104 lines · 3.4 KB · TypeScript
RawDownload
import { beforeEach, describe, expect, it } from "vite-plus/test"; import {  completeConfirmDialogClose,  readConfirmDialogState,  registerConfirmDialogHost,  requestConfirmDialog,  resetConfirmDialogForTests,  respondToConfirmDialog,} from "./confirmDialog"; function requireConfirmation(confirmation: Promise<boolean> | undefined): Promise<boolean> {  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);  });});