





















@@ -8,17 +8,32 @@ type MockManifestRegistry = {
88diagnostics: unknown[];
99};
101011+type MockPluginIndex = {
12+plugins: Array<{
13+pluginId: string;
14+origin: string;
15+enabled: boolean;
16+enabledByDefault?: boolean;
17+}>;
18+diagnostics: unknown[];
19+};
20+1121function createEmptyMockManifestRegistry(): MockManifestRegistry {
1222return { plugins: [], diagnostics: [] };
1323}
142425+function createMockPluginIndex(plugins: MockPluginIndex["plugins"]): MockPluginIndex {
26+return { plugins, diagnostics: [] };
27+}
28+1529const mocks = vi.hoisted(() => ({
1630resolveRuntimePluginRegistry: vi.fn<(params?: unknown) => PluginRegistry | undefined>(
1731() => undefined,
1832),
1933loadPluginManifestRegistry: vi.fn<(params?: Record<string, unknown>) => MockManifestRegistry>(
2034() => createEmptyMockManifestRegistry(),
2135),
36+loadPluginRegistrySnapshot: vi.fn<() => MockPluginIndex>(() => createMockPluginIndex([])),
2237withBundledPluginAllowlistCompat: vi.fn(
2338({ config }: { config?: OpenClawConfig; pluginIds: string[] }) => config,
2439),
@@ -35,7 +50,11 @@ vi.mock("./loader.js", () => ({
3550}));
36513752vi.mock("./plugin-registry.js", () => ({
38-loadPluginManifestRegistryForPluginRegistry: mocks.loadPluginManifestRegistry,
53+loadPluginRegistrySnapshot: mocks.loadPluginRegistrySnapshot,
54+}));
55+56+vi.mock("./manifest-registry-installed.js", () => ({
57+loadPluginManifestRegistryForInstalledIndex: mocks.loadPluginManifestRegistry,
3958}));
40594160vi.mock("./bundled-compat.js", () => ({
@@ -61,6 +80,7 @@ describe("migration provider runtime", () => {
6180vi.clearAllMocks();
6281mocks.resolveRuntimePluginRegistry.mockReturnValue(createEmptyPluginRegistry());
6382mocks.loadPluginManifestRegistry.mockReturnValue(createEmptyMockManifestRegistry());
83+mocks.loadPluginRegistrySnapshot.mockReturnValue(createMockPluginIndex([]));
6484const runtime = await import("./migration-provider-runtime.js");
6585resolvePluginMigrationProvider = runtime.resolvePluginMigrationProvider;
6686resolvePluginMigrationProviders = runtime.resolvePluginMigrationProviders;
@@ -82,6 +102,20 @@ describe("migration provider runtime", () => {
82102mocks.resolveRuntimePluginRegistry.mockImplementation((params?: unknown) =>
83103params === undefined ? active : loaded,
84104);
105+mocks.loadPluginRegistrySnapshot.mockReturnValue(
106+createMockPluginIndex([
107+{
108+pluginId: "external-migration",
109+origin: "installed",
110+enabled: true,
111+},
112+{
113+pluginId: "disabled-external-migration",
114+origin: "installed",
115+enabled: false,
116+},
117+]),
118+);
85119mocks.loadPluginManifestRegistry.mockImplementation((params?: Record<string, unknown>) => ({
86120diagnostics: [],
87121plugins: params?.includeDisabled
@@ -109,11 +143,20 @@ describe("migration provider runtime", () => {
109143const resolved = resolvePluginMigrationProvider({ providerId: "external-import", cfg });
110144111145expect(resolved).toBe(provider);
146+expect(mocks.loadPluginRegistrySnapshot).toHaveBeenCalledWith({
147+config: cfg,
148+env: process.env,
149+preferPersisted: false,
150+});
112151expect(mocks.loadPluginManifestRegistry).toHaveBeenCalledWith({
152+index: expect.objectContaining({
153+plugins: expect.arrayContaining([
154+expect.objectContaining({ pluginId: "external-migration" }),
155+]),
156+}),
113157config: cfg,
114158env: process.env,
115159includeDisabled: true,
116-preferPersisted: false,
117160});
118161expect(mocks.resolveRuntimePluginRegistry).toHaveBeenCalledWith();
119162expect(mocks.resolveRuntimePluginRegistry).toHaveBeenCalledWith({
@@ -136,30 +179,41 @@ describe("migration provider runtime", () => {
136179mocks.resolveRuntimePluginRegistry.mockImplementation((params?: unknown) =>
137180params === undefined ? active : loaded,
138181);
139-mocks.loadPluginManifestRegistry.mockImplementation((params?: Record<string, unknown>) => {
140-if (params?.preferPersisted !== false) {
141-return createEmptyMockManifestRegistry();
142-}
143-return {
144-diagnostics: [],
145-plugins: [
146-{
147-id: "migrate-hermes",
148-origin: "bundled",
149-contracts: { migrationProviders: ["hermes"] },
150-},
151-],
152-};
153-});
182+mocks.loadPluginRegistrySnapshot.mockReturnValue(
183+createMockPluginIndex([
184+{
185+pluginId: "migrate-hermes",
186+origin: "bundled",
187+enabled: true,
188+},
189+]),
190+);
191+mocks.loadPluginManifestRegistry.mockImplementation(() => ({
192+diagnostics: [],
193+plugins: [
194+{
195+id: "migrate-hermes",
196+origin: "bundled",
197+contracts: { migrationProviders: ["hermes"] },
198+},
199+],
200+}));
154201155202const resolved = resolvePluginMigrationProvider({ providerId: "hermes" });
156203157204expect(resolved).toBe(provider);
205+expect(mocks.loadPluginRegistrySnapshot).toHaveBeenCalledWith({
206+config: undefined,
207+env: process.env,
208+preferPersisted: false,
209+});
158210expect(mocks.loadPluginManifestRegistry).toHaveBeenCalledWith({
211+index: expect.objectContaining({
212+plugins: [expect.objectContaining({ pluginId: "migrate-hermes" })],
213+}),
159214config: undefined,
160215env: process.env,
161216includeDisabled: true,
162-preferPersisted: false,
163217});
164218expect(mocks.resolveRuntimePluginRegistry).toHaveBeenCalledWith({
165219onlyPluginIds: ["migrate-hermes"],
@@ -187,6 +241,15 @@ describe("migration provider runtime", () => {
187241mocks.resolveRuntimePluginRegistry.mockImplementation((params?: unknown) =>
188242params === undefined ? active : loaded,
189243);
244+mocks.loadPluginRegistrySnapshot.mockReturnValue(
245+createMockPluginIndex([
246+{
247+pluginId: "external-migration",
248+origin: "installed",
249+enabled: true,
250+},
251+]),
252+);
190253mocks.loadPluginManifestRegistry.mockImplementation((params?: Record<string, unknown>) => ({
191254diagnostics: [],
192255plugins: params?.includeDisabled
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。