-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreset.test.ts
More file actions
98 lines (76 loc) · 2.6 KB
/
reset.test.ts
File metadata and controls
98 lines (76 loc) · 2.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import { describe, expect, it, vi } from "vitest";
import { runCommand } from "./helpers.js";
vi.mock("../../src/lib/program.js", () => ({
program: { opts: () => ({}) },
}));
const mockRm = vi.fn();
vi.mock("node:fs/promises", () => ({
rm: (...args: unknown[]) => mockRm(...args),
}));
const mockClearTokens = vi.fn();
vi.mock("../../src/lib/token-storage.js", () => ({
clearTokens: () => mockClearTokens(),
}));
let mockAnswer = "y";
vi.mock("node:readline", () => ({
createInterface: () => ({
question: (_msg: string, cb: (answer: string) => void) => {
cb(mockAnswer);
},
close: vi.fn(),
}),
}));
const { resetCommand } = await import("../../src/commands/reset.js");
describe("reset", () => {
it("skips confirmation with --force", async () => {
mockRm.mockResolvedValue(undefined);
mockClearTokens.mockResolvedValueOnce(undefined);
await runCommand(resetCommand, ["--force"]);
expect(mockRm).toHaveBeenCalledTimes(2);
expect(mockClearTokens).toHaveBeenCalled();
});
it("aborts when user answers no", async () => {
mockAnswer = "n";
mockRm.mockReset();
mockClearTokens.mockReset();
await runCommand(resetCommand, []);
expect(mockRm).not.toHaveBeenCalled();
expect(mockClearTokens).not.toHaveBeenCalled();
});
it("proceeds when user answers yes", async () => {
mockAnswer = "y";
mockRm.mockReset();
mockRm.mockResolvedValue(undefined);
mockClearTokens.mockReset();
mockClearTokens.mockResolvedValueOnce(undefined);
await runCommand(resetCommand, []);
expect(mockRm).toHaveBeenCalledTimes(2);
expect(mockClearTokens).toHaveBeenCalled();
});
it("aborts on empty answer (no default)", async () => {
mockAnswer = "";
mockRm.mockReset();
mockClearTokens.mockReset();
await runCommand(resetCommand, []);
expect(mockRm).not.toHaveBeenCalled();
expect(mockClearTokens).not.toHaveBeenCalled();
});
it("handles missing files gracefully", async () => {
mockRm.mockReset();
mockRm.mockRejectedValue(new Error("ENOENT"));
mockClearTokens.mockReset();
mockClearTokens.mockResolvedValueOnce(undefined);
await runCommand(resetCommand, ["--force"]);
expect(mockClearTokens).toHaveBeenCalled();
});
it("handles unexpected errors", async () => {
mockRm.mockReset();
mockRm.mockResolvedValue(undefined);
mockClearTokens.mockReset();
mockClearTokens.mockRejectedValueOnce(new Error("Disk error"));
const original = process.exitCode;
await runCommand(resetCommand, ["--force"]);
expect(process.exitCode).toBe(1);
process.exitCode = original;
});
});