1import { beforeEach, describe, expect, it, vi } from "vite-plus/test";
2
3const { confirmMock, readLocalApiMock } = vi.hoisted(() => {
4 const confirmMock = vi.fn<(message: string, options?: unknown) => Promise<boolean>>();
5 const readLocalApiMock = vi.fn<
6 () =>
7 | {
8 dialogs: { confirm: (message: string, options?: unknown) => Promise<boolean> };
9 }
10 | undefined
11 >();
12 return { confirmMock, readLocalApiMock };
13});
14
15vi.mock("~/localApi", () => ({
16 readLocalApi: () => readLocalApiMock(),
17}));
18
19import { confirmTerminalClose, isTerminalCloseConfirmPending } from "./terminalCloseConfirm";
20
21describe("terminal close confirmation", () => {
22 beforeEach(() => {
23 confirmMock.mockReset();
24 readLocalApiMock.mockReset();
25 readLocalApiMock.mockReturnValue({ dialogs: { confirm: confirmMock } });
26 });
27
28 it("clears pending state and resolves false when the dialog rejects", async () => {
29 let reject: (reason?: unknown) => void = () => undefined;
30 confirmMock.mockImplementation(
31 () =>
32 new Promise<boolean>((_resolve, rejectPromise) => {
33 reject = rejectPromise;
34 }),
35 );
36
37 const confirmation = confirmTerminalClose(["Terminal 1"]);
38 expect(isTerminalCloseConfirmPending()).toBe(true);
39
40 reject(new Error("dialog failed"));
41 await expect(confirmation).resolves.toBe(false);
42 expect(isTerminalCloseConfirmPending()).toBe(false);
43 });
44});