Analyse: geprüfte Rechtstexte Fassung 2026-10-02 veröffentlichen (HTML, PDF, Zusatzseiten-Vorlage, Archiv)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f401dc14d7
commit
ddb91a9950
16 files changed
+827
-138
No files matched your search
@@ -0,0 +1,78 @@
|
||||
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'))
|
||||
)
|
||||
})
|
||||
+22
-14
@@ -4,22 +4,31 @@ import { existsSync, readFileSync } from 'node:fs'
|
||||
|
||||
const root = (rel) => new URL(`../${rel}`, import.meta.url)
|
||||
|
||||
test('AVV Website-Analyse: öffentliche Seite existiert, trägt Fassung und Entwurfshinweis, keine internen Kommentare', () => {
|
||||
const file = root('public/rechtliches/avv-website-analyse.html')
|
||||
assert.ok(existsSync(file))
|
||||
const html = readFileSync(file, 'utf8')
|
||||
// Die Entwurfsseite nennt noch Fassung 2026-10-01; Task 6 ersetzt sie durch die geprüfte Fassung 2026-10-02
|
||||
assert.ok(html.includes('Fassung 2026-10-01'))
|
||||
assert.match(html, /Entwurf – vor Verwendung anwaltlich prüfen lassen/)
|
||||
assert.doesNotMatch(html, /<!--/)
|
||||
assert.match(html, /<h2>12\. Haftung/)
|
||||
const V = '2026-10-02'
|
||||
const FILES = [`public/rechtliches/avv-website-analyse-${V}.html`, `public/rechtliches/leistungsbeschreibung-website-analyse-${V}.html`]
|
||||
|
||||
test('Analyse-Rechtstexte: versionierte Dateien tragen die Fassung, keine Entwurfs- oder Prüfhinweise, keine Kommentare', () => {
|
||||
for (const f of FILES) {
|
||||
assert.ok(existsSync(root(f)), f)
|
||||
const html = readFileSync(root(f), 'utf8')
|
||||
assert.ok(html.includes(`Fassung ${V}`), f)
|
||||
assert.doesNotMatch(html, /<!--/, f)
|
||||
assert.doesNotMatch(html, /Entwurf/, f)
|
||||
assert.doesNotMatch(html, /Prüfpunkt/, f)
|
||||
}
|
||||
assert.match(readFileSync(root(FILES[0]), 'utf8'), /<h2>12\. Haftung/)
|
||||
})
|
||||
|
||||
test('AVV-Link im Portal zeigt auf eine vorhandene Datei unter public/', () => {
|
||||
test('Entwurfsseite ohne Fassung ist nicht mehr als Datei vorhanden', () => {
|
||||
assert.ok(!existsSync(root('public/rechtliches/avv-website-analyse.html')))
|
||||
assert.ok(!existsSync(root('public/rechtliches/leistungsbeschreibung-website-analyse.html')))
|
||||
})
|
||||
|
||||
test('AVV-Link im Portal zeigt auf eine ausgelieferte Adresse (Task 7 stellt auf die Fassung um)', () => {
|
||||
const fn = readFileSync(root('public/funktionen.js'), 'utf8')
|
||||
const url = fn.match(/const AVV_URL = '([^']+)'/)?.[1]
|
||||
assert.equal(url, '/rechtliches/avv-website-analyse.html')
|
||||
assert.ok(existsSync(root(`public${url}`)))
|
||||
for (const f of FILES) assert.ok(existsSync(root(f)))
|
||||
})
|
||||
|
||||
test('Portal: Dev-Modus-Hinweis an der Analyse-Kachel', () => {
|
||||
@@ -29,7 +38,6 @@ test('Portal: Dev-Modus-Hinweis an der Analyse-Kachel', () => {
|
||||
})
|
||||
|
||||
test('Texte: Akzentfarbe wird beim Einschalten gewählt (kein späteres Portal-Setting behauptet)', () => {
|
||||
for (const f of ['docs/rechtliches/avv-website-analyse.md', 'docs/rechtliches/leistungsbeschreibung-website-analyse.md']) {
|
||||
assert.match(readFileSync(root(f), 'utf8'), /beim Einschalten gewählt/, f)
|
||||
}
|
||||
// Geprüfte Fassung 2026-10-02: nur die Leistungsbeschreibung sagt es so; die AVV nennt die Akzentfarbe unter den Einstellungen
|
||||
assert.match(readFileSync(root('docs/rechtliches/leistungsbeschreibung-website-analyse.md'), 'utf8'), /beim Einschalten wählt/)
|
||||
})
|
||||
Reference in new issue
Block a user