import { describe, expect, it, vi } from "vitest"; import { fetchOpenAiModelCatalog, normalizeBaseUrl, toModelCatalog, } from "../src/lib/providers.js"; describe("provider utilities", () => { it("normalizes base URLs by trimming whitespace and trailing slashes", () => { expect(normalizeBaseUrl(" https://example.test/v1/ ")).toBe("https://example.test/v1"); }); it("dedupes and sorts fetched model entries", () => { expect( toModelCatalog([ { id: "gpt-5.4" }, { id: "gpt-5.3-mini", name: "GPT-5.3 Mini" }, { id: "gpt-5.4", name: "Duplicate" }, { id: " " }, ]), ).toEqual([ { id: "gpt-5.3-mini", label: "GPT-5.3 Mini", raw: { id: "gpt-5.3-mini", name: "GPT-5.3 Mini" } }, { id: "gpt-5.4", label: "gpt-5.4", raw: { id: "gpt-5.4" } }, ]); }); it("fetches the openai-compatible model catalog with bearer auth", async () => { const fetchMock = vi.fn(async (_url, _init) => ({ ok: true, json: async () => ({ data: [ { id: "gpt-5.4" }, { id: "gpt-5.3-codex", name: "GPT-5.3 Codex" }, ], }), } as Response)); const result = await fetchOpenAiModelCatalog(fetchMock, { baseUrl: "https://example.test/v1/", apiKey: "sk-provider", }); expect(fetchMock).toHaveBeenCalledWith( "https://example.test/v1/models", expect.objectContaining({ headers: { Authorization: "Bearer sk-provider", }, }), ); expect(result).toEqual({ baseUrl: "https://example.test/v1", modelCatalog: [ { id: "gpt-5.3-codex", label: "GPT-5.3 Codex", raw: { id: "gpt-5.3-codex", name: "GPT-5.3 Codex" } }, { id: "gpt-5.4", label: "gpt-5.4", raw: { id: "gpt-5.4" } }, ], }); }); });