diff --git a/tests/tutorial-focus-trap.test.cjs b/tests/tutorial-focus-trap.test.cjs new file mode 100644 index 0000000..bfd8469 --- /dev/null +++ b/tests/tutorial-focus-trap.test.cjs @@ -0,0 +1,63 @@ +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); +});