mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-06 14:51:08 +00:00
* refactor(plugins): separate activation from enablement * fix(cli): sanitize verbose plugin activation reasons
106 lines
2.9 KiB
TypeScript
106 lines
2.9 KiB
TypeScript
import { beforeEach, describe, expect, it } from "vitest";
|
|
import { createPluginRecord } from "../plugins/status.test-helpers.js";
|
|
import {
|
|
buildPluginDiagnosticsReport,
|
|
buildPluginSnapshotReport,
|
|
resetPluginsCliTestState,
|
|
runPluginsCommand,
|
|
runtimeLogs,
|
|
} from "./plugins-cli-test-helpers.js";
|
|
|
|
describe("plugins cli list", () => {
|
|
beforeEach(() => {
|
|
resetPluginsCliTestState();
|
|
});
|
|
|
|
it("includes imported state in JSON output", async () => {
|
|
buildPluginSnapshotReport.mockReturnValue({
|
|
workspaceDir: "/workspace",
|
|
plugins: [
|
|
createPluginRecord({
|
|
id: "demo",
|
|
imported: true,
|
|
activated: true,
|
|
explicitlyEnabled: true,
|
|
}),
|
|
],
|
|
diagnostics: [],
|
|
});
|
|
|
|
await runPluginsCommand(["plugins", "list", "--json"]);
|
|
|
|
expect(buildPluginSnapshotReport).toHaveBeenCalledWith();
|
|
|
|
expect(JSON.parse(runtimeLogs[0] ?? "null")).toEqual({
|
|
workspaceDir: "/workspace",
|
|
plugins: [
|
|
expect.objectContaining({
|
|
id: "demo",
|
|
imported: true,
|
|
activated: true,
|
|
explicitlyEnabled: true,
|
|
}),
|
|
],
|
|
diagnostics: [],
|
|
});
|
|
});
|
|
|
|
it("shows imported state in verbose output", async () => {
|
|
buildPluginSnapshotReport.mockReturnValue({
|
|
plugins: [
|
|
createPluginRecord({
|
|
id: "demo",
|
|
name: "Demo Plugin",
|
|
imported: false,
|
|
activated: true,
|
|
explicitlyEnabled: false,
|
|
}),
|
|
],
|
|
diagnostics: [],
|
|
});
|
|
|
|
await runPluginsCommand(["plugins", "list", "--verbose"]);
|
|
|
|
expect(buildPluginSnapshotReport).toHaveBeenCalledWith();
|
|
|
|
const output = runtimeLogs.join("\n");
|
|
expect(output).toContain("activated: yes");
|
|
expect(output).toContain("imported: no");
|
|
expect(output).toContain("explicitly enabled: no");
|
|
});
|
|
|
|
it("sanitizes activation reasons in verbose output", async () => {
|
|
buildPluginSnapshotReport.mockReturnValue({
|
|
plugins: [
|
|
createPluginRecord({
|
|
id: "demo",
|
|
name: "Demo Plugin",
|
|
activated: true,
|
|
activationSource: "auto",
|
|
activationReason: "\u001B[31mconfigured\nnext\tstep",
|
|
}),
|
|
],
|
|
diagnostics: [],
|
|
});
|
|
|
|
await runPluginsCommand(["plugins", "list", "--verbose"]);
|
|
|
|
const output = runtimeLogs.join("\n");
|
|
expect(output).toContain("activation reason: configured\\nnext\\tstep");
|
|
expect(output).not.toContain("\u001B[31m");
|
|
expect(output.match(/activation reason:/g)).toHaveLength(1);
|
|
});
|
|
|
|
it("keeps doctor on a module-loading snapshot", async () => {
|
|
buildPluginDiagnosticsReport.mockReturnValue({
|
|
plugins: [],
|
|
diagnostics: [],
|
|
});
|
|
|
|
await runPluginsCommand(["plugins", "doctor"]);
|
|
|
|
expect(buildPluginDiagnosticsReport).toHaveBeenCalledWith();
|
|
expect(runtimeLogs).toContain("No plugin issues detected.");
|
|
});
|
|
});
|