]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-21017 Tests: fix the use of Jest fake timers
authorDavid Cho-Lerat <david.cho-lerat@sonarsource.com>
Fri, 24 Nov 2023 11:37:49 +0000 (12:37 +0100)
committersonartech <sonartech@sonarsource.com>
Fri, 24 Nov 2023 20:02:45 +0000 (20:02 +0000)
server/sonar-web/design-system/src/components/__tests__/DropdownMenu-test.tsx
server/sonar-web/design-system/src/components/input/__tests__/DateRangePicker-test.tsx
server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx
server/sonar-web/src/main/js/apps/issues/__tests__/IssuesApp-Filtering-it.tsx
server/sonar-web/src/main/js/components/controls/__tests__/clipboard-test.tsx

index e7e9776cf55e5523732056bb01a0e13f2f16cd4a..131e881e4e6e9ae2900b5d0f9303134f580b5537 100644 (file)
@@ -17,7 +17,7 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { screen } from '@testing-library/react';
+import { act, screen, waitFor } from '@testing-library/react';
 import { noop } from 'lodash';
 import { render, renderWithRouter } from '../../helpers/testUtils';
 import {
@@ -65,14 +65,20 @@ it('menu items should work with tooltips', async () => {
   await user.hover(screen.getByRole('menuitem'));
   expect(screen.queryByRole('tooltip')).not.toBeInTheDocument();
 
-  jest.runAllTimers();
+  act(() => {
+    jest.runAllTimers();
+  });
   expect(screen.getByRole('tooltip')).toBeVisible();
 
   await user.unhover(screen.getByRole('menuitem'));
   expect(screen.getByRole('tooltip')).toBeVisible();
 
-  jest.runAllTimers();
-  expect(screen.queryByRole('tooltip')).not.toBeInTheDocument();
+  act(() => {
+    jest.runAllTimers();
+  });
+  await waitFor(() => {
+    expect(screen.queryByRole('tooltip')).not.toBeInTheDocument();
+  });
 });
 
 function renderDropdownMenu() {
index 6dcbbe827624aa31770db993c08c797016d0f660..2b6c9e5e04d0ae4625765c7134d3dc9bbee6e639 100644 (file)
@@ -17,7 +17,7 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { screen } from '@testing-library/react';
+import { act, screen } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 import { formatISO, parseISO } from 'date-fns';
 import { byRole } from '../../../../../src/main/js/helpers/testSelector';
@@ -43,12 +43,13 @@ it('behaves correctly', async () => {
 
   await user.click(screen.getByRole('textbox', { name: 'from' }));
 
-  expect(nav.get()).toBeInTheDocument();
+  const fromNav = nav.get();
+  expect(fromNav).toBeInTheDocument();
 
   await user.click(nav.byRole('button', { name: 'previous_month_x' }).get());
   await user.click(screen.getByText('7'));
 
-  expect(nav.query()).not.toBeInTheDocument();
+  expect(fromNav).not.toBeInTheDocument();
 
   expect(onChange).toHaveBeenCalled();
   const { from } = onChange.mock.calls[0][0]; // first argument
@@ -57,7 +58,9 @@ it('behaves correctly', async () => {
 
   onChange.mockClear();
 
-  jest.runAllTimers();
+  act(() => {
+    jest.runAllTimers();
+  });
 
   const previousButton = nav.byRole('button', { name: 'previous_month_x' });
   const nextButton = nav.byRole('button', { name: 'next_month_x' });
index 76e98ef85d099f29ba091a8503a375cd1028473d..045fb4d4b9091a3d13c79645d84aa7c19f8e63fc 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 
-import { screen, waitFor } from '@testing-library/react';
+import { act, screen, waitFor } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 import React, { useContext } from 'react';
 import { Route } from 'react-router-dom';
@@ -155,6 +155,7 @@ describe('getTasksForComponent', () => {
   });
 
   afterEach(() => {
+    jest.runOnlyPendingTimers();
     jest.useRealTimers();
   });
 
@@ -176,8 +177,9 @@ describe('getTasksForComponent', () => {
     await waitFor(() => {
       expect(getComponentNavigation).toHaveBeenCalledTimes(1);
     });
-    expect(getComponentNavigation).toHaveBeenCalledTimes(1);
-    expect(getTasksForComponent).toHaveBeenCalledTimes(1);
+    await waitFor(() => expect(getTasksForComponent).toHaveBeenCalledTimes(1));
+
+    act(() => jest.runOnlyPendingTimers());
 
     jest.runOnlyPendingTimers();
 
@@ -195,7 +197,8 @@ describe('getTasksForComponent', () => {
     expect(getTasksForComponent).toHaveBeenCalledTimes(3);
 
     // Make sure the timeout was cleared. It should not be called again.
-    jest.runAllTimers();
+    act(() => jest.runAllTimers());
+
     // The number of calls haven't changed.
     await waitFor(() => {
       expect(getComponentNavigation).toHaveBeenCalledTimes(2);
@@ -225,7 +228,9 @@ describe('getTasksForComponent', () => {
     await waitFor(() => {
       expect(getComponentNavigation).toHaveBeenCalledTimes(1);
     });
-    expect(getTasksForComponent).toHaveBeenCalledTimes(1);
+    await waitFor(() => expect(getTasksForComponent).toHaveBeenCalledTimes(1));
+
+    act(() => jest.runOnlyPendingTimers());
 
     jest.runOnlyPendingTimers();
 
@@ -259,7 +264,7 @@ describe('getTasksForComponent', () => {
       expect(getComponentNavigation).toHaveBeenCalledTimes(1);
     });
 
-    expect(getTasksForComponent).toHaveBeenCalledTimes(1);
+    await waitFor(() => expect(getTasksForComponent).toHaveBeenCalledTimes(1));
   });
 
   it('only fully reloads a non-empty component if there was previously some task in progress', async () => {
@@ -281,10 +286,9 @@ describe('getTasksForComponent', () => {
 
     // First round, a pending task in the queue. This should trigger a reload of the
     // status endpoint.
-    await waitFor(() => {
-      expect(getTasksForComponent).toHaveBeenCalledTimes(1);
-    });
-    jest.runOnlyPendingTimers();
+    await waitFor(() => expect(getTasksForComponent).toHaveBeenCalledTimes(1));
+
+    act(() => jest.runOnlyPendingTimers());
 
     // Second round, nothing in the queue, and a success task is current. This
     // implies the current task was updated, and previously we displayed some information
index 2e2320f6f0bfa14ac59404a8ff29f4e3b3185713..06827728ca170a10eec6ab66d28d722cd670e312 100644 (file)
@@ -64,7 +64,7 @@ beforeEach(() => {
 describe('issues app filtering', () => {
   it('should combine sidebar filters properly', async () => {
     jest.useFakeTimers();
-    const user = userEvent.setup({ delay: null });
+    const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime });
     renderIssueApp();
     await waitOnDataLoaded();
 
@@ -157,6 +157,7 @@ describe('issues app filtering', () => {
     expect(ui.issueItem5.get()).toBeInTheDocument();
     expect(ui.issueItem6.get()).toBeInTheDocument();
     expect(ui.issueItem7.get()).toBeInTheDocument();
+    jest.runOnlyPendingTimers();
     jest.useRealTimers();
   });
 
index c6670938912a1ee1db65d8ddc47f14ea57f29c83..d97bbda87b97fcf3d00548d3f4365aae40f4d48e 100644 (file)
@@ -17,7 +17,7 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { screen } from '@testing-library/react';
+import { act, screen } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 import * as React from 'react';
 import { renderComponent } from '../../../helpers/testReactTestingUtils';
@@ -45,13 +45,13 @@ describe('ClipboardBase', () => {
   });
 
   it('should allow its content to be copied', async () => {
-    const user = userEvent.setup();
+    const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime });
     renderClipboardBase();
 
     user.click(screen.getByRole('button'));
     expect(await screen.findByText('copied')).toBeInTheDocument();
 
-    jest.runAllTimers();
+    act(() => jest.runAllTimers());
 
     expect(screen.getByText('click to copy')).toBeInTheDocument();
   });