From 01b3ece441d97a147332aa720e898562aa85a62a Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Thu, 13 Aug 2026 12:30:34 +0800 Subject: [PATCH] test(plugins): refresh fixture contracts (#122986) --- src/plugins/plugin-lookup-table.test.ts | 9 ++++++ .../runtime/metadata-registry-loader.test.ts | 4 +++ .../runtime/runtime-registry-loader.test.ts | 20 ++++++++++++- .../status-effective-plugin-discovery.test.ts | 29 +++++++++++++------ 4 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/plugins/plugin-lookup-table.test.ts b/src/plugins/plugin-lookup-table.test.ts index b3710f3251d0..bc35dc04d6a8 100644 --- a/src/plugins/plugin-lookup-table.test.ts +++ b/src/plugins/plugin-lookup-table.test.ts @@ -32,6 +32,15 @@ vi.mock("../channels/config-presence.js", () => ({ env: NodeJS.ProcessEnv, options?: { includePersistedAuthState?: boolean }, ) => listPotentialConfiguredChannelIds(config, env, options), + listPotentialConfiguredChannelPresenceSignals: ( + config: OpenClawConfig, + env: NodeJS.ProcessEnv, + options?: { includePersistedAuthState?: boolean }, + ) => + listPotentialConfiguredChannelIds(config, env, options).map((channelId: string) => ({ + channelId, + source: "env" as const, + })), listExplicitlyDisabledChannelIdsForConfig: (config: OpenClawConfig) => listExplicitlyDisabledChannelIdsForConfig(config), })); diff --git a/src/plugins/runtime/metadata-registry-loader.test.ts b/src/plugins/runtime/metadata-registry-loader.test.ts index c6c77c8fe54f..6ac6dd0d0e7c 100644 --- a/src/plugins/runtime/metadata-registry-loader.test.ts +++ b/src/plugins/runtime/metadata-registry-loader.test.ts @@ -24,7 +24,11 @@ vi.mock("../loader.js", () => ({ })); vi.mock("../../agents/agent-scope.js", () => ({ + listAgentEntries: vi.fn(() => []), resolveAgentWorkspaceDir: () => "/resolved-workspace", + tryResolveConfiguredAgentWorkspaceDir: vi.fn< + typeof import("../../agents/agent-scope.js").tryResolveConfiguredAgentWorkspaceDir + >(() => "/resolved-workspace"), resolveDefaultAgentId: () => "default", })); diff --git a/src/plugins/runtime/runtime-registry-loader.test.ts b/src/plugins/runtime/runtime-registry-loader.test.ts index c4ecca89baa2..afd1775ff010 100644 --- a/src/plugins/runtime/runtime-registry-loader.test.ts +++ b/src/plugins/runtime/runtime-registry-loader.test.ts @@ -19,9 +19,16 @@ const mocks = vi.hoisted(() => ({ vi.fn(), isPluginMetadataSnapshotCompatible: vi.fn(), + rebasePluginMetadataSnapshotManifestRegistry: vi.fn< + typeof import("../plugin-metadata-snapshot.js").rebasePluginMetadataSnapshotManifestRegistry + >((snapshot) => snapshot), + listAgentEntries: vi.fn(() => []), resolveAgentWorkspaceDir: vi.fn< typeof import("../../agents/agent-scope.js").resolveAgentWorkspaceDir >(() => "/resolved-workspace"), + tryResolveConfiguredAgentWorkspaceDir: vi.fn< + typeof import("../../agents/agent-scope.js").tryResolveConfiguredAgentWorkspaceDir + >(() => "/resolved-workspace"), resolveDefaultAgentId: vi.fn( () => "default", ), @@ -63,11 +70,19 @@ vi.mock("../plugin-metadata-snapshot.js", () => ({ isPluginMetadataSnapshotCompatible: ( ...args: Parameters ) => mocks.isPluginMetadataSnapshotCompatible(...args), + rebasePluginMetadataSnapshotManifestRegistry: ( + ...args: Parameters + ) => mocks.rebasePluginMetadataSnapshotManifestRegistry(...args), })); vi.mock("../../agents/agent-scope.js", () => ({ + listAgentEntries: (...args: Parameters) => + mocks.listAgentEntries(...args), resolveAgentWorkspaceDir: (...args: Parameters) => mocks.resolveAgentWorkspaceDir(...args), + tryResolveConfiguredAgentWorkspaceDir: ( + ...args: Parameters + ) => mocks.tryResolveConfiguredAgentWorkspaceDir(...args), resolveDefaultAgentId: (...args: Parameters) => mocks.resolveDefaultAgentId(...args), })); @@ -107,7 +122,10 @@ function requireLoadOptions(): Record { describe("ensurePluginRegistryLoaded", () => { beforeEach(() => { vi.clearAllMocks(); - mocks.resolvePluginMetadataSnapshot.mockReset(); + mocks.resolvePluginMetadataSnapshot.mockReset().mockReturnValue({ + index: { installRecords: {}, plugins: [{ pluginId: "openai" }] }, + manifestRegistry: { plugins: [], diagnostics: [] }, + } as never); mocks.isPluginMetadataSnapshotCompatible.mockReturnValue(true); mocks.applyPluginAutoEnable.mockImplementation((params) => ({ config: params.config ?? {}, diff --git a/src/plugins/status-effective-plugin-discovery.test.ts b/src/plugins/status-effective-plugin-discovery.test.ts index 73f475a4f9cf..018188e21f28 100644 --- a/src/plugins/status-effective-plugin-discovery.test.ts +++ b/src/plugins/status-effective-plugin-discovery.test.ts @@ -3,22 +3,23 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -import { afterAll, beforeEach, expect, it, vi } from "vitest"; +import { afterAll, afterEach, beforeEach, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../config/types.openclaw.js"; +import { clearCurrentPluginMetadataSnapshot } from "./current-plugin-metadata-state.js"; import type { PluginMetadataSnapshot } from "./plugin-metadata-snapshot.types.js"; import { createColdPluginFixture } from "./test-helpers/cold-plugin-fixtures.js"; const counters = vi.hoisted(() => ({ manifestRegistryRebuilds: 0, discoveryScans: 0 })); -vi.mock("./plugin-registry-contributions.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../config/io.plugin-metadata.js", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, - loadPluginManifestRegistryForPluginRegistry: ( - ...args: Parameters + resolveConfigWidePluginManifestRegistry: ( + ...args: Parameters ) => { counters.manifestRegistryRebuilds += 1; - return actual.loadPluginManifestRegistryForPluginRegistry(...args); + return actual.resolveConfigWidePluginManifestRegistry(...args); }, }; }); @@ -89,11 +90,16 @@ function countResolve(metadataSnapshot: PluginMetadataSnapshot): { } beforeEach(() => { + clearCurrentPluginMetadataSnapshot(); vi.stubEnv("OPENCLAW_DISABLE_BUNDLED_PLUGINS", "1"); vi.stubEnv("OPENCLAW_HOME", path.join(tempRoot, "home")); vi.stubEnv("OPENCLAW_STATE_DIR", path.join(tempRoot, "state")); }); +afterEach(() => { + clearCurrentPluginMetadataSnapshot(); +}); + afterAll(() => { fs.rmSync(tempRoot, { recursive: true, force: true }); vi.unstubAllEnvs(); @@ -117,11 +123,16 @@ it("only reuses a snapshot that answers for the whole config", () => { const env = process.env; const withoutSnapshot = resolveEffectivePluginIds({ config, env }); const full = countResolve(loadPluginMetadataSnapshot({ config, env })); + clearCurrentPluginMetadataSnapshot(); // `recordPluginInstallSource` asks for one plugin's effective state, which scopes the // snapshot to that plugin and truncates its manifest set to that plugin alone. - const scoped = countResolve( - loadPluginMetadataSnapshot({ config, env, pluginIds: ["other-plugin"] }), - ); + const scopedSnapshot = loadPluginMetadataSnapshot({ + config, + env, + pluginIds: ["other-plugin"], + }); + clearCurrentPluginMetadataSnapshot(); + const scoped = countResolve(scopedSnapshot); expect({ full: full.ids, scoped: scoped.ids }).toEqual({ full: withoutSnapshot,