Design P6: reine Helfer fuer Gutschrift-, Angebots- und Speicherzeilen mit Tests
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
910fa0ff30
commit
b81e53eef5
6 files changed
+146
-2
No files matched your search
@@ -0,0 +1,44 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import { loadModule } from './load.mjs'
|
||||
|
||||
// P6: Zeilen der Abo-Angebote (Filter, Aktionen, Mail-Zeile) als reine Helfer
|
||||
const { offerStatus, filterOffers, offerRowActions, offerMailLine } = await loadModule('src/lib/offerFormat.js')
|
||||
|
||||
test('offerStatus: Tonnamen und Beschriftungen sind festgelegt', () => {
|
||||
assert.deepEqual(offerStatus('offen'), { tone: 'warn', label: 'offen' })
|
||||
assert.deepEqual(offerStatus('aktiv'), { tone: 'ok', label: 'aktiv' })
|
||||
assert.deepEqual(offerStatus('abgelaufen'), { tone: 'muted', label: 'abgelaufen' })
|
||||
assert.deepEqual(offerStatus('zurueckgezogen'), { tone: 'muted', label: 'zurückgezogen' })
|
||||
})
|
||||
|
||||
test('filterOffers: "open" zeigt offen und aktiv, "all" alles, ohne Liste leer, Eingabe bleibt unveraendert', () => {
|
||||
const offers = [
|
||||
{ id: '1', status: 'offen' },
|
||||
{ id: '2', status: 'aktiv' },
|
||||
{ id: '3', status: 'abgelaufen' },
|
||||
{ id: '4', status: 'zurueckgezogen' },
|
||||
]
|
||||
const copy = structuredClone(offers)
|
||||
assert.deepEqual(filterOffers(offers, 'open').map((o) => o.id), ['1', '2'])
|
||||
assert.deepEqual(filterOffers(offers, 'all').map((o) => o.id), ['1', '2', '3', '4'])
|
||||
assert.deepEqual(filterOffers(null, 'open'), [])
|
||||
assert.deepEqual(filterOffers(null, 'all'), [])
|
||||
assert.deepEqual(offers, copy)
|
||||
})
|
||||
|
||||
test('offerRowActions: E-Mail-Knopf und Zurueckziehen je nach Status', () => {
|
||||
assert.deepEqual(offerRowActions({ status: 'offen', mailSendable: true }), { sendLabel: 'E-Mail senden', canWithdraw: true })
|
||||
assert.deepEqual(offerRowActions({ status: 'offen', mailSendable: true, notifiedAt: '2026-09-30T10:05:00.000Z' }), { sendLabel: 'Erneut senden', canWithdraw: true })
|
||||
assert.deepEqual(offerRowActions({ status: 'aktiv', mailSendable: true }), { sendLabel: 'E-Mail senden', canWithdraw: false })
|
||||
assert.deepEqual(offerRowActions({ status: 'abgelaufen', mailSendable: false }), { sendLabel: '', canWithdraw: true })
|
||||
assert.deepEqual(offerRowActions({ status: 'zurueckgezogen' }), { sendLabel: '', canWithdraw: false })
|
||||
})
|
||||
|
||||
test('offerMailLine: gesendet, nicht verschickt, ohne Adresse, sonst keine Zeile', () => {
|
||||
assert.deepEqual(offerMailLine({ notifiedAt: '2026-09-30T10:05:00.000Z' }), { tone: 'muted', text: 'E-Mail gesendet 30.09.26, 12:05' })
|
||||
assert.deepEqual(offerMailLine({ mailSendable: true }), { tone: 'warn', text: 'E-Mail nicht verschickt' })
|
||||
assert.deepEqual(offerMailLine({ status: 'offen', customerEmail: '' }), { tone: 'warn', text: 'Keine E-Mail-Adresse hinterlegt' })
|
||||
assert.equal(offerMailLine({ status: 'abgelaufen', customerEmail: '' }), null)
|
||||
assert.equal(offerMailLine({ status: 'offen', customerEmail: 'a@b.de' }), null)
|
||||
})
|
||||
Reference in new issue
Block a user