Abo-Fassung 6: Fassungstabelle, aktuelleAboFassung, termsVersionNeu

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-16 15:47:05 +00:00
1 parent c2b7073d99
commit 65b1389b55
3 files changed
+114 -22

No files matched your search

+45
View File
@@ -14,6 +14,9 @@ const {
productView,
contractAttachmentFor,
regularStorageLine,
FASSUNGEN,
aktuelleAboFassung,
isTermsV4OrNewer,
} = await import('../server/services/products.js')
const line = (price, amount, proration = false) => ({
@@ -136,6 +139,48 @@ test('Vertragsunterlagen je Version', () => {
assert.equal(termsDocFor('2026-09-25-v2').version, '2026-09-25-v2', 'aeltere Fassung bleibt benannt')
})
test('Fassungstabelle: Reihenfolge, Muster nur am Ende, v6 im Vorschaupfad', () => {
assert.deepEqual(FASSUNGEN.map((f) => f.muster?.source ?? 'sonst'), ['-v6$', '-v5$', '-v4$', 'sonst'])
assert.deepEqual(termsDocFor('2026-10-16-v6'), {
version: '2026-10-16-v6', url: '/neu/rechtliches/abo-bedingungen.html',
pdfFile: 'neu/rechtliches/WEBklar-Abo-Vertragsunterlagen.pdf', endParagraph: '§ 11',
})
for (const v of ['2026-10-16-v60', '2026-10-16-v6x', 'v6-2026-10-16', '2026-10-16-v66']) {
assert.equal(termsDocFor(v).url, '/vertragsunterlagen/v3/abo-bedingungen.html', v)
}
const a = contractAttachmentFor('2026-10-16-v6')
assert.equal(a.filename, 'WEBklar-Abo-Vertragsunterlagen.pdf')
assert.ok(path.isAbsolute(a.path) && a.path.endsWith(path.join('public', 'neu', 'rechtliches', 'WEBklar-Abo-Vertragsunterlagen.pdf')))
})
test('Fassung 5 bleibt bis P10 an den heutigen Adressen, das Archiv ist vorbereitet', () => {
const v5 = FASSUNGEN.find((f) => f.muster?.source === '-v5$')
assert.equal(termsDocFor('2026-09-30-v5').url, '/abo-bedingungen.html')
assert.deepEqual(Object.keys(termsDocFor('2026-09-30-v5')).sort(), ['endParagraph', 'pdfFile', 'url', 'version'])
assert.deepEqual(v5.archiv, { url: '/vertragsunterlagen/v5/abo-bedingungen.html', pdfFile: 'vertragsunterlagen/v5/WEBklar-Abo-Vertragsunterlagen.pdf' })
})
test('isTermsV4OrNewer: v4, v5, v6 ja; v3, fehlende und fremde Endungen nein', () => {
for (const v of ['2026-09-30-v4', '2026-09-30-v5', '2026-10-16-v6']) assert.equal(isTermsV4OrNewer(v), true, v)
for (const v of ['2026-09-25-v3', '2026-09-25', null, undefined, '', '2026-10-16-v60', 7]) assert.equal(isTermsV4OrNewer(v), false, String(v))
})
test('aktuelleAboFassung: v6 nur mit neuer Ansicht', () => {
// appwriteUserId gehört zur gültigen Kunden-Sitzung (N1, schalter.js istKundenSitzung)
const k = (email, extra = {}) => ({ session: { customerId: 'c1', appwriteUserId: 'u1', email, ...extra } })
const vorher = { ...config.kundenansichtNeu }
try {
Object.assign(config.kundenansichtNeu, { mode: 'off', pilotEmails: ['*'] })
assert.equal(aktuelleAboFassung(k('a@example.invalid')), '2026-09-30-v5', 'off schlägt die Liste')
Object.assign(config.kundenansichtNeu, { mode: 'pilot', pilotEmails: [] })
assert.equal(aktuelleAboFassung(k('a@example.invalid')), '2026-09-30-v5', 'leere Liste lässt niemanden durch')
config.kundenansichtNeu.pilotEmails = ['a@example.invalid']
assert.equal(aktuelleAboFassung(k(' A@Example.INVALID ')), '2026-10-16-v6', 'Großschreibung und Leerraum')
assert.equal(aktuelleAboFassung(k('b@example.invalid')), '2026-09-30-v5')
assert.equal(aktuelleAboFassung(k('b@example.invalid', { viewAs: true, viewId: 'v1' })), '2026-10-16-v6', 'Mitarbeiter-Kundenansicht')
Object.assign(config.kundenansichtNeu, { mode: 'on', pilotEmails: [] })
assert.equal(aktuelleAboFassung(k('b@example.invalid')), '2026-10-16-v6')
} finally { Object.assign(config.kundenansichtNeu, vorher) }
assert.deepEqual([config.abo.termsVersion, config.abo.termsVersionNeu], ['2026-09-30-v5', '2026-10-16-v6'])
})
test('Produktansicht enthält Leistungen ohne 1-Postfach-Regel bei Wartung', () => {
const w = productView('wartung').features.flat().join(' ')
assert.ok(w.includes('beliebig viele Postfächer') && !w.includes('1 E-Mail-Postfach'))