import { test } from 'node:test'; import assert from 'node:assert/strict'; import { istMail, mailLayout, esc } from '../src/lib/mail.ts'; test('Gültige Adressen werden erkannt', () => { for (const gut of ['mail@tillheidrich.de', 'a.b+c@sub.beispiel.co.uk', 'x@y.de', 'Oma_1949@web.de']) { assert.ok(istMail(gut), `fälschlich abgelehnt: ${gut}`); } }); test('Ungültige Adressen werden abgelehnt — auch die mit angehängtem Zeilenumbruch', () => { const schlecht = [ '', ' ', 'keine-adresse', 'a@b', '@b.de', 'a@.de', 'a b@c.de', 'a@b .de', 'a@b.de\nBcc: opfer@example.com', // Kopfzeilen-Einschleusung 'a@b.de\r\nSubject: x', 'a@b.de\n', // JS-„$" passt auch vor dem Zeilenende 'a'.repeat(250) + '@b.de', // zu lang ]; for (const s of schlecht) assert.ok(!istMail(s), `durchgerutscht: ${JSON.stringify(s)}`); }); test('esc entschärft alles, was HTML zerlegen könnte', () => { assert.equal(esc('x'), '<b>x</b>'); assert.equal(esc('a & b'), 'a & b'); assert.equal(esc('sagte "hallo"'), 'sagte "hallo"'); // Reihenfolge: & zuerst, sonst würde < zu &lt; assert.equal(esc('<&>'), '<&>'); }); test('Die Überschrift der Mail wird immer maskiert', () => { const html = mailLayout('', ['Text']); assert.ok(!html.includes('' }); assert.ok(!html.includes('