Files
Webklar-Kundenbereich/test/auftraegeKundenportalWiderruf.test.js

111 lines
5.7 KiB
JavaScript

import { test } from 'node:test'
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import { installFakeDom } from './support/fakeDom.js'
import { h } from '../public/auftrag-dom.js'
import { initProjektWiderruf } from '../public/auftrag-widerruf.js'
import { pruefeQuelltext } from './auftraegeKundenportalDaten.js'
const html = readFileSync(new URL('../public/widerrufen.html', import.meta.url), 'utf8')
const MELDUNG = 'Die Nummer sieht anders aus als AB-2026-0001. Bitte prüfen Sie die Nummer oder lassen Sie das Feld leer.'
test('widerrufen.html: Vertragsart „Projektauftrag“ hinter „Öffnungszeiten live“, freiwilliges Feld abNummer vor dem Namen, Skripte', () => {
assert.match(html, /name="order" value="zeiten"[^>]*> Öffnungszeiten live<\/label>\s*<label class="radio"><input type="radio" name="order" value="projekt" data-text="Projektauftrag \(Auftragsbestätigung\)"> Projektauftrag \(Auftragsbestätigung\)<\/label>\s*<\/fieldset>/)
assert.match(html, /<div id="ab-nummer-wrap">\s*<label for="abNummer" data-label-for="abNummer" data-label="Nummer der Auftragsbestätigung">Nummer der Auftragsbestätigung <small>\(falls zur Hand, zum Beispiel AB-2026-0001\)<\/small><\/label>\s*<input id="abNummer" name="abNummer" maxlength="20" autocomplete="off" autocapitalize="characters" spellcheck="false" placeholder="AB-2026-0001">\s*<\/div>/)
assert.doesNotMatch(html, /<input id="abNummer"[^>]*required/, 'die Nummer ist freiwillig')
assert.ok(html.indexOf('id="ab-nummer-wrap"') < html.indexOf('for="name"'), 'das Feld steht vor dem Namen')
assert.doesNotMatch(html, /id="ab-nummer-wrap"[^>]*hidden/, 'ohne das Skript bleibt das Feld sichtbar')
assert.match(html, /initLegalForm\(\{ endpoint: '\/api\/abo\/public\/withdraw', fields: \['order', 'abNummer', 'name', 'customerNumber', 'email'\] \}\)/)
assert.match(html, /<script type="module" src="\/auftrag-widerruf\.js"><\/script>/)
for (const wert of ['abschluss', 'wechsel', 'zusatzspeicher', 'funktion', 'termine', 'shop', 'zeiten']) assert.match(html, new RegExp(`name="order" value="${wert}"`), `${wert} bleibt`)
})
const mit = (fn) => async () => {
const fx = installFakeDom()
try {
await fn(fx)
} finally {
fx.restore()
}
}
function aufbau(fx, order = 'abschluss') {
const radios = ['abschluss', 'projekt'].map((wert) => h('input', { type: 'radio', name: 'order', value: wert, checked: wert === order }))
const nummer = h('input', { id: 'abNummer', name: 'abNummer' })
const wrap = h('div', { id: 'ab-nummer-wrap' }, h('label', { for: 'abNummer' }, 'Nummer'), nummer)
const fehler = h('p', { id: 'form-error', class: 'error hidden' })
const knopf = h('button', { type: 'submit' }, 'Widerruf bestätigen')
const form = h('form', { id: 'decl-form' }, h('fieldset', {}, ...radios.map((r) => h('label', { class: 'radio' }, r))), wrap, fehler, knopf)
fx.document.body.append(form)
const gesendet = []
form.addEventListener('submit', (ev) => {
ev.preventDefault()
gesendet.push(nummer.value)
})
initProjektWiderruf(form)
return { form, radios, nummer, wrap, fehler, knopf, gesendet }
}
test('Das Feld erscheint nur bei „Projektauftrag“ und wird beim Wegwählen geleert', mit(async (fx) => {
const t = aufbau(fx, 'abschluss')
assert.equal(t.wrap.classList.contains('hidden'), true)
await fx.klick(t.radios[1])
assert.equal(t.wrap.classList.contains('hidden'), false)
await fx.setze(t.nummer, 'AB-2026-0001')
await fx.klick(t.radios[0])
assert.equal(t.wrap.classList.contains('hidden'), true)
assert.equal(t.nummer.value, '')
}))
test('Ist „Projektauftrag“ schon gewählt, ist das Feld sofort da', mit(async (fx) => {
const t = aufbau(fx, 'projekt')
assert.equal(t.wrap.classList.contains('hidden'), false)
}))
test('Projektauftrag: eine eingegebene, aber unpassende Nummer wird gemeldet und stoppt das Absenden; Wechsel der Vertragsart nimmt die Meldung weg', mit(async (fx) => {
const t = aufbau(fx, 'projekt')
for (const eingabe of ['AB-2026-01', 'RE-2026-0001', 'irgendwas']) {
await fx.setze(t.nummer, eingabe)
await fx.klick(t.knopf)
assert.deepEqual(t.gesendet, [], eingabe)
assert.equal(t.fehler.classList.contains('hidden'), false)
assert.equal(t.fehler.textContent, MELDUNG)
assert.equal(t.nummer.value, eingabe)
}
assert.equal(fx.document.activeElement, t.nummer)
await fx.klick(t.radios[0])
assert.equal(t.fehler.classList.contains('hidden'), true)
}))
test('Ohne Nummer geht der Projektauftrag durch (freiwilliges Feld); die eigene Meldung verschwindet, sobald der Widerruf durchgeht', mit(async (fx) => {
const t = aufbau(fx, 'projekt')
await fx.klick(t.knopf)
assert.deepEqual(t.gesendet, [''])
assert.equal(t.fehler.classList.contains('hidden'), true)
await fx.setze(t.nummer, 'kaputt')
await fx.klick(t.knopf)
assert.deepEqual(t.gesendet, [''], 'unpassende Eingabe: nichts gesendet')
assert.equal(t.fehler.classList.contains('hidden'), false)
await fx.setze(t.nummer, ' ')
await fx.klick(t.knopf)
assert.deepEqual(t.gesendet, ['', ''], 'nur Leerzeichen zählen als leer')
assert.equal(t.fehler.classList.contains('hidden'), true)
}))
test('Gültige Nummer in anderer Schreibweise wird vereinheitlicht, dann geht der Widerruf durch', mit(async (fx) => {
const t = aufbau(fx, 'projekt')
await fx.setze(t.nummer, ' ab 2026 0001 ')
await fx.klick(t.knopf)
assert.deepEqual(t.gesendet, ['AB-2026-0001'])
assert.equal(t.fehler.classList.contains('hidden'), true)
}))
test('Andere Vertragsart: kein Zwang, das Feld wird leer gesendet', mit(async (fx) => {
const t = aufbau(fx, 'abschluss')
await fx.klick(t.knopf)
assert.deepEqual(t.gesendet, [''])
}))
test('Quelltext: nur ./auftrag-ansicht.js, kein fetch', () => {
pruefeQuelltext('auftrag-widerruf.js', { importe: ['./auftrag-ansicht.js'] })
})