Kontrolle: Betreff-Zusaetze Erinnerung und Kopie, Mail-Protokolle ohne Meldung und Adresse

Die Erinnerung beginnt mit 'Erinnerung: ', die Teamkopie mit 'Kopie: ' (der Mailer
nimmt dafuer ein optionales subjectPrefix). Die Protokollzeilen in mails.js nennen
nur Nummer und Fehlerkennung.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-07 15:24:59 +00:00
1 parent b6c1d81342
commit 1cbec5b32d
3 files changed
+42 -9

No files matched your search

+27 -1
View File
@@ -132,7 +132,7 @@ test('sendeAuftragMail: K31 an den Kunden ohne BCC (Link im Fragment, AB-PDF und
assert.ok(Buffer.from(kundenmail.attachments[0].content, 'base64').equals(AB_PDF))
assert.ok(Buffer.from(kundenmail.attachments[1].content, 'base64').equals(AGB_PDF))
assert.deepEqual(adressen(teamkopie.to), config.chatNotify.emails)
assert.equal(teamkopie.subject, K31_BETREFF)
assert.equal(teamkopie.subject, `Kopie: ${K31_BETREFF}`)
assert.ok(teamkopie.text.split('\n').includes('Kopie für das Team – der Bestätigungslink steht nur in der Mail an den Kunden.'))
assert.ok(!teamkopie.attachments || teamkopie.attachments.length === 0, 'die AB-PDF liegt im Ticketsystem')
const geheim = JSON.stringify(teamkopie)
@@ -144,6 +144,8 @@ test('sendeAuftragMail: die Erinnerung geht auch als Teamkopie raus; ohne pdf wi
await sendeAuftragMail(abDokument({ ...AUFWAND, pdfDatei }), { token: TOKEN, erinnerung: true })
assert.equal(sink.sent.length, 2)
for (const mail of sink.sent) assert.ok(mail.text.includes('Wir haben Ihnen diese Auftragsbestätigung am 06.10.2026 schon einmal geschickt'))
const betreff = 'Ihre Auftragsbestätigung AB-2026-0001 – Website für Musterbäckerei'
assert.deepEqual(sink.sent.map((m) => m.subject), [`Erinnerung: ${betreff}`, `Kopie: Erinnerung: ${betreff}`])
assert.ok(Buffer.from(sink.sent[0].attachments[0].content, 'base64').equals(AB_PDF))
assert.ok(!JSON.stringify(sink.sent[1]).includes(TOKEN))
})
@@ -202,3 +204,27 @@ test('sendeBestaetigtMails wirft nie: scheitert K32, geht T22 trotzdem raus; ohn
await sendeBestaetigtMails(BESTAETIGT({ gesendetAn: '', kunde: kunde('privat', { email: '' }) }))
assert.deepEqual(sink.sent.map((m) => m.subject), [T22_BETREFF])
})
test('Protokoll der Mail-Wege: nur Nummer und Fehlerkennung, nie die Meldung des Transports und nie eine Adresse', async () => {
const meldung = 'Recipient address rejected: <k@example.invalid>'
// nur die Zeilen von mails.js; das Protokoll des Mailers (shared) ist nicht Gegenstand
const protokolliert = () => protokoll.mock.calls.map((c) => c.arguments.join(' ')).filter((zeile) => zeile.startsWith('[auftraege]')).join('\n')
const pruefe = (mitKennung) => {
const text = protokolliert()
assert.ok(text.includes('AB-2026-0001'), 'die Nummer steht im Protokoll')
for (const verboten of ['k@example.invalid', 'Recipient', 'rejected']) assert.ok(!text.includes(verboten), `das Protokoll enthält ${verboten}`)
if (mitKennung) assert.ok(text.includes('EENVELOPE'), 'die Fehlerkennung steht im Protokoll')
protokoll.mock.resetCalls()
}
const fehler = () => Object.assign(new Error(meldung), { code: 'EENVELOPE' })
// Teamkopie scheitert (zweiter Aufruf)
let aufrufe = 0
setMailTransportForTests({ async sendMail(mail) { aufrufe += 1; if (aufrufe === 2) throw fehler(); return sink.sendMail(mail) } })
await sendeAuftragMail(AB, { pdf: AB_PDF, token: TOKEN })
pruefe(false)
// K32 und T22 scheitern beide
setMailTransportForTests({ async sendMail() { throw fehler() } })
await sendeBestaetigtMails(BESTAETIGT())
assert.ok(protokolliert().includes('K32') && protokolliert().includes('T22'))
pruefe(true)
})