From a16f8dff1553e179b665b93e822bd068f967f4d2 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 24 Apr 2026 19:01:13 +0100 Subject: [PATCH] test: fold tiny media fallback specs --- .../model-fallback.image-provider.test.ts | 50 ------------------- src/agents/model-fallback.test.ts | 45 +++++++++++++++++ ...media-tool-shared.model-resolution.test.ts | 47 ----------------- src/agents/tools/media-tool-shared.test.ts | 47 ++++++++++++++++- 4 files changed, 91 insertions(+), 98 deletions(-) delete mode 100644 src/agents/model-fallback.image-provider.test.ts delete mode 100644 src/agents/tools/media-tool-shared.model-resolution.test.ts diff --git a/src/agents/model-fallback.image-provider.test.ts b/src/agents/model-fallback.image-provider.test.ts deleted file mode 100644 index 9155d41b8c4..00000000000 --- a/src/agents/model-fallback.image-provider.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { describe, expect, it, vi } from "vitest"; -import { runWithImageModelFallback } from "./model-fallback.js"; -import { makeModelFallbackCfg } from "./test-helpers/model-fallback-config-fixture.js"; - -describe("runWithImageModelFallback provider resolution", () => { - it("inherits the configured image-model provider for bare override ids", async () => { - const cfg = makeModelFallbackCfg({ - agents: { - defaults: { - imageModel: { - primary: "openai-codex/gpt-5.4", - fallbacks: ["openai-codex/gpt-5.4-mini"], - }, - }, - }, - }); - const run = vi.fn().mockResolvedValueOnce("ok"); - - const result = await runWithImageModelFallback({ - cfg, - modelOverride: "gpt-5.4-mini", - run, - }); - - expect(result.result).toBe("ok"); - expect(run.mock.calls).toEqual([["openai-codex", "gpt-5.4-mini"]]); - }); - - it("keeps a fully qualified override provider over the configured default", async () => { - const cfg = makeModelFallbackCfg({ - agents: { - defaults: { - imageModel: { - primary: "openai-codex/gpt-5.4", - }, - }, - }, - }); - const run = vi.fn().mockResolvedValueOnce("ok"); - - const result = await runWithImageModelFallback({ - cfg, - modelOverride: "google/gemini-3-pro-image", - run, - }); - - expect(result.result).toBe("ok"); - expect(run.mock.calls).toEqual([["google", "gemini-3-pro-image"]]); - }); -}); diff --git a/src/agents/model-fallback.test.ts b/src/agents/model-fallback.test.ts index d3eda8ba795..b11456ecb5c 100644 --- a/src/agents/model-fallback.test.ts +++ b/src/agents/model-fallback.test.ts @@ -1896,6 +1896,51 @@ describe("runWithModelFallback", () => { }); describe("runWithImageModelFallback", () => { + it("inherits the configured image-model provider for bare override ids", async () => { + const cfg = makeCfg({ + agents: { + defaults: { + imageModel: { + primary: "openai-codex/gpt-5.4", + fallbacks: ["openai-codex/gpt-5.4-mini"], + }, + }, + }, + }); + const run = vi.fn().mockResolvedValueOnce("ok"); + + const result = await runWithImageModelFallback({ + cfg, + modelOverride: "gpt-5.4-mini", + run, + }); + + expect(result.result).toBe("ok"); + expect(run.mock.calls).toEqual([["openai-codex", "gpt-5.4-mini"]]); + }); + + it("keeps a fully qualified override provider over the configured default", async () => { + const cfg = makeCfg({ + agents: { + defaults: { + imageModel: { + primary: "openai-codex/gpt-5.4", + }, + }, + }, + }); + const run = vi.fn().mockResolvedValueOnce("ok"); + + const result = await runWithImageModelFallback({ + cfg, + modelOverride: "google/gemini-3-pro-image", + run, + }); + + expect(result.result).toBe("ok"); + expect(run.mock.calls).toEqual([["google", "gemini-3-pro-image"]]); + }); + it("keeps explicit image fallbacks reachable when models allowlist is present", async () => { const cfg = makeCfg({ agents: { diff --git a/src/agents/tools/media-tool-shared.model-resolution.test.ts b/src/agents/tools/media-tool-shared.model-resolution.test.ts deleted file mode 100644 index c05a4fb0066..00000000000 --- a/src/agents/tools/media-tool-shared.model-resolution.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { describe, expect, it, vi } from "vitest"; -import { resolveModelFromRegistry } from "./media-tool-shared.js"; - -describe("resolveModelFromRegistry", () => { - it("normalizes provider and model refs before registry lookup", () => { - const foundModel = { provider: "ollama", id: "qwen3.5:397b-cloud" }; - const find = vi.fn(() => foundModel); - - const result = resolveModelFromRegistry({ - modelRegistry: { find }, - provider: " OLLAMA ", - modelId: " qwen3.5:397b-cloud ", - }); - - expect(find).toHaveBeenCalledWith("ollama", "qwen3.5:397b-cloud"); - expect(result).toBe(foundModel); - }); - - it("reports the normalized ref when the registry lookup misses", () => { - const find = vi.fn(() => null); - - expect(() => - resolveModelFromRegistry({ - modelRegistry: { find }, - provider: " OLLAMA ", - modelId: " qwen3.5:397b-cloud ", - }), - ).toThrow("Unknown model: ollama/qwen3.5:397b-cloud"); - }); - - it("falls back to provider-prefixed custom model IDs", () => { - const foundModel = { provider: "kimchi", id: "kimchi/claude-opus-4-6" }; - const find = vi.fn().mockReturnValueOnce(null).mockReturnValueOnce(foundModel); - - const result = resolveModelFromRegistry({ - modelRegistry: { find }, - provider: "kimchi", - modelId: "claude-opus-4-6", - }); - - expect(find.mock.calls).toEqual([ - ["kimchi", "claude-opus-4-6"], - ["kimchi", "kimchi/claude-opus-4-6"], - ]); - expect(result).toBe(foundModel); - }); -}); diff --git a/src/agents/tools/media-tool-shared.test.ts b/src/agents/tools/media-tool-shared.test.ts index 7a69c5eb286..85704493f3f 100644 --- a/src/agents/tools/media-tool-shared.test.ts +++ b/src/agents/tools/media-tool-shared.test.ts @@ -1,7 +1,7 @@ import path from "node:path"; import { pathToFileURL } from "node:url"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { resolveMediaToolLocalRoots } from "./media-tool-shared.js"; +import { resolveMediaToolLocalRoots, resolveModelFromRegistry } from "./media-tool-shared.js"; function normalizeHostPath(value: string): string { return path.normalize(path.resolve(value)); @@ -35,3 +35,48 @@ describe("resolveMediaToolLocalRoots", () => { expect(normalizedRoots).not.toContain(normalizeHostPath("/")); }); }); + +describe("resolveModelFromRegistry", () => { + it("normalizes provider and model refs before registry lookup", () => { + const foundModel = { provider: "ollama", id: "qwen3.5:397b-cloud" }; + const find = vi.fn(() => foundModel); + + const result = resolveModelFromRegistry({ + modelRegistry: { find }, + provider: " OLLAMA ", + modelId: " qwen3.5:397b-cloud ", + }); + + expect(find).toHaveBeenCalledWith("ollama", "qwen3.5:397b-cloud"); + expect(result).toBe(foundModel); + }); + + it("reports the normalized ref when the registry lookup misses", () => { + const find = vi.fn(() => null); + + expect(() => + resolveModelFromRegistry({ + modelRegistry: { find }, + provider: " OLLAMA ", + modelId: " qwen3.5:397b-cloud ", + }), + ).toThrow("Unknown model: ollama/qwen3.5:397b-cloud"); + }); + + it("falls back to provider-prefixed custom model IDs", () => { + const foundModel = { provider: "kimchi", id: "kimchi/claude-opus-4-6" }; + const find = vi.fn().mockReturnValueOnce(null).mockReturnValueOnce(foundModel); + + const result = resolveModelFromRegistry({ + modelRegistry: { find }, + provider: "kimchi", + modelId: "claude-opus-4-6", + }); + + expect(find.mock.calls).toEqual([ + ["kimchi", "claude-opus-4-6"], + ["kimchi", "kimchi/claude-opus-4-6"], + ]); + expect(result).toBe(foundModel); + }); +});