/** * @file Tests for keyboard shortcut registration and event handling */ import { render, act } from "@testing-library/react"; import { useEffect, useState, type FC } from "react"; import { KeyboardShortcutProvider, useKeyboardShortcut, useRegisterShortcut } from "./context"; const Harness: FC = () => { const { registerShortcut } = useKeyboardShortcut(); const [hit, setHit] = useState(0); useEffect(() => { registerShortcut({ key: "k", ctrl: true }, () => setHit((v) => v + 1)); }, [registerShortcut]); return
{String(hit)}
; }; const CmdOrCtrlHarness: FC = () => { const [hit, setHit] = useState(0); useRegisterShortcut({ key: "c", cmdOrCtrl: true }, () => setHit((v) => v + 1), []); return
{String(hit)}
; }; describe("KeyboardShortcutContext", () => { it("invokes handler on matching keydown", () => { const { getByTestId } = render( , ); act(() => { const evt = new KeyboardEvent("keydown", { key: "k", ctrlKey: true }); document.dispatchEvent(evt); }); expect(getByTestId("hit").textContent).toBe("1"); }); it("cmdOrCtrl registers both Ctrl and Meta shortcuts", () => { const { getByTestId } = render( , ); // Test Ctrl variant act(() => { const ctrlEvt = new KeyboardEvent("keydown", { key: "c", ctrlKey: true }); document.dispatchEvent(ctrlEvt); }); expect(getByTestId("hit").textContent).toBe("1"); // Test Meta variant act(() => { const metaEvt = new KeyboardEvent("keydown", { key: "c", metaKey: true }); document.dispatchEvent(metaEvt); }); expect(getByTestId("hit").textContent).toBe("2"); }); it("cmdOrCtrl works with shift modifier", () => { const ShiftHarness: FC = () => { const [hit, setHit] = useState(0); useRegisterShortcut({ key: "z", cmdOrCtrl: true, shift: true }, () => setHit((v) => v + 1), []); return
{String(hit)}
; }; const { getByTestId } = render( , ); // Test Ctrl+Shift variant act(() => { const ctrlShiftEvt = new KeyboardEvent("keydown", { key: "z", ctrlKey: true, shiftKey: true, }); document.dispatchEvent(ctrlShiftEvt); }); expect(getByTestId("hit").textContent).toBe("1"); // Test Meta+Shift variant act(() => { const metaShiftEvt = new KeyboardEvent("keydown", { key: "z", metaKey: true, shiftKey: true, }); document.dispatchEvent(metaShiftEvt); }); expect(getByTestId("hit").textContent).toBe("2"); }); });