import { describe, expect, it } from "vitest"; import { emptyAiProviderForm } from "../contracts/aiProviders"; import { aiProviderCreateRequestFromForm, aiProviderUpdateRequestFromForm } from "./aiProviders"; describe("ai provider form schemas", () => { it("generates provider IDs and defaults for normal OpenAI setup", () => { const request = aiProviderCreateRequestFromForm({ ...emptyAiProviderForm(), id: "", apiKeyRef: "secret://providers/openai" }); expect(request).toMatchObject({ id: "ai.openai", name: "OpenAI", kind: "openai", baseUrl: "https://api.openai.com/v1", apiKeyRef: "secret://providers/openai", defaultModel: "gpt-5.6-terra", relayMode: "relay" }); expect(request.models).toContain("gpt-5.6-terra"); }); it("keeps Ollama local mode keyless while still providing required metadata", () => { const request = aiProviderUpdateRequestFromForm({ ...emptyAiProviderForm(), kind: "ollama", name: "", baseUrl: "", apiKeyRef: "", modelsText: "", defaultModel: "", relayMode: "local" }); expect(request).toMatchObject({ name: "Ollama Local", kind: "ollama", baseUrl: "http://127.0.0.1:11434/v1", apiKeyRef: "", defaultModel: "gpt-oss:20b", relayMode: "local" }); expect(request.models).toEqual(["gpt-oss:20b"]); }); it("keeps an existing configured secret opaque during edits", () => { const request = aiProviderUpdateRequestFromForm({ ...emptyAiProviderForm(), id: "ai.openai", apiKeyRef: "", apiKeyConfigured: true }); expect(request.apiKeyRef).toBe(""); expect(JSON.stringify(request)).not.toContain("secret://providers/openai"); }); });