From 7b0629cee9d48d45725e5cadf1a552a5a511a60a Mon Sep 17 00:00:00 2001 From: Tyler Dane Date: Mon, 1 Jun 2026 19:56:44 -0500 Subject: [PATCH 1/9] test(web): batch interim test runner --- packages/scripts/src/testing/run.ts | 36 ++++++-- packages/web/src/__tests__/web.preload.ts | 16 ++++ .../hooks/useCompleteAuthentication.test.ts | 6 +- .../src/auth/compass/hooks/useLogout.test.ts | 14 +-- .../compass/session/SessionProvider.test.tsx | 12 +-- .../auth/compass/session/session.util.test.ts | 6 +- .../auth/google/util/google.auth.util.test.ts | 5 - .../src/common/hooks/useAuthCmdItems.test.ts | 6 +- .../common/hooks/useLogoutCmdItems.test.ts | 6 +- .../src/common/hooks/useVersionCheck.test.ts | 5 - .../event/remote.event.repository.test.ts | 6 +- .../src/common/utils/app-init.util.test.ts | 5 - .../src/common/utils/draft/draft.util.test.ts | 1 - .../utils/draft/someday.draft.util.test.ts | 46 ++-------- .../components/AuthModal/AuthModal.test.tsx | 9 +- .../AuthModal/hooks/useAuthUrlParam.test.tsx | 20 +--- .../AuthenticatedLayout.test.tsx | 10 +- .../ContextMenu/ContextMenuItems.test.tsx | 35 ++++--- .../HeaderInfoIcon/HeaderInfoIcon.test.tsx | 91 +++++++++---------- .../components/MobileGate/MobileGate.test.tsx | 2 +- .../PlannerAccountSummary.test.tsx | 5 - .../PlannerSidebar/PlannerSidebar.test.tsx | 65 ------------- .../PlannerSidebarActions.test.tsx | 6 +- .../SomedayEventSections.test.tsx | 1 - .../SomedayEventsContainer.test.tsx | 10 -- .../draft/hooks/useSidebarState.test.ts | 6 +- .../components/SelectView/SelectView.test.tsx | 10 +- .../ducks/events/sagas/event.sagas.test.ts | 5 - .../ducks/events/sagas/someday.sagas.test.ts | 2 - .../provider/SSEProvider.interaction.test.tsx | 6 +- .../web/src/sse/provider/SSEProvider.test.tsx | 6 +- .../views/Day/components/Tasks/Tasks.test.tsx | 6 +- .../MigrationToast/MigrationToast.test.tsx | 6 +- .../Toasts/UndoToast/UndoDeleteToast.test.tsx | 6 +- .../__tests__/DNDTasksContext.test.tsx | 6 +- .../Day/hooks/tasks/useTaskState.test.tsx | 6 +- .../Draft/hooks/actions/submit.parser.test.ts | 6 +- .../hooks/actions/useDraftActions.test.ts | 6 +- 38 files changed, 152 insertions(+), 349 deletions(-) delete mode 100644 packages/web/src/components/PlannerSidebar/PlannerSidebar.test.tsx diff --git a/packages/scripts/src/testing/run.ts b/packages/scripts/src/testing/run.ts index ecb451c2b..479367764 100644 --- a/packages/scripts/src/testing/run.ts +++ b/packages/scripts/src/testing/run.ts @@ -21,6 +21,7 @@ const bunRuntime = (globalThis as unknown as { Bun: BunRuntime }).Bun; const WEB_ROOT = resolve(process.cwd(), "packages/web"); const WEB_SRC = resolve(WEB_ROOT, "src"); const WEB_TEST_FILE_PATTERN = /\.(spec|test)\.[tj]sx?$/; +const DEFAULT_WEB_TEST_BATCH_SIZE = 3; const TEST_PROJECTS = { backend: { @@ -62,6 +63,26 @@ function findWebTestFiles(dir: string): string[] { .sort(); } +function chunk(items: T[], size: number): T[][] { + const chunks: T[][] = []; + + for (let index = 0; index < items.length; index += size) { + chunks.push(items.slice(index, index + size)); + } + + return chunks; +} + +function getWebTestBatchSize() { + const configuredBatchSize = Number(process.env["WEB_TEST_BATCH_SIZE"]); + + if (Number.isInteger(configuredBatchSize) && configuredBatchSize > 0) { + return configuredBatchSize; + } + + return DEFAULT_WEB_TEST_BATCH_SIZE; +} + function assertBackendConfigFile() { const configFilePath = resolve(process.cwd(), "compass.yaml"); @@ -91,15 +112,16 @@ function runCommand(cmd: string[], cwd = process.cwd()) { } } -function runWebProject() { - for (const testFile of findWebTestFiles(WEB_SRC)) { - runCommand([process.execPath, "test", "--cwd", WEB_ROOT, testFile]); - } -} - function runProject(projectName: keyof typeof TEST_PROJECTS) { if (projectName === "web") { - runWebProject(); + const testFileBatches = chunk( + findWebTestFiles(WEB_SRC), + getWebTestBatchSize(), + ); + + for (const testFiles of testFileBatches) { + runCommand(["bun", "test", "--cwd", WEB_ROOT, ...testFiles]); + } return; } diff --git a/packages/web/src/__tests__/web.preload.ts b/packages/web/src/__tests__/web.preload.ts index a476e3682..40e7c5690 100644 --- a/packages/web/src/__tests__/web.preload.ts +++ b/packages/web/src/__tests__/web.preload.ts @@ -274,6 +274,20 @@ mockNodeModules(); const sessionModule = await import("supertokens-web-js/recipe/session"); const { cleanup } = await import("@testing-library/react"); +function resetDocument() { + document.body.innerHTML = ""; + document.body.removeAttribute("style"); + document.body.removeAttribute("class"); + document.body.removeAttribute("data-app-locked"); + document.documentElement.removeAttribute("style"); +} + +function resetBrowserState() { + dom.reconfigure({ url: "http://localhost/" }); + localStorage.clear(); + sessionStorage.clear(); +} + beforeEach(() => { sessionModule.doesSessionExist?.mockResolvedValue(true); }); @@ -282,6 +296,8 @@ beforeAll(() => server.listen({ onUnhandledRequest: "error" })); afterEach(async () => { await Promise.resolve(); cleanup(); + resetDocument(); + resetBrowserState(); server.resetHandlers(); }); afterAll(() => server.close()); diff --git a/packages/web/src/auth/compass/hooks/useCompleteAuthentication.test.ts b/packages/web/src/auth/compass/hooks/useCompleteAuthentication.test.ts index 4229e3d15..e6d676e2c 100644 --- a/packages/web/src/auth/compass/hooks/useCompleteAuthentication.test.ts +++ b/packages/web/src/auth/compass/hooks/useCompleteAuthentication.test.ts @@ -1,4 +1,4 @@ -import { afterAll, beforeEach, describe, it, mock } from "bun:test"; +import { beforeEach, describe, it, mock } from "bun:test"; // Pre-define mock functions const mockSyncPendingLocalEvents = mock(); @@ -72,7 +72,3 @@ describe("useCompleteAuthentication", () => { await Promise.resolve(result.current({ email: "test@example.com" })); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/auth/compass/hooks/useLogout.test.ts b/packages/web/src/auth/compass/hooks/useLogout.test.ts index 30a06f480..243374c81 100644 --- a/packages/web/src/auth/compass/hooks/useLogout.test.ts +++ b/packages/web/src/auth/compass/hooks/useLogout.test.ts @@ -1,13 +1,5 @@ import { act, renderHook } from "@testing-library/react"; -import { - afterAll, - beforeEach, - describe, - expect, - it, - mock, - spyOn, -} from "bun:test"; +import { beforeEach, describe, expect, it, mock, spyOn } from "bun:test"; const clearAuthenticationState = mock(); const setAuthenticated = mock(); @@ -89,7 +81,3 @@ describe("useLogout", () => { consoleWarn.mockRestore(); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/auth/compass/session/SessionProvider.test.tsx b/packages/web/src/auth/compass/session/SessionProvider.test.tsx index 03d178f92..d6b7aa731 100644 --- a/packages/web/src/auth/compass/session/SessionProvider.test.tsx +++ b/packages/web/src/auth/compass/session/SessionProvider.test.tsx @@ -1,8 +1,9 @@ import { act, renderHook, waitFor } from "@testing-library/react"; +import { useContext } from "react"; import { Subject } from "rxjs"; import { authSlice } from "@web/ducks/auth/slices/auth.slice"; import { userMetadataSlice } from "@web/ducks/auth/slices/user-metadata.slice"; -import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test"; +import { beforeEach, describe, expect, it, mock } from "bun:test"; // Create mocks at module level const refreshUserMetadata = mock().mockResolvedValue(undefined); @@ -101,9 +102,8 @@ const { session } = require("@web/common/classes/Session") as { }; }; -const { SessionProvider, sessionInit } = +const { SessionContext, SessionProvider, sessionInit } = require("./SessionProvider") as typeof import("./SessionProvider"); -const { useSession } = require("./useSession") as typeof import("./useSession"); describe("SessionProvider sessionInit", () => { beforeEach(() => { @@ -170,7 +170,7 @@ describe("SessionProvider sessionInit", () => { getStream.mockReturnValue({} as EventSource); doesSessionExist.mockResolvedValue(false); - const { result } = renderHook(() => useSession(), { + const { result } = renderHook(() => useContext(SessionContext), { wrapper: SessionProvider, }); @@ -188,7 +188,3 @@ describe("SessionProvider sessionInit", () => { expect(result.current.authenticated).toBe(true); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/auth/compass/session/session.util.test.ts b/packages/web/src/auth/compass/session/session.util.test.ts index a16522c50..5cd1f43f9 100644 --- a/packages/web/src/auth/compass/session/session.util.test.ts +++ b/packages/web/src/auth/compass/session/session.util.test.ts @@ -1,6 +1,6 @@ import { UNAUTHENTICATED_USER } from "@web/common/constants/auth.constants"; import { getUserId } from "./session.util"; -import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test"; +import { beforeEach, describe, expect, it, mock } from "bun:test"; const mockDoesSessionExist = mock(); const mockGetAccessTokenPayloadSecurely = mock(); @@ -44,7 +44,3 @@ describe("session.util", () => { }); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/auth/google/util/google.auth.util.test.ts b/packages/web/src/auth/google/util/google.auth.util.test.ts index c4ba8b2ac..b31808042 100644 --- a/packages/web/src/auth/google/util/google.auth.util.test.ts +++ b/packages/web/src/auth/google/util/google.auth.util.test.ts @@ -3,7 +3,6 @@ import { isGoogleRevoked, } from "@web/auth/google/state/google.auth.state"; import { - afterAll, afterEach, beforeEach, describe, @@ -192,7 +191,3 @@ describe("google-auth.util", () => { }); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/common/hooks/useAuthCmdItems.test.ts b/packages/web/src/common/hooks/useAuthCmdItems.test.ts index 5556b89dc..d95f561e8 100644 --- a/packages/web/src/common/hooks/useAuthCmdItems.test.ts +++ b/packages/web/src/common/hooks/useAuthCmdItems.test.ts @@ -1,6 +1,6 @@ import { renderHook } from "@testing-library/react"; import { act, type MouseEvent } from "react"; -import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test"; +import { beforeEach, describe, expect, it, mock } from "bun:test"; const mockOpenModal = mock(); const mockUseAuthModal = mock(); @@ -90,7 +90,3 @@ describe("useAuthCmdItems", () => { expect(mockOpenModal).toHaveBeenNthCalledWith(2, "login"); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/common/hooks/useLogoutCmdItems.test.ts b/packages/web/src/common/hooks/useLogoutCmdItems.test.ts index 1ba06b69a..790ae3fa8 100644 --- a/packages/web/src/common/hooks/useLogoutCmdItems.test.ts +++ b/packages/web/src/common/hooks/useLogoutCmdItems.test.ts @@ -1,6 +1,6 @@ import { renderHook } from "@testing-library/react"; import { act, type MouseEvent } from "react"; -import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test"; +import { beforeEach, describe, expect, it, mock } from "bun:test"; const mockOpenLogoutConfirmation = mock(); const mockUseLogoutConfirmation = mock(); @@ -55,7 +55,3 @@ describe("useLogoutCmdItems", () => { expect(mockOpenLogoutConfirmation).toHaveBeenCalledTimes(1); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/common/hooks/useVersionCheck.test.ts b/packages/web/src/common/hooks/useVersionCheck.test.ts index 692c2a24f..2051bfc3c 100644 --- a/packages/web/src/common/hooks/useVersionCheck.test.ts +++ b/packages/web/src/common/hooks/useVersionCheck.test.ts @@ -1,7 +1,6 @@ import { renderHook, waitFor } from "@testing-library/react"; import { act } from "react"; import { - afterAll, afterEach, beforeEach, describe, @@ -289,7 +288,3 @@ describe("useVersionCheck", () => { }); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/common/repositories/event/remote.event.repository.test.ts b/packages/web/src/common/repositories/event/remote.event.repository.test.ts index 3f0d6526b..d317b936e 100644 --- a/packages/web/src/common/repositories/event/remote.event.repository.test.ts +++ b/packages/web/src/common/repositories/event/remote.event.repository.test.ts @@ -8,7 +8,7 @@ import { isBackendUnavailable, resetBackendAvailabilityForTests, } from "@web/common/apis/util/backend-unavailable-error.util"; -import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test"; +import { beforeEach, describe, expect, it, mock } from "bun:test"; const mockCreate = mock(); const mockGet = mock(); @@ -274,7 +274,3 @@ describe("RemoteEventRepository", () => { }); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/common/utils/app-init.util.test.ts b/packages/web/src/common/utils/app-init.util.test.ts index 84e207ca7..f4d68372c 100644 --- a/packages/web/src/common/utils/app-init.util.test.ts +++ b/packages/web/src/common/utils/app-init.util.test.ts @@ -1,6 +1,5 @@ import { DatabaseInitError } from "@web/common/utils/storage/db-errors.util"; import { - afterAll, afterEach, beforeEach, describe, @@ -180,7 +179,3 @@ describe("app-init.util", () => { }); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/common/utils/draft/draft.util.test.ts b/packages/web/src/common/utils/draft/draft.util.test.ts index a3fc44432..edc3be22d 100644 --- a/packages/web/src/common/utils/draft/draft.util.test.ts +++ b/packages/web/src/common/utils/draft/draft.util.test.ts @@ -107,5 +107,4 @@ describe("shortcut draft creation", () => { afterAll(() => { setSystemTime(); - mock.restore(); }); diff --git a/packages/web/src/common/utils/draft/someday.draft.util.test.ts b/packages/web/src/common/utils/draft/someday.draft.util.test.ts index c466b6ae8..2821fb331 100644 --- a/packages/web/src/common/utils/draft/someday.draft.util.test.ts +++ b/packages/web/src/common/utils/draft/someday.draft.util.test.ts @@ -2,21 +2,10 @@ import { Categories_Event } from "@core/types/event.types"; import dayjs from "@core/util/date/dayjs"; import { draftSlice } from "@web/ducks/events/slices/draft.slice"; import { type Activity_DraftEvent } from "@web/ducks/events/slices/draft.slice.types"; -import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test"; +import { beforeEach, describe, expect, it, mock } from "bun:test"; -// Mock assembleDefaultEvent since it makes external calls -const assembleDefaultEvent = mock(async (_, startDate, endDate) => ({ - _id: "mock-id", - user: "mock-user", - title: "", - startDate, - endDate, - isAllDay: false, - isSomeday: true, -})); - -mock.module("../event/event.util", () => ({ - assembleDefaultEvent, +mock.module("@web/auth/compass/session/session.util", () => ({ + getUserId: mock().mockResolvedValue("mock-user"), })); const { createSomedayDraft } = @@ -27,7 +16,6 @@ describe("createSomedayDraft", () => { const mockActivity: Activity_DraftEvent = "sidebarClick"; beforeEach(() => { - assembleDefaultEvent.mockClear(); mockDispatch.mockClear(); }); @@ -46,25 +34,17 @@ describe("createSomedayDraft", () => { const expectedStart = "2024-03-10"; const expectedEnd = "2024-03-16"; - expect(assembleDefaultEvent).toHaveBeenCalledWith( - Categories_Event.SOMEDAY_WEEK, - expectedStart, - expectedEnd, - ); - expect(mockDispatch).toHaveBeenCalledWith( draftSlice.actions.start({ activity: mockActivity, eventType: Categories_Event.SOMEDAY_WEEK, - event: { - _id: "mock-id", + event: expect.objectContaining({ user: "mock-user", - title: "", startDate: expectedStart, endDate: expectedEnd, isAllDay: false, isSomeday: true, - }, + }), }), ); }); @@ -84,30 +64,18 @@ describe("createSomedayDraft", () => { const expectedStart = "2024-02-01"; const expectedEnd = "2024-02-29"; - expect(assembleDefaultEvent).toHaveBeenCalledWith( - Categories_Event.SOMEDAY_MONTH, - expectedStart, - expectedEnd, - ); - expect(mockDispatch).toHaveBeenCalledWith( draftSlice.actions.start({ activity: mockActivity, eventType: Categories_Event.SOMEDAY_MONTH, - event: { - _id: "mock-id", + event: expect.objectContaining({ user: "mock-user", - title: "", startDate: expectedStart, endDate: expectedEnd, isAllDay: false, isSomeday: true, - }, + }), }), ); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/components/AuthModal/AuthModal.test.tsx b/packages/web/src/components/AuthModal/AuthModal.test.tsx index 978f87511..3f8b170e4 100644 --- a/packages/web/src/components/AuthModal/AuthModal.test.tsx +++ b/packages/web/src/components/AuthModal/AuthModal.test.tsx @@ -12,7 +12,6 @@ import { render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { setTestWindowUrl } from "@web/__tests__/set-test-window-url"; import { - afterAll, afterEach, beforeEach, describe, @@ -909,7 +908,9 @@ const mockWindowLocation = (url: string) => { setTestWindowUrl(url); }; -const originalReplaceState = window.history.replaceState.bind(window.history); +const originalReplaceState = Object.getPrototypeOf( + window.history, +).replaceState.bind(window.history) as typeof window.history.replaceState; const replaceStateSpy = spyOn(window.history, "replaceState"); describe("URL Parameter Support", () => { @@ -1106,7 +1107,3 @@ describe("URL Parameter Support", () => { }); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/components/AuthModal/hooks/useAuthUrlParam.test.tsx b/packages/web/src/components/AuthModal/hooks/useAuthUrlParam.test.tsx index dc166c445..74a452312 100644 --- a/packages/web/src/components/AuthModal/hooks/useAuthUrlParam.test.tsx +++ b/packages/web/src/components/AuthModal/hooks/useAuthUrlParam.test.tsx @@ -1,17 +1,11 @@ import { renderHook } from "@testing-library/react"; import { setTestWindowUrl } from "@web/__tests__/set-test-window-url"; import { useAuthUrlParam } from "./useAuthUrlParam"; -import { - afterAll, - beforeEach, - describe, - expect, - it, - mock, - spyOn, -} from "bun:test"; - -const originalReplaceState = window.history.replaceState.bind(window.history); +import { beforeEach, describe, expect, it, mock, spyOn } from "bun:test"; + +const originalReplaceState = Object.getPrototypeOf( + window.history, +).replaceState.bind(window.history) as typeof window.history.replaceState; const replaceStateSpy = spyOn(window.history, "replaceState"); describe("useAuthUrlParam", () => { @@ -171,7 +165,3 @@ describe("useAuthUrlParam", () => { }); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/components/AuthenticatedLayout/AuthenticatedLayout.test.tsx b/packages/web/src/components/AuthenticatedLayout/AuthenticatedLayout.test.tsx index c51dcf63c..77f7c3abe 100644 --- a/packages/web/src/components/AuthenticatedLayout/AuthenticatedLayout.test.tsx +++ b/packages/web/src/components/AuthenticatedLayout/AuthenticatedLayout.test.tsx @@ -1,14 +1,10 @@ import { MemoryRouter, Route, Routes } from "react-router-dom"; -import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test"; +import { describe, expect, it } from "bun:test"; import "@testing-library/jest-dom"; import { render, screen } from "@testing-library/react"; import { AuthenticatedLayout } from "./AuthenticatedLayout"; describe("AuthenticatedLayout", () => { - beforeEach(() => { - mock.restore(); - }); - it("should render child routes via Outlet", async () => { render( { expect(screen.getByText("Nested Content")).toBeInTheDocument(); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/components/ContextMenu/ContextMenuItems.test.tsx b/packages/web/src/components/ContextMenu/ContextMenuItems.test.tsx index 8050218d0..13fb8d9a8 100644 --- a/packages/web/src/components/ContextMenu/ContextMenuItems.test.tsx +++ b/packages/web/src/components/ContextMenu/ContextMenuItems.test.tsx @@ -1,6 +1,8 @@ +import { configureStore } from "@reduxjs/toolkit"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { type ReactElement } from "react"; +import { Provider } from "react-redux"; import { ThemeProvider } from "styled-components"; import { createMockStandaloneEvent } from "@core/util/test/ccal.event.factory"; import { @@ -10,7 +12,8 @@ import { import { theme } from "@web/common/styles/theme"; import { type Schema_GridEvent } from "@web/common/types/web.event.types"; import { gridEventDefaultPosition } from "@web/common/utils/event/event.util"; -import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test"; +import { reducers } from "@web/store/reducers"; +import { beforeEach, describe, expect, it, mock } from "bun:test"; const mockClose = mock(); const mockOpenForm = mock(); @@ -71,17 +74,27 @@ const createStateWithPendingEvents = ( let currentState = createStateWithPendingEvents(); currentState.auth.status = "authenticating"; -mock.module("@web/store/store.hooks", () => ({ - useAppDispatch: () => mock(), - useAppSelector: (selector: (state: InitialReduxState) => unknown) => - selector(currentState), -})); - const { ContextMenuItems } = require("./ContextMenuItems") as typeof import("./ContextMenuItems"); -const renderWithTheme = (ui: ReactElement) => - render({ui}); +const renderWithTheme = (ui: ReactElement) => { + const store = configureStore({ + preloadedState: currentState, + reducer: reducers, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware({ + immutableCheck: false, + serializableCheck: false, + thunk: false, + }), + }); + + return render( + + {ui} + , + ); +}; describe("ContextMenuItems", () => { beforeEach(() => { @@ -231,7 +244,3 @@ describe("ContextMenuItems", () => { expect(mockClose).toHaveBeenCalled(); }); }); - -afterAll(() => { - mock.restore(); -}); diff --git a/packages/web/src/components/HeaderInfoIcon/HeaderInfoIcon.test.tsx b/packages/web/src/components/HeaderInfoIcon/HeaderInfoIcon.test.tsx index c2c874e86..294e3071c 100644 --- a/packages/web/src/components/HeaderInfoIcon/HeaderInfoIcon.test.tsx +++ b/packages/web/src/components/HeaderInfoIcon/HeaderInfoIcon.test.tsx @@ -1,4 +1,3 @@ -import type React from "react"; import "@testing-library/jest-dom"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; @@ -9,7 +8,7 @@ import { } from "@web/auth/google/hooks/useConnectGoogle/useConnectGoogle.types"; import { theme } from "@web/common/styles/theme"; import { type AuthView } from "@web/components/AuthModal/hooks/useAuthModal"; -import { afterAll, beforeEach, describe, expect, it, mock } from "bun:test"; +import { beforeEach, describe, expect, it, mock } from "bun:test"; interface MockConnectGoogleResult { commandAction: GoogleUiConfig["commandAction"]; @@ -97,36 +96,54 @@ mock.module("@web/components/AuthModal/hooks/useAuthModal", () => ({ })); mock.module("@phosphor-icons/react", () => ({ + ArrowCounterClockwise: () =>