Menu
Public repository / fee5b6c2cde89fa6bf8dc51068af7336b56a88b8
AkurAI-Framework / tests/hotkeys.test.mjs
Latest change 5097caa5d055c8539c451aeda1036baafb1d495f - OLI-245: hotkeys.js helper + SPA router/IdP return_to docs by Ólafur Búi Ólafsson
import { test } from "node:test";
import assert from "node:assert/strict";
import { resolveHotkey, createHotkeys, isTypingTarget } from "../site/frontend/hotkeys.js";
const ev = (key, over = {}) => ({ key, ctrlKey: false, metaKey: false, altKey: false, target: { tagName: "DIV" }, ...over });
const map = { global: { "?": "help", Escape: "close" }, selection: { e: "archive" } };
test("global keys resolve; selection keys need hasSelection", () => {
assert.equal(resolveHotkey(ev("?"), map, {}), "help");
assert.equal(resolveHotkey(ev("e"), map, {}), null);
assert.equal(resolveHotkey(ev("e"), map, { hasSelection: true }), "archive");
});
test("modifier chords are ignored", () => {
assert.equal(resolveHotkey(ev("?", { ctrlKey: true }), map, {}), null);
});
test("typing targets are ignored except Escape -> closeTyping", () => {
const t = { target: { tagName: "INPUT" } };
assert.equal(resolveHotkey(ev("?", t), map, {}), null);
assert.equal(resolveHotkey(ev("Escape", t), map, {}), "closeTyping");
assert.ok(isTypingTarget({ isContentEditable: true }));
});
test("disabled silences everything but Escape", () => {
assert.equal(resolveHotkey(ev("?"), map, { enabled: false }), null);
assert.equal(resolveHotkey(ev("Escape"), map, { enabled: false }), "close");
});
test("scope: keymap applies only inside the scope selector when given", () => {
const scoped = { scope: "[data-list]", keys: { j: "next" } };
const inside = ev("j", { target: { tagName: "DIV", closest: (s) => (s === "[data-list]" ? {} : null) } });
assert.equal(resolveHotkey(inside, { scoped }, {}), "next");
assert.equal(resolveHotkey(ev("j"), { scoped }, {}), null);
});
test("createHotkeys binds, calls onAction, preventDefaults listed actions, destroys", () => {
let handler, removed = false, got = [], prevented = 0;
const win = { addEventListener: (_, h) => (handler = h), removeEventListener: () => (removed = true) };
const hk = createHotkeys({ window: win, keymap: map, preventDefault: ["help"], onAction: (a) => got.push(a) });
handler({ ...ev("?"), preventDefault: () => prevented++ });
handler({ ...ev("Escape"), preventDefault: () => prevented++ });
assert.deepEqual(got, ["help", "close"]);
assert.equal(prevented, 1);
hk.setEnabled(false);
handler(ev("?"));
assert.equal(got.length, 2);
hk.destroy();
assert.ok(removed);
});