import * as appHooks from "@/app/hooks"; import { AppDispatch, setupStore } from "@/app/store"; import HandleLogin from "@/features/User/HandleLogin"; import * as oidcAuth from "@/features/User/oidcAuth"; import { clientConfig } from "@/features/User/oidcAuth"; import { useInitializeApp } from "@/features/User/useInitializeApp"; import * as apiUtils from "@/utils/apiUtils"; import { renderHook, screen, waitFor } from "@testing-library/react"; import { Provider } from "react-redux"; import { push } from "redux-first-history"; import { renderWithProviders } from "../../utils/Renderwithproviders"; clientConfig.url = "https://example.com"; describe("HandleLogin", () => { beforeEach(() => { jest.clearAllMocks(); jest.spyOn(apiUtils, "redirectTo").mockImplementation(() => {}); const dispatch = jest.fn() as AppDispatch; jest.spyOn(appHooks, "useAppDispatch").mockReturnValue(dispatch); sessionStorage.clear(); Object.defineProperty(window, "matchMedia", { writable: true, value: jest.fn().mockImplementation((query) => ({ matches: false, media: query, onchange: null, addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: jest.fn(), })), }); }); test("redirects and sets sessionStorage when no userData", async () => { const loginUrlMock = { code_verifier: "verifier123", state: "state123", redirectTo: new URL("http://login.url"), }; jest.spyOn(oidcAuth, "Auth").mockResolvedValue(loginUrlMock); const { result } = renderHook(() => useInitializeApp(), { wrapper: ({ children }) => ( {children} ), }); await waitFor( () => { expect(oidcAuth.Auth).toHaveBeenCalled(); }, { timeout: 3000 } ); await waitFor( () => { expect(sessionStorage.getItem("redirectState")).toEqual( JSON.stringify({ code_verifier: "verifier123", state: "state123", }) ); }, { timeout: 3000 } ); await waitFor( () => { expect(apiUtils.redirectTo).toHaveBeenCalledWith( loginUrlMock.redirectTo ); }, { timeout: 3000 } ); }); test("does not render loading element when userData exists and calendars pending is true", () => { const preloadedState = { user: { userData: { sub: "test", email: "test@test.com", sid: "aiYbWZSk2g0F+LrQeD7Dg4QcUMR8R/zTZdZBiA7N6Ro", openpaasId: "667037022b752d0026472254", }, tokens: { access_token: "test" }, loading: false, }, calendars: { list: {}, pending: true }, loading: { isLoading: true }, }; renderWithProviders(, preloadedState); // HandleLogin now returns null, loading is shown at App level via appLoading state expect(screen.queryByTestId("loading")).not.toBeInTheDocument(); }); test("does not render loading element when userData exists and calendars pending is false", () => { const preloadedState = { user: { userData: { sub: "cmoussu", email: "cmoussu@linagora.com", sid: "aiYbWZSk2g0F+LrQeD7Dg4QcUMR8R/zTZdZBiA7N6Ro", openpaasId: "667037022b752d0026472254", }, tokens: { access_token: "test" }, loading: false, }, calendars: { list: {}, pending: false }, loading: { isLoading: false }, }; renderWithProviders(, preloadedState); // HandleLogin now returns null, loading is shown at App level via appLoading state expect(screen.queryByTestId("loading")).not.toBeInTheDocument(); }); test("goes to error page when there is error in user data", async () => { const mockDispatch = jest.fn(); jest.spyOn(appHooks, "useAppDispatch").mockReturnValue(mockDispatch); jest.spyOn(oidcAuth, "Auth").mockResolvedValue({ code_verifier: "verifier123", state: "state123", redirectTo: new URL("http://login.url"), }); renderWithProviders(, { user: { error: true, loading: false, userData: { sub: "test", email: "test@test.com", sid: "testSid", openpaasId: "testId", }, tokens: { access_token: "test" }, }, calendars: { list: {}, pending: false, error: null, }, }); await waitFor( () => { expect(mockDispatch).toHaveBeenCalledWith(push("/error")); }, { timeout: 3000 } ); }); });