diff --git a/web/src/hooks/useCodexExplorationCollapse.test.ts b/web/src/hooks/useCodexExplorationCollapse.test.ts index 70cffe84..de2f3d0b 100644 --- a/web/src/hooks/useCodexExplorationCollapse.test.ts +++ b/web/src/hooks/useCodexExplorationCollapse.test.ts @@ -1,9 +1,13 @@ +import { act, renderHook } from '@testing-library/react' import { beforeEach, describe, expect, it } from 'vitest' import { DEFAULT_CODEX_EXPLORATION_COLLAPSED, getInitialCodexExplorationCollapsed, + useCodexExplorationCollapse, } from './useCodexExplorationCollapse' +const STORAGE_KEY = 'hapi-codex-exploration-collapsed' + describe('useCodexExplorationCollapse helpers', () => { beforeEach(() => { window.localStorage.clear() @@ -14,10 +18,61 @@ describe('useCodexExplorationCollapse helpers', () => { }) it('reads valid stored values and ignores invalid values', () => { - window.localStorage.setItem('hapi-codex-exploration-collapsed', 'false') + window.localStorage.setItem(STORAGE_KEY, 'false') expect(getInitialCodexExplorationCollapsed()).toBe(false) - window.localStorage.setItem('hapi-codex-exploration-collapsed', 'invalid') + window.localStorage.setItem(STORAGE_KEY, 'invalid') expect(getInitialCodexExplorationCollapsed()).toBe(DEFAULT_CODEX_EXPLORATION_COLLAPSED) }) }) + +describe('useCodexExplorationCollapse', () => { + beforeEach(() => { + window.localStorage.clear() + }) + + it('persists the expanded preference', () => { + const { result } = renderHook(() => useCodexExplorationCollapse()) + + act(() => { + result.current.setCodexExplorationCollapsed(false) + }) + + expect(result.current.codexExplorationCollapsed).toBe(false) + expect(window.localStorage.getItem(STORAGE_KEY)).toBe('false') + }) + + it('removes the stored preference when restored to the default', () => { + window.localStorage.setItem(STORAGE_KEY, 'false') + const { result } = renderHook(() => useCodexExplorationCollapse()) + + act(() => { + result.current.setCodexExplorationCollapsed(true) + }) + + expect(result.current.codexExplorationCollapsed).toBe(true) + expect(window.localStorage.getItem(STORAGE_KEY)).toBeNull() + }) + + it('applies cross-tab changes from storage events', () => { + const { result } = renderHook(() => useCodexExplorationCollapse()) + + act(() => { + window.dispatchEvent(new StorageEvent('storage', { + key: STORAGE_KEY, + newValue: 'false', + })) + }) + + expect(result.current.codexExplorationCollapsed).toBe(false) + + act(() => { + window.dispatchEvent(new StorageEvent('storage', { + key: STORAGE_KEY, + newValue: null, + })) + }) + + expect(result.current.codexExplorationCollapsed).toBe(true) + }) +})