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:
1 parent
2c059cb3d6
commit
90098726b9
13 files changed
+345
-63
No files matched your search
@@ -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' })
|
||||
|
||||
Reference in new issue
Block a user