From 17553b4cf4fa44534f64a9096264dde3555c18b3 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 12 Apr 2026 03:48:13 +0100 Subject: [PATCH] test(secrets): reuse legacy x-search fixtures --- src/secrets/runtime-legacy-x-search.test.ts | 94 ++------------------- src/secrets/runtime.test-support.ts | 4 + 2 files changed, 13 insertions(+), 85 deletions(-) diff --git a/src/secrets/runtime-legacy-x-search.test.ts b/src/secrets/runtime-legacy-x-search.test.ts index eec7b914975..8ebb936a1c1 100644 --- a/src/secrets/runtime-legacy-x-search.test.ts +++ b/src/secrets/runtime-legacy-x-search.test.ts @@ -1,18 +1,11 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../config/config.js"; import { createEmptyPluginRegistry } from "../plugins/registry-empty.js"; import { setActivePluginRegistry } from "../plugins/runtime.js"; -import type { PluginWebSearchProviderEntry } from "../plugins/types.js"; - -type WebProviderUnderTest = "brave" | "gemini" | "grok" | "kimi" | "perplexity" | "firecrawl"; - -const { resolvePluginWebSearchProvidersMock } = vi.hoisted(() => ({ - resolvePluginWebSearchProvidersMock: vi.fn(() => buildTestWebSearchProviders()), -})); - -vi.mock("../plugins/web-search-providers.runtime.js", () => ({ - resolvePluginWebSearchProviders: resolvePluginWebSearchProvidersMock, -})); +import { + asConfig, + getResolvePluginWebSearchProvidersMock, + resetPluginWebSearchProvidersMock, +} from "./runtime.test-support.ts"; vi.mock("../channels/plugins/bootstrap-registry.js", () => { return { @@ -33,74 +26,6 @@ vi.mock("../channels/plugins/bootstrap-registry.js", () => { }; }); -function asConfig(value: unknown): OpenClawConfig { - return value as OpenClawConfig; -} - -function createTestProvider(params: { - id: WebProviderUnderTest; - pluginId: string; - order: number; -}): PluginWebSearchProviderEntry { - const credentialPath = `plugins.entries.${params.pluginId}.config.webSearch.apiKey`; - const readSearchConfigKey = (searchConfig?: Record): unknown => { - const providerConfig = - searchConfig?.[params.id] && typeof searchConfig[params.id] === "object" - ? (searchConfig[params.id] as { apiKey?: unknown }) - : undefined; - return providerConfig?.apiKey ?? searchConfig?.apiKey; - }; - return { - pluginId: params.pluginId, - id: params.id, - label: params.id, - hint: `${params.id} test provider`, - envVars: [`${params.id.toUpperCase()}_API_KEY`], - placeholder: `${params.id}-...`, - signupUrl: `https://example.com/${params.id}`, - autoDetectOrder: params.order, - credentialPath, - inactiveSecretPaths: [credentialPath], - getCredentialValue: readSearchConfigKey, - setCredentialValue: (searchConfigTarget, value) => { - const providerConfig = - params.id === "brave" || params.id === "firecrawl" - ? searchConfigTarget - : ((searchConfigTarget[params.id] ??= {}) as { apiKey?: unknown }); - providerConfig.apiKey = value; - }, - getConfiguredCredentialValue: (config) => - (config?.plugins?.entries?.[params.pluginId]?.config as { webSearch?: { apiKey?: unknown } }) - ?.webSearch?.apiKey, - setConfiguredCredentialValue: (configTarget, value) => { - const plugins = (configTarget.plugins ??= {}) as { entries?: Record }; - const entries = (plugins.entries ??= {}); - const entry = (entries[params.pluginId] ??= {}) as { config?: Record }; - const config = (entry.config ??= {}); - const webSearch = (config.webSearch ??= {}) as { apiKey?: unknown }; - webSearch.apiKey = value; - }, - resolveRuntimeMetadata: - params.id === "perplexity" - ? () => ({ - perplexityTransport: "search_api" as const, - }) - : undefined, - createTool: () => null, - }; -} - -function buildTestWebSearchProviders(): PluginWebSearchProviderEntry[] { - return [ - createTestProvider({ id: "brave", pluginId: "brave", order: 10 }), - createTestProvider({ id: "gemini", pluginId: "google", order: 20 }), - createTestProvider({ id: "grok", pluginId: "xai", order: 30 }), - createTestProvider({ id: "kimi", pluginId: "moonshot", order: 40 }), - createTestProvider({ id: "perplexity", pluginId: "perplexity", order: 50 }), - createTestProvider({ id: "firecrawl", pluginId: "firecrawl", order: 60 }), - ]; -} - let clearConfigCache: typeof import("../config/config.js").clearConfigCache; let clearRuntimeConfigSnapshot: typeof import("../config/config.js").clearRuntimeConfigSnapshot; let clearSecretsRuntimeSnapshot: typeof import("./runtime.js").clearSecretsRuntimeSnapshot; @@ -114,8 +39,7 @@ describe("secrets runtime snapshot legacy x_search", () => { }); beforeEach(() => { - resolvePluginWebSearchProvidersMock.mockReset(); - resolvePluginWebSearchProvidersMock.mockReturnValue(buildTestWebSearchProviders()); + resetPluginWebSearchProvidersMock(); }); afterEach(() => { @@ -151,7 +75,7 @@ describe("secrets runtime snapshot legacy x_search", () => { model: "grok-4-1-fast", }); expect(snapshot.config.plugins?.entries?.xai).toBeUndefined(); - expect(resolvePluginWebSearchProvidersMock).not.toHaveBeenCalled(); + expect(getResolvePluginWebSearchProvidersMock()).not.toHaveBeenCalled(); }); it("still resolves legacy x_search auth in place even when unrelated legacy config is present", async () => { @@ -183,7 +107,7 @@ describe("secrets runtime snapshot legacy x_search", () => { enabled: true, }); expect(snapshot.config.plugins?.entries?.xai).toBeUndefined(); - expect(resolvePluginWebSearchProvidersMock).not.toHaveBeenCalled(); + expect(getResolvePluginWebSearchProvidersMock()).not.toHaveBeenCalled(); }); it("does not force-enable xai at runtime for knob-only x_search config", async () => { @@ -208,6 +132,6 @@ describe("secrets runtime snapshot legacy x_search", () => { model: "grok-4-1-fast", }); expect(snapshot.config.plugins?.entries?.xai).toBeUndefined(); - expect(resolvePluginWebSearchProvidersMock).not.toHaveBeenCalled(); + expect(getResolvePluginWebSearchProvidersMock()).not.toHaveBeenCalled(); }); }); diff --git a/src/secrets/runtime.test-support.ts b/src/secrets/runtime.test-support.ts index 4ac3395a72b..e39bdca266d 100644 --- a/src/secrets/runtime.test-support.ts +++ b/src/secrets/runtime.test-support.ts @@ -98,6 +98,10 @@ export function resetPluginWebSearchProvidersMock() { resolvePluginWebSearchProvidersMock.mockReturnValue(buildTestWebSearchProviders()); } +export function getResolvePluginWebSearchProvidersMock() { + return resolvePluginWebSearchProvidersMock; +} + export function setupSecretsRuntimeSnapshotTestHooks(): { prepareSecretsRuntimeSnapshot: PrepareSecretsRuntimeSnapshot; } {