import { test } from 'node:test'; import assert from 'node:assert/strict'; import { archivName, paketName } from '../src/lib/shares.ts'; /** * Namen im Sammelpaket. Zwei gleiche Namen in einem ZIP sind beim Packen kein * Fehler — sie fallen erst beim **Auspacken** auf, wo das zweite das erste * überschreibt. Deshalb hat das einen Test. */ test('Gleiche Dateinamen werden durchnummeriert', () => { const v = new Map(); assert.equal(archivName('bild.png', v), 'bild.png'); assert.equal(archivName('bild.png', v), 'bild_1.png'); assert.equal(archivName('bild.png', v), 'bild_2.png'); assert.equal(archivName('anderes.png', v), 'anderes.png'); }); test('Namen können nicht aus dem Archiv ausbrechen', () => { const v = new Map(); for (const boese of ['../../etc/passwd', 'a/b/c.png', 'a\\b.png', '/absolut.png']) { const n = archivName(boese, v); assert.ok(!n.includes('/') && !n.includes('\\'), `Trennzeichen überlebt: ${n}`); } }); test('Steuerzeichen fliegen heraus', () => { const v = new Map(); assert.equal(archivName('abc.png', v), 'abc.png'); assert.equal(archivName('zeile\numbruch.png', v), 'zeileumbruch.png'); }); test('Fehlende oder endungslose Namen bekommen etwas Brauchbares', () => { const v = new Map(); assert.equal(archivName(null, v), 'bild.jpg'); assert.equal(archivName('', v), 'bild_1.jpg'); assert.equal(archivName(' ', v), 'bild_2.jpg'); assert.equal(archivName('ohne-endung', v), 'ohne-endung.jpg'); assert.equal(archivName('mit.png', v), 'mit.png'); assert.equal(archivName('mit.PNG', v), 'mit.PNG'); }); test('Echte Klarbild-Namen bleiben unverändert', () => { const v = new Map(); const n = '2026-08-20_143207_lea-badge_the-frame_a3f9.jpg'; assert.equal(archivName(n, v), n); }); test('Das Paket heißt nach Datum und Titel', () => { const am = new Date('2026-09-01T10:00:00Z'); assert.equal(paketName('Kita August 2026', am), '2026-09-01_kita-august-2026.zip'); assert.equal(paketName('Müller & Söhne', am), '2026-09-01_mueller-soehne.zip'); assert.equal(paketName(null, am), '2026-09-01_klarbild.zip'); assert.equal(paketName('', am), '2026-09-01_klarbild.zip'); assert.equal(paketName('!!!', am), '2026-09-01_klarbild.zip'); }); test('Der Paketname verträgt sich mit jedem Dateisystem', () => { const am = new Date('2026-09-01T10:00:00Z'); for (const titel of ['Grüße aus Köln / Teil 2', 'a\\b:c*d?e"fh|i', '../../..', 'x'.repeat(200)]) { const n = paketName(titel, am); assert.ok(!/[^a-z0-9_.-]/.test(n), `unerwartetes Zeichen in ${n}`); assert.ok(n.length < 60, `zu lang: ${n.length}`); assert.ok(n.endsWith('.zip')); } });