hovercard.spec.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import * as React from 'react';
  2. import {act, render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  3. import {Hovercard, HOVERCARD_PORTAL_ID} from 'sentry/components/hovercard';
  4. describe('Hovercard', () => {
  5. beforeEach(() => {
  6. jest.useFakeTimers();
  7. jest.clearAllMocks();
  8. });
  9. afterEach(() => {
  10. jest.useRealTimers();
  11. });
  12. it('reuses portal', () => {
  13. render(
  14. <React.Fragment>
  15. <Hovercard
  16. position="top"
  17. body="Hovercard Body"
  18. header="Hovercard Header"
  19. displayTimeout={0}
  20. >
  21. Hovercard Trigger
  22. </Hovercard>
  23. <Hovercard
  24. position="top"
  25. body="Hovercard Body"
  26. header="Hovercard Header"
  27. displayTimeout={0}
  28. >
  29. Hovercard Trigger
  30. </Hovercard>
  31. </React.Fragment>
  32. );
  33. // eslint-disable-next-line
  34. expect(document.querySelectorAll(`#${HOVERCARD_PORTAL_ID}`)).toHaveLength(1);
  35. });
  36. it('Displays card', async () => {
  37. render(
  38. <Hovercard
  39. position="top"
  40. body="Hovercard Body"
  41. header="Hovercard Header"
  42. displayTimeout={0}
  43. >
  44. Hovercard Trigger
  45. </Hovercard>
  46. );
  47. userEvent.hover(screen.getByText('Hovercard Trigger'));
  48. expect(await screen.findByText(/Hovercard Body/)).toBeInTheDocument();
  49. expect(await screen.findByText(/Hovercard Header/)).toBeInTheDocument();
  50. });
  51. it('Does not display card', () => {
  52. render(
  53. <Hovercard
  54. position="top"
  55. body="Hovercard Body"
  56. header="Hovercard Header"
  57. displayTimeout={0}
  58. show={false}
  59. >
  60. Hovercard Trigger
  61. </Hovercard>
  62. );
  63. userEvent.hover(screen.getByText('Hovercard Trigger'));
  64. jest.runAllTimers();
  65. expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
  66. expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
  67. });
  68. it('Always displays card', () => {
  69. render(
  70. <Hovercard
  71. position="top"
  72. body="Hovercard Body"
  73. header="Hovercard Header"
  74. displayTimeout={0}
  75. show
  76. >
  77. Hovercard Trigger
  78. </Hovercard>
  79. );
  80. expect(screen.getByText(/Hovercard Body/)).toBeInTheDocument();
  81. expect(screen.getByText(/Hovercard Header/)).toBeInTheDocument();
  82. });
  83. it('Respects displayTimeout displays card', async () => {
  84. const DISPLAY_TIMEOUT = 100;
  85. render(
  86. <Hovercard
  87. position="top"
  88. body="Hovercard Body"
  89. header="Hovercard Header"
  90. displayTimeout={DISPLAY_TIMEOUT}
  91. >
  92. Hovercard Trigger
  93. </Hovercard>
  94. );
  95. userEvent.hover(screen.getByText('Hovercard Trigger'));
  96. act(() => {
  97. jest.advanceTimersByTime(DISPLAY_TIMEOUT - 1);
  98. });
  99. expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
  100. expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
  101. expect(await screen.findByText(/Hovercard Body/)).toBeInTheDocument();
  102. expect(await screen.findByText(/Hovercard Header/)).toBeInTheDocument();
  103. });
  104. it('Doesnt leak timeout', () => {
  105. render(
  106. <Hovercard
  107. position="top"
  108. body="Hovercard Body"
  109. header="Hovercard Header"
  110. displayTimeout={100}
  111. >
  112. Hovercard Trigger
  113. </Hovercard>
  114. );
  115. userEvent.hover(screen.getByText('Hovercard Trigger'));
  116. act(() => {
  117. jest.advanceTimersByTime(99);
  118. });
  119. expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
  120. expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
  121. userEvent.unhover(screen.getByText('Hovercard Trigger'));
  122. act(() => {
  123. jest.advanceTimersByTime(1);
  124. });
  125. expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
  126. expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
  127. });
  128. });