Search now matches across model label, id, provider, and description with multi-token fuzzy matching, so "kimi zen" finds the OpenCode Zen Kimi model.
91 lines
2.3 KiB
TypeScript
91 lines
2.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { AgentModelDefinition } from "@server/server/agent/agent-sdk-types";
|
|
import {
|
|
buildModelRows,
|
|
buildSelectedTriggerLabel,
|
|
matchesSearch,
|
|
resolveProviderLabel,
|
|
} from "./combined-model-selector.utils";
|
|
|
|
describe("combined model selector helpers", () => {
|
|
const providerDefinitions = [
|
|
{
|
|
id: "claude",
|
|
label: "Claude",
|
|
description: "Claude provider",
|
|
defaultModeId: "default",
|
|
modes: [],
|
|
},
|
|
{
|
|
id: "codex",
|
|
label: "Codex",
|
|
description: "Codex provider",
|
|
defaultModeId: "auto",
|
|
modes: [],
|
|
},
|
|
];
|
|
|
|
const claudeModels: AgentModelDefinition[] = [
|
|
{
|
|
provider: "claude",
|
|
id: "sonnet-4.6",
|
|
label: "Sonnet 4.6",
|
|
},
|
|
];
|
|
|
|
const codexModels: AgentModelDefinition[] = [
|
|
{
|
|
provider: "codex",
|
|
id: "gpt-5.4",
|
|
label: "GPT-5.4",
|
|
},
|
|
];
|
|
|
|
it("keeps enough data to search by model and provider name", async () => {
|
|
const rows = buildModelRows(
|
|
providerDefinitions,
|
|
new Map([
|
|
["claude", claudeModels],
|
|
["codex", codexModels],
|
|
]),
|
|
);
|
|
|
|
expect(rows).toEqual([
|
|
expect.objectContaining({
|
|
providerLabel: "Claude",
|
|
modelLabel: "Sonnet 4.6",
|
|
modelId: "sonnet-4.6",
|
|
}),
|
|
expect.objectContaining({
|
|
providerLabel: "Codex",
|
|
modelLabel: "GPT-5.4",
|
|
modelId: "gpt-5.4",
|
|
}),
|
|
]);
|
|
|
|
expect(matchesSearch(rows[0], "claude")).toBe(true);
|
|
expect(matchesSearch(rows[1], "gpt-5.4")).toBe(true);
|
|
});
|
|
|
|
it("matches across label, provider, and description with multi-token fuzzy search", () => {
|
|
const row = {
|
|
favoriteKey: "opencode:opencode-zen/kimi-k2.5",
|
|
provider: "opencode",
|
|
providerLabel: "OpenCode",
|
|
modelId: "opencode-zen/kimi-k2.5",
|
|
modelLabel: "Kimi K2.5",
|
|
description: "OpenCode Zen - kimi",
|
|
};
|
|
|
|
expect(matchesSearch(row, "kimi zen")).toBe(true);
|
|
expect(matchesSearch(row, "zen kimi")).toBe(true);
|
|
expect(matchesSearch(row, "k2.5 zen")).toBe(true);
|
|
expect(matchesSearch(row, "kimi gemini")).toBe(false);
|
|
});
|
|
|
|
it("keeps the selected trigger label model-only", () => {
|
|
expect(resolveProviderLabel(providerDefinitions, "codex")).toBe("Codex");
|
|
expect(buildSelectedTriggerLabel("GPT-5.4")).toBe("GPT-5.4");
|
|
});
|
|
});
|