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
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
56 lines
2.1 KiB
TypeScript
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");
|
|
});
|
|
});
|