// @vitest-environment jsdom import { act } from "react"; import { createRoot } from "react-dom/client"; import { afterEach, beforeEach, expect, it, vi } from "vitest"; import { BoardDialogs } from "./BoardDialogs"; const state = vi.hoisted(() => ({ newIssueOpen: false, newProjectOpen: false, newGoalOpen: false, newAgentOpen: false })); vi.mock("../context/DialogContext", () => ({ useDialogState: () => state, useDialogActions: () => ({ closeNewIssue: vi.fn(), closeNewProject: vi.fn(), closeNewGoal: vi.fn(), closeNewAgent: vi.fn() }) })); vi.mock("./NewIssueDialog", () => ({ NewIssueDialog: () => })); vi.mock("./NewProjectDialog", () => ({ NewProjectDialog: () =>
Project dialog
})); vi.mock("./NewGoalDialog", () => ({ NewGoalDialog: () =>
Goal dialog
})); vi.mock("./NewAgentDialog", () => ({ NewAgentDialog: () =>
Agent dialog
})); let container: HTMLDivElement; let root: ReturnType; beforeEach(() => { Object.assign(state, { newIssueOpen: false, newProjectOpen: false, newGoalOpen: false, newAgentOpen: false }); container = document.createElement("div"); document.body.appendChild(container); root = createRoot(container); }); afterEach(async () => { await act(async () => root.unmount()); container.remove(); }); async function render() { await act(async () => { root.render(); }); } it("leaves unopened dialog trees unmounted", async () => { await render(); expect(container.innerHTML).toBe(""); }); it("loads a requested dialog and retains its draft across close and reopen", async () => { await render(); state.newIssueOpen = true; await render(); const draft = container.querySelector("input")!; expect(draft).not.toBeNull(); draft.value = "Keep my draft"; expect(container.textContent).not.toContain("Project dialog"); state.newIssueOpen = false; await render(); state.newIssueOpen = true; await render(); expect(container.querySelector("input")).toBe(draft); expect(container.querySelector("input")?.value).toBe("Keep my draft"); });