From 5747700b3cd11239349d0fecd732b205a77f3563 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 17 Mar 2026 07:06:30 +0000 Subject: [PATCH] refactor(provider-tests): share codex catalog assertions --- .../contracts/catalog.contract.test.ts | 56 ++---------- src/plugins/provider-runtime.test-support.ts | 87 +++++++++++++++++++ src/plugins/provider-runtime.test.ts | 56 ++---------- 3 files changed, 104 insertions(+), 95 deletions(-) create mode 100644 src/plugins/provider-runtime.test-support.ts diff --git a/src/plugins/contracts/catalog.contract.test.ts b/src/plugins/contracts/catalog.contract.test.ts index dcfe0c86f6a..4339b6edec4 100644 --- a/src/plugins/contracts/catalog.contract.test.ts +++ b/src/plugins/contracts/catalog.contract.test.ts @@ -1,4 +1,9 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeEach, describe, it, vi } from "vitest"; +import { + expectAugmentedCodexCatalog, + expectCodexBuiltInSuppression, + expectCodexMissingAuthHint, +} from "../provider-runtime.test-support.js"; import { providerContractPluginIds, resolveProviderContractProvidersForPluginIds, @@ -45,57 +50,14 @@ describe("provider catalog contract", () => { }); it("keeps codex-only missing-auth hints wired through the provider runtime", () => { - expect( - buildProviderMissingAuthMessageWithPlugin({ - provider: "openai", - env: process.env, - context: { - env: process.env, - provider: "openai", - listProfileIds: (providerId) => (providerId === "openai-codex" ? ["p1"] : []), - }, - }), - ).toContain("openai-codex/gpt-5.4"); + expectCodexMissingAuthHint(buildProviderMissingAuthMessageWithPlugin); }); it("keeps built-in model suppression wired through the provider runtime", () => { - expect( - resolveProviderBuiltInModelSuppression({ - env: process.env, - context: { - env: process.env, - provider: "azure-openai-responses", - modelId: "gpt-5.3-codex-spark", - }, - }), - ).toMatchObject({ - suppress: true, - errorMessage: expect.stringContaining("openai-codex/gpt-5.3-codex-spark"), - }); + expectCodexBuiltInSuppression(resolveProviderBuiltInModelSuppression); }); it("keeps bundled model augmentation wired through the provider runtime", async () => { - await expect( - augmentModelCatalogWithProviderPlugins({ - env: process.env, - context: { - env: process.env, - entries: [ - { provider: "openai", id: "gpt-5.2", name: "GPT-5.2" }, - { provider: "openai", id: "gpt-5.2-pro", name: "GPT-5.2 Pro" }, - { provider: "openai-codex", id: "gpt-5.3-codex", name: "GPT-5.3 Codex" }, - ], - }, - }), - ).resolves.toEqual([ - { provider: "openai", id: "gpt-5.4", name: "gpt-5.4" }, - { provider: "openai", id: "gpt-5.4-pro", name: "gpt-5.4-pro" }, - { provider: "openai-codex", id: "gpt-5.4", name: "gpt-5.4" }, - { - provider: "openai-codex", - id: "gpt-5.3-codex-spark", - name: "gpt-5.3-codex-spark", - }, - ]); + await expectAugmentedCodexCatalog(augmentModelCatalogWithProviderPlugins); }); }); diff --git a/src/plugins/provider-runtime.test-support.ts b/src/plugins/provider-runtime.test-support.ts new file mode 100644 index 00000000000..818ad364cbd --- /dev/null +++ b/src/plugins/provider-runtime.test-support.ts @@ -0,0 +1,87 @@ +import { expect } from "vitest"; + +export const openaiCodexCatalogEntries = [ + { provider: "openai", id: "gpt-5.2", name: "GPT-5.2" }, + { provider: "openai", id: "gpt-5.2-pro", name: "GPT-5.2 Pro" }, + { provider: "openai-codex", id: "gpt-5.3-codex", name: "GPT-5.3 Codex" }, +]; + +export const expectedAugmentedOpenaiCodexCatalogEntries = [ + { provider: "openai", id: "gpt-5.4", name: "gpt-5.4" }, + { provider: "openai", id: "gpt-5.4-pro", name: "gpt-5.4-pro" }, + { provider: "openai-codex", id: "gpt-5.4", name: "gpt-5.4" }, + { + provider: "openai-codex", + id: "gpt-5.3-codex-spark", + name: "gpt-5.3-codex-spark", + }, +]; + +export function expectCodexMissingAuthHint( + buildProviderMissingAuthMessageWithPlugin: (params: { + provider: string; + env: NodeJS.ProcessEnv; + context: { + env: NodeJS.ProcessEnv; + provider: string; + listProfileIds: (providerId: string) => string[]; + }; + }) => string | undefined, +) { + expect( + buildProviderMissingAuthMessageWithPlugin({ + provider: "openai", + env: process.env, + context: { + env: process.env, + provider: "openai", + listProfileIds: (providerId) => (providerId === "openai-codex" ? ["p1"] : []), + }, + }), + ).toContain("openai-codex/gpt-5.4"); +} + +export function expectCodexBuiltInSuppression( + resolveProviderBuiltInModelSuppression: (params: { + env: NodeJS.ProcessEnv; + context: { + env: NodeJS.ProcessEnv; + provider: string; + modelId: string; + }; + }) => unknown, +) { + expect( + resolveProviderBuiltInModelSuppression({ + env: process.env, + context: { + env: process.env, + provider: "azure-openai-responses", + modelId: "gpt-5.3-codex-spark", + }, + }), + ).toMatchObject({ + suppress: true, + errorMessage: expect.stringContaining("openai-codex/gpt-5.3-codex-spark"), + }); +} + +export async function expectAugmentedCodexCatalog( + augmentModelCatalogWithProviderPlugins: (params: { + env: NodeJS.ProcessEnv; + context: { + env: NodeJS.ProcessEnv; + entries: typeof openaiCodexCatalogEntries; + }; + }) => Promise, +) { + await expect( + augmentModelCatalogWithProviderPlugins({ + env: process.env, + context: { + env: process.env, + entries: openaiCodexCatalogEntries, + }, + }), + ).resolves.toEqual(expectedAugmentedOpenaiCodexCatalogEntries); +} diff --git a/src/plugins/provider-runtime.test.ts b/src/plugins/provider-runtime.test.ts index c6cb64db8eb..d0e57c9216b 100644 --- a/src/plugins/provider-runtime.test.ts +++ b/src/plugins/provider-runtime.test.ts @@ -1,4 +1,9 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; +import { + expectAugmentedCodexCatalog, + expectCodexBuiltInSuppression, + expectCodexMissingAuthHint, +} from "./provider-runtime.test-support.js"; import type { ProviderPlugin, ProviderRuntimeModel } from "./types.js"; type ResolvePluginProviders = typeof import("./providers.js").resolvePluginProviders; @@ -433,54 +438,9 @@ describe("provider-runtime", () => { }), ).toBe(true); - expect( - buildProviderMissingAuthMessageWithPlugin({ - provider: "openai", - env: process.env, - context: { - env: process.env, - provider: "openai", - listProfileIds: (providerId) => (providerId === "openai-codex" ? ["p1"] : []), - }, - }), - ).toContain("openai-codex/gpt-5.4"); - - expect( - resolveProviderBuiltInModelSuppression({ - env: process.env, - context: { - env: process.env, - provider: "azure-openai-responses", - modelId: "gpt-5.3-codex-spark", - }, - }), - ).toMatchObject({ - suppress: true, - errorMessage: expect.stringContaining("openai-codex/gpt-5.3-codex-spark"), - }); - - await expect( - augmentModelCatalogWithProviderPlugins({ - env: process.env, - context: { - env: process.env, - entries: [ - { provider: "openai", id: "gpt-5.2", name: "GPT-5.2" }, - { provider: "openai", id: "gpt-5.2-pro", name: "GPT-5.2 Pro" }, - { provider: "openai-codex", id: "gpt-5.3-codex", name: "GPT-5.3 Codex" }, - ], - }, - }), - ).resolves.toEqual([ - { provider: "openai", id: "gpt-5.4", name: "gpt-5.4" }, - { provider: "openai", id: "gpt-5.4-pro", name: "gpt-5.4-pro" }, - { provider: "openai-codex", id: "gpt-5.4", name: "gpt-5.4" }, - { - provider: "openai-codex", - id: "gpt-5.3-codex-spark", - name: "gpt-5.3-codex-spark", - }, - ]); + expectCodexMissingAuthHint(buildProviderMissingAuthMessageWithPlugin); + expectCodexBuiltInSuppression(resolveProviderBuiltInModelSuppression); + await expectAugmentedCodexCatalog(augmentModelCatalogWithProviderPlugins); expect(prepareDynamicModel).toHaveBeenCalledTimes(1); expect(refreshOAuth).toHaveBeenCalledTimes(1);