


























@@ -102,6 +102,46 @@ function buildPluginsParams(commandBodyNormalized: string, cfg: OpenClawConfig)
102102});
103103}
104104105+type MockCalls = {
106+mock: { calls: unknown[][] };
107+};
108+109+function requireRecord(value: unknown, label: string): Record<string, unknown> {
110+expect(typeof value, label).toBe("object");
111+expect(value, label).not.toBeNull();
112+return value as Record<string, unknown>;
113+}
114+115+function getNestedRecord(record: Record<string, unknown>, key: string, label: string) {
116+return requireRecord(record[key], label);
117+}
118+119+function expectPluginEnabledInConfig(config: unknown, enabled: boolean) {
120+const configRecord = requireRecord(config, "config");
121+const plugins = getNestedRecord(configRecord, "plugins", "config.plugins");
122+const entries = getNestedRecord(plugins, "entries", "config.plugins.entries");
123+const superpowers = getNestedRecord(entries, "superpowers", "superpowers entry");
124+expect(superpowers.enabled).toBe(enabled);
125+}
126+127+function expectLastReplaceConfig(enabled: boolean) {
128+const calls = (replaceConfigFileMock as unknown as MockCalls).mock.calls;
129+expect(calls.length).toBeGreaterThan(0);
130+const [payload] = calls.at(-1) ?? [];
131+const payloadRecord = requireRecord(payload, "replace config payload");
132+expectPluginEnabledInConfig(payloadRecord.nextConfig, enabled);
133+expect(payloadRecord.afterWrite).toEqual({ mode: "auto" });
134+}
135+136+function expectLastRegistryRefresh(enabled: boolean) {
137+const calls = (refreshPluginRegistryAfterConfigMutationMock as unknown as MockCalls).mock.calls;
138+expect(calls.length).toBeGreaterThan(0);
139+const [payload] = calls.at(-1) ?? [];
140+const payloadRecord = requireRecord(payload, "registry refresh payload");
141+expect(payloadRecord.reason).toBe("policy-changed");
142+expectPluginEnabledInConfig(payloadRecord.config, enabled);
143+}
144+105145describe("handlePluginsCommand", () => {
106146beforeEach(() => {
107147vi.clearAllMocks();
@@ -206,60 +246,16 @@ describe("handlePluginsCommand", () => {
206246207247const enableResult = await handlePluginsCommand(enableParams, true);
208248expect(enableResult?.reply?.text).toContain('Plugin "superpowers" enabled');
209-expect(replaceConfigFileMock).toHaveBeenLastCalledWith(
210-expect.objectContaining({
211-nextConfig: expect.objectContaining({
212-plugins: expect.objectContaining({
213-entries: expect.objectContaining({
214-superpowers: expect.objectContaining({ enabled: true }),
215-}),
216-}),
217-}),
218-afterWrite: { mode: "auto" },
219-}),
220-);
221-expect(refreshPluginRegistryAfterConfigMutationMock).toHaveBeenLastCalledWith(
222-expect.objectContaining({
223-reason: "policy-changed",
224-config: expect.objectContaining({
225-plugins: expect.objectContaining({
226-entries: expect.objectContaining({
227-superpowers: expect.objectContaining({ enabled: true }),
228-}),
229-}),
230-}),
231-}),
232-);
249+expectLastReplaceConfig(true);
250+expectLastRegistryRefresh(true);
233251234252const disableParams = buildPluginsParams("/plugins disable superpowers", buildCfg());
235253disableParams.command.senderIsOwner = true;
236254237255const disableResult = await handlePluginsCommand(disableParams, true);
238256expect(disableResult?.reply?.text).toContain('Plugin "superpowers" disabled');
239-expect(replaceConfigFileMock).toHaveBeenLastCalledWith(
240-expect.objectContaining({
241-nextConfig: expect.objectContaining({
242-plugins: expect.objectContaining({
243-entries: expect.objectContaining({
244-superpowers: expect.objectContaining({ enabled: false }),
245-}),
246-}),
247-}),
248-afterWrite: { mode: "auto" },
249-}),
250-);
251-expect(refreshPluginRegistryAfterConfigMutationMock).toHaveBeenLastCalledWith(
252-expect.objectContaining({
253-reason: "policy-changed",
254-config: expect.objectContaining({
255-plugins: expect.objectContaining({
256-entries: expect.objectContaining({
257-superpowers: expect.objectContaining({ enabled: false }),
258-}),
259-}),
260-}),
261-}),
262-);
257+expectLastReplaceConfig(false);
258+expectLastRegistryRefresh(false);
263259});
264260265261it("refuses plugin enablement in Nix mode before reading or replacing config", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。