import { beforeEach, describe, expect, it, vi } from "vitest"; import type { PluginDiscoveryResult } from "./discovery.js"; const discoverOpenClawPluginsMock = vi.fn(); vi.mock("./discovery.js", async (importOriginal) => { const actual = await importOriginal(); return { ...actual, discoverOpenClawPlugins: (...args: unknown[]) => discoverOpenClawPluginsMock(...args), }; }); const { loadPluginManifestRegistry } = await import("./manifest-registry.js"); const { resolveInstalledPluginIndexRegistry } = await import("./installed-plugin-index-registry.js"); const emptyDiscovery: PluginDiscoveryResult = { candidates: [], diagnostics: [] }; describe("discovery threading", () => { beforeEach(() => { discoverOpenClawPluginsMock.mockReset(); discoverOpenClawPluginsMock.mockReturnValue(emptyDiscovery); }); describe("loadPluginManifestRegistry", () => { it("skips internal discoverOpenClawPlugins when discovery is supplied", () => { loadPluginManifestRegistry({ discovery: emptyDiscovery }); expect(discoverOpenClawPluginsMock).not.toHaveBeenCalled(); }); it("calls discoverOpenClawPlugins when neither discovery nor candidates supplied", () => { loadPluginManifestRegistry({}); expect(discoverOpenClawPluginsMock).toHaveBeenCalledTimes(1); }); it("prefers explicit candidates over discovery when both are supplied", () => { loadPluginManifestRegistry({ candidates: [], diagnostics: [], discovery: emptyDiscovery }); expect(discoverOpenClawPluginsMock).not.toHaveBeenCalled(); }); }); describe("resolveInstalledPluginIndexRegistry", () => { it("skips internal discoverOpenClawPlugins when discovery is supplied", () => { resolveInstalledPluginIndexRegistry({ discovery: emptyDiscovery, installRecords: {} }); expect(discoverOpenClawPluginsMock).not.toHaveBeenCalled(); }); it("calls discoverOpenClawPlugins when neither discovery nor candidates supplied", () => { resolveInstalledPluginIndexRegistry({ installRecords: {} }); expect(discoverOpenClawPluginsMock).toHaveBeenCalledTimes(1); }); it("prefers explicit candidates over discovery when both are supplied", () => { resolveInstalledPluginIndexRegistry({ candidates: [], discovery: emptyDiscovery, installRecords: {}, }); expect(discoverOpenClawPluginsMock).not.toHaveBeenCalled(); }); }); });