// @vitest-environment jsdom
import { act } from "react";
import { createRoot } from "react-dom/client";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { MemoryRouter, Route, Routes } from "react-router-dom";
import { afterEach, expect, it, vi } from "vitest";
import { CloudAccessGate } from "./CloudAccessGate";
import { ShellConfigurationGate } from "./ShellConfigurationGate";
import { useStreamlinedUiEnabled } from "../hooks/useStreamlinedUiEnabled";
vi.mock("@/lib/router", async () => await import("react-router-dom"));
vi.mock("./AnimatedPaperclipIcon", () => ({ PaperclipLoading: () =>
Loading shell
}));
const { health, session, access, settings } = vi.hoisted(() => ({ health: vi.fn(), session: vi.fn(), access: vi.fn(), settings: vi.fn() }));
vi.mock("../api/health", () => ({ healthApi: { get: health } }));
vi.mock("../api/auth", () => ({ authApi: { getSession: session } }));
vi.mock("../api/access", () => ({ accessApi: { getCurrentBoardAccess: access } }));
vi.mock("../api/instanceSettings", () => ({ instanceSettingsApi: { getExperimental: settings } }));
(globalThis as Record).IS_REACT_ACT_ENVIRONMENT = true;
afterEach(() => vi.resetAllMocks());
it.each([false, true])("runs access checks while shell settings are pending (membership=%s)", async allowMembershipRequest => {
let resolveSettings!: (value: unknown) => void;
health.mockResolvedValue({ status: "ok", deploymentMode: "authenticated", bootstrapStatus: "ready" });
session.mockResolvedValue({ user: { id: "user" } });
access.mockResolvedValue({ companyIds: ["company"] });
settings.mockReturnValue(new Promise(resolve => { resolveSettings = resolve; }));
function RoutesUnderTest() {
const { loaded, enabled } = useStreamlinedUiEnabled();
return }>
}>
{enabled ? "Streamlined shell" : "Legacy shell"}} />
;
}
const container = document.createElement("div");
const root = createRoot(container);
const client = new QueryClient({ defaultOptions: { queries: { retry: false } } });
try {
await act(async () => root.render());
await act(async () => { await new Promise(resolve => setTimeout(resolve, 20)); });
expect(health).toHaveBeenCalledTimes(1);
expect(session).toHaveBeenCalledTimes(1);
expect(access).toHaveBeenCalledTimes(1);
expect(container.textContent).not.toContain("Streamlined shell");
expect(container.textContent).not.toContain("Legacy shell");
await act(async () => { resolveSettings({ enableStreamlinedUi: false }); });
await act(async () => { await new Promise(resolve => setTimeout(resolve, 20)); });
expect(container.textContent).toBe("Legacy shell");
} finally {
await act(async () => root.unmount());
client.clear();
}
});