import { test } from 'node:test' import assert from 'node:assert/strict' import { installFakeDom } from './support/fakeDom.js' import { h } from '../public/neu/dom.js' import { ladeFristen, streifenText, fruehesteFrist, baueStreifen } from '../public/neu/fristen-streifen.js' import { lies, handyTeil } from './support/knHuelle.js' const FRIST = { fristen: [{ quelle: 'abschluss', bezeichnung: 'Abo', bis: '2026-10-21T21:59:59.999Z' }], fruehestesEnde: '2026-10-21T21:59:59.999Z', anzeigen: true } test('ladeFristen: 404, 500, Netzfehler und anzeigen:false ergeben null; sonst die Daten (Review Focus 5)', async () => { for (const status of [404, 500, 0]) assert.equal(await ladeFristen(async () => { throw Object.assign(new Error('x'), { status }) }), null) assert.equal(await ladeFristen(async () => ({ fristen: [], fruehestesEnde: null, anzeigen: false })), null) assert.deepEqual(await ladeFristen(async (p) => { assert.equal(p, '/api/fristen'); return FRIST }), FRIST) }) test('streifenText: Berliner Datum, nicht UTC; fruehesteFrist fällt auf das kleinste bis zurück', () => { assert.equal(streifenText('2026-10-21T21:59:59.999Z'), 'Widerrufsfrist bis 21.10.'); assert.equal(streifenText('2026-10-21T22:30:00.000Z'), 'Widerrufsfrist bis 22.10.') assert.equal(fruehesteFrist({ fruehestesEnde: null, fristen: [{ bis: '2026-11-03T10:00:00Z' }, { bis: '2026-10-30T10:00:00Z' }] }), '2026-10-30T10:00:00Z') }) test('baueStreifen: Text mit Link, nicht wegtippbar, null versteckt', () => { const fx = installFakeDom() try { const w = h('div', { hidden: true }); const s = baueStreifen(w); s.setze(FRIST) assert.deepEqual([w.hidden, fx.text(w)], [false, 'Widerrufsfrist bis 21.10. · Widerrufen']) assert.deepEqual([fx.finde(w, 'a').getAttribute('href'), fx.alle(w, 'button').length, fx.document.body.classList.contains('kn-hat-streifen')], ['/widerrufen.html', 0, true]) s.setze(null); assert.deepEqual([w.hidden, fx.document.body.classList.contains('kn-hat-streifen')], [true, false]) } finally { fx.restore() } }) test('huelle.css (Streifen): 44 px, getönt, am Handy über der Leiste, bei Tastatur weg', () => { const css = lies('huelle.css') assert.match(css, /\.kn-streifen\s*\{(?=[^}]*min-height:\s*44px)(?=[^}]*background:\s*var\(--kn-orange-bg\))(?=[^}]*color:\s*var\(--kn-orange-fg\))/s) assert.match(handyTeil(css), /\.kn-streifen\s*\{[^}]*position:\s*fixed/s) assert.match(css, /\.kn-tastatur \.kn-streifen[^{]*\{[^}]*display:\s*none/s) }) test('Streifen: ohne gültiges Datum steht ein allgemeiner Text, mehrere Fristen zeigen die früheste, ein neuer Stand ersetzt den alten', () => { const fx = installFakeDom() try { assert.equal(streifenText(''), 'Widerrufsfrist läuft'); assert.equal(streifenText('kein Datum'), 'Widerrufsfrist läuft') assert.equal(fruehesteFrist({ fristen: [] }), '') const w = h('div', { hidden: true }); const s = baueStreifen(w) s.setze({ ...FRIST, fruehestesEnde: null, fristen: [{ bis: '2026-11-03T10:00:00Z' }, { bis: '2026-10-30T10:00:00Z' }] }) assert.equal(fx.text(w), 'Widerrufsfrist bis 30.10. · Widerrufen') s.setze(FRIST); assert.deepEqual([fx.text(w), fx.alle(w, 'a').length], ['Widerrufsfrist bis 21.10. · Widerrufen', 1]) assert.deepEqual([w.getAttribute('role'), w.getAttribute('aria-label'), w.classList.contains('kn-streifen')], ['region', 'Widerrufsfrist', true]) } finally { fx.restore() } })