// is-user-editing.test.mjs — contract tests for isUserEditing() // // isUserEditing(activeEl) returns true when the browser has focus in an element // that a poll-driven DOM refresh would destroy: INPUT, TEXTAREA, contenteditable, // or any element inside a [role="dialog"]. // // Run with: node --test web/test/is-user-editing.test.mjs import { describe, it } from 'node:test'; import assert from 'node:assert/strict'; import { isUserEditing } from '../app.js'; // ── Mock helpers ─────────────────────────────────────────────────────────────── function makeEl(tagName, extras = {}) { return { tagName: tagName.toUpperCase(), isContentEditable: false, closest(sel) { return null; }, ...extras, }; } // ── Tests ────────────────────────────────────────────────────────────────────── describe('isUserEditing', () => { it('returns false for null', () => { assert.strictEqual(isUserEditing(null), false); }); it('returns false for undefined', () => { assert.strictEqual(isUserEditing(undefined), false); }); it('returns true for INPUT element', () => { assert.strictEqual(isUserEditing(makeEl('INPUT')), true); }); it('returns true for TEXTAREA element', () => { assert.strictEqual(isUserEditing(makeEl('TEXTAREA')), true); }); it('returns true for contenteditable element', () => { assert.strictEqual(isUserEditing(makeEl('DIV', { isContentEditable: true })), true); }); it('returns true for element inside [role="dialog"]', () => { const el = makeEl('SPAN', { closest(sel) { return sel === '[role="dialog"]' ? {} : null; }, }); assert.strictEqual(isUserEditing(el), true); }); it('returns false for a non-editing BUTTON', () => { assert.strictEqual(isUserEditing(makeEl('BUTTON')), false); }); it('returns false for a non-editing DIV without contenteditable', () => { assert.strictEqual(isUserEditing(makeEl('DIV')), false); }); it('returns false for a non-editing SPAN not inside a dialog', () => { assert.strictEqual(isUserEditing(makeEl('SPAN')), false); }); });