| 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<typeof fetch>(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" } }, |
| ], |
| }); |
| }); |
| }); |
|
|