From e63dcc320b3388a4560a141b31df7da059ff5937 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 14 Feb 2026 22:06:04 +0000 Subject: [PATCH] refactor(test): share pi embedded model fixtures --- .../pi-embedded-runner/model.e2e.test.ts | 44 +++++------------- .../pi-embedded-runner/model.test-harness.ts | 46 +++++++++++++++++++ src/agents/pi-embedded-runner/model.test.ts | 45 +++++------------- 3 files changed, 68 insertions(+), 67 deletions(-) create mode 100644 src/agents/pi-embedded-runner/model.test-harness.ts diff --git a/src/agents/pi-embedded-runner/model.e2e.test.ts b/src/agents/pi-embedded-runner/model.e2e.test.ts index 3d176ccaf..d7b22c466 100644 --- a/src/agents/pi-embedded-runner/model.e2e.test.ts +++ b/src/agents/pi-embedded-runner/model.e2e.test.ts @@ -5,23 +5,16 @@ vi.mock("../pi-model-discovery.js", () => ({ discoverModels: vi.fn(() => ({ find: vi.fn(() => null) })), })); -import { discoverModels } from "../pi-model-discovery.js"; import { buildInlineProviderModels, resolveModel } from "./model.js"; - -const makeModel = (id: string) => ({ - id, - name: id, - reasoning: false, - input: ["text"] as const, - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 1, - maxTokens: 1, -}); +import { + makeModel, + mockDiscoveredModel, + OPENAI_CODEX_TEMPLATE_MODEL, + resetMockDiscoverModels, +} from "./model.test-harness.js"; beforeEach(() => { - vi.mocked(discoverModels).mockReturnValue({ - find: vi.fn(() => null), - } as unknown as ReturnType); + resetMockDiscoverModels(); }); describe("pi embedded model e2e smoke", () => { @@ -45,26 +38,11 @@ describe("pi embedded model e2e smoke", () => { }); it("builds an openai-codex forward-compat fallback for gpt-5.3-codex", () => { - const templateModel = { - id: "gpt-5.2-codex", - name: "GPT-5.2 Codex", + mockDiscoveredModel({ provider: "openai-codex", - api: "openai-codex-responses", - baseUrl: "https://chatgpt.com/backend-api", - reasoning: true, - input: ["text", "image"] as const, - cost: { input: 1.75, output: 14, cacheRead: 0.175, cacheWrite: 0 }, - contextWindow: 272000, - maxTokens: 128000, - }; - vi.mocked(discoverModels).mockReturnValue({ - find: vi.fn((provider: string, modelId: string) => { - if (provider === "openai-codex" && modelId === "gpt-5.2-codex") { - return templateModel; - } - return null; - }), - } as unknown as ReturnType); + modelId: "gpt-5.2-codex", + templateModel: OPENAI_CODEX_TEMPLATE_MODEL, + }); const result = resolveModel("openai-codex", "gpt-5.3-codex", "/tmp/agent"); expect(result.error).toBeUndefined(); diff --git a/src/agents/pi-embedded-runner/model.test-harness.ts b/src/agents/pi-embedded-runner/model.test-harness.ts new file mode 100644 index 000000000..d7f52bdd3 --- /dev/null +++ b/src/agents/pi-embedded-runner/model.test-harness.ts @@ -0,0 +1,46 @@ +import { vi } from "vitest"; +import { discoverModels } from "../pi-model-discovery.js"; + +export const makeModel = (id: string) => ({ + id, + name: id, + reasoning: false, + input: ["text"] as const, + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 1, + maxTokens: 1, +}); + +export const OPENAI_CODEX_TEMPLATE_MODEL = { + id: "gpt-5.2-codex", + name: "GPT-5.2 Codex", + provider: "openai-codex", + api: "openai-codex-responses", + baseUrl: "https://chatgpt.com/backend-api", + reasoning: true, + input: ["text", "image"] as const, + cost: { input: 1.75, output: 14, cacheRead: 0.175, cacheWrite: 0 }, + contextWindow: 272000, + maxTokens: 128000, +}; + +export function resetMockDiscoverModels(): void { + vi.mocked(discoverModels).mockReturnValue({ + find: vi.fn(() => null), + } as unknown as ReturnType); +} + +export function mockDiscoveredModel(params: { + provider: string; + modelId: string; + templateModel: unknown; +}): void { + vi.mocked(discoverModels).mockReturnValue({ + find: vi.fn((provider: string, modelId: string) => { + if (provider === params.provider && modelId === params.modelId) { + return params.templateModel; + } + return null; + }), + } as unknown as ReturnType); +} diff --git a/src/agents/pi-embedded-runner/model.test.ts b/src/agents/pi-embedded-runner/model.test.ts index 794b4c3d9..911e662d6 100644 --- a/src/agents/pi-embedded-runner/model.test.ts +++ b/src/agents/pi-embedded-runner/model.test.ts @@ -6,23 +6,16 @@ vi.mock("../pi-model-discovery.js", () => ({ })); import type { OpenClawConfig } from "../../config/config.js"; -import { discoverModels } from "../pi-model-discovery.js"; import { buildInlineProviderModels, resolveModel } from "./model.js"; - -const makeModel = (id: string) => ({ - id, - name: id, - reasoning: false, - input: ["text"] as const, - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 1, - maxTokens: 1, -}); +import { + makeModel, + mockDiscoveredModel, + OPENAI_CODEX_TEMPLATE_MODEL, + resetMockDiscoverModels, +} from "./model.test-harness.js"; beforeEach(() => { - vi.mocked(discoverModels).mockReturnValue({ - find: vi.fn(() => null), - } as unknown as ReturnType); + resetMockDiscoverModels(); }); describe("buildInlineProviderModels", () => { @@ -136,27 +129,11 @@ describe("resolveModel", () => { }); it("builds an openai-codex fallback for gpt-5.3-codex", () => { - const templateModel = { - id: "gpt-5.2-codex", - name: "GPT-5.2 Codex", + mockDiscoveredModel({ provider: "openai-codex", - api: "openai-codex-responses", - baseUrl: "https://chatgpt.com/backend-api", - reasoning: true, - input: ["text", "image"] as const, - cost: { input: 1.75, output: 14, cacheRead: 0.175, cacheWrite: 0 }, - contextWindow: 272000, - maxTokens: 128000, - }; - - vi.mocked(discoverModels).mockReturnValue({ - find: vi.fn((provider: string, modelId: string) => { - if (provider === "openai-codex" && modelId === "gpt-5.2-codex") { - return templateModel; - } - return null; - }), - } as unknown as ReturnType); + modelId: "gpt-5.2-codex", + templateModel: OPENAI_CODEX_TEMPLATE_MODEL, + }); const result = resolveModel("openai-codex", "gpt-5.3-codex", "/tmp/agent");