hovercard.spec.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import {act, render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  2. import {Hovercard} from 'sentry/components/hovercard';
  3. describe('Hovercard', () => {
  4. beforeEach(() => {
  5. jest.clearAllMocks();
  6. });
  7. it('Displays card', async () => {
  8. render(
  9. <Hovercard
  10. position="top"
  11. body="Hovercard Body"
  12. header="Hovercard Header"
  13. displayTimeout={0}
  14. >
  15. Hovercard Trigger
  16. </Hovercard>
  17. );
  18. await userEvent.hover(screen.getByText('Hovercard Trigger'));
  19. expect(await screen.findByText(/Hovercard Body/)).toBeInTheDocument();
  20. expect(await screen.findByText(/Hovercard Header/)).toBeInTheDocument();
  21. });
  22. it('Does not display card', async () => {
  23. render(
  24. <Hovercard
  25. position="top"
  26. body="Hovercard Body"
  27. header="Hovercard Header"
  28. displayTimeout={0}
  29. forceVisible={false}
  30. >
  31. Hovercard Trigger
  32. </Hovercard>
  33. );
  34. await userEvent.hover(screen.getByText('Hovercard Trigger'));
  35. expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
  36. expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
  37. });
  38. it('Always displays card', async () => {
  39. render(
  40. <Hovercard
  41. position="top"
  42. body="Hovercard Body"
  43. header="Hovercard Header"
  44. displayTimeout={0}
  45. forceVisible
  46. >
  47. Hovercard Trigger
  48. </Hovercard>
  49. );
  50. expect(await screen.findByText(/Hovercard Body/)).toBeInTheDocument();
  51. expect(screen.getByText(/Hovercard Header/)).toBeInTheDocument();
  52. });
  53. it('Respects displayTimeout displays card', async () => {
  54. const DISPLAY_TIMEOUT = 100;
  55. render(
  56. <Hovercard
  57. position="top"
  58. body="Hovercard Body"
  59. header="Hovercard Header"
  60. delay={DISPLAY_TIMEOUT}
  61. displayTimeout={DISPLAY_TIMEOUT}
  62. >
  63. Hovercard Trigger
  64. </Hovercard>
  65. );
  66. jest.useFakeTimers();
  67. await userEvent.hover(screen.getByText('Hovercard Trigger'), {delay: null});
  68. act(() => jest.advanceTimersByTime(DISPLAY_TIMEOUT - 1));
  69. expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
  70. expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
  71. act(() => jest.advanceTimersByTime(1));
  72. expect(await screen.findByText(/Hovercard Body/)).toBeInTheDocument();
  73. expect(await screen.findByText(/Hovercard Header/)).toBeInTheDocument();
  74. jest.useRealTimers();
  75. });
  76. it('Doesnt leak timeout', async () => {
  77. const DISPLAY_TIMEOUT = 100;
  78. render(
  79. <Hovercard
  80. position="top"
  81. body="Hovercard Body"
  82. header="Hovercard Header"
  83. delay={DISPLAY_TIMEOUT}
  84. displayTimeout={DISPLAY_TIMEOUT}
  85. >
  86. Hovercard Trigger
  87. </Hovercard>
  88. );
  89. jest.useFakeTimers();
  90. await userEvent.hover(screen.getByText('Hovercard Trigger'), {delay: null});
  91. act(() => jest.advanceTimersByTime(DISPLAY_TIMEOUT - 1));
  92. expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
  93. expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
  94. await userEvent.unhover(screen.getByText('Hovercard Trigger'), {delay: null});
  95. act(() => jest.advanceTimersByTime(1));
  96. jest.useRealTimers();
  97. expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
  98. expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
  99. });
  100. });