Kundenansicht neu P10: Skript setzt die Kundenart der Bestandseinträge auf Unternehmen (E18)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ff8adadf00
commit
4a75d7aba0
2 files changed
+184
No files matched your search
@@ -0,0 +1,61 @@
|
||||
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/)
|
||||
})
|
||||
Reference in new issue
Block a user