Rechtstexte und K15: Prüfbefunde F5–F8 (AVV genauer, PDF-Prüfsumme, Unterlagen der vereinbarten Fassung)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-05 03:42:27 +00:00
1 parent 2c059cb3d6
commit 90098726b9
13 files changed
+345 -63

No files matched your search

+24
View File
@@ -1,5 +1,6 @@
import { test, after } from 'node:test'
import assert from 'node:assert/strict'
import { createHash } from 'node:crypto'
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
@@ -256,6 +257,23 @@ test('pdf_dateien: je Dokument ein PDF unter dem Namen aus legalPdfFiles, größ
}
})
test('pdf_pruefsumme: neben jedem PDF liegt <PDF>.sha256 mit der SHA-256 der HTML-Seite, aus der es gedruckt wurde (HTML geändert ohne neues PDF fällt auf)', () => {
const sha256 = (bytes) => createHash('sha256').update(bytes).digest('hex')
for (const d of DOKUMENTE) {
const pdf = d.html.replace(/\.html$/, '.pdf')
const summe = lies(`${pdf}.sha256`)
assert.match(summe, /^[0-9a-f]{64}\n$/, `${pdf}.sha256: nur die Prüfsumme und ein Zeilenende`)
assert.equal(summe.trim(), sha256(readFileSync(join(ROOT, d.html))), `${d.html} wurde geändert, ohne das PDF neu zu drucken (scripts/build-legal-pdfs.sh termine)`)
}
// die Prüfung schlägt an: eine geänderte Seite ergibt eine andere Summe
const d = DOKUMENTE[1]
assert.notEqual(sha256(`${lies(d.html)} `), lies(`${d.html.replace(/\.html$/, '.pdf')}.sha256`).trim())
// das Skript schreibt die Summe und druckt ein PDF mit gültiger Summe nicht neu
const sh = lies('scripts/build-legal-pdfs.sh')
assert.ok(sh.includes('sha256sum "$quelle"') && sh.includes('echo "$summe" > "$ziel.sha256"'))
assert.ok(sh.includes('(unveraendert)') && sh.includes('FORCE'))
})
test('anhaenge_drei: legalPdfAttachments("termine", F) liefert lb, avv, widerruf als application/pdf', async () => {
const anhaenge = await legalPdfAttachments('termine', V)
assert.deepEqual(anhaenge.map((a) => a.filename), [
@@ -294,6 +312,11 @@ test('router_alias: /rechtliches/<slug>.html liefert die Bytes der Fassungsdatei
assert.match(pdf.headers.get('content-type'), /application\/pdf/)
const alt = await fetch(`${app.url}/rechtliches/${slug}-1999-01-01.html`)
assert.equal(alt.status, 404, `${slug}-1999-01-01.html darf es nicht geben`)
// die Prüfsummen-Datei neben dem PDF wird einfach mit ausgeliefert, die Adressen der Seiten bleiben davon unberührt
const summe = await fetch(`${app.url}/rechtliches/${slug}-${V}.pdf.sha256`)
assert.equal(summe.status, 200)
assert.match(await summe.text(), /^[0-9a-f]{64}\n$/)
assert.equal((await fetch(`${app.url}/rechtliches/${slug}.pdf.sha256`)).status, 404)
}
// Fassung der Konstante ohne Datei: der Alias antwortet 404
const vorher = config.termine.avvVersion
@@ -329,6 +352,7 @@ test('script_modus: build-legal-pdfs.sh kennt termine und datenschutz, lässt di
}
// Chrome höchstens 120 Sekunden je Aufruf; Aufbau und Aufrufe nacheinander
assert.match(sh, /^ {2}timeout 120 "\$CHROME" /m)
assert.match(sh, /v="\$\(timeout 60 node --max-old-space-size=256 /, 'auch der Node-Aufruf für die Fassung hat Heap-Grenze und Timeout')
assert.ok(!/ &$|^\s*wait\b|xargs -P/m.test(sh), 'keine parallelen Läufe')
// bash versteht das Skript, und ein unbekannter Modus liefert die Usage mit allen Modi
const syntax = spawnSync('bash', ['-n', 'scripts/build-legal-pdfs.sh'], { cwd: ROOT, encoding: 'utf8' })