Files
hapi/web/src/hooks/useCodexExplorationCollapse.test.ts
T
wushenghuaandGitHub d0ae6c1f8d feat(web): make Codex exploration collapse configurable (#1352)
* feat(web): configure Codex exploration collapse

Default Codex exploration groups to collapsed and expose a persisted chat setting for users who prefer them expanded.\n\nvia [HAPI](https://hapi.run)\n\nCo-Authored-By: HAPI <noreply@hapi.run>

* test(web): cover Codex exploration preference

Cover preference persistence, default cleanup, and cross-tab storage synchronization.\n\nvia [HAPI](https://hapi.run)\n\nCo-Authored-By: HAPI <noreply@hapi.run>
2026-08-04 08:04:12 +08:00

79 lines
2.5 KiB
TypeScript

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()
})
it('defaults to collapsed', () => {
expect(getInitialCodexExplorationCollapsed()).toBe(DEFAULT_CODEX_EXPLORATION_COLLAPSED)
})
it('reads valid stored values and ignores invalid values', () => {
window.localStorage.setItem(STORAGE_KEY, 'false')
expect(getInitialCodexExplorationCollapsed()).toBe(false)
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)
})
})