openclaw/src/cli/program/register.maintenance.test.ts

163 lines
3.9 KiB
TypeScript

import { Command } from "commander";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { registerMaintenanceCommands } from "./register.maintenance.js";
const mocks = vi.hoisted(() => ({
doctorCommand: vi.fn(),
dashboardCommand: vi.fn(),
resetCommand: vi.fn(),
uninstallCommand: vi.fn(),
runtime: {
log: vi.fn(),
error: vi.fn(),
exit: vi.fn(),
},
}));
const { doctorCommand, dashboardCommand, resetCommand, uninstallCommand, runtime } = mocks;
vi.mock("../../commands/doctor.js", () => ({
doctorCommand: mocks.doctorCommand,
}));
vi.mock("../../commands/dashboard.js", () => ({
dashboardCommand: mocks.dashboardCommand,
}));
vi.mock("../../commands/reset.js", () => ({
resetCommand: mocks.resetCommand,
}));
vi.mock("../../commands/uninstall.js", () => ({
uninstallCommand: mocks.uninstallCommand,
}));
vi.mock("../../runtime.js", () => ({
defaultRuntime: mocks.runtime,
}));
describe("registerMaintenanceCommands doctor action", () => {
async function runMaintenanceCli(args: string[]) {
const program = new Command();
registerMaintenanceCommands(program);
await program.parseAsync(args, { from: "user" });
}
beforeEach(() => {
vi.clearAllMocks();
});
it("exits with code 0 after successful doctor run", async () => {
doctorCommand.mockResolvedValue(undefined);
await runMaintenanceCli(["doctor", "--non-interactive", "--yes"]);
expect(doctorCommand).toHaveBeenCalledWith(
runtime,
expect.objectContaining({
nonInteractive: true,
yes: true,
}),
);
expect(runtime.exit).toHaveBeenCalledWith(0);
});
it("exits with code 1 when doctor fails", async () => {
doctorCommand.mockRejectedValue(new Error("doctor failed"));
await runMaintenanceCli(["doctor"]);
expect(runtime.error).toHaveBeenCalledWith("Error: doctor failed");
expect(runtime.exit).toHaveBeenCalledWith(1);
expect(runtime.exit).not.toHaveBeenCalledWith(0);
});
it("maps --fix to repair=true", async () => {
doctorCommand.mockResolvedValue(undefined);
await runMaintenanceCli(["doctor", "--fix"]);
expect(doctorCommand).toHaveBeenCalledWith(
runtime,
expect.objectContaining({
repair: true,
}),
);
});
it("passes noOpen to dashboard command", async () => {
dashboardCommand.mockResolvedValue(undefined);
await runMaintenanceCli(["dashboard", "--no-open"]);
expect(dashboardCommand).toHaveBeenCalledWith(
runtime,
expect.objectContaining({
noOpen: true,
}),
);
});
it("passes reset options to reset command", async () => {
resetCommand.mockResolvedValue(undefined);
await runMaintenanceCli([
"reset",
"--scope",
"full",
"--yes",
"--non-interactive",
"--dry-run",
]);
expect(resetCommand).toHaveBeenCalledWith(
runtime,
expect.objectContaining({
scope: "full",
yes: true,
nonInteractive: true,
dryRun: true,
}),
);
});
it("passes uninstall options to uninstall command", async () => {
uninstallCommand.mockResolvedValue(undefined);
await runMaintenanceCli([
"uninstall",
"--service",
"--state",
"--workspace",
"--app",
"--all",
"--yes",
"--non-interactive",
"--dry-run",
]);
expect(uninstallCommand).toHaveBeenCalledWith(
runtime,
expect.objectContaining({
service: true,
state: true,
workspace: true,
app: true,
all: true,
yes: true,
nonInteractive: true,
dryRun: true,
}),
);
});
it("exits with code 1 when dashboard fails", async () => {
dashboardCommand.mockRejectedValue(new Error("dashboard failed"));
await runMaintenanceCli(["dashboard"]);
expect(runtime.error).toHaveBeenCalledWith("Error: dashboard failed");
expect(runtime.exit).toHaveBeenCalledWith(1);
});
});