import { describe, expect, it } from "vite-plus/test"; import { ProviderInstanceId, type ProviderOptionSelection } from "@t3tools/contracts"; import type { ModelOption } from "../../lib/modelOptions"; import { modelMatchesCatalogQuery, pendingModelAfterPress } from "./thread-settings-sheet-state"; function modelOption( model: string, options: ReadonlyArray = [], ): ModelOption { return { key: `codex:${model}`, label: model, subtitle: "", providerKey: "codex", providerLabel: "Codex", providerDriver: "codex", isDefault: false, isLegacy: false, capabilities: null, selection: { instanceId: ProviderInstanceId.make("codex"), model, options, }, }; } describe("thread settings sheet state", () => { it("matches visible model and provider terms", () => { const model = modelOption("gpt-next"); expect(modelMatchesCatalogQuery({ model, providerLabel: "Codex", query: "NEXT" })).toBe(true); expect(modelMatchesCatalogQuery({ model, providerLabel: "Codex", query: "codex" })).toBe(true); expect(modelMatchesCatalogQuery({ model, providerLabel: "Codex", query: "claude" })).toBe( false, ); }); it("treats whitespace-only catalog searches as empty", () => { expect( modelMatchesCatalogQuery({ model: modelOption("gpt-next"), providerLabel: "Codex", query: " ", }), ).toBe(true); }); it("matches the upstream provider's display name", () => { const model = { ...modelOption("opencode/claude-fable-5"), label: "Claude Fable 5", subtitle: "OpenCode Zen", }; expect(modelMatchesCatalogQuery({ model, providerLabel: "OpenCode", query: " ZEN " })).toBe( true, ); expect(modelMatchesCatalogQuery({ model, providerLabel: "OpenCode", query: "copilot" })).toBe( false, ); }); it("clears staging when the applied model is pressed", () => { expect( pendingModelAfterPress({ current: modelOption("gpt-next"), pressed: modelOption("gpt-current"), pressedIsApplied: true, }), ).toBeNull(); }); it("preserves staged options when the highlighted model is pressed again", () => { const pending = modelOption("gpt-next", [{ id: "effort", value: "high" }]); expect( pendingModelAfterPress({ current: pending, pressed: modelOption("gpt-next"), pressedIsApplied: false, }), ).toBe(pending); }); it("stages a different model", () => { const pressed = modelOption("gpt-other"); expect( pendingModelAfterPress({ current: modelOption("gpt-next"), pressed, pressedIsApplied: false, }), ).toBe(pressed); }); });