import { test, after } from 'node:test' import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import { fileURLToPath } from 'node:url' import express, { Router } from 'express' import { useTestEnv } from './support/testEnv.js' useTestEnv({ appwriteUrl: 'http://127.0.0.1:1', stripeUrl: 'http://127.0.0.1:1' }) const { config } = await import('../server/config.js') const { startTestApp } = await import('./support/testApp.js') const { analyseLegalRouter, legalPaths, legalPdfFiles, legalPdfAttachments } = await import('../server/services/analyseLegal.js') const core = await import('../analytics/client/core.js') const root = (rel) => new URL(`../${rel}`, import.meta.url) const V = '2026-10-02' // wie in server/index.js: erst die Router für Adressen ohne Fassung, dann express.static const rechtliches = Router() rechtliches.use(analyseLegalRouter()) rechtliches.use(express.static(fileURLToPath(new URL('../public/rechtliches/', import.meta.url)))) const app = await startTestApp({ '/rechtliches': rechtliches }) after(() => app.close()) const fetchBytes = async (path) => { const r = await fetch(app.url + path) return { status: r.status, body: Buffer.from(await r.arrayBuffer()) } } test('legalPaths und legalPdfFiles nennen feste Adressen und Dateinamen', () => { assert.deepEqual(legalPaths(V), { avv: `/rechtliches/avv-website-analyse-${V}.html`, lb: `/rechtliches/leistungsbeschreibung-website-analyse-${V}.html`, }) const f = legalPdfFiles(V) assert.equal(f.avv.filename, `AVV-Website-Analyse-${V}.pdf`) assert.equal(f.lb.filename, `Leistungsbeschreibung-Website-Analyse-${V}.pdf`) assert.throws(() => legalPaths('../x')) }) test('Adressen ohne Fassung liefern die Bytes der Fassung aus config.analyse.avvVersion', async () => { assert.equal(config.analyse.avvVersion, V) const a = await fetchBytes('/rechtliches/avv-website-analyse.html') assert.equal(a.status, 200) assert.deepEqual(a.body, readFileSync(root(`public/rechtliches/avv-website-analyse-${V}.html`))) const l = await fetchBytes('/rechtliches/leistungsbeschreibung-website-analyse.html') assert.equal(l.status, 200) assert.deepEqual(l.body, readFileSync(root(`public/rechtliches/leistungsbeschreibung-website-analyse-${V}.html`))) }) test('versionierte Adresse 200, unbekannte Fassung 404', async () => { assert.equal((await fetchBytes(`/rechtliches/avv-website-analyse-${V}.html`)).status, 200) assert.equal((await fetchBytes(`/rechtliches/leistungsbeschreibung-website-analyse-${V}.html`)).status, 200) assert.equal((await fetchBytes('/rechtliches/avv-website-analyse-2026-01-01.html')).status, 404) }) test('PDFs: beginnen mit %PDF, > 20 KB, Anhänge mit richtigen Dateinamen', async () => { const att = await legalPdfAttachments(V) assert.equal(att.length, 2) assert.deepEqual(att.map((a) => a.filename), [`AVV-Website-Analyse-${V}.pdf`, `Leistungsbeschreibung-Website-Analyse-${V}.pdf`]) for (const a of att) { assert.equal(a.contentType, 'application/pdf') assert.equal(a.content.subarray(0, 4).toString(), '%PDF') assert.ok(a.content.length > 20 * 1024) } await assert.rejects(legalPdfAttachments('2026-01-01')) }) test('Banner-Archiv: Text und aria-label wortgleich zu core.js, README nennt BANNER_VERSION', () => { const md = readFileSync(root(`docs/rechtliches/archiv/banner-${V}.md`), 'utf8') assert.ok(md.includes(core.BANNER_TEXT)) assert.ok(md.includes(core.BANNER_ARIA)) assert.equal(core.BANNER_VERSION, V) assert.ok(md.includes('BANNER_VERSION')) assert.ok(readFileSync(root('docs/rechtliches/archiv/README.md'), 'utf8').includes('BANNER_VERSION')) assert.deepEqual( readFileSync(root(`docs/rechtliches/archiv/datenschutz-analyse-${V}.html`)), readFileSync(root('runner/src/templates/datenschutz-analyse.html')) ) }) test('Banner-Archiv eigene Website: Sie-Fassung wortgleich zu core.js, README nennt BANNER_VERSION_EIGEN', () => { const v = core.BANNER_VERSION_EIGEN const md = readFileSync(root(`docs/rechtliches/archiv/banner-eigen-${v}.md`), 'utf8') assert.ok(md.includes(core.BANNER_TEXT_EIGEN)) assert.ok(md.includes(`BANNER_VERSION_EIGEN\`: ${v}`)) const readme = readFileSync(root('docs/rechtliches/archiv/README.md'), 'utf8') assert.ok(readme.includes('BANNER_VERSION_EIGEN') && readme.includes(`datenschutz-analyse-webklar-com-${v}.html`)) const seite = readFileSync(root(`docs/rechtliches/archiv/datenschutz-analyse-webklar-com-${v}.html`), 'utf8') assert.ok(seite.includes(`Stand ${v.slice(8, 10)}.${v.slice(5, 7)}.${v.slice(0, 4)}`), 'Stand der Zusatzseite = Fassung') })