openclaw/src/commands/uninstall.test.ts

67 lines
1.9 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
import { createNonExitingRuntime } from "../runtime.js";
const resolveCleanupPlanFromDisk = vi.fn();
const removePath = vi.fn();
const removeStateAndLinkedPaths = vi.fn();
const removeWorkspaceDirs = vi.fn();
vi.mock("../config/config.js", () => ({
isNixMode: false,
}));
vi.mock("./cleanup-plan.js", () => ({
resolveCleanupPlanFromDisk,
}));
vi.mock("./cleanup-utils.js", () => ({
removePath,
removeStateAndLinkedPaths,
removeWorkspaceDirs,
}));
const { uninstallCommand } = await import("./uninstall.js");
describe("uninstallCommand", () => {
const runtime = createNonExitingRuntime();
beforeEach(() => {
vi.clearAllMocks();
resolveCleanupPlanFromDisk.mockReturnValue({
stateDir: "/tmp/.openclaw",
configPath: "/tmp/.openclaw/openclaw.json",
oauthDir: "/tmp/.openclaw/credentials",
configInsideState: true,
oauthInsideState: true,
workspaceDirs: ["/tmp/.openclaw/workspace"],
});
removePath.mockResolvedValue({ ok: true });
removeStateAndLinkedPaths.mockResolvedValue(undefined);
removeWorkspaceDirs.mockResolvedValue(undefined);
vi.spyOn(runtime, "log").mockImplementation(() => {});
vi.spyOn(runtime, "error").mockImplementation(() => {});
});
it("recommends creating a backup before removing state or workspaces", async () => {
await uninstallCommand(runtime, {
state: true,
yes: true,
nonInteractive: true,
dryRun: true,
});
expect(runtime.log).toHaveBeenCalledWith(expect.stringContaining("openclaw backup create"));
});
it("does not recommend backup for service-only uninstall", async () => {
await uninstallCommand(runtime, {
service: true,
yes: true,
nonInteractive: true,
dryRun: true,
});
expect(runtime.log).not.toHaveBeenCalledWith(expect.stringContaining("openclaw backup create"));
});
});