import { describe, expect, it, vi } from "vitest"; const mockSynthesize = vi.fn(); vi.mock("@/lib/graph/investigation-overview-synthesis.js", () => ({ synthesizeInvestigationOverview: (...args) => mockSynthesize(...args), })); vi.mock("@/lib/llm/provider.js", () => ({ getProvider: () => ({ generateReconstruction() {} }), getProviderModelName: () => "gpt-5.6-terra", })); vi.mock("@/lib/supabase/api-auth.js", () => ({ withAuthenticatedApi: (handler) => handler, })); describe("POST /api/cases/overview provider routing", () => { beforeEach(() => mockSynthesize.mockClear()); it("passes the central provider and model resolution to overview synthesis", async () => { mockSynthesize.mockResolvedValue({ understanding: "Understanding", plausibleInterpretations: "None" }); const { POST } = await import("@/app/api/cases/overview/route.js"); const response = await POST(new Request("http://localhost/api/cases/overview", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ situationGraph: { nodes: [], edges: [] }, findings: [], plausibleInterpretations: [] }), })); expect(response.status).toBe(200); expect(mockSynthesize.mock.calls[0][1]).toMatchObject({ modelName: "gpt-5.6-terra" }); }); it("sanitizes provider failure details", async () => { const error = Object.assign( new Error("Ollama /api/generate returned 500 from private host"), { statusCode: 502 }, ); mockSynthesize.mockImplementationOnce(async () => { throw error; }); const { POST } = await import("@/app/api/cases/overview/route.js"); const response = await POST(new Request("http://localhost/api/cases/overview", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ situationGraph: { nodes: [], edges: [] } }), })); expect(response.status).toBe(502); const rawData = await response.text(); const data = JSON.parse(rawData); expect(data.success).toBe(false); expect(data.stage).toBe("provider"); expect(data).toEqual({ success: false, stage: "provider", error: "Reasoning request could not be completed.", }); // Prove raw provider diagnostics are NOT exposed at the route boundary expect(rawData).not.toContain(error.message); }); });