Tests nach der Freigabe: Wortlaut-Status freigegeben, Rückfall "PDF fehlt" per Test-Weiche

Seit die PDFs der Fassung 6 im Repo liegen, stellt knUnterlagenFehlen den Fall "Fassung 6
ohne PDF" mit setAnhangPfadFuerTests nach (vertragsAnhang.js, nur für Tests, Vorgabe aus).
Vier Nachweis-Tests erwarten jetzt wortlaut: 'freigegeben'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-28 14:52:35 +00:00
1 parent 5d0adf12c9
commit 99d9b280f5
6 files changed
+34 -13

No files matched your search

+18 -7
View File
@@ -7,7 +7,7 @@ import { useTestEnv } from './support/testEnv.js'
import { schemaKeys } from './support/schema.js'
import { mailSink } from './support/mailSink.js'
// Abschlussprüfung F5: Fassung 6 ohne PDF. Fehlt der Anhang, behaupten K01, K12 und K13 kein „im Anhang“, und das Team bekommt in T02, T12 bzw. T13
// Abschlussprüfung F5: Fassung 6 ohne PDF. Seit der Freigabe (28.10.2026) liegen die PDFs im Repo; ohnePdf() stellt den Rückfall nach. Fehlt der Anhang, behaupten K01, K12 und K13 kein „im Anhang“, und das Team bekommt in T02, T12 bzw. T13
// den Block anhang_fehlt (Muster K38/T24). Alte Fassungen bleiben unverändert (Hash-Pins auf die Wiedergabe der alten Vorlagen).
const aw = await startAppwriteMock({
schema: {
@@ -30,6 +30,7 @@ const { listContractEvents } = await import('../server/services/contractEvents.j
const { deleteDocument } = await import('../server/services/appwriteAdmin.js')
const { setMailTransportForTests } = await import('../server/services/mailer.js')
const { loadTemplate, renderMail } = await import('../server/services/mailTemplates.js')
const { setAnhangPfadFuerTests } = await import('../server/services/vertragsAnhang.js')
const app = await startTestApp({ '/api/abo': aboRoutes })
const mails = mailSink()
@@ -63,6 +64,16 @@ async function mitNeuFassung(fassung, fn) {
}
}
/** Fassung 6 ohne PDF: der Pfad zeigt während fn auf eine nicht vorhandene Datei. */
async function ohnePdf(fn) {
setAnhangPfadFuerTests((p) => `${p}.fehlt`)
try {
return await fn()
} finally {
setAnhangPfadFuerTests(null)
}
}
// ---------------------------------------------------------------- Vorlagen
test('Vorlagen: K01, K12 und K13 kennen anhang und ohne_anhang, T02, T12 und T13 den Block anhang_fehlt', () => {
for (const id of ['K01', 'K12', 'K13']) assert.deepEqual(['anhang', 'ohne_anhang'].filter((b) => !loadTemplate(id).blocks.includes(b)), [], id)
@@ -136,7 +147,7 @@ async function k01(termsVersion) {
}
test('K01: Fassung 6 ohne PDF behauptet keinen Anhang, T02 sagt es dem Team', async () => {
const { kunde, team } = await k01(NEU)
const { kunde, team } = await ohnePdf(() => k01(NEU))
assert.equal(kunde.attachments.length, 0)
assert.doesNotMatch(kunde.text, /Anhang|beigefügt/i)
assert.match(kunde.text, /senden wir Ihnen gesondert zu/)
@@ -169,7 +180,7 @@ async function k12(termsVersion) {
return { kunde: mails.sent.find((m) => m.subject === 'Ihr Wechsel ins WEBklar Wartungs-Abo – Bestätigung'), team: mails.sent.find((m) => m.subject.startsWith('[Abo] Wechsel ins Wartungs-Abo')) }
}
test('K12: Fassung 6 ohne PDF behauptet keinen Anhang, T12 sagt es dem Team; mit PDF und alte Fassung wie bisher', async () => {
const ohne = await k12(NEU)
const ohne = await ohnePdf(() => k12(NEU))
assert.equal(ohne.kunde.attachments.length, 0)
assert.doesNotMatch(ohne.kunde.text, /Anhang|beigefügt/i)
assert.match(ohne.kunde.text, /senden wir Ihnen gesondert zu/)
@@ -195,13 +206,13 @@ async function k13({ units, paidUnits, ziel, termsVersion }) {
return { kunde: mails.sent.find((m) => m.subject === 'Ihr E-Mail-Zusatzspeicher – Bestätigung'), team: mails.sent.find((m) => m.subject.startsWith('[Speicher]')) }
}
test('K13: Fassung 6 ohne PDF behauptet keinen Anhang, T13 sagt es dem Team (auch ohne Aufgabe); mit PDF und alte Fassung wie bisher', async () => {
const ohne = await k13({ units: 0, paidUnits: 0, ziel: 2, termsVersion: NEU })
const ohne = await ohnePdf(() => k13({ units: 0, paidUnits: 0, ziel: 2, termsVersion: NEU }))
assert.equal(ohne.kunde.attachments.length, 0)
assert.doesNotMatch(ohne.kunde.text, /Anhang|beigefügt/i)
assert.match(ohne.kunde.text, /senden wir Ihnen gesondert zu/)
assert.match(ohne.team.text, new RegExp(HINWEIS))
// Plus nur bis zur schon bezahlten Menge: keine Aufgabe, aber die Unterlagen müssen nachgesendet werden
const bezahlt = await k13({ units: 1, paidUnits: 3, ziel: 3, termsVersion: NEU })
const bezahlt = await ohnePdf(() => k13({ units: 1, paidUnits: 3, ziel: 3, termsVersion: NEU }))
assert.equal(bezahlt.kunde.attachments.length, 0)
assert.ok(bezahlt.team, 'T13 geht auch ohne Aufgabe raus, wenn der Anhang fehlt')
assert.match(bezahlt.team.text, new RegExp(HINWEIS))
@@ -218,7 +229,7 @@ test('K13: Fassung 6 ohne PDF behauptet keinen Anhang, T13 sagt es dem Team (auc
})
// Karte mit Bestätigung bei der Bank: K12 geht beim Klick, T12 "wirksam" erst mit pending_update_applied; auch dieses T12 sagt, dass die PDFs fehlen
test('T12 beim späteren Wirksamwerden (Karte, pending_update_applied) trägt anhang_fehlt, solange die PDFs der Fassung 6 fehlen', async () => {
test('T12 beim späteren Wirksamwerden (Karte, pending_update_applied) trägt anhang_fehlt, solange die PDFs der Fassung 6 fehlen', () => ohnePdf(async () => {
await resetHosting()
const nowU = nowUnix()
st.nextSubscriptionUpdate = {
@@ -234,4 +245,4 @@ test('T12 beim späteren Wirksamwerden (Karte, pending_update_applied) trägt an
const t12 = mails.sent.filter((m) => m.subject.startsWith('[Abo] Wechsel ins Wartungs-Abo'))
assert.equal(t12.length, 1)
assert.match(t12[0].text, new RegExp(HINWEIS))
})
}))