// @vitest-environment jsdom import { act } from "react"; import { createRoot } from "react-dom/client"; import { afterEach, describe, expect, it } from "vitest"; import { DialogProvider, useDialogActions, useDialogState } from "./DialogContext"; // eslint-disable-next-line @typescript-eslint/no-explicit-any (globalThis as any).IS_REACT_ACT_ENVIRONMENT = true; describe("DialogContext", () => { afterEach(() => { document.body.innerHTML = ""; }); it("keeps action-only consumers from rerendering when dialog state changes", () => { const host = document.createElement("div"); document.body.appendChild(host); const root = createRoot(host); let actionRenderCount = 0; let stateRenderCount = 0; function ActionOnlyConsumer() { actionRenderCount += 1; const { openNewIssue } = useDialogActions(); return ; } function StateConsumer() { stateRenderCount += 1; const { newIssueOpen } = useDialogState(); return {newIssueOpen ? "open" : "closed"}; } act(() => { root.render( , ); }); expect(actionRenderCount).toBe(1); expect(stateRenderCount).toBe(1); const button = host.querySelector("button"); act(() => { button?.dispatchEvent(new MouseEvent("click", { bubbles: true })); }); expect(host.textContent).toContain("open"); expect(actionRenderCount).toBe(1); expect(stateRenderCount).toBe(2); act(() => root.unmount()); }); });