import { describe, expect, it, vi } from "vitest"; import { ENV } from "./env"; import { invokeSelectedReference } from "./aiReferenceClient"; const recommendation = { application: { slug: "veille-reglementaire" }, decision: { selected: { origin: "manual", engine: { slug: "manus-forge", name: "Manus Forge", provider: "Manus" }, connection: { configured: true, model: "gemini-2.5-flash" }, }, }, }; describe("client Référentiel IA", () => { it("résout le moteur du Référentiel puis transmet son slug exact", async () => { ENV.aiReferentielUrl = "https://referentiel-ia-santinova.recette.santinova-soft.org"; ENV.aiReferentielToken = "token-de-test"; ENV.aiReferentielAppSlug = "veille-reglementaire"; const fetcher = vi.fn() .mockResolvedValueOnce(new Response(JSON.stringify(recommendation), { status: 200 })) .mockResolvedValueOnce(new Response(JSON.stringify({ choices: [] }), { status: 200, headers: { "x-santinova-ia-provider": "Manus", "x-santinova-ia-model": "gemini-2.5-flash", "x-santinova-ia-transport": "manus-forge", "x-santinova-ia-origin": "manual", }, })); const response = await invokeSelectedReference<{ choices: unknown[] }>({ messages: [{ role: "user", content: "test" }] }, fetcher as typeof fetch); expect(response.choices).toEqual([]); expect(fetcher).toHaveBeenCalledTimes(2); const [, invokeOptions] = fetcher.mock.calls[1] as [string, RequestInit]; expect(JSON.parse(String(invokeOptions.body))).toEqual({ engineSlug: "manus-forge", payload: { messages: [{ role: "user", content: "test" }] }, }); }); it("refuse une décision rattachée à une autre application", async () => { ENV.aiReferentielUrl = "https://referentiel-ia-santinova.recette.santinova-soft.org"; ENV.aiReferentielToken = "token-de-test"; ENV.aiReferentielAppSlug = "veille-reglementaire"; const fetcher = vi.fn().mockResolvedValue(new Response(JSON.stringify({ ...recommendation, application: { slug: "autre-app" } }), { status: 200 })); await expect(invokeSelectedReference({ messages: [] }, fetcher as typeof fetch)).rejects.toThrow("application attendue"); }); });