Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 36 additions & 13 deletions src/__tests__/unit/pages/forgot-password.spec.js
Original file line number Diff line number Diff line change
@@ -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 }

Expand All @@ -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 = {
Expand All @@ -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
})
Expand Down
67 changes: 42 additions & 25 deletions src/__tests__/unit/pages/reset-password.spec.js
Original file line number Diff line number Diff line change
@@ -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"

Expand All @@ -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 }

Expand All @@ -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 = {
Expand All @@ -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
})
Expand Down
Loading