import { fireEvent, screen } from '@testing-library/react'; import { describe, expect, it } from 'vitest'; import { renderWithProviders } from '../../test/test-utils'; import TwoPanelLayout, { useTwoPanelLayout } from './TwoPanelLayout'; function Sidebar() { return
sidebar-content
; } function Content() { return
main-content
; } describe('TwoPanelLayout', () => { it('renders only the content when the sidebar is hidden', () => { renderWithProviders( }> , { preloadedState: { layout: { panels: { chat: { sidebarVisible: false, sidebarWidth: 256 } } }, }, } ); expect(screen.getByText('main-content')).toBeInTheDocument(); expect(screen.queryByText('sidebar-content')).not.toBeInTheDocument(); expect(screen.queryByTestId('two-panel-divider-chat')).not.toBeInTheDocument(); }); it('renders sidebar + divider when open and applies the persisted width', () => { renderWithProviders( }> , { preloadedState: { layout: { panels: { chat: { sidebarVisible: true, sidebarWidth: 300 } } }, }, } ); expect(screen.getByText('sidebar-content')).toBeInTheDocument(); const pane = screen.getByTestId('two-panel-sidebar-chat'); expect(pane).toHaveStyle({ width: '300px' }); expect(screen.getByTestId('two-panel-divider-chat')).toBeInTheDocument(); }); it('forceSidebarVisible overrides a hidden persisted state without mutating it', () => { const { store } = renderWithProviders( } forceSidebarVisible> , { preloadedState: { layout: { panels: { chat: { sidebarVisible: false, sidebarWidth: 256 } } }, }, } ); expect(screen.getByText('sidebar-content')).toBeInTheDocument(); expect( (store.getState() as { layout: { panels: Record } }).layout.panels.chat ).toEqual({ sidebarVisible: false, sidebarWidth: 256 }); }); it('resizes via keyboard and clamps to the configured bounds', () => { const { store } = renderWithProviders( } minSidebarWidth={180} maxSidebarWidth={480}> , { preloadedState: { layout: { panels: { chat: { sidebarVisible: true, sidebarWidth: 300 } } }, }, } ); const divider = screen.getByTestId('two-panel-divider-chat'); const widthOf = () => (store.getState() as { layout: { panels: Record } }).layout .panels.chat.sidebarWidth; fireEvent.keyDown(divider, { key: 'ArrowRight' }); expect(widthOf()).toBe(316); fireEvent.keyDown(divider, { key: 'ArrowLeft' }); expect(widthOf()).toBe(300); }); it('seeds default geometry for an unseen panel via ensurePanelLayout', () => { const { store } = renderWithProviders( } defaultSidebarVisible defaultSidebarWidth={222}> ); const panel = (store.getState() as { layout: { panels: Record } }).layout .panels.fresh; expect(panel).toEqual({ sidebarVisible: true, sidebarWidth: 222 }); }); it('shows a reopen rail when collapsed and showCollapsedRail is set', () => { const { store } = renderWithProviders( } showCollapsedRail> , { preloadedState: { layout: { panels: { chat: { sidebarVisible: false, sidebarWidth: 256 } } }, }, } ); const reopen = screen.getByTestId('two-panel-reopen-chat'); fireEvent.click(reopen); expect( (store.getState() as { layout: { panels: Record } }) .layout.panels.chat.sidebarVisible ).toBe(true); }); }); describe('useTwoPanelLayout', () => { function Harness() { const { sidebarVisible, toggleSidebar } = useTwoPanelLayout('chat', { sidebarVisible: false }); return ( ); } it('reflects and toggles the same persisted state', () => { renderWithProviders(); const btn = screen.getByRole('button'); expect(btn).toHaveTextContent('closed'); fireEvent.click(btn); expect(btn).toHaveTextContent('open'); fireEvent.click(btn); expect(btn).toHaveTextContent('closed'); }); });