import { StrictMode } from "react"; import { act } from "react"; import { createRoot, type Root } from "react-dom/client"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const resolveMock = vi.fn(); beforeEach(() => { vi.resetModules(); resolveMock.mockReset(); vi.doMock("@/client/lib/api", () => ({ api: { pageMentions: { resolve: resolveMock, }, }, })); }); afterEach(() => { vi.restoreAllMocks(); vi.unstubAllGlobals(); }); async function flushReactWork() { await act(async () => { await Promise.resolve(); await Promise.resolve(); await Promise.resolve(); }); } describe("PageMentionProvider", () => { it("keeps a live resolver under React StrictMode", async () => { resolveMock.mockResolvedValue({ mentions: [{ page_id: "page-2", accessible: true, title: "Roadmap", icon: null }], }); const { PageMentionProvider } = await import("@/client/components/page-mention/provider"); const { usePageMentionEntry } = await import("@/client/components/page-mention/context"); function Probe() { const entry = usePageMentionEntry("page-2"); return {entry.title ?? entry.status}; } const host = document.createElement("div"); document.body.appendChild(host); let root: Root | null = createRoot(host); try { await act(async () => { root!.render( {}} > , ); }); await flushReactWork(); expect(resolveMock).toHaveBeenCalledWith("workspace-1", ["page-2"], undefined); expect(host.textContent).toBe("Roadmap"); } finally { await act(async () => { root?.unmount(); }); root = null; host.remove(); } }); });