trans3 / ui /tests /hooks /useKeyboardShortcuts.test.tsx
Mayo
feat: multi-selection on ui
04ac060 unverified
Raw
History Blame Contribute Delete
2.05 kB
import { renderHook } from '@testing-library/react'
import { fireEvent } from '@testing-library/react'
import { beforeEach, describe, expect, it } from 'vitest'
import { useKeyboardShortcuts } from '@/hooks/useKeyboardShortcuts'
import { getGetSceneJsonQueryKey } from '@/lib/api/default/default'
import type { Node, Page, SceneSnapshot } from '@/lib/api/schemas'
import { queryClient } from '@/lib/queryClient'
import { useSelectionStore } from '@/lib/stores/selectionStore'
function textNode(id: string): Node {
return {
id,
transform: { x: 0, y: 0, width: 10, height: 10, rotationDeg: 0 },
visible: true,
kind: { text: { raw: `t-${id}` } },
} as unknown as Node
}
function seedScene(): SceneSnapshot {
const page: Page = {
id: 'p-1',
name: 'P',
width: 10,
height: 10,
nodes: { t1: textNode('t1'), t2: textNode('t2') },
} as unknown as Page
return {
epoch: 1,
scene: { pages: { 'p-1': page }, project: { name: 'P' } as never } as never,
}
}
describe('useKeyboardShortcuts — Ctrl+A', () => {
beforeEach(() => {
useSelectionStore.getState().setPage(null)
queryClient.clear()
})
it('Ctrl+A selects every text node on the active page', () => {
queryClient.setQueryData(getGetSceneJsonQueryKey(), seedScene())
useSelectionStore.getState().setPage('p-1')
renderHook(() => useKeyboardShortcuts())
fireEvent.keyDown(window, { key: 'a', ctrlKey: true })
expect([...useSelectionStore.getState().nodeIds].sort()).toEqual(['t1', 't2'])
})
it('Ctrl+A is a no-op while typing inside a textarea', () => {
queryClient.setQueryData(getGetSceneJsonQueryKey(), seedScene())
useSelectionStore.getState().setPage('p-1')
renderHook(() => useKeyboardShortcuts())
const textarea = document.createElement('textarea')
document.body.appendChild(textarea)
textarea.focus()
fireEvent.keyDown(textarea, { key: 'a', ctrlKey: true })
expect(useSelectionStore.getState().nodeIds.size).toBe(0)
document.body.removeChild(textarea)
})
})