Files
nexarch/web/task-board/app/api/tasks/route.test.ts
T
patrickandClaude Sonnet 5 ee6376162d
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
TSK-04: aufgaben-oberflaeche
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-16 19:19:55 +00:00

56 lines
2.1 KiB
TypeScript

import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { NextRequest } from "next/server";
import { GET } from "./route";
describe("GET /api/tasks", () => {
const originalFetch = global.fetch;
const originalEnv = process.env.TASK_BOARD_API_URL;
beforeEach(() => {
process.env.TASK_BOARD_API_URL = "http://backend-mandant-a.local";
});
afterEach(() => {
global.fetch = originalFetch;
process.env.TASK_BOARD_API_URL = originalEnv;
});
it("liefert 400 ohne userId", async () => {
const req = new NextRequest("http://localhost/api/tasks");
const res = await GET(req);
expect(res.status).toBe(400);
});
it("ruft ausschliesslich das konfigurierte Backend auf und reicht die Antwort durch", async () => {
let capturedURL = "";
let capturedHeaders: Headers | undefined;
global.fetch = vi.fn(async (url: string | URL, init?: RequestInit) => {
capturedURL = url.toString();
capturedHeaders = new Headers(init?.headers);
return new Response(JSON.stringify([{ ID: "1", Title: "x" }]), { status: 200 });
}) as typeof fetch;
const req = new NextRequest("http://localhost/api/tasks?userId=alice");
const res = await GET(req);
expect(res.status).toBe(200);
expect(capturedURL).toBe("http://backend-mandant-a.local/tasks");
expect(capturedHeaders?.get("X-User-Id")).toBe("alice");
});
// AK5: ein Client-seitiger Mandanten-Parameter darf die Zielinstanz
// nicht umlenken -- die Route liest nur 'userId' aus der Anfrage, der
// Mandant ist durch TASK_BOARD_API_URL beim Deployment fest gebunden.
it("ignoriert einen client-seitigen Mandanten-Parameter, Ziel bleibt das konfigurierte Backend", async () => {
let capturedURL = "";
global.fetch = vi.fn(async (url: string | URL) => {
capturedURL = url.toString();
return new Response(JSON.stringify([]), { status: 200 });
}) as typeof fetch;
const req = new NextRequest("http://localhost/api/tasks?userId=alice&tenant=mandant-b&mandant=mandant-b");
await GET(req);
expect(capturedURL).toBe("http://backend-mandant-a.local/tasks");
});
});