Files
tolaria/src/hooks/useViewMode.test.ts
lucaronin 434395d602 test: add tests for useViewMode and useAppKeyboard view shortcuts
- useViewMode: default state, localStorage persistence, visibility flags
- useAppKeyboard: Option+1/2/3 view mode shortcuts, Cmd+key shortcuts
- Verifies Alt-only vs Cmd+Alt distinction for view mode keys

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 08:36:07 +01:00

77 lines
2.8 KiB
TypeScript

import { describe, it, expect, vi, beforeEach } from 'vitest'
import { renderHook, act } from '@testing-library/react'
import { useViewMode } from './useViewMode'
vi.mock('../mock-tauri', () => ({
isTauri: () => false,
}))
const localStorageMock = (() => {
let store: Record<string, string> = {}
return {
getItem: (key: string) => store[key] ?? null,
setItem: (key: string, value: string) => { store[key] = value },
removeItem: (key: string) => { delete store[key] },
clear: () => { store = {} },
}
})()
Object.defineProperty(globalThis, 'localStorage', { value: localStorageMock, writable: true })
describe('useViewMode', () => {
beforeEach(() => {
localStorageMock.clear()
})
it('defaults to "all" when no stored value', () => {
const { result } = renderHook(() => useViewMode())
expect(result.current.viewMode).toBe('all')
expect(result.current.sidebarVisible).toBe(true)
expect(result.current.noteListVisible).toBe(true)
})
it('loads persisted view mode from localStorage', () => {
localStorageMock.setItem('laputa-view-mode', 'editor-only')
const { result } = renderHook(() => useViewMode())
expect(result.current.viewMode).toBe('editor-only')
expect(result.current.sidebarVisible).toBe(false)
expect(result.current.noteListVisible).toBe(false)
})
it('setViewMode updates state and persists to localStorage', () => {
const { result } = renderHook(() => useViewMode())
act(() => result.current.setViewMode('editor-list'))
expect(result.current.viewMode).toBe('editor-list')
expect(result.current.sidebarVisible).toBe(false)
expect(result.current.noteListVisible).toBe(true)
expect(localStorageMock.getItem('laputa-view-mode')).toBe('editor-list')
})
it('editor-only hides both sidebar and note list', () => {
const { result } = renderHook(() => useViewMode())
act(() => result.current.setViewMode('editor-only'))
expect(result.current.sidebarVisible).toBe(false)
expect(result.current.noteListVisible).toBe(false)
})
it('editor-list hides sidebar but shows note list', () => {
const { result } = renderHook(() => useViewMode())
act(() => result.current.setViewMode('editor-list'))
expect(result.current.sidebarVisible).toBe(false)
expect(result.current.noteListVisible).toBe(true)
})
it('all mode shows both sidebar and note list', () => {
const { result } = renderHook(() => useViewMode())
act(() => result.current.setViewMode('editor-only'))
act(() => result.current.setViewMode('all'))
expect(result.current.sidebarVisible).toBe(true)
expect(result.current.noteListVisible).toBe(true)
})
it('ignores invalid localStorage values', () => {
localStorageMock.setItem('laputa-view-mode', 'garbage')
const { result } = renderHook(() => useViewMode())
expect(result.current.viewMode).toBe('all')
})
})