From ed1734a7c72e5599b1bb70d42bfccff3f4ee1c99 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 5 Apr 2026 13:55:23 +0100 Subject: [PATCH] test: stabilize provider normalization lanes --- src/agents/models-config.providers.policy.ts | 6 +- .../models-config.providers.static.test.ts | 81 ++++++++++++++++--- 2 files changed, 74 insertions(+), 13 deletions(-) diff --git a/src/agents/models-config.providers.policy.ts b/src/agents/models-config.providers.policy.ts index ad7939aba2e..aad8a6817bf 100644 --- a/src/agents/models-config.providers.policy.ts +++ b/src/agents/models-config.providers.policy.ts @@ -43,6 +43,9 @@ export function normalizeProviderSpecificConfig( providerKey: string, provider: ProviderConfig, ): ProviderConfig { + if (shouldNormalizeGoogleProviderConfig(providerKey, provider)) { + return normalizeGoogleProviderConfig(providerKey, provider); + } const runtimeProviderKey = resolveProviderPluginLookupKey(providerKey, provider); const normalized = normalizeProviderConfigWithPlugin({ @@ -55,9 +58,6 @@ export function normalizeProviderSpecificConfig( if (normalized && normalized !== provider) { return normalized; } - if (shouldNormalizeGoogleProviderConfig(providerKey, provider)) { - return normalizeGoogleProviderConfig(providerKey, provider); - } return provider; } diff --git a/src/agents/models-config.providers.static.test.ts b/src/agents/models-config.providers.static.test.ts index 0bbaacc75e6..52a6e2b4a09 100644 --- a/src/agents/models-config.providers.static.test.ts +++ b/src/agents/models-config.providers.static.test.ts @@ -1,15 +1,74 @@ -import { describe, expect, it } from "vitest"; -import { - loadBundledProviderCatalogExportMap, - resolveBundledProviderCatalogEntries, -} from "./models-config.providers.static.js"; +import fs from "node:fs"; +import { mkdtempSync } from "node:fs"; +import { tmpdir } from "node:os"; +import path from "node:path"; +import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; + +type StaticModule = typeof import("./models-config.providers.static.js"); + +const fixtureRoot = mkdtempSync(path.join(tmpdir(), "openclaw-provider-catalogs-")); +const fixtureExtensionsDir = path.join(fixtureRoot, "dist-runtime", "extensions"); + +function writeFixtureCatalog(dirName: string, exportNames: string[]) { + const pluginDir = path.join(fixtureExtensionsDir, dirName); + fs.mkdirSync(pluginDir, { recursive: true }); + fs.writeFileSync( + path.join(pluginDir, "provider-catalog.js"), + exportNames + .map((exportName) => `export function ${exportName}() { return "${dirName}"; }`) + .join("\n") + "\n", + "utf8", + ); +} + +writeFixtureCatalog("openrouter", ["buildOpenrouterProvider"]); +writeFixtureCatalog("volcengine", ["buildDoubaoProvider", "buildDoubaoCodingProvider"]); + +let staticModule: StaticModule; + +beforeAll(async () => { + vi.resetModules(); + vi.doMock("../plugins/bundled-plugin-metadata.js", () => ({ + listBundledPluginMetadata: (_params: { rootDir: string }) => [ + { + dirName: "openrouter", + publicSurfaceArtifacts: ["provider-catalog.js"], + manifest: { id: "openrouter", providers: ["openrouter"] }, + }, + { + dirName: "volcengine", + publicSurfaceArtifacts: ["provider-catalog.js"], + manifest: { id: "volcengine", providers: ["volcengine", "byteplus"] }, + }, + { + dirName: "ignored", + publicSurfaceArtifacts: ["api.js"], + manifest: { id: "ignored", providers: [] }, + }, + ], + resolveBundledPluginPublicSurfacePath: ({ + rootDir, + dirName, + artifactBasename, + }: { + rootDir: string; + dirName: string; + artifactBasename: string; + }) => path.join(rootDir, "dist-runtime", "extensions", dirName, artifactBasename), + })); + staticModule = await import("./models-config.providers.static.js"); +}); + +afterAll(() => { + vi.doUnmock("../plugins/bundled-plugin-metadata.js"); + vi.resetModules(); + fs.rmSync(fixtureRoot, { recursive: true, force: true }); +}); describe("models-config bundled provider catalogs", () => { it("detects provider catalogs from plugin folders via metadata artifacts", () => { - const entries = resolveBundledProviderCatalogEntries(); - expect(entries.map((entry) => entry.dirName)).toEqual( - expect.arrayContaining(["openrouter", "volcengine"]), - ); + const entries = staticModule.resolveBundledProviderCatalogEntries({ rootDir: fixtureRoot }); + expect(entries.map((entry) => entry.dirName)).toEqual(["openrouter", "volcengine"]); expect(entries.find((entry) => entry.dirName === "volcengine")).toMatchObject({ dirName: "volcengine", pluginId: "volcengine", @@ -17,7 +76,9 @@ describe("models-config bundled provider catalogs", () => { }); it("loads provider catalog exports from detected plugin folders", async () => { - const exports = await loadBundledProviderCatalogExportMap(); + const exports = await staticModule.loadBundledProviderCatalogExportMap({ + rootDir: fixtureRoot, + }); expect(exports.buildOpenrouterProvider).toBeTypeOf("function"); expect(exports.buildDoubaoProvider).toBeTypeOf("function"); expect(exports.buildDoubaoCodingProvider).toBeTypeOf("function");