Files
openclaw/src/cli/plugins-list-command.test.ts
2026-05-30 13:00:31 +02:00

107 lines
3.2 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from "vitest";
import type { OutputRuntimeEnv } from "../runtime.js";
function createJsonRuntime(writes: unknown[]): OutputRuntimeEnv {
return {
log: (...args: unknown[]) => writes.push(args.length === 1 ? args[0] : args),
error: vi.fn(),
exit: vi.fn((code: number) => {
throw new Error(`exit ${code}`);
}),
writeStdout: (value: string) => writes.push(value),
writeJson: (value: unknown) => writes.push(value),
};
}
describe("runPluginsListCommand", () => {
afterEach(() => {
vi.doUnmock("../config/config.js");
vi.doUnmock("../plugins/status.js");
vi.doUnmock("../plugins/status-snapshot.js");
vi.doUnmock("../plugins/source-display.js");
vi.doUnmock("../terminal/table.js");
vi.doUnmock("../terminal/theme.js");
vi.doUnmock("./command-format.js");
vi.doUnmock("./plugins-list-format.js");
vi.resetModules();
});
it("does not import human list renderers for JSON output", async () => {
vi.resetModules();
const importedHumanModules: string[] = [];
vi.doMock("../config/config.js", () => ({
getRuntimeConfig: () => ({}),
}));
vi.doMock("../plugins/status.js", () => {
throw new Error("plugins list JSON must use the snapshot status module");
});
vi.doMock("../plugins/status-snapshot.js", () => ({
buildPluginRegistrySnapshotReport: () => ({
workspaceDir: "/workspace",
registrySource: "config",
registryDiagnostics: [],
plugins: [{ id: "demo", enabled: true }],
diagnostics: [],
}),
}));
vi.doMock("../plugins/source-display.js", () => {
importedHumanModules.push("source-display");
return {
formatPluginSourceForTable: vi.fn(),
resolvePluginSourceRoots: vi.fn(),
};
});
vi.doMock("../terminal/table.js", () => {
importedHumanModules.push("table");
return {
getTerminalTableWidth: vi.fn(),
renderTable: vi.fn(),
};
});
vi.doMock("../terminal/theme.js", () => {
importedHumanModules.push("theme");
return {
theme: {
muted: (value: string) => value,
heading: (value: string) => value,
command: (value: string) => value,
error: (value: string) => value,
success: (value: string) => value,
warn: (value: string) => value,
},
};
});
vi.doMock("./command-format.js", () => {
importedHumanModules.push("command-format");
return {
formatCliCommand: (value: string) => value,
};
});
vi.doMock("./plugins-list-format.js", () => {
importedHumanModules.push("plugins-list-format");
return {
formatPluginLine: vi.fn(),
};
});
const { runPluginsListCommand } = await import("./plugins-list-command.js");
const writes: unknown[] = [];
await runPluginsListCommand({ json: true }, createJsonRuntime(writes));
expect(importedHumanModules).toEqual([]);
expect(writes).toEqual([
{
workspaceDir: "/workspace",
registry: {
source: "config",
diagnostics: [],
},
plugins: [{ id: "demo", enabled: true }],
diagnostics: [],
},
]);
});
});