import { beforeEach, describe, expect, it } from "vite-plus/test"; import { completeConfirmDialogClose, readConfirmDialogState, registerConfirmDialogHost, requestConfirmDialog, resetConfirmDialogForTests, respondToConfirmDialog, } from "./confirmDialog"; function requireConfirmation(confirmation: Promise | undefined): Promise { if (!confirmation) { throw new Error("Expected a registered confirmation host."); } return confirmation; } describe("confirm dialog coordinator", () => { beforeEach(() => { resetConfirmDialogForTests(); }); it("returns undefined until a themed host is mounted", () => { expect(requestConfirmDialog("Confirm this action?")).toBeUndefined(); expect(readConfirmDialogState()).toEqual({ status: "idle" }); }); it("resolves a displayed confirmation and waits for its close transition", async () => { const unregister = registerConfirmDialogHost(); const confirmation = requireConfirmation( requestConfirmDialog("Delete this thread?", { variant: "destructive" }), ); expect(readConfirmDialogState()).toEqual({ status: "confirming", message: "Delete this thread?", variant: "destructive", }); respondToConfirmDialog(true); await expect(confirmation).resolves.toBe(true); expect(readConfirmDialogState()).toEqual({ status: "closing", message: "Delete this thread?", variant: "destructive", }); completeConfirmDialogClose(); expect(readConfirmDialogState()).toEqual({ status: "idle" }); unregister(); }); it("serializes concurrent confirmations", async () => { const unregister = registerConfirmDialogHost(); const first = requireConfirmation(requestConfirmDialog("Delete the project?")); const second = requireConfirmation(requestConfirmDialog("Delete the worktree too?")); respondToConfirmDialog(false); await expect(first).resolves.toBe(false); expect(readConfirmDialogState()).toEqual({ status: "closing", message: "Delete the project?", variant: "default", }); completeConfirmDialogClose(); expect(readConfirmDialogState()).toEqual({ status: "confirming", message: "Delete the worktree too?", variant: "default", }); respondToConfirmDialog(true); await expect(second).resolves.toBe(true); completeConfirmDialogClose(); expect(readConfirmDialogState()).toEqual({ status: "idle" }); unregister(); }); it("cancels active and queued confirmations if the last host unmounts", async () => { const unregister = registerConfirmDialogHost(); const active = requireConfirmation(requestConfirmDialog("Delete the thread?")); const queued = requireConfirmation(requestConfirmDialog("Delete the worktree too?")); unregister(); await expect(Promise.all([active, queued])).resolves.toEqual([false, false]); expect(readConfirmDialogState()).toEqual({ status: "idle" }); }); it("ignores responses after the active dialog has been closed", () => { const unregister = registerConfirmDialogHost(); const confirmation = requireConfirmation(requestConfirmDialog("Continue?")); respondToConfirmDialog(true); respondToConfirmDialog(false); completeConfirmDialogClose(); expect(readConfirmDialogState()).toEqual({ status: "idle" }); unregister(); return expect(confirmation).resolves.toBe(true); }); });