// @vitest-environment jsdom import { flushSync } from "react-dom"; import { createRoot, type Root } from "react-dom/client"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { ConferenceRoomChatGate } from "./ConferenceRoomChatGate"; const mockInstanceSettingsApi = vi.hoisted(() => ({ getExperimental: vi.fn(), })); vi.mock("@/api/instanceSettings", () => ({ instanceSettingsApi: mockInstanceSettingsApi, })); vi.mock("@/lib/router", () => ({ Navigate: ({ to, replace }: { to: string; replace?: boolean }) => (
), Outlet: () =>
gated content
, })); async function flushReact() { for (let index = 0; index < 5; index += 1) { await Promise.resolve(); await new Promise((resolve) => window.setTimeout(resolve, 0)); } flushSync(() => {}); } describe("ConferenceRoomChatGate (PAP-137)", () => { let container: HTMLDivElement; let root: Root | null = null; async function renderGate() { root = createRoot(container); const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } }, }); flushSync(() => { root!.render( , ); }); await flushReact(); } beforeEach(() => { container = document.createElement("div"); document.body.appendChild(container); }); afterEach(() => { flushSync(() => { root?.unmount(); }); root = null; container.remove(); vi.clearAllMocks(); }); it("redirects to the company home when the flag is off", async () => { mockInstanceSettingsApi.getExperimental.mockResolvedValue({ enableConferenceRoomChat: false }); await renderGate(); const navigate = container.querySelector('[data-testid="navigate"]'); expect(navigate?.getAttribute("data-to")).toBe("/dashboard"); expect(navigate?.getAttribute("data-replace")).toBe("true"); expect(container.querySelector('[data-testid="outlet"]')).toBeNull(); }); it("renders the gated routes when the flag is on", async () => { mockInstanceSettingsApi.getExperimental.mockResolvedValue({ enableConferenceRoomChat: true }); await renderGate(); expect(container.querySelector('[data-testid="outlet"]')).not.toBeNull(); expect(container.querySelector('[data-testid="navigate"]')).toBeNull(); }); it("renders nothing (no premature redirect) while the flag is loading", async () => { mockInstanceSettingsApi.getExperimental.mockImplementation(() => new Promise(() => {})); await renderGate(); expect(container.querySelector('[data-testid="navigate"]')).toBeNull(); expect(container.querySelector('[data-testid="outlet"]')).toBeNull(); }); });