full upgrade to dev

This commit is contained in:
2026-01-08 11:40:42 +01:00
parent 7320a0562d
commit 41f404c581
4 changed files with 48 additions and 28 deletions

View File

@@ -1,12 +1,38 @@
jest.mock("next/server", () => ({
NextResponse: jest.fn().mockImplementation(function (body, init) {
// Use function and assign to `this` so `new NextResponse(...)` returns an instance with properties
jest.mock("next/server", () => {
const mockNextResponse = function (
body: string | object,
init?: { headers?: Record<string, string> },
) {
// Return an object that mimics NextResponse
const mockResponse = {
body,
init,
text: async () => {
if (typeof body === "string") {
return body;
} else if (body && typeof body === "object") {
return JSON.stringify(body);
}
return "";
},
json: async () => {
if (typeof body === "object") {
return body;
}
try {
return JSON.parse(body as string);
} catch {
return {};
}
},
};
return mockResponse;
};
this.body = body;
this.init = init;
}),
}));
return {
NextResponse: mockNextResponse,
};
});
import { GET } from "@/app/api/sitemap/route";
@@ -81,18 +107,19 @@ describe("GET /api/sitemap", () => {
it("should return a sitemap", async () => {
const response = await GET();
expect(response.body).toContain(
// Get the body text from the NextResponse
const body = await response.text();
expect(body).toContain(
'<urlset xmlns="https://www.sitemaps.org/schemas/sitemap/0.9">',
);
expect(response.body).toContain("<loc>https://dki.one/</loc>");
expect(response.body).toContain("<loc>https://dki.one/legal-notice</loc>");
expect(response.body).toContain(
"<loc>https://dki.one/privacy-policy</loc>",
);
expect(response.body).toContain(
expect(body).toContain("<loc>https://dki.one/</loc>");
expect(body).toContain("<loc>https://dki.one/legal-notice</loc>");
expect(body).toContain("<loc>https://dki.one/privacy-policy</loc>");
expect(body).toContain(
"<loc>https://dki.one/projects/just-doing-some-testing</loc>",
);
expect(response.body).toContain(
expect(body).toContain(
"<loc>https://dki.one/projects/blockchain-based-voting-system</loc>",
);
// Note: Headers are not available in test environment

View File

@@ -1,5 +1,4 @@
import { NextResponse } from "next/server";
import http from "http";
import NodeCache from "node-cache";
// Use a dynamic import for node-fetch so tests that mock it (via jest.mock) are respected
@@ -9,7 +8,7 @@ async function getFetch() {
// support both CJS and ESM interop
return (mod as { default: unknown }).default ?? mod;
} catch (_err) {
return (globalThis as unknown as { fetch: unknown }).fetch;
return globalThis.fetch;
}
}
@@ -45,11 +44,9 @@ export async function GET() {
}
try {
const agent = new http.Agent({ keepAlive: true });
const fetchFn = await getFetch();
const response = await fetchFn(
const response = await (fetchFn as unknown as typeof fetch)(
`${GHOST_API_URL}/ghost/api/content/posts/?key=${GHOST_API_KEY}&limit=all`,
{ agent: agent as unknown as undefined },
);
const posts: GhostPostsResponse =
(await response.json()) as GhostPostsResponse;

View File

@@ -81,10 +81,9 @@ export async function GET() {
// For tests return a plain object so tests can inspect `.body` easily
if (process.env.NODE_ENV === "test") {
return {
body: xml,
return new NextResponse(xml, {
headers: { "Content-Type": "application/xml" },
};
});
}
return new NextResponse(xml, {
@@ -115,7 +114,7 @@ export async function GET() {
try {
const mod = await import("node-fetch");
const nodeFetch = mod.default ?? mod;
response = await nodeFetch(
response = await (nodeFetch as unknown as typeof fetch)(
`${process.env.GHOST_API_URL}/ghost/api/content/posts/?key=${process.env.GHOST_API_KEY}&limit=all`,
);
} catch (err) {

View File

@@ -4,9 +4,6 @@ import React from "react";
import { render } from "@testing-library/react";
import { ToastProvider } from "@/components/Toast";
// Set test environment
process.env.NODE_ENV = "test";
// Mock Next.js router
jest.mock("next/navigation", () => ({
useRouter() {