Webshop A3: Register-Eintrag shop, Haken, Rechtstext-Satz und Ticket-Details
Registereintrag config.features.shop (Bestelltexte mit Fassung config.shop.fassung, Rechtsunterlagen-Getter, Mailtexte, Ticket), STANDARD_HAKEN.shop (Schalter, Bestellpruefung ueber shop/anfrage.js, Unterlagen, Belehrung), legalDocs-Satz shop, shopTicketDetails sowie Rumpf von anfrageOffenePunkte. Tests angepasst und um Shop-Faelle erweitert. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6782d99960
commit
0e74f1669c
12 files changed
+594
-23
No files matched your search
+54
-1
@@ -1,6 +1,6 @@
|
||||
import { test, after, mock } from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import { closeSync, copyFileSync, mkdirSync, mkdtempSync, openSync, readFileSync, rmSync, writeFileSync, writeSync } from 'node:fs'
|
||||
import { closeSync, copyFileSync, existsSync, mkdirSync, mkdtempSync, openSync, readFileSync, rmSync, writeFileSync, writeSync } from 'node:fs'
|
||||
import fsp from 'node:fs/promises'
|
||||
import { syncBuiltinESMExports } from 'node:module'
|
||||
import { tmpdir } from 'node:os'
|
||||
@@ -291,6 +291,59 @@ test('News: Leistungsbeschreibung folgt der Fassung <F> (Adresse unverändert, k
|
||||
assert.equal(Object.getOwnPropertyDescriptor(n, 'leistungsbeschreibung').get, undefined)
|
||||
})
|
||||
|
||||
// Webshop (Block A3): eigener Satz mit eigener Fassung config.shop.fassung; die Dateien legt Block J an
|
||||
test('Webshop-Satz: Adressen, PDF-Namen und Funktionszuordnung folgen config.shop.fassung', async () => {
|
||||
const S = config.shop.fassung
|
||||
assert.match(S, /^\d{4}-\d{2}-\d{2}$/)
|
||||
assert.deepEqual(legalPaths('shop', S), {
|
||||
lb: `/rechtliches/leistungsbeschreibung-webshop-${S}.html`,
|
||||
avv: `/rechtliches/avv-webshop-${S}.html`,
|
||||
widerruf: `/rechtliches/widerrufsbelehrung-funktionen-${S}.html`,
|
||||
})
|
||||
assert.deepEqual(Object.keys(legalPaths('shop', S)), ['lb', 'avv', 'widerruf'])
|
||||
const f = legalPdfFiles('shop', S)
|
||||
assert.equal(f.lb.filename, `Leistungsbeschreibung-Webshop-${S}.pdf`)
|
||||
assert.equal(f.avv.filename, `AVV-Webshop-${S}.pdf`)
|
||||
assert.equal(f.widerruf.filename, `Widerrufsbelehrung-Muster-Widerrufsformular-${S}.pdf`)
|
||||
assert.equal(f.avv.path, new URL(`../public/rechtliches/avv-webshop-${S}.pdf`, import.meta.url).pathname)
|
||||
assert.throws(() => legalPaths('shop', '2026-10-5'), /Fassung/)
|
||||
|
||||
// die aktuelle Fassung des Satzes shop ist config.shop.fassung (nicht die der Termine)
|
||||
assert.deepEqual(featureLegalPaths('shop'), legalPaths('shop', S))
|
||||
const alt = config.shop.fassung
|
||||
config.shop.fassung = '2099-01-02'
|
||||
try {
|
||||
assert.deepEqual(featureLegalPaths('shop'), legalPaths('shop', '2099-01-02'))
|
||||
assert.deepEqual(featureLegalPaths('termine'), legalPaths('termine', V), 'Termine bleiben bei ihrer Fassung')
|
||||
await assert.rejects(featureLegalAttachments('shop'))
|
||||
} finally {
|
||||
config.shop.fassung = alt
|
||||
}
|
||||
assert.deepEqual(featureLegalPaths('shop', { fassung: '2026-10-01' }), legalPaths('shop', '2026-10-01'))
|
||||
assert.deepEqual(featureLegalPaths('termine'), legalPaths('termine', V))
|
||||
})
|
||||
|
||||
test('featureLegalReady("shop") ist true genau dann, wenn alle sechs Dateien der Fassung da sind (bis Block J: false)', async () => {
|
||||
const S = config.shop.fassung
|
||||
const html = Object.values(legalPaths('shop', S))
|
||||
const pdfs = Object.values(legalPdfFiles('shop', S)).map((x) => x.path)
|
||||
const alleDa = html.every((p) => existsSync(root(`public${p}`))) && pdfs.every((p) => existsSync(p))
|
||||
assert.equal(await featureLegalReady('shop'), alleDa)
|
||||
assert.equal(await featureLegalReady('shop', { fassung: '1999-01-01' }), false)
|
||||
// nie ein Wurf bei fehlenden Dateien; die Anhaenge werfen dagegen
|
||||
if (!alleDa) await assert.rejects(featureLegalAttachments('shop'))
|
||||
})
|
||||
|
||||
test('Register: leistungsbeschreibung, avv und widerruf des Webshops folgen config.shop.fassung (Drift-Wächter)', () => {
|
||||
const s = featureConfig('shop')
|
||||
const S = config.shop.fassung
|
||||
const p = legalPaths('shop', S)
|
||||
assert.deepEqual(s.leistungsbeschreibung, { version: S, url: p.lb })
|
||||
assert.deepEqual(s.avv, { version: S, url: p.avv })
|
||||
assert.deepEqual(s.widerruf, { version: S, url: p.widerruf })
|
||||
assert.equal(s.consent.version, S)
|
||||
})
|
||||
|
||||
test('config.js importiert legalDocs.js nicht (Adresse aus Slug und Version gebaut)', () => {
|
||||
const src = readFileSync(root('server/config.js'), 'utf8')
|
||||
assert.doesNotMatch(src, /^\s*(import\b[^\n]*|.*\bimport\()['"`][^'"`]*legalDocs/m)
|
||||
|
||||
Reference in new issue
Block a user