Files
kandev/apps/web/lib/keyboard/constants.test.ts
T
José Almeida 1394b7103f feat: add recent task switcher (#779)
* feat: add recent task switcher

* fix: address task switcher review feedback

* test: cover recent task cleanup

* perf: reduce recent task switcher storage reads
2026-05-02 22:25:40 +01:00

155 lines
4.7 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { MODIFIER_KEYS, KEYS, SHORTCUTS, KeyboardShortcut } from "./constants";
describe("MODIFIER_KEYS", () => {
it("defines all modifier keys", () => {
expect(MODIFIER_KEYS.CTRL).toBe("Control");
expect(MODIFIER_KEYS.CMD).toBe("Meta");
expect(MODIFIER_KEYS.ALT).toBe("Alt");
expect(MODIFIER_KEYS.SHIFT).toBe("Shift");
});
it("has correct type", () => {
// TypeScript ensures these are readonly at compile time
const keys: typeof MODIFIER_KEYS = MODIFIER_KEYS;
expect(keys).toBeDefined();
});
});
describe("KEYS", () => {
it("defines special keys", () => {
expect(KEYS.ENTER).toBe("Enter");
expect(KEYS.ESCAPE).toBe("Escape");
expect(KEYS.SPACE).toBe(" ");
expect(KEYS.TAB).toBe("Tab");
expect(KEYS.BACKSPACE).toBe("Backspace");
expect(KEYS.DELETE).toBe("Delete");
});
it("defines arrow keys", () => {
expect(KEYS.ARROW_UP).toBe("ArrowUp");
expect(KEYS.ARROW_DOWN).toBe("ArrowDown");
expect(KEYS.ARROW_LEFT).toBe("ArrowLeft");
expect(KEYS.ARROW_RIGHT).toBe("ArrowRight");
});
it("defines letter keys A-Z", () => {
expect(KEYS.A).toBe("a");
expect(KEYS.B).toBe("b");
expect(KEYS.Z).toBe("z");
});
it("defines number keys 0-9", () => {
expect(KEYS.ZERO).toBe("0");
expect(KEYS.ONE).toBe("1");
expect(KEYS.NINE).toBe("9");
});
it("has correct type", () => {
// TypeScript ensures these are readonly at compile time
const keys: typeof KEYS = KEYS;
expect(keys).toBeDefined();
});
});
describe("SHORTCUTS", () => {
describe("SUBMIT", () => {
it("uses Enter key with ctrlOrCmd modifier", () => {
expect(SHORTCUTS.SUBMIT.key).toBe("Enter");
expect(SHORTCUTS.SUBMIT.modifiers?.ctrlOrCmd).toBe(true);
});
});
describe("SAVE", () => {
it("uses S key with ctrlOrCmd modifier", () => {
expect(SHORTCUTS.SAVE.key).toBe("s");
expect(SHORTCUTS.SAVE.modifiers?.ctrlOrCmd).toBe(true);
});
});
describe("CANCEL", () => {
it("uses Escape key without modifiers", () => {
const cancel = SHORTCUTS.CANCEL as KeyboardShortcut;
expect(cancel.key).toBe("Escape");
expect(cancel.modifiers).toBeUndefined();
});
});
describe("SEARCH", () => {
it("uses K key with ctrlOrCmd modifier", () => {
expect(SHORTCUTS.SEARCH.key).toBe("k");
expect(SHORTCUTS.SEARCH.modifiers?.ctrlOrCmd).toBe(true);
});
});
describe("NEW_TASK", () => {
it("uses N key with ctrlOrCmd modifier", () => {
expect(SHORTCUTS.NEW_TASK.key).toBe("n");
expect(SHORTCUTS.NEW_TASK.modifiers?.ctrlOrCmd).toBe(true);
});
});
describe("TOGGLE_SIDEBAR", () => {
it("uses B key with ctrlOrCmd modifier", () => {
expect(SHORTCUTS.TOGGLE_SIDEBAR.key).toBe("b");
expect(SHORTCUTS.TOGGLE_SIDEBAR.modifiers?.ctrlOrCmd).toBe(true);
});
});
describe("TASK_SWITCHER", () => {
it("uses Space with ctrlOrCmd modifier", () => {
const shortcut = SHORTCUTS.TASK_SWITCHER as KeyboardShortcut;
expect(shortcut.key).toBe(" ");
expect(shortcut.modifiers?.ctrlOrCmd).toBe(true);
expect(shortcut.modifiers?.shift).toBeUndefined();
});
});
it("has correct type", () => {
// TypeScript ensures these are readonly at compile time
const shortcuts: typeof SHORTCUTS = SHORTCUTS;
expect(shortcuts).toBeDefined();
});
it("all shortcuts have valid key property", () => {
Object.values(SHORTCUTS).forEach((shortcut) => {
expect(shortcut).toHaveProperty("key");
expect(typeof shortcut.key).toBe("string");
});
});
it("all shortcuts with modifiers have valid modifier properties", () => {
Object.values(SHORTCUTS).forEach((shortcut) => {
const typedShortcut = shortcut as KeyboardShortcut;
if (typedShortcut.modifiers) {
const validModifiers = ["ctrl", "cmd", "alt", "shift", "ctrlOrCmd"];
Object.keys(typedShortcut.modifiers).forEach((modifier) => {
expect(validModifiers).toContain(modifier);
});
}
});
});
});
describe("Type definitions", () => {
it("KeyboardShortcut type accepts valid shortcuts", () => {
// These should compile without errors
const shortcut1: import("./constants").KeyboardShortcut = {
key: "Enter",
};
expect(shortcut1.key).toBe("Enter");
const shortcut2: import("./constants").KeyboardShortcut = {
key: "s",
modifiers: { ctrlOrCmd: true },
};
expect(shortcut2.modifiers?.ctrlOrCmd).toBe(true);
const shortcut3: import("./constants").KeyboardShortcut = {
key: "a",
modifiers: { ctrl: true, shift: true, alt: true },
};
expect(shortcut3.modifiers?.ctrl).toBe(true);
});
});