import { act, renderHook } from "@testing-library/react"; import { afterEach, describe, expect, it, vi } from "vitest"; import { useWorkbenchResponsiveLayout } from "./use-workbench-responsive-layout"; function mockViewport(width: number, largeScreen: boolean) { Object.defineProperty(window, "innerWidth", { configurable: true, value: width }); vi.stubGlobal( "matchMedia", vi.fn().mockImplementation((query: string) => ({ matches: largeScreen, media: query, onchange: null, addEventListener: vi.fn(), removeEventListener: vi.fn(), addListener: vi.fn(), removeListener: vi.fn(), dispatchEvent: vi.fn() })) ); } afterEach(() => { vi.unstubAllGlobals(); }); describe("workbench responsive layout", () => { it("coordinates the expanded condition feed with the desktop Agent panel", () => { mockViewport(1366, true); const collapseAgentPanel = vi.fn(); const expandAgentPanel = vi.fn(); const { result } = renderHook(() => useWorkbenchResponsiveLayout({ activeToolOpen: false, agentPanelOpen: true, devPanelOpen: false, collapseAgentPanel, expandAgentPanel, onClearActiveTool: vi.fn() }) ); expect(result.current.isLargeScreen).toBe(true); expect(result.current.shouldShowConditionFeed).toBe(false); act(() => result.current.toggleConditionFeedForViewport()); expect(result.current.shouldShowConditionFeed).toBe(true); act(() => result.current.handleConditionExpandedChange(true)); expect(result.current.conditionFeedExpanded).toBe(true); expect(collapseAgentPanel).toHaveBeenCalledOnce(); act(() => result.current.handleConditionExpandedChange(false)); expect(result.current.conditionFeedExpanded).toBe(false); expect(expandAgentPanel).toHaveBeenCalledOnce(); }); it("toggles the condition sheet without leaking desktop panel state on mobile", () => { mockViewport(390, false); const onClearActiveTool = vi.fn(); const { result } = renderHook(() => useWorkbenchResponsiveLayout({ activeToolOpen: true, agentPanelOpen: true, devPanelOpen: false, collapseAgentPanel: vi.fn(), expandAgentPanel: vi.fn(), onClearActiveTool }) ); act(() => result.current.toggleConditionFeedForViewport()); expect(result.current.mobileSheet).toBe("condition"); expect(result.current.mobileSheetSnap).toBe("half"); expect(onClearActiveTool).toHaveBeenCalledOnce(); act(() => result.current.toggleConditionFeedForViewport()); expect(result.current.mobileSheet).toBeNull(); act(() => result.current.openAgentPanelForViewport()); expect(result.current.mobileSheet).toBe("agent"); }); });