From c0fad7c934075721478dbf3c1a5ce372c5f9a401 Mon Sep 17 00:00:00 2001 From: "s.chlaifa" Date: Fri, 21 Aug 2026 10:54:59 +0200 Subject: [PATCH 1/5] 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 }) From eae68338377824657bf42a6ab19a7c64c60453d6 Mon Sep 17 00:00:00 2001 From: "s.chlaifa" Date: Thu, 20 Aug 2026 14:11:24 +0200 Subject: [PATCH 2/5] (med-112) correction retoyr page faq --- CHANGELOG.md | 3 +++ src/pages/faq.js | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27e5822..4ed0596 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ ## [1.39.0](https://github.com/DNUM-SocialGouv/Medle/compare/release-1.38.0...release-1.39.0) (TODO) ### Feature +* MED-112: Correction retours page FAQ + + ## [1.38.0](https://github.com/DNUM-SocialGouv/Medle/compare/release-1.37.0...release-1.38.0) (2026-07-31) ### Feature diff --git a/src/pages/faq.js b/src/pages/faq.js index feaae31..160c2cd 100644 --- a/src/pages/faq.js +++ b/src/pages/faq.js @@ -118,7 +118,7 @@ const FaqPage = () => {

Dois-je enregistrer la prise en charge psychologique ?

La prise en charge psychologique des victimes, telle que prévue dans le cadre du schéma directeur et qui est financée par l’assurance maladie à hauteur d’un équivalent temps plein (ETP) par structure de médecine légale du vivant, ne fait pas l’objet d’un recensement dans MedLé.

-

Victime : précisions sur la rubrique «Types de violence» (sous-rubriques «Nature» et «Contexte»)

+

Victime : précisions sur la rubrique «Types de violence» (sous-rubriques «Nature» et «Contexte»)

Pour les victimes, le type de violence doit être précisé pour chaque acte. Plusieurs choix sont possibles, vous pouvez donc cocher plusieurs cases à la fois dans «nature de la violence» et dans «contexte de la violence».

Voici quelques précisions concernant les items listés dans la rubrique «Types de violence» :