| 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) |
| }) |
| }) |
|
|