tooltip.spec.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
  2. import {Tooltip} from 'sentry/components/tooltip';
  3. describe('Tooltip', function () {
  4. function mockOverflow(width: number, containerWidth: number) {
  5. Object.defineProperty(HTMLElement.prototype, 'scrollWidth', {
  6. configurable: true,
  7. value: width,
  8. });
  9. Object.defineProperty(HTMLElement.prototype, 'clientWidth', {
  10. configurable: true,
  11. value: containerWidth,
  12. });
  13. }
  14. afterEach(() => {
  15. // @ts-expect-error
  16. delete HTMLElement.prototype.scrollWidth;
  17. // @ts-expect-error
  18. delete HTMLElement.prototype.clientWidth;
  19. });
  20. beforeEach(() => {
  21. jest.clearAllMocks();
  22. });
  23. it('renders', function () {
  24. render(
  25. <Tooltip delay={0} title="test">
  26. <span>My Button</span>
  27. </Tooltip>
  28. );
  29. });
  30. it('updates title', async function () {
  31. const {rerender} = render(
  32. <Tooltip delay={0} title="test">
  33. <span>My Button</span>
  34. </Tooltip>
  35. );
  36. // Change title
  37. rerender(
  38. <Tooltip delay={0} title="bar">
  39. <span>My Button</span>
  40. </Tooltip>
  41. );
  42. await userEvent.hover(screen.getByText('My Button'));
  43. expect(screen.getByText('bar')).toBeInTheDocument();
  44. await userEvent.unhover(screen.getByText('My Button'));
  45. await waitFor(() => {
  46. expect(screen.queryByText('bar')).not.toBeInTheDocument();
  47. });
  48. });
  49. it('disables and does not render', async function () {
  50. render(
  51. <Tooltip delay={0} title="test" disabled>
  52. <span>My Button</span>
  53. </Tooltip>
  54. );
  55. await userEvent.hover(screen.getByText('My Button'));
  56. expect(screen.queryByText('test')).not.toBeInTheDocument();
  57. await userEvent.unhover(screen.getByText('My Button'));
  58. });
  59. it('resets visibility when becoming disabled', async function () {
  60. const {rerender} = render(
  61. <Tooltip delay={0} title="test" disabled={false}>
  62. <span>My Button</span>
  63. </Tooltip>
  64. );
  65. await userEvent.hover(screen.getByText('My Button'));
  66. expect(screen.getByText('test')).toBeInTheDocument();
  67. rerender(
  68. <Tooltip delay={0} title="test" disabled>
  69. <span>My Button</span>
  70. </Tooltip>
  71. );
  72. expect(screen.queryByText('test')).not.toBeInTheDocument();
  73. // Becomes enabled again
  74. rerender(
  75. <Tooltip delay={0} title="test" disabled={false}>
  76. <span>My Button</span>
  77. </Tooltip>
  78. );
  79. expect(screen.queryByText('test')).not.toBeInTheDocument();
  80. });
  81. it('does not render an empty tooltip', async function () {
  82. render(
  83. <Tooltip delay={0} title="">
  84. <span>My Button</span>
  85. </Tooltip>
  86. );
  87. await userEvent.hover(screen.getByText('My Button'));
  88. expect(screen.getByText('My Button')).not.toHaveAttribute('aria-describedby');
  89. await userEvent.unhover(screen.getByText('My Button'));
  90. });
  91. it('displays a tooltip if the content overflows with showOnlyOnOverflow', async function () {
  92. // Mock this to return true because scrollWidth and clientWidth are 0 in JSDOM
  93. mockOverflow(100, 50);
  94. render(
  95. <Tooltip delay={0} title="test" showOnlyOnOverflow>
  96. <div>This text overflows</div>
  97. </Tooltip>
  98. );
  99. await userEvent.hover(screen.getByText('This text overflows'));
  100. expect(screen.getByText('test')).toBeInTheDocument();
  101. await userEvent.unhover(screen.getByText('This text overflows'));
  102. });
  103. it('does not display a tooltip if the content does not overflow with showOnlyOnOverflow', async function () {
  104. mockOverflow(50, 100);
  105. render(
  106. <Tooltip delay={0} title="test" showOnlyOnOverflow>
  107. <div>This text does not overflow</div>
  108. </Tooltip>
  109. );
  110. await userEvent.hover(screen.getByText('This text does not overflow'));
  111. expect(screen.queryByText('test')).not.toBeInTheDocument();
  112. });
  113. });