99 lines · 2.7 KB · TypeScript
RawDownload
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<ProviderOptionSelection> = [],): 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);  });});