AkurAI Build
Menu

Public repository / 3aae9f4e85241bcb775c31f5c03094becd3da56a

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