1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
// 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);
});
});
|