hovercard.spec.tsx 3.1 KB

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