From c0fad7c934075721478dbf3c1a5ce372c5f9a401 Mon Sep 17 00:00:00 2001 From: "s.chlaifa" Date: Fri, 21 Aug 2026 10:54:59 +0200 Subject: [PATCH] fix unit tests --- .../unit/pages/forgot-password.spec.js | 49 ++++++++++---- .../unit/pages/reset-password.spec.js | 67 ++++++++++++------- 2 files changed, 78 insertions(+), 38 deletions(-) diff --git a/src/__tests__/unit/pages/forgot-password.spec.js b/src/__tests__/unit/pages/forgot-password.spec.js index 99e5631..9fce46c 100644 --- a/src/__tests__/unit/pages/forgot-password.spec.js +++ b/src/__tests__/unit/pages/forgot-password.spec.js @@ -1,13 +1,15 @@ import { render, screen, waitFor } from "@testing-library/react" import userEvent from "@testing-library/user-event" import faker from "faker" -import { rest } from "msw" -import { setupServer } from "msw/node" import React from "react" import { API_URL, FORGOT_PWD_ENDPOINT } from "../../../config" import ForgotPasswordPage from "../../../pages/forgot-password" +// Mock isomorphic-unfetch before importing components +jest.mock("isomorphic-unfetch") +import fetch from "isomorphic-unfetch" + const originalWindow = { ...window } const originalConsoleError = { ...console.error } @@ -16,17 +18,40 @@ const foundEmail = "xx" + notFoundEmail // Ensure to have consistently a differe const url = `${API_URL}${FORGOT_PWD_ENDPOINT}` -const server = setupServer( - rest.post(url, (req, res, ctx) => { - if (req.body?.email === notFoundEmail) { - return res(ctx.status(404), ctx.json({ message: `User with email ${notFoundEmail} doesn't exist.`, status: 404 })) +// Setup fetch mock +fetch.mockImplementation((fetchUrl, options) => { + if (fetchUrl === url && options?.method === "POST") { + let body = {} + try { + body = typeof options.body === 'string' ? JSON.parse(options.body) : options.body + } catch (e) { + // If body parsing fails, treat as empty + } + + if (body?.email === notFoundEmail) { + return Promise.resolve({ + ok: false, + status: 404, + json: () => Promise.resolve({ message: `User with email ${notFoundEmail} doesn't exist.`, status: 404 }), + }) } - return res(ctx.status(200), ctx.json({})) - }), -) + + return Promise.resolve({ + ok: true, + status: 200, + json: () => Promise.resolve({}), + }) + } + + // Default response for other requests + return Promise.resolve({ + ok: true, + status: 200, + json: () => Promise.resolve({}), + }) +}) beforeAll(() => { - server.listen() // Disable window._paq.push used by Matomo. if (!window?._paq?.push) { window._paq = { @@ -37,13 +62,11 @@ beforeAll(() => { }) afterEach(() => { - server.resetHandlers() jest.clearAllMocks() }) afterAll(() => { - server.close() - // eslint-disable-next-line no-global-assign + window = originalWindow console.error = originalConsoleError }) diff --git a/src/__tests__/unit/pages/reset-password.spec.js b/src/__tests__/unit/pages/reset-password.spec.js index b3b2842..c6946a2 100644 --- a/src/__tests__/unit/pages/reset-password.spec.js +++ b/src/__tests__/unit/pages/reset-password.spec.js @@ -1,8 +1,6 @@ import { render, screen, waitFor } from "@testing-library/react" import userEvent from "@testing-library/user-event" import faker from "faker" -import { rest } from "msw" -import { setupServer } from "msw/node" import * as nextRouter from "next/router" import React from "react" @@ -11,6 +9,10 @@ import ResetPasswordPage from "../../../pages/reset-password" import { generateToken } from "../../../utils/jwt" import { mockRouterImplementation } from "../../../utils/test-utils" +// Mock isomorphic-unfetch before importing components +jest.mock("isomorphic-unfetch") +import fetch from "isomorphic-unfetch" + const originalWindow = { ...window } const originalConsoleError = { ...console.error } @@ -20,31 +22,47 @@ const user = { email: faker.internet.email() } const correctLoginToken = generateToken(user, { timeout: "1H" }) const incorrectLoginToken = generateToken(user, { timeout: "100ms" }) // Token only valid for 100 ms. -beforeAll(() => { - /* eslint-disable no-import-assign*/ - nextRouter.useRouter.mockImplementation(() => ({ - ...mockRouterImplementation, - query: { loginToken: correctLoginToken }, - })) -}) - -afterAll(() => { - nextRouter.useRouter.mockRestore() -}) - const url = `${API_URL}${RESET_PWD_ENDPOINT}` -const server = setupServer( - rest.patch(url, (req, res, ctx) => { - if (req.body?.loginToken === correctLoginToken) { - return res(ctx.status(200), ctx.json({})) +// Setup fetch mock +fetch.mockImplementation((fetchUrl, options) => { + if (fetchUrl === url && options?.method === "PATCH") { + let body = {} + try { + body = typeof options.body === 'string' ? JSON.parse(options.body) : options.body + } catch (e) { + // If body parsing fails, treat as empty + } + + if (body?.loginToken === correctLoginToken) { + return Promise.resolve({ + ok: true, + status: 200, + json: () => Promise.resolve({}), + }) } - return res(ctx.status(500)) - }), -) + + return Promise.resolve({ + ok: false, + status: 500, + json: () => Promise.resolve({}), + }) + } + + // Default response for other requests + return Promise.resolve({ + ok: true, + status: 200, + json: () => Promise.resolve({}), + }) +}) beforeAll(() => { - server.listen() + + nextRouter.useRouter.mockImplementation(() => ({ + ...mockRouterImplementation, + query: { loginToken: correctLoginToken }, + })) // Disable window._paq.push used by Matomo. if (!window?._paq?.push) { window._paq = { @@ -55,13 +73,12 @@ beforeAll(() => { }) afterEach(() => { - server.resetHandlers() jest.clearAllMocks() }) afterAll(() => { - server.close() - // eslint-disable-next-line no-global-assign + nextRouter.useRouter.mockRestore() + window = originalWindow console.error = originalConsoleError })