Buchungskalender: Preis-Editor prüft Grenzen wie der Server

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5.5 committed 2026-10-07 14:14:38 +00:00
1 parent 37cd312549
commit 8c8fa05591
5 files changed
+116 -12

No files matched your search

+82
View File
@@ -380,3 +380,85 @@ test('Freigeben: Serverfehler 400 mit felder zeigt genau den Feldtext', mit(serv
assert.equal(fx.text(fx.finde(panel, '[data-fehler="posten"]')), 'Die Summe muss größer als 0 sein.')
assert.equal(fx.text(fx.finde(panel, '[data-fehler="_"]')), '')
}))
// Fix round 1: Preis-Editor prüft Grenzen wie der Server
const preisEditor = async (fx, preise = PREISE) => {
const { panel } = await zeigeTab(fx, ukTab)
await fx.klick(aktion(fx, panel, 'bearbeiten'))
await fx.ruhe()
return panel
}
const versuche = async (fx, panel) => {
const vorher = posts(fx).filter((a) => a.url.includes('/preise')).length
await fx.klick(aktion(fx, panel, 'preise-speichern'))
await fx.ruhe()
return posts(fx).filter((a) => a.url.includes('/preise')).length - vorher
}
const fehlerText = (fx, panel, n) => fx.text(fx.finde(panel, `[data-fehler="${n}"]`))
test('Preis-Editor: Staffeln (Anzahl, erste ab 1, aufsteigend, Preisgrenzen)', mit(ukServer({ 'PUT /api/unterkunft/unterkuenfte/u1/preise': () => ({ body: {} }) }), async (fx) => {
const panel = await preisEditor(fx)
const zeilen = () => fx.alle(panel, '[data-staffel-zeile]')
const ab = (i) => fx.finde(zeilen()[i], '[data-staffel="ab"]')
const preis = (i) => fx.finde(zeilen()[i], '[data-staffel="preis"]')
await fx.setze(ab(1), '1')
assert.equal(await versuche(fx, panel), 0)
assert.match(fehlerText(fx, panel, 'staffeln'), /größer werden/)
await fx.setze(ab(1), '7')
await fx.setze(preis(1), '0,50')
assert.equal(await versuche(fx, panel), 0)
assert.match(fehlerText(fx, panel, 'staffeln'), /1,00 € und 1\.000,00 €/)
await fx.setze(preis(1), '1.000,01')
assert.equal(await versuche(fx, panel), 0)
await fx.setze(preis(1), '50')
for (let i = 0; i < 5; i += 1) { await fx.klick(aktion(fx, panel, 'staffel-dazu')); await fx.setze(ab(zeilen().length - 1), String(10 + i)); await fx.setze(preis(zeilen().length - 1), '40') }
assert.equal(zeilen().length, 7)
assert.equal(await versuche(fx, panel), 0)
assert.match(fehlerText(fx, panel, 'staffeln'), /1 bis 6/)
await fx.klick(fx.finde(zeilen()[6], '[data-aktion="staffel-weg"]'))
assert.equal(await versuche(fx, panel), 1)
}))
test('Preis-Editor: Rabatt, Frist, Personen, Stornobedingungen, USt', mit(ukServer({ 'PUT /api/unterkunft/unterkuenfte/u1/preise': () => ({ body: {} }) }), async (fx) => {
const panel = await preisEditor(fx)
const fall = async (sel, wert, ok, feldName, re) => {
const alt = fx.finde(panel, sel).value
await fx.setze(fx.finde(panel, sel), wert)
assert.equal(await versuche(fx, panel), 0, `${sel}=${wert}`)
assert.match(fehlerText(fx, panel, feldName), re)
await fx.setze(fx.finde(panel, sel), alt)
}
await fall('#bk-p-rabatt', '51', 0, 'direktrabattProzent', /0 bis 50/)
await fall('#bk-p-frist', '0', 0, 'fristTage', /1 bis 14/)
await fall('#bk-p-frist', '15', 0, 'fristTage', /1 bis 14/)
await fall('#bk-p-inklusive', '0', 0, 'personenInklusive', /ab 1/)
await fall('#bk-p-storno', 'zu kurz', 0, 'stornobedingungen', /20 bis 5000/)
await fall('#bk-p-ust-ue', '8', 0, 'ustUebernachtung', /0, 7 oder 19/)
await fall('#bk-p-ust-re', '20', 0, 'ustReinigung', /0, 7 oder 19/)
assert.equal(await versuche(fx, panel), 1)
}))
test('Preis-Editor: gespeicherte USt 19 bleibt bei Kleinunternehmer unverändert', mit(ukServer({
'GET /api/unterkunft/unterkuenfte/u1/preise': () => ({ body: { preise: { ...PREISE, steuerart: 'kleinunternehmer', ustUebernachtung: 19, ustReinigung: 0 } } }),
'PUT /api/unterkunft/unterkuenfte/u1/preise': () => ({ body: {} }),
}), async (fx) => {
const panel = await preisEditor(fx)
assert.equal(await versuche(fx, panel), 1)
const put = posts(fx).find((a) => a.url.includes('/preise'))
assert.equal(put.body.steuerart, 'kleinunternehmer')
assert.equal(put.body.ustUebernachtung, 19)
assert.equal(put.body.ustReinigung, 0)
}))
test('fehlerFuerFormular: unbekannter Code → deutscher Standardtext', async () => {
const { fehlerFuerFormular } = await import('../public/buchungen-fehler.js')
assert.equal(fehlerFuerFormular({ fehler: 'komischer_code', message: 'Fehler 400' }).fehler._, 'Das hat nicht geklappt. Bitte versuch es noch einmal.')
assert.equal(fehlerFuerFormular({ fehler: 'zeitraum_belegt', message: 'x' }).fehler._, 'Der Zeitraum ist bereits belegt.')
})
test('Kalender: vergangene Tage lassen sich nicht sperren', mit(ukServer(), async (fx) => {
const { panel } = await zeigeTab(fx, kal)
await fx.klick(tag(fx, panel, '2026-10-01'))
assert.match(fx.text(fx.finde(panel, '[data-hinweis]')), /Vergangene Tage/)
assert.equal(fx.finde(panel, '[data-aktion="sperren-senden"]'), null)
}))