import { test, after } from 'node:test' import assert from 'node:assert/strict' import { startAppwriteMock } from './support/appwriteMock.js' import { useTestEnv } from './support/testEnv.js' // Einmal-Skript scripts/kundenart-bestand.mjs (P10, E18): Kundenart "unternehmen" nur dort setzen, wo das Feld leer ist, und nur mit // passender Bestaetigungszeile. Nur Nachbauten, nie Produktion. const aw = await startAppwriteMock({ schema: { customers: ['name', 'email', 'companyName', 'customerStatus', 'kundenart'] } }) after(() => aw.close()) useTestEnv({ appwriteUrl: aw.url, stripeUrl: 'http://127.0.0.1:1' }) const { parseArgs, bestaetigungsZeile, pruefen, ausfuehren } = await import('../scripts/kundenart-bestand.mjs') const kunde = (id, customerStatus, kundenart) => aw.seed('customers', { $id: id, name: `Name ${id}`, email: `${id}@example.invalid`, companyName: `Firma ${id}`, customerStatus, ...(kundenart === undefined ? {} : { kundenart }) }) kunde('k_leer', 'customer', ''); kunde('k_fehlt', 'lead'); kunde('k_blank', 'lost', ' '); kunde('k_archiv', 'archived', '') kunde('k_unt', 'customer', 'unternehmen'); kunde('k_priv', 'lead', 'privat'); kunde('k_fremd', 'customer', 'firma') const OHNE = ['k_archiv', 'k_blank', 'k_fehlt', 'k_leer'] const stand = () => JSON.stringify([...aw.docs('customers')]) const sammler = () => { const zeilen = []; return { log: (z) => zeilen.push(z), text: () => zeilen.join('\n') } } test('parseArgs: nur --pruefen oder --ausfuehren mit Bestätigung, alles andere wirft', () => { assert.deepEqual(parseArgs(['--pruefen']), { modus: 'pruefen' }) assert.deepEqual(parseArgs(['--ausfuehren', '--bestaetigung=Kundenart unternehmen setzen: 4']), { modus: 'ausfuehren', bestaetigung: 'Kundenart unternehmen setzen: 4' }) for (const schlecht of [[], ['--ausfuehren'], ['--pruefen', '--ausfuehren'], ['--force'], ['--pruefen', '--bestaetigung=x']]) assert.throws(() => parseArgs(schlecht), /Aufruf/) assert.equal(bestaetigungsZeile(42), 'Kundenart unternehmen setzen: 42') }) test('pruefen zählt und nennt IDs, schreibt nichts, gibt keine Personendaten aus', async () => { const vorher = stand(); const out = sammler() const e = await pruefen({ log: out.log }) assert.deepEqual([e.gesamt, e.mitKundenart, [...e.ohne].sort(), e.unbekannt], [7, { unternehmen: 1, privat: 1 }, OHNE, ['k_fremd']]) assert.deepEqual(e.ohneNachStatus, { customer: ['k_leer'], lead: ['k_fehlt'], lost: ['k_blank'], archived: ['k_archiv'] }) assert.equal(stand(), vorher) assert.match(out.text(), /Ohne Kundenart: 4/); assert.match(out.text(), /Unbekannte Werte: 1/); assert.match(out.text(), /Kundenart unternehmen setzen: 4/) assert.doesNotMatch(out.text(), /Name |Firma |@example/) }) test('ausfuehren ohne passende Bestätigungszeile schreibt nichts', async () => { const vorher = stand() for (const b of ['', 'ja', 'Kundenart unternehmen setzen: 3', 'Kundenart unternehmen setzen: 5', 'kundenart unternehmen setzen: 4']) await assert.rejects(ausfuehren({ bestaetigung: b, log: () => {} }), /Kundenart unternehmen setzen: 4/, b) assert.equal(stand(), vorher) }) test('ausfuehren setzt nur leere Felder, lässt alles andere stehen und ist wiederholbar', async () => { const out = sammler() const e = await ausfuehren({ bestaetigung: bestaetigungsZeile(4), log: out.log }) assert.deepEqual([e.gesetzt, e.uebersprungen, e.fehler], [4, 0, []]) const art = (id) => aw.docs('customers').get(id).kundenart assert.deepEqual(OHNE.map(art), Array(4).fill('unternehmen')); assert.deepEqual(['k_unt', 'k_priv', 'k_fremd'].map(art), ['unternehmen', 'privat', 'firma']) assert.equal(aw.docs('customers').get('k_leer').name, 'Name k_leer') for (const id of OHNE) assert.match(out.text(), new RegExp(`\\t${id}\\t`)); assert.doesNotMatch(out.text(), /Name |Firma |@example/) assert.equal((await ausfuehren({ bestaetigung: bestaetigungsZeile(0), log: () => {} })).gesetzt, 0) }) test('Wert, der zwischen Prüfen und Schreiben gesetzt wurde, bleibt', async () => { kunde('k_r1', 'lead', ''); kunde('k_r2', 'lead', '') const e = await ausfuehren({ bestaetigung: bestaetigungsZeile(2), log: (z) => { if (/^Schreibe 2 /.test(z)) kunde('k_r1', 'lead', 'privat') } }) assert.deepEqual([e.gesetzt, e.uebersprungen], [1, 1]) assert.deepEqual(['k_r1', 'k_r2'].map((id) => aw.docs('customers').get(id).kundenart), ['privat', 'unternehmen']) }) test('Schreibfehler stehen im Ergebnis, die übrigen Einträge werden trotzdem gesetzt', async () => { kunde('k_e1', 'lead', ''); kunde('k_e2', 'lead', '') aw.failNext({ collection: 'customers', method: 'PATCH', status: 500, message: 'kaputt' }) const e = await ausfuehren({ bestaetigung: bestaetigungsZeile(2), log: () => {} }) assert.deepEqual([e.gesetzt, e.fehler.length], [1, 1]); assert.match(e.fehler[0].grund, /kaputt/) })