import { describe, expect, it } from "vite-plus/test"; import { ProviderInstanceId, type ServerConfig } from "@t3tools/contracts"; import { buildModelOptions, groupByProvider, resolveDefaultableModelSelection, resolveSelectableModelSelection,} from "./modelOptions"; describe("mobile model options", () => { it("groups models by provider and flags legacy entries", () => { 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; expect(groupByProvider(buildModelOptions(config, null))).toMatchObject([ { providerKey: "codex", providerLabel: "Codex", models: [ { key: "codex:gpt-5.6-sol", label: "GPT-5.6 Sol", isLegacy: false }, { key: "codex:gpt-5.4", label: "GPT-5.4", isLegacy: true }, ], }, ]); }); 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); }); it("keeps legacy models out of implicit defaults", () => { 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 current = { instanceId: ProviderInstanceId.make("codex"), model: "gpt-5.6-sol" }; const legacy = { instanceId: ProviderInstanceId.make("codex"), model: "gpt-5.4" }; expect(resolveDefaultableModelSelection(config, current)).toBe(current); // A legacy last-used selection falls through to the provider default. expect(resolveDefaultableModelSelection(config, legacy)).toBeNull(); // Offline: nothing to validate against, selection passes through. expect(resolveDefaultableModelSelection(null, legacy)).toBe(legacy); });});
import { describe, expect, it } from "vite-plus/test";
import { ProviderInstanceId, type ServerConfig } from "@t3tools/contracts";
import {
buildModelOptions,
groupByProvider,
resolveDefaultableModelSelection,
resolveSelectableModelSelection,
} from "./modelOptions";
describe("mobile model options", () => {
it("groups models by provider and flags legacy entries", () => {
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;
expect(groupByProvider(buildModelOptions(config, null))).toMatchObject([
{
providerKey: "codex",
providerLabel: "Codex",
models: [
{ key: "codex:gpt-5.6-sol", label: "GPT-5.6 Sol", isLegacy: false },
{ key: "codex:gpt-5.4", label: "GPT-5.4", isLegacy: true },
],
},
]);
});
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);
});
it("keeps legacy models out of implicit defaults", () => {
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 current = { instanceId: ProviderInstanceId.make("codex"), model: "gpt-5.6-sol" };
const legacy = { instanceId: ProviderInstanceId.make("codex"), model: "gpt-5.4" };
expect(resolveDefaultableModelSelection(config, current)).toBe(current);
// A legacy last-used selection falls through to the provider default.
expect(resolveDefaultableModelSelection(config, legacy)).toBeNull();
// Offline: nothing to validate against, selection passes through.
expect(resolveDefaultableModelSelection(null, legacy)).toBe(legacy);
});
});