Files
the-beacon/tests/tutorial-focus-trap.test.cjs
2026-04-17 03:10:43 -04:00

64 lines
1.7 KiB
JavaScript

const test = require('node:test');
const assert = require('node:assert/strict');
function createButton(id) {
return {
id,
disabled: false,
hidden: false,
offsetParent: {},
focusCalled: 0,
focus() { this.focusCalled += 1; },
};
}
test('tutorial focus trap wraps Tab from last button to first', () => {
const skip = createButton('tutorial-skip-btn');
const next = createButton('tutorial-next-btn');
const overlay = {
querySelectorAll() {
return [skip, next];
},
};
global.document = {
activeElement: next,
getElementById(id) {
return id === 'tutorial-overlay' ? overlay : null;
},
addEventListener() {},
};
const { trapTutorialFocus } = require('../js/tutorial.js');
let prevented = false;
const handled = trapTutorialFocus({ key: 'Tab', shiftKey: false, preventDefault() { prevented = true; } }, global.document);
assert.equal(handled, true);
assert.equal(prevented, true);
assert.equal(skip.focusCalled, 1);
});
test('tutorial focus trap wraps Shift+Tab from first button to last', () => {
const skip = createButton('tutorial-skip-btn');
const next = createButton('tutorial-next-btn');
const overlay = {
querySelectorAll() {
return [skip, next];
},
};
global.document = {
activeElement: skip,
getElementById(id) {
return id === 'tutorial-overlay' ? overlay : null;
},
addEventListener() {},
};
const { trapTutorialFocus } = require('../js/tutorial.js');
let prevented = false;
const handled = trapTutorialFocus({ key: 'Tab', shiftKey: true, preventDefault() { prevented = true; } }, global.document);
assert.equal(handled, true);
assert.equal(prevented, true);
assert.equal(next.focusCalled, 1);
});