import { test } from 'node:test' import assert from 'node:assert/strict' import { adminOfferView } from '../server/services/offers.js' const DAY = 86400000 const iso = (ms) => new Date(ms).toISOString() const ymd = (ms) => iso(ms).slice(0, 10) const now = Date.now() const offer = (fields = {}) => ({ $id: 'offer-1', $createdAt: iso(now - DAY), status: 'offen', scope: 'neu', months: 2, monthlyPriceCents: 2500, regularPriceCents: 5000, customerId: 'c1', validUntil: `${ymd(now + 10 * DAY)}T00:00:00.000Z`, notifiedAt: null, ...fields, }) const customer = { name: 'Martin', email: 'martin@example.invalid' } test('Offenes, gültiges Angebot: Mail kann (erneut) raus, Adresse steht in der Admin-Ansicht', () => { const v = adminOfferView(offer(), customer) assert.equal(v.mailSendable, true) assert.equal(v.customerEmail, 'martin@example.invalid') assert.equal(v.notifiedAt, null) assert.equal(adminOfferView(offer({ notifiedAt: iso(now) }), customer).mailSendable, true) }) test('Keine Mail bei abgelaufenem, zurückgezogenem oder eingelöstem Angebot und ohne Adresse', () => { assert.equal(adminOfferView(offer({ validUntil: `${ymd(now - 2 * DAY)}T00:00:00.000Z` }), customer).mailSendable, false) assert.equal(adminOfferView(offer({ status: 'zurueckgezogen' }), customer).mailSendable, false) const sub = { startedAt: iso(now - DAY), trialEnd: null } assert.equal(adminOfferView(offer({ status: 'aktiv', appliedAt: iso(now - DAY + 5000) }), customer, sub).mailSendable, false) const v = adminOfferView(offer(), { name: 'Ohne Mail', email: '' }) assert.equal(v.mailSendable, false) assert.equal(v.customerEmail, '') }) test('Laufendes Abo: Mail nur, solange die erste rabattierte Abbuchung bevorsteht', () => { const future = adminOfferView( offer({ status: 'aktiv', scope: 'laufend', appliedAt: iso(now - 3600000) }), customer, { startedAt: iso(now - 10 * DAY), trialEnd: null } ) assert.equal(future.mailSendable, true) const past = adminOfferView( offer({ status: 'aktiv', scope: 'laufend', appliedAt: iso(now - 40 * DAY) }), customer, { startedAt: iso(now - 50 * DAY), trialEnd: null } ) assert.equal(past.mailSendable, false) // Abo-Dokument fehlt: Termin unbekannt, also keine Mail assert.equal(adminOfferView(offer({ status: 'aktiv', scope: 'laufend', appliedAt: iso(now) }), customer, null).mailSendable, false) })