import { describe, expect, it } from "vite-plus/test"; import { ProviderInstanceId, type ServerConfig } from "@t3tools/contracts"; import { buildModelMenuActions, buildModelOptions, groupByProvider, resolveSelectableModelSelection, } from "./modelOptions"; describe("mobile model options", () => { it("folds legacy models into a provider-scoped menu", () => { const config = { providers: [ { instanceId: "codex", driver: "codex", displayName: "Codex", enabled: true, installed: true, auth: { status: "authenticated" }, models: [ { slug: "gpt-5.6-sol", name: "GPT-5.6 Sol", isCustom: false, capabilities: null, }, { slug: "gpt-5.4", name: "GPT-5.4", isCustom: false, isLegacy: true, capabilities: null, }, ], }, ], } as unknown as ServerConfig; const actions = buildModelMenuActions(groupByProvider(buildModelOptions(config, null)), null); expect(actions).toMatchObject([ { title: "Codex", subactions: [{ id: "model:codex:gpt-5.6-sol", title: "GPT-5.6 Sol" }], }, { id: "legacy-models:codex", title: "Codex legacy models", subactions: [{ id: "model:codex:gpt-5.4", title: "GPT-5.4" }], }, ]); }); it("omits an empty provider menu when every model is legacy", () => { const config = { providers: [ { instanceId: "codex", driver: "codex", displayName: "Codex", enabled: true, installed: true, auth: { status: "authenticated" }, models: [ { slug: "gpt-5.4", name: "GPT-5.4", isCustom: false, isLegacy: true, capabilities: null, }, ], }, ], } as unknown as ServerConfig; expect( buildModelMenuActions(groupByProvider(buildModelOptions(config, null)), null), ).toMatchObject([ { id: "legacy-models:codex", title: "Codex legacy models", subactions: [{ id: "model:codex:gpt-5.4" }], }, ]); }); it("normalizes a legacy fallback selection against current capabilities", () => { const config = { providers: [ { instanceId: "codex", driver: "codex", displayName: "Codex", enabled: true, installed: true, auth: { status: "authenticated" }, models: [ { slug: "gpt-test", name: "GPT Test", isCustom: false, capabilities: { optionDescriptors: [ { id: "serviceTier", label: "Service Tier", type: "select", options: [ { id: "default", label: "Standard", isDefault: true }, { id: "priority", label: "Fast" }, ], currentValue: "default", }, ], }, }, ], }, ], } as unknown as ServerConfig; const [option] = buildModelOptions(config, { instanceId: ProviderInstanceId.make("codex"), model: "gpt-test", options: [{ id: "fastMode", value: true }], }); expect(option?.capabilities?.optionDescriptors?.[0]?.id).toBe("serviceTier"); expect(option?.selection.options).toEqual([{ id: "serviceTier", value: "default" }]); }); it("rejects stored selections whose provider is not usable", () => { const config = { providers: [ { instanceId: "codex", driver: "codex", enabled: true, installed: true, auth: { status: "authenticated" }, models: [], }, { instanceId: "claudeAgent", driver: "claudeAgent", enabled: false, installed: true, auth: { status: "authenticated" }, models: [], }, ], } as unknown as ServerConfig; const usable = { instanceId: ProviderInstanceId.make("codex"), model: "gpt-5.6-sol", }; const disabled = { instanceId: ProviderInstanceId.make("claudeAgent"), model: "claude-sonnet-5", }; const removed = { instanceId: ProviderInstanceId.make("codex_personal"), model: "gpt-5.6-sol", }; expect(resolveSelectableModelSelection(config, usable)).toBe(usable); expect(resolveSelectableModelSelection(config, disabled)).toBeNull(); expect(resolveSelectableModelSelection(config, removed)).toBeNull(); // No config (environment offline) — nothing to validate against. expect(resolveSelectableModelSelection(null, disabled)).toBe(disabled); }); });