import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { renderHook } from '@testing-library/react'; import { fireEvent } from '@testing-library/dom'; import { useShortcut } from '@/hooks/use-shortcut'; describe('useShortcut', () => { beforeEach(() => { // No-op: each test sets up its own keydown }); afterEach(() => { vi.restoreAllMocks(); }); it('calls the callback when the shortcut matches (mod+s)', () => { const cb = vi.fn(); renderHook(() => useShortcut('mod+s', cb)); fireEvent.keyDown(window, { key: 's', ctrlKey: true }); expect(cb).toHaveBeenCalledTimes(1); }); it('recognizes metaKey as well as ctrlKey (Mac shortcut)', () => { const cb = vi.fn(); renderHook(() => useShortcut('mod+s', cb)); fireEvent.keyDown(window, { key: 's', metaKey: true }); expect(cb).toHaveBeenCalledTimes(1); }); it('matches plain keys without modifier (just "k")', () => { const cb = vi.fn(); renderHook(() => useShortcut('k', cb)); fireEvent.keyDown(window, { key: 'k' }); expect(cb).toHaveBeenCalledTimes(1); }); it('matches shift variants (mod+shift+s)', () => { const cb = vi.fn(); renderHook(() => useShortcut('mod+shift+s', cb)); fireEvent.keyDown(window, { key: 'S', ctrlKey: true, shiftKey: true }); expect(cb).toHaveBeenCalledTimes(1); }); it('does NOT fire when shift is required but missing', () => { const cb = vi.fn(); renderHook(() => useShortcut('mod+shift+s', cb)); fireEvent.keyDown(window, { key: 's', ctrlKey: true }); expect(cb).not.toHaveBeenCalled(); }); it('does NOT fire when the wrong key is pressed', () => { const cb = vi.fn(); renderHook(() => useShortcut('mod+s', cb)); fireEvent.keyDown(window, { key: 'x', ctrlKey: true }); expect(cb).not.toHaveBeenCalled(); }); it('does NOT fire when no modifier is held but one is required', () => { const cb = vi.fn(); renderHook(() => useShortcut('mod+s', cb)); fireEvent.keyDown(window, { key: 's' }); expect(cb).not.toHaveBeenCalled(); }); it('does NOT fire when the target is an ', () => { const cb = vi.fn(); renderHook(() => useShortcut('mod+s', cb)); const input = document.createElement('input'); document.body.appendChild(input); fireEvent.keyDown(input, { key: 's', ctrlKey: true }); document.body.removeChild(input); expect(cb).not.toHaveBeenCalled(); }); it('does NOT fire when the target is a