// @vitest-environment jsdom import React from "react"; import { act } from "react"; import { createRoot } from "react-dom/client"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const cleanupCallbacks: Array<() => void> = []; function createTestStorage(): Storage { const entries = new Map(); return { get length() { return entries.size; }, clear: () => entries.clear(), getItem: (key) => entries.get(key) ?? null, key: (index) => Array.from(entries.keys())[index] ?? null, removeItem: (key) => { entries.delete(key); }, setItem: (key, value) => { entries.set(key, value); }, }; } function makeContainer(): HTMLElement { const container = document.createElement("div"); document.body.appendChild(container); cleanupCallbacks.push(() => { container.remove(); }); return container; } describe("AutoRoutingBanner", () => { beforeEach(() => { ( globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean } ).IS_REACT_ACT_ENVIRONMENT = true; vi.stubGlobal("localStorage", createTestStorage()); localStorage.clear(); }); afterEach(() => { while (cleanupCallbacks.length > 0) { cleanupCallbacks.pop()?.(); } document.body.innerHTML = ""; localStorage.clear(); vi.unstubAllGlobals(); }); it("renders banner on first mount", async () => { const { default: AutoRoutingBanner } = await import("@/shared/components/AutoRoutingBanner"); const container = makeContainer(); const root = createRoot(container); await act(async () => { root.render(); }); expect(container.querySelector('[role="banner"]')).toBeTruthy(); expect(container.textContent).toContain("Auto-Routing Active"); }); it("includes link to Combos page", async () => { const { default: AutoRoutingBanner } = await import("@/shared/components/AutoRoutingBanner"); const container = makeContainer(); const root = createRoot(container); await act(async () => { root.render(); }); const link = container.querySelector('a[href="/dashboard/combos"]'); expect(link).toBeTruthy(); }); it("can be dismissed by clicking close button", async () => { const { default: AutoRoutingBanner } = await import("@/shared/components/AutoRoutingBanner"); const container = makeContainer(); const root = createRoot(container); await act(async () => { root.render(); }); expect(container.querySelector('[role="banner"]')).toBeTruthy(); const closeButton = container.querySelector('button[aria-label="Dismiss auto-routing banner"]'); expect(closeButton).toBeTruthy(); await act(async () => { closeButton?.click(); }); expect(container.querySelector('[role="banner"]')).toBeFalsy(); }); it("persists dismissal to localStorage", async () => { const { default: AutoRoutingBanner } = await import("@/shared/components/AutoRoutingBanner"); const container = makeContainer(); const root = createRoot(container); await act(async () => { root.render(); }); const closeButton = container.querySelector('button[aria-label="Dismiss auto-routing banner"]'); await act(async () => { closeButton?.click(); }); expect(localStorage.getItem("auto-routing-banner-dismissed")).toBe("true"); }); it("remains hidden after dismissal on remount", async () => { localStorage.setItem("auto-routing-banner-dismissed", "true"); const { default: AutoRoutingBanner } = await import("@/shared/components/AutoRoutingBanner"); const container = makeContainer(); const root = createRoot(container); await act(async () => { root.render(); }); expect(container.querySelector('[role="banner"]')).toBeFalsy(); }); });