From 9463661a8419c3440a7ed47660392d536b73655a Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 12 Apr 2026 03:12:16 +0100 Subject: [PATCH] test(providers): dedupe replay policy assertions --- extensions/kilocode/index.test.ts | 22 ++++-------- extensions/opencode-go/index.test.ts | 48 ++++++-------------------- extensions/opencode/index.test.ts | 48 ++++++-------------------- extensions/openrouter/index.test.ts | 44 ++++++----------------- test/helpers/provider-replay-policy.ts | 35 +++++++++++++++++++ 5 files changed, 73 insertions(+), 124 deletions(-) create mode 100644 test/helpers/provider-replay-policy.ts diff --git a/extensions/kilocode/index.test.ts b/extensions/kilocode/index.test.ts index a7afcf45c24..632c1067470 100644 --- a/extensions/kilocode/index.test.ts +++ b/extensions/kilocode/index.test.ts @@ -2,26 +2,16 @@ import type { StreamFn } from "@mariozechner/pi-agent-core"; import type { Context, Model } from "@mariozechner/pi-ai"; import { describe, expect, it } from "vitest"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; +import { expectPassthroughReplayPolicy } from "../../test/helpers/provider-replay-policy.ts"; import plugin from "./index.js"; describe("kilocode provider plugin", () => { it("owns passthrough-gemini replay policy for Gemini-backed models", async () => { - const provider = await registerSingleProviderPlugin(plugin); - - expect( - provider.buildReplayPolicy?.({ - provider: "kilocode", - modelApi: "openai-completions", - modelId: "gemini-2.5-pro", - } as never), - ).toMatchObject({ - applyAssistantFirstOrderingFix: false, - validateGeminiTurns: false, - validateAnthropicTurns: false, - sanitizeThoughtSignatures: { - allowBase64Only: true, - includeCamelCase: true, - }, + await expectPassthroughReplayPolicy({ + plugin, + providerId: "kilocode", + modelId: "gemini-2.5-pro", + sanitizeThoughtSignatures: true, }); }); diff --git a/extensions/opencode-go/index.test.ts b/extensions/opencode-go/index.test.ts index b0d998c61f6..1d621bd7c21 100644 --- a/extensions/opencode-go/index.test.ts +++ b/extensions/opencode-go/index.test.ts @@ -1,48 +1,22 @@ -import { describe, expect, it } from "vitest"; -import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; +import { describe, it } from "vitest"; +import { expectPassthroughReplayPolicy } from "../../test/helpers/provider-replay-policy.ts"; import plugin from "./index.js"; describe("opencode-go provider plugin", () => { it("owns passthrough-gemini replay policy for Gemini-backed models", async () => { - const provider = await registerSingleProviderPlugin(plugin); - - expect( - provider.buildReplayPolicy?.({ - provider: "opencode-go", - modelApi: "openai-completions", - modelId: "gemini-2.5-pro", - } as never), - ).toMatchObject({ - applyAssistantFirstOrderingFix: false, - validateGeminiTurns: false, - validateAnthropicTurns: false, - sanitizeThoughtSignatures: { - allowBase64Only: true, - includeCamelCase: true, - }, + await expectPassthroughReplayPolicy({ + plugin, + providerId: "opencode-go", + modelId: "gemini-2.5-pro", + sanitizeThoughtSignatures: true, }); }); it("keeps non-Gemini replay policy minimal on passthrough routes", async () => { - const provider = await registerSingleProviderPlugin(plugin); - - expect( - provider.buildReplayPolicy?.({ - provider: "opencode-go", - modelApi: "openai-completions", - modelId: "qwen3-coder", - } as never), - ).toMatchObject({ - applyAssistantFirstOrderingFix: false, - validateGeminiTurns: false, - validateAnthropicTurns: false, + await expectPassthroughReplayPolicy({ + plugin, + providerId: "opencode-go", + modelId: "qwen3-coder", }); - expect( - provider.buildReplayPolicy?.({ - provider: "opencode-go", - modelApi: "openai-completions", - modelId: "qwen3-coder", - } as never), - ).not.toHaveProperty("sanitizeThoughtSignatures"); }); }); diff --git a/extensions/opencode/index.test.ts b/extensions/opencode/index.test.ts index 4e12b4e24e2..ff59311b196 100644 --- a/extensions/opencode/index.test.ts +++ b/extensions/opencode/index.test.ts @@ -1,48 +1,22 @@ -import { describe, expect, it } from "vitest"; -import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; +import { describe, it } from "vitest"; +import { expectPassthroughReplayPolicy } from "../../test/helpers/provider-replay-policy.ts"; import plugin from "./index.js"; describe("opencode provider plugin", () => { it("owns passthrough-gemini replay policy for Gemini-backed models", async () => { - const provider = await registerSingleProviderPlugin(plugin); - - expect( - provider.buildReplayPolicy?.({ - provider: "opencode", - modelApi: "openai-completions", - modelId: "gemini-2.5-pro", - } as never), - ).toMatchObject({ - applyAssistantFirstOrderingFix: false, - validateGeminiTurns: false, - validateAnthropicTurns: false, - sanitizeThoughtSignatures: { - allowBase64Only: true, - includeCamelCase: true, - }, + await expectPassthroughReplayPolicy({ + plugin, + providerId: "opencode", + modelId: "gemini-2.5-pro", + sanitizeThoughtSignatures: true, }); }); it("keeps non-Gemini replay policy minimal on passthrough routes", async () => { - const provider = await registerSingleProviderPlugin(plugin); - - expect( - provider.buildReplayPolicy?.({ - provider: "opencode", - modelApi: "openai-completions", - modelId: "claude-opus-4.6", - } as never), - ).toMatchObject({ - applyAssistantFirstOrderingFix: false, - validateGeminiTurns: false, - validateAnthropicTurns: false, + await expectPassthroughReplayPolicy({ + plugin, + providerId: "opencode", + modelId: "claude-opus-4.6", }); - expect( - provider.buildReplayPolicy?.({ - provider: "opencode", - modelApi: "openai-completions", - modelId: "claude-opus-4.6", - } as never), - ).not.toHaveProperty("sanitizeThoughtSignatures"); }); }); diff --git a/extensions/openrouter/index.test.ts b/extensions/openrouter/index.test.ts index 2623b164dce..991c195e3c3 100644 --- a/extensions/openrouter/index.test.ts +++ b/extensions/openrouter/index.test.ts @@ -1,45 +1,21 @@ import { describe, expect, it, vi } from "vitest"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; +import { expectPassthroughReplayPolicy } from "../../test/helpers/provider-replay-policy.ts"; import openrouterPlugin from "./index.js"; describe("openrouter provider hooks", () => { it("owns passthrough-gemini replay policy for Gemini-backed models", async () => { - const provider = await registerSingleProviderPlugin(openrouterPlugin); - - expect( - provider.buildReplayPolicy?.({ - provider: "openrouter", - modelApi: "openai-completions", - modelId: "gemini-2.5-pro", - } as never), - ).toMatchObject({ - applyAssistantFirstOrderingFix: false, - validateGeminiTurns: false, - validateAnthropicTurns: false, - sanitizeThoughtSignatures: { - allowBase64Only: true, - includeCamelCase: true, - }, + await expectPassthroughReplayPolicy({ + plugin: openrouterPlugin, + providerId: "openrouter", + modelId: "gemini-2.5-pro", + sanitizeThoughtSignatures: true, }); - - expect( - provider.buildReplayPolicy?.({ - provider: "openrouter", - modelApi: "openai-completions", - modelId: "openai/gpt-5.4", - } as never), - ).toMatchObject({ - applyAssistantFirstOrderingFix: false, - validateGeminiTurns: false, - validateAnthropicTurns: false, + await expectPassthroughReplayPolicy({ + plugin: openrouterPlugin, + providerId: "openrouter", + modelId: "openai/gpt-5.4", }); - expect( - provider.buildReplayPolicy?.({ - provider: "openrouter", - modelApi: "openai-completions", - modelId: "openai/gpt-5.4", - } as never), - ).not.toHaveProperty("sanitizeThoughtSignatures"); }); it("owns native reasoning output mode", async () => { diff --git a/test/helpers/provider-replay-policy.ts b/test/helpers/provider-replay-policy.ts new file mode 100644 index 00000000000..33da777c9a1 --- /dev/null +++ b/test/helpers/provider-replay-policy.ts @@ -0,0 +1,35 @@ +import { expect } from "vitest"; +import { registerSingleProviderPlugin } from "./plugins/plugin-registration.js"; + +export async function expectPassthroughReplayPolicy(params: { + modelId: string; + plugin: unknown; + providerId: string; + sanitizeThoughtSignatures?: boolean; +}) { + const provider = await registerSingleProviderPlugin(params.plugin as never); + const policy = provider.buildReplayPolicy?.({ + provider: params.providerId, + modelApi: "openai-completions", + modelId: params.modelId, + } as never); + + expect(policy).toMatchObject({ + applyAssistantFirstOrderingFix: false, + validateGeminiTurns: false, + validateAnthropicTurns: false, + }); + + if (params.sanitizeThoughtSignatures) { + expect(policy).toMatchObject({ + sanitizeThoughtSignatures: { + allowBase64Only: true, + includeCamelCase: true, + }, + }); + } else { + expect(policy).not.toHaveProperty("sanitizeThoughtSignatures"); + } + + return provider; +}