summaryrefslogtreecommitdiff
path: root/web/test/is-user-editing.test.mjs
blob: 844d3cd0ab01bfadb917758f028fe42fcf5506e2 (plain)
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);
  });
});