diff --git a/tests/close.test.ts b/tests/close.test.ts index 27d56f3..282e54f 100644 --- a/tests/close.test.ts +++ b/tests/close.test.ts @@ -122,6 +122,46 @@ describe("closeMultiModel", () => { expect(result.error).toBe("Cleanup cancelled by user"); }); + test("user confirms cleanup when not forced", async () => { + mockCommandResponses["tmux has-session -t test-session"] = { ok: false, stdout: "", stderr: "" }; + const worktreePath = "/home/user/.local/share/opencode/multi-model/test-session/model"; + const worktreeListOutput = `worktree ${worktreePath}\nbranch refs/heads/opencode/test-session/model`; + mockCommandResponses["git worktree list --porcelain"] = { ok: true, stdout: worktreeListOutput, stderr: "" }; + + // Stub readline to simulate user confirming cleanup (answers "y") + const mockInterface = { + question: (q: string, cb: (a: string) => void) => cb("y"), + close: () => {}, + } as any; + spyOn(readline, "createInterface").mockImplementation(() => mockInterface); + + // Freeze timestamp for deterministic tag name + const fixedDate = new Date("2023-01-01T00:00:00.000Z"); + const OriginalDate = Date; + // @ts-ignore + global.Date = class extends OriginalDate { constructor() { super(); return fixedDate; } toISOString() { return "2023-01-01T00:00:00.000Z"; } } as any; + + const result = await closeMultiModel({ sessionName: "test-session", cleanupWorktrees: true, force: false }); + + // Restore Date after invocation + // @ts-ignore + global.Date = OriginalDate; + + // Verify result indicates successful cleanup + expect(result.success).toBe(true); + expect(result.cleanupPerformed).toBe(true); + expect(result.worktreesRemoved).toEqual([worktreePath]); + expect(result.branchesDeleted).toEqual(["opencode/test-session/model"]); + expect(result.tagsCreated?.length).toBe(1); + expect(result.warnings).toEqual([]); + + // Verify the expected git commands were executed + expect(executedCommands).toContain(`git worktree remove -f ${worktreePath}`); + expect(executedCommands).toContain(`git branch -D opencode/test-session/model`); + const expectedTagCmd = `git tag archive/opencode/test-session/model-2023-01-01T00-00-00-000Z opencode/test-session/model`; + expect(executedCommands).toContain(expectedTagCmd); + }); + test("warning when tag creation fails", async () => { mockCommandResponses["tmux has-session -t test-session"] = { ok: false, stdout: "", stderr: "" }; const worktreePath = "/home/user/.local/share/opencode/multi-model/test-session/model";