



















@@ -1,19 +1,36 @@
11import { beforeEach, describe, expect, it } from "vitest";
22import type { OpenClawConfig } from "../config/config.js";
33import {
4+buildPluginRegistrySnapshotReport,
45enablePluginInConfig,
56loadConfig,
67refreshPluginRegistry,
78resetPluginsCliTestState,
9+runtimeErrors,
810runPluginsCommand,
911writeConfigFile,
1012} from "./plugins-cli-test-helpers.js";
11131214describe("plugins cli policy mutations", () => {
15+const compatibilityPluginIds = [
16+{ alias: "openai-codex", pluginId: "openai" },
17+{ alias: "google-gemini-cli", pluginId: "google" },
18+{ alias: "minimax-portal-auth", pluginId: "minimax" },
19+] as const;
20+1321beforeEach(() => {
1422resetPluginsCliTestState();
1523});
162425+function mockPluginRegistry(ids: string[]) {
26+buildPluginRegistrySnapshotReport.mockReturnValue({
27+plugins: ids.map((id) => ({ id })),
28+diagnostics: [],
29+registrySource: "derived",
30+registryDiagnostics: [],
31+});
32+}
33+1734it("refreshes the persisted plugin registry after enabling a plugin", async () => {
1835const enabledConfig = {
1936plugins: {
@@ -28,6 +45,7 @@ describe("plugins cli policy mutations", () => {
2845enabled: true,
2946pluginId: "alpha",
3047});
48+mockPluginRegistry(["alpha"]);
31493250await runPluginsCommand(["plugins", "enable", "alpha"]);
3351@@ -48,6 +66,7 @@ describe("plugins cli policy mutations", () => {
4866},
4967},
5068} as OpenClawConfig);
69+mockPluginRegistry(["alpha"]);
51705271await runPluginsCommand(["plugins", "disable", "alpha"]);
5372@@ -60,4 +79,67 @@ describe("plugins cli policy mutations", () => {
6079reason: "policy-changed",
6180});
6281});
82+83+it.each(compatibilityPluginIds)(
84+"enables compatibility id $alias through canonical plugin $pluginId",
85+async ({ alias, pluginId }) => {
86+const sourceConfig = {} as OpenClawConfig;
87+const enabledConfig = {
88+plugins: {
89+entries: {
90+[pluginId]: { enabled: true },
91+},
92+},
93+} as OpenClawConfig;
94+loadConfig.mockReturnValue(sourceConfig);
95+enablePluginInConfig.mockReturnValue({
96+config: enabledConfig,
97+enabled: true,
98+});
99+mockPluginRegistry([pluginId]);
100+101+await runPluginsCommand(["plugins", "enable", alias]);
102+103+expect(enablePluginInConfig).toHaveBeenCalledWith(sourceConfig, pluginId);
104+expect(writeConfigFile).toHaveBeenCalledWith(enabledConfig);
105+},
106+);
107+108+it.each(compatibilityPluginIds)(
109+"disables compatibility id $alias through canonical plugin $pluginId",
110+async ({ alias, pluginId }) => {
111+loadConfig.mockReturnValue({
112+plugins: {
113+entries: {
114+[pluginId]: { enabled: true },
115+},
116+},
117+} as OpenClawConfig);
118+mockPluginRegistry([pluginId]);
119+120+await runPluginsCommand(["plugins", "disable", alias]);
121+122+const nextConfig = writeConfigFile.mock.calls[0]?.[0] as OpenClawConfig;
123+expect(nextConfig.plugins?.entries?.[pluginId]?.enabled).toBe(false);
124+expect(nextConfig.plugins?.entries?.[alias]).toBeUndefined();
125+},
126+);
127+128+it.each(["enable", "disable"] as const)(
129+"rejects %s for a plugin that is not discovered",
130+async (command) => {
131+mockPluginRegistry(["alpha"]);
132+133+await expect(runPluginsCommand(["plugins", command, "missing-plugin"])).rejects.toThrow(
134+"__exit__:1",
135+);
136+137+expect(runtimeErrors).toContain(
138+"Plugin not found: missing-plugin. Run `openclaw plugins list` to see installed plugins.",
139+);
140+expect(enablePluginInConfig).not.toHaveBeenCalled();
141+expect(writeConfigFile).not.toHaveBeenCalled();
142+expect(refreshPluginRegistry).not.toHaveBeenCalled();
143+},
144+);
63145});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。