'use strict'; const test = require('node:test'); const assert = require('node:assert'); const fs = require('node:fs'); const path = require('node:path'); let JSDOM = null; try { ({ JSDOM } = require('jsdom')); } catch (e) { /* jsdom fehlt -> skip */ } const SRC = fs.readFileSync(path.join(__dirname, '../../app/static/sort.js'), 'utf8'); function load(html) { const dom = new JSDOM(`${html}`, { runScripts: 'outside-only' }); dom.window.eval(SRC); dom.window.FBSort.init(dom.window.document.body); return dom.window.document; } const TABLE = `
NameBetragAktion
B10,00 €x
A-5,00 €x
C–x
Gesamt5,00 €
Datum
`; const ids = (doc) => [...doc.querySelectorAll('#t tbody tr')].map((r) => r.id); test('Buttons nur an Spalten mit Text, nicht an server-Tabellen', { skip: !JSDOM }, () => { const doc = load(TABLE.replace('Aktion', 'Aktion')); assert.equal(doc.querySelectorAll('#t .sort-btn').length, 2); assert.equal(doc.querySelectorAll('#s .sort-btn').length, 0); assert.equal(doc.querySelector('#t .sort-btn').textContent, '⇅'); }); test('Klick sortiert auf/ab, Folgezeilen wandern mit, Leerwert am Ende, tfoot bleibt', { skip: !JSDOM }, () => { const doc = load(TABLE); const btn = doc.querySelectorAll('#t .sort-btn')[1]; // Betrag btn.click(); assert.equal(btn.textContent, '▲'); assert.deepEqual(ids(doc), ['r2', 'r2-edit', 'r1', 'r1-edit', 'r3']); btn.click(); assert.equal(btn.textContent, '▼'); assert.deepEqual(ids(doc), ['r1', 'r1-edit', 'r2', 'r2-edit', 'r3']); assert.equal(doc.querySelector('#t tfoot tr').id, 'sum'); const nameBtn = doc.querySelectorAll('#t .sort-btn')[0]; nameBtn.click(); assert.equal(btn.textContent, '⇅'); assert.deepEqual(ids(doc), ['r2', 'r2-edit', 'r1', 'r1-edit', 'r3']); }); test('init zweimal erzeugt keine doppelten Buttons', { skip: !JSDOM }, () => { const doc = load(TABLE); doc.defaultView.FBSort.init(doc.body); assert.equal(doc.querySelectorAll('#t .sort-btn').length, 3); });