72 lines
2.6 KiB
TypeScript
72 lines
2.6 KiB
TypeScript
import { afterEach, describe, expect, test } from "bun:test";
|
|
import { clearModelCache, resolveModelPattern } from "../src/core/tools/task/model-resolver";
|
|
|
|
describe("task/model-resolver: resolveModelPattern", () => {
|
|
afterEach(() => {
|
|
clearModelCache();
|
|
});
|
|
|
|
describe("provider-specific matching", () => {
|
|
const models = ["cerebras/zai-glm-4.7", "zai/glm-4.7", "anthropic/claude-sonnet"];
|
|
|
|
test("exact full match with provider prefix", async () => {
|
|
const result = await resolveModelPattern("zai/glm-4.7", models);
|
|
expect(result).toBe("zai/glm-4.7");
|
|
});
|
|
|
|
test("explicit provider should not cross provider boundaries", async () => {
|
|
const modelsWithoutZai = ["cerebras/zai-glm-4.7", "zai/glm-4.6"];
|
|
const result = await resolveModelPattern("zai/glm-4.7", modelsWithoutZai);
|
|
expect(result).toBeUndefined();
|
|
});
|
|
|
|
test("fuzzy match within explicit provider", async () => {
|
|
const modelsWithSuffix = ["cerebras/zai-glm-4.7-preview", "zai/glm-4.7-beta"];
|
|
const result = await resolveModelPattern("zai/glm-4.7", modelsWithSuffix);
|
|
expect(result).toBe("zai/glm-4.7-beta");
|
|
});
|
|
|
|
test("exact ID match without provider", async () => {
|
|
const result = await resolveModelPattern("glm-4.7", models);
|
|
expect(result).toBe("zai/glm-4.7");
|
|
});
|
|
|
|
test("fuzzy match without provider uses general fallback", async () => {
|
|
const modelsNoExact = ["cerebras/zai-glm-4.7", "anthropic/claude-sonnet"];
|
|
const result = await resolveModelPattern("glm", modelsNoExact);
|
|
expect(result).toBe("cerebras/zai-glm-4.7");
|
|
});
|
|
});
|
|
|
|
describe("comma-separated patterns (fallback chain)", () => {
|
|
test("first pattern fails, second succeeds", async () => {
|
|
const models = ["cerebras/zai-glm-4.7", "anthropic/claude-sonnet"];
|
|
const result = await resolveModelPattern("zai/glm-4.6, glm", models);
|
|
expect(result).toBe("cerebras/zai-glm-4.7");
|
|
});
|
|
|
|
test("first pattern succeeds, second ignored", async () => {
|
|
const models = ["zai/glm-4.7", "cerebras/zai-glm-4.7"];
|
|
const result = await resolveModelPattern("zai/glm-4.7, cerebras/zai-glm-4.7", models);
|
|
expect(result).toBe("zai/glm-4.7");
|
|
});
|
|
});
|
|
|
|
describe("edge cases", () => {
|
|
test("default returns undefined", async () => {
|
|
const result = await resolveModelPattern("default", ["zai/glm-4.7"]);
|
|
expect(result).toBeUndefined();
|
|
});
|
|
|
|
test("undefined returns undefined", async () => {
|
|
const result = await resolveModelPattern(undefined, ["zai/glm-4.7"]);
|
|
expect(result).toBeUndefined();
|
|
});
|
|
|
|
test("empty models list returns pattern as-is", async () => {
|
|
const result = await resolveModelPattern("zai/glm-4.7", []);
|
|
expect(result).toBe("zai/glm-4.7");
|
|
});
|
|
});
|
|
});
|