From 0188d6923357ddc2ba1efda9b3158bfd9d8cfd9f Mon Sep 17 00:00:00 2001 From: justsisyphus Date: Fri, 30 Jan 2026 15:11:32 +0900 Subject: [PATCH] test: add requiresModel and isModelAvailable tests --- src/shared/model-availability.test.ts | 37 ++++++++++++++++++++- src/shared/model-requirements.test.ts | 46 +++++++++++++++++++-------- 2 files changed, 68 insertions(+), 15 deletions(-) diff --git a/src/shared/model-availability.test.ts b/src/shared/model-availability.test.ts index 7e893a28..1da92659 100644 --- a/src/shared/model-availability.test.ts +++ b/src/shared/model-availability.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach } from "bun:test" import { mkdtempSync, writeFileSync, rmSync } from "fs" import { tmpdir } from "os" import { join } from "path" -import { fetchAvailableModels, fuzzyMatchModel, getConnectedProviders, __resetModelCache } from "./model-availability" +import { fetchAvailableModels, fuzzyMatchModel, getConnectedProviders, __resetModelCache, isModelAvailable } from "./model-availability" describe("fetchAvailableModels", () => { let tempDir: string @@ -610,3 +610,38 @@ describe("fetchAvailableModels with provider-models cache (whitelist-filtered)", expect(result.has("google/gemini-3-pro")).toBe(false) }) }) + +describe("isModelAvailable", () => { + it("returns true when model exists via fuzzy match", () => { + // #given + const available = new Set(["openai/gpt-5.2-codex", "anthropic/claude-opus-4-5"]) + + // #when + const result = isModelAvailable("gpt-5.2-codex", available) + + // #then + expect(result).toBe(true) + }) + + it("returns false when model not found", () => { + // #given + const available = new Set(["anthropic/claude-opus-4-5"]) + + // #when + const result = isModelAvailable("gpt-5.2-codex", available) + + // #then + expect(result).toBe(false) + }) + + it("returns false for empty available set", () => { + // #given + const available = new Set() + + // #when + const result = isModelAvailable("gpt-5.2-codex", available) + + // #then + expect(result).toBe(false) + }) +}) diff --git a/src/shared/model-requirements.test.ts b/src/shared/model-requirements.test.ts index 256d4b8b..c325f3af 100644 --- a/src/shared/model-requirements.test.ts +++ b/src/shared/model-requirements.test.ts @@ -424,20 +424,38 @@ describe("ModelRequirement type", () => { } }) - test("all fallbackChain entries have non-empty providers array", () => { - // #given - all agent and category requirements - const allRequirements = [ - ...Object.values(AGENT_MODEL_REQUIREMENTS), - ...Object.values(CATEGORY_MODEL_REQUIREMENTS), - ] + test("all fallbackChain entries have non-empty providers array", () => { + // #given - all agent and category requirements + const allRequirements = [ + ...Object.values(AGENT_MODEL_REQUIREMENTS), + ...Object.values(CATEGORY_MODEL_REQUIREMENTS), + ] - // #when - checking each entry in fallbackChain - // #then - all have non-empty providers array - for (const req of allRequirements) { - for (const entry of req.fallbackChain) { - expect(entry.providers).toBeArray() - expect(entry.providers.length).toBeGreaterThan(0) - } - } + // #when - checking each entry in fallbackChain + // #then - all have non-empty providers array + for (const req of allRequirements) { + for (const entry of req.fallbackChain) { + expect(entry.providers).toBeArray() + expect(entry.providers.length).toBeGreaterThan(0) + } + } + }) +}) + +describe("requiresModel field in categories", () => { + test("deep category has requiresModel set to gpt-5.2-codex", () => { + // #given + const deep = CATEGORY_MODEL_REQUIREMENTS["deep"] + + // #when / #then + expect(deep.requiresModel).toBe("gpt-5.2-codex") + }) + + test("artistry category has requiresModel set to gemini-3-pro", () => { + // #given + const artistry = CATEGORY_MODEL_REQUIREMENTS["artistry"] + + // #when / #then + expect(artistry.requiresModel).toBe("gemini-3-pro") }) })