import { act, useLayoutEffect } from "react"; import { create, type ReactTestRenderer } from "react-test-renderer"; import { afterEach, beforeEach, describe, expect, it, vi } from "vite-plus/test"; import { usePanelNavigationSuppression } from "./panelAnimations"; let renderer: ReactTestRenderer | null = null; let pendingFrames: FrameRequestCallback[] = []; let observed: boolean[] = []; function SuppressionProbe({ navigationKey }: { navigationKey: string }) { const suppressed = usePanelNavigationSuppression(navigationKey); useLayoutEffect(() => { observed.push(suppressed); }, [suppressed]); return null; } beforeEach(() => { pendingFrames = []; observed = []; vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true); vi.stubGlobal("window", { requestAnimationFrame: vi.fn((callback: FrameRequestCallback) => { pendingFrames.push(callback); return pendingFrames.length; }), cancelAnimationFrame: vi.fn(), }); }); afterEach(async () => { await act(() => renderer?.unmount()); vi.unstubAllGlobals(); }); async function paintPendingFrame() { const callback = pendingFrames.shift(); await act(() => callback?.(0)); } describe("usePanelNavigationSuppression", () => { it("suppresses initial and navigated panel state until each route has painted", async () => { await act(() => { renderer = create(); }); expect(observed.at(-1)).toBe(true); await paintPendingFrame(); expect(observed.at(-1)).toBe(true); await paintPendingFrame(); expect(observed.at(-1)).toBe(false); await act(() => { renderer?.update(); }); expect(observed.at(-1)).toBe(true); await paintPendingFrame(); expect(observed.at(-1)).toBe(true); await paintPendingFrame(); expect(observed.at(-1)).toBe(false); }); });