Auf Abo bestellen, Wechsel, Zusatzspeicher und Übernahmegutschrift fehlt der feste Widerrufsstreifen, damit Kerninfo und Knopf "Zahlungspflichtig bestellen" auch bei Privatkunden in laufender Frist auf 375x667 auf einem Bildschirm stehen (Spec Abschnitt 4). Auf den Hauptseiten bleibt er (Spec 5.2), "Vertrag widerrufen" bleibt im Konto und unter Verträge erreichbar. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
65 lines
4.6 KiB
JavaScript
65 lines
4.6 KiB
JavaScript
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() }
|
|
})
|
|
|
|
test('baueStreifen.erlaube: auf Bestellseiten versteckt, Körperklasse weg; ein neuer Stand erscheint dort nicht, danach zeigt er den letzten Stand', () => {
|
|
const fx = installFakeDom()
|
|
try {
|
|
const w = h('div', { hidden: true }); const s = baueStreifen(w)
|
|
const sichtbar = () => [w.hidden, fx.document.body.classList.contains('kn-hat-streifen')]
|
|
s.setze(FRIST); assert.deepEqual(sichtbar(), [false, true])
|
|
s.erlaube(false); assert.deepEqual([...sichtbar(), fx.text(w)], [true, false, '']) // Bestellseite: weg, auch der Platz unten
|
|
s.setze({ ...FRIST, fruehestesEnde: '2026-10-30T10:00:00Z' }); assert.deepEqual(sichtbar(), [true, false]) // ein Neuladen der Fristen bringt ihn dort nicht zurück
|
|
s.erlaube(true); assert.deepEqual([...sichtbar(), fx.text(w)], [false, true, 'Widerrufsfrist bis 30.10. · Widerrufen']) // zurück auf einer Hauptseite
|
|
s.setze(null); s.erlaube(false); s.erlaube(true); assert.deepEqual(sichtbar(), [true, false]) // ohne Frist bleibt er in jedem Fall weg
|
|
const wt = h('div', { hidden: true }); const t = baueStreifen(wt); t.erlaube(false); t.setze(FRIST) // erst die Seite, dann die Daten
|
|
assert.deepEqual([wt.hidden, fx.document.body.classList.contains('kn-hat-streifen')], [true, false])
|
|
} finally { fx.restore() }
|
|
})
|