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 <
assert.equal(esc('<&>'), '<&>');
});
test('Die Überschrift der Mail wird immer maskiert', () => {
const html = mailLayout('', ['Text']);
assert.ok(!html.includes('' });
assert.ok(!html.includes('