diff --git a/server/routes/unterkunft.js b/server/routes/unterkunft.js index aca1cb9..c86eecb 100644 --- a/server/routes/unterkunft.js +++ b/server/routes/unterkunft.js @@ -606,7 +606,8 @@ router.get('/rechnungen/:datei', route(async (req, res) => { let modul try { modul = await import('../services/unterkunft/rechnungPdf.js') - } catch { + } catch (err) { + if (err?.code !== 'ERR_MODULE_NOT_FOUND') throw err return res.status(501).json({ fehler: 'nicht_verfuegbar' }) } const art = dok.art === 'storno' ? 'storno' : 'rechnung' diff --git a/test/unterkunftBuchung.test.js b/test/unterkunftBuchung.test.js index f15201e..7a9fc60 100644 --- a/test/unterkunftBuchung.test.js +++ b/test/unterkunftBuchung.test.js @@ -294,12 +294,13 @@ test('Webhook charge.refunded: erstattetCent = Maximum, nie zurueck', async () = assert.equal((await sp.ladeAnfrage(id)).erstattetCent, 7000) }) -test('rechnung.pdf: 200 mit PDF oder 501 ohne Erzeuger; falsches Token 404', async () => { +test('rechnung.pdf: 200 mit PDF; falsches Token 404', async () => { const { id, token } = await freigegeben() await post(url(id, token), { rechnungsadresse: ADRESSE, zahlart: 'vorort' }) const r = await send('GET', url(id, token, '/rechnung.pdf')) - assert.ok([200, 501].includes(r.status), String(r.status)) - if (r.status === 200) assert.equal(r.headers.get('content-type'), 'application/pdf') + assert.equal(r.status, 200) + assert.equal(r.headers.get('content-type'), 'application/pdf') + assert.ok(String(r.body).startsWith('%PDF-'), 'PDF-Kopf') assert.equal((await send('GET', url(id, 'falsch', '/rechnung.pdf'))).status, 404) assert.equal((await send('GET', url(id, token, '/rechnung.pdf') + '&art=storno')).status, 404) assert.equal((await send('GET', url(id, token, '/rechnung.pdf') + '&art=x')).status, 400) diff --git a/test/unterkunftVerwaltung.test.js b/test/unterkunftVerwaltung.test.js index 6b26ae6..c18d1a4 100644 --- a/test/unterkunftVerwaltung.test.js +++ b/test/unterkunftVerwaltung.test.js @@ -474,7 +474,7 @@ test('Stornieren: Erstattung fehlgeschlagen -> 502 erstattung_fehlgeschlagen mit // ------------------------------------------------------------------------------------------------ Rechnungen -test('Rechnungen: Liste nur des Projekts; PDF fremde Rechnung 404, eigene 200 oder 501, unsichere ID 404', async () => { +test('Rechnungen: Liste nur des Projekts; PDF fremde Rechnung 404, eigene 200 als PDF, unsichere ID 404', async () => { aw.seed('ukRechnungen', { $id: 'r1', featureId: FEATURE, anfrageId: 'a1', art: 'rechnung', nummer: 'DH-2026-0001', datum: '2026-11-01', bruttoCent: 100, inhalt: JSON.stringify({ anfrageNummer: 'A-X', empfaenger: { name: 'Eva' } }) }) aw.seed('ukRechnungen', { $id: 'rfremd', featureId: 'anderes', anfrageId: 'a9', art: 'rechnung', nummer: 'XX-1', datum: '2026-11-01', bruttoCent: 100, inhalt: '{}' }) const l = (await get('/rechnungen')).body.rechnungen @@ -488,8 +488,10 @@ test('Rechnungen: Liste nur des Projekts; PDF fremde Rechnung 404, eigene 200 od assert.equal((await get('/rechnungen/r1')).status, 404) assert.equal((await get('/rechnungen/..%2F..%2Fx.pdf')).status, 404) const eigene = await get('/rechnungen/r1.pdf') - assert.ok([200, 501].includes(eigene.status), String(eigene.status)) - if (eigene.status === 501) assert.equal(eigene.body.fehler, 'nicht_verfuegbar') + assert.equal(eigene.status, 200) + assert.equal(eigene.headers.get('content-type'), 'application/pdf') + assert.match(eigene.headers.get('content-disposition'), /Rechnung-DH-2026-0001\.pdf/) + assert.ok(String(eigene.body).startsWith('%PDF-'), 'PDF-Kopf') }) // ------------------------------------------------------------------------------------------------ Stripe