import test from 'node:test' import assert from 'node:assert/strict' import { loadModule } from './load.mjs' const { normalizeName, normalizePhone, companyDomain, findDuplicates, rejectionLine, notesWithRejection, lastRejection } = await loadModule('src/lib/leadDuplicates.js') test('normalizeName: Rechtsform, Umlaute, Satzzeichen, einzelne Buchstaben', () => { assert.equal(normalizeName('Bäckerei Müller GmbH & Co. KG'), 'baeckerei mueller') assert.equal(normalizeName('Café Rosé'), 'cafe rose') assert.equal(normalizeName('Friseur Amin e.K.'), 'friseur amin') assert.equal(normalizeName('Straße-Bau UG (haftungsbeschränkt)'), 'strasse bau') assert.equal(normalizeName(''), '') assert.equal(normalizeName(undefined), '') }) test('normalizePhone: Ziffern, +49 und 0049 als 0, zu kurz zählt nicht', () => { assert.equal(normalizePhone('+49 631 / 123 45-6'), '0631123456') assert.equal(normalizePhone('0049 631 1234560'), '06311234560') assert.equal(normalizePhone('0631 1234560'), '06311234560') assert.equal(normalizePhone('12 34'), '') assert.equal(normalizePhone(null), '') }) test('companyDomain: Freemailer zählen nicht', () => { assert.equal(companyDomain('Info@Baecker-Mueller.de'), 'baecker-mueller.de') assert.equal(companyDomain('x@gmail.com'), '') assert.equal(companyDomain('x@web.de'), '') assert.equal(companyDomain('kaputt'), '') }) const LIST = [ { $id: 'a', name: 'Bäckerei Müller GmbH', email: 'info@mueller-backt.de', phone: '0631 123456', customerStatus: 'lead' }, { $id: 'b', name: 'Friseur Amin', email: 'amin@gmail.com', customerStatus: 'customer' }, { $id: 'c', name: 'Autohaus Schmidt Kaiserslautern', phone: '+49 6301 9999', customerStatus: 'lost', notes: 'Abgesagt am 01.10.2026 (Kenso): kein Bedarf\nalt' }, { $id: 'd', name: 'Bäckerei', customerStatus: 'lead', archived: true }, ] const hit = (input, opts) => findDuplicates(LIST, input, opts).map((m) => `${m.customer.$id}:${m.reasons.join('+')}`) test('findDuplicates: Name, E-Mail, Domain, Telefon; Abgesagte zuerst', () => { assert.deepEqual(hit({ name: 'Baeckerei Mueller' }), ['a:Name']) // ae/ue wie ä/ü assert.deepEqual(hit({ name: 'bäckerei müller' }), ['a:Name']) assert.deepEqual(hit({ name: 'Bäckerei' }), ['d:Name']) // archiviert zählt mit; kurzer Name nur exakt assert.deepEqual(hit({ email: 'INFO@mueller-backt.de' }), ['a:E-Mail']) assert.deepEqual(hit({ email: 'chef@mueller-backt.de' }), ['a:E-Mail-Domain']) assert.deepEqual(hit({ email: 'jemand@gmail.com' }), []) assert.deepEqual(hit({ phone: '06301/9999' }), ['c:Telefon']) assert.deepEqual(hit({ name: 'Autohaus Schmidt' }), ['c:Name']) // Teilname ab 2 Wörtern und 8 Zeichen assert.deepEqual(hit({ name: 'Schmidt' }), []) assert.deepEqual(hit({ name: 'Bäckerei Müller', phone: '0049 6301 9999' }), ['c:Telefon', 'a:Name']) assert.deepEqual(hit({ name: 'bäckerei müller' }, { excludeId: 'a' }), []) assert.deepEqual(hit({}), []) assert.deepEqual(findDuplicates(undefined, { name: 'x' }), []) }) test('Absage-Vermerk: Zeile, Notizen, letzter Vermerk', () => { const d = new Date(2026, 9, 6, 12) assert.equal(rejectionLine({ date: d, by: 'Kenso Grimm', reason: ' kein\n Bedarf ' }), 'Abgesagt am 06.10.2026 (Kenso Grimm): kein Bedarf') assert.equal(rejectionLine({ date: d }), 'Abgesagt am 06.10.2026') assert.equal(notesWithRejection('', 'X'), 'X') assert.equal(notesWithRejection(' alt \n', 'X'), 'X\nalt') assert.equal(notesWithRejection('a'.repeat(5000), 'X').length, 5000) assert.equal(lastRejection(LIST[2].notes), 'Abgesagt am 01.10.2026 (Kenso): kein Bedarf') assert.equal(lastRejection('nur Notiz'), '') assert.equal(lastRejection(undefined), '') })