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' import { fileURLToPath } from 'node:url' import { spawnSync } from 'node:child_process' import express, { Router } from 'express' import { useTestEnv } from './support/testEnv.js' // HTML-Generator der Rechtstexte (scripts/build-legal-html.mjs) und die ausgelieferten Dateien des Terminplaners (Task F6). // Die Markdown-Quellen stehen unter docs/rechtliches/, die Seiten und PDFs unter public/rechtliches/-.html|pdf. 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 { legalPaths, legalPdfFiles, legalPdfAttachments, legalRouter } = await import('../server/services/legalDocs.js') const { render, parse, lauf, termineDokumente, shopDokumente, unterkunftDokumente, MarkdownFehler } = await import('../scripts/build-legal-html.mjs') const V = config.termine.avvVersion const ROOT = fileURLToPath(new URL('..', import.meta.url)) const lies = (rel) => readFileSync(join(ROOT, rel), 'utf8') const DOKUMENTE = termineDokumente(V) const S = config.shop.fassung const SHOP = shopDokumente(S) const U = config.unterkunft.fassung const UK = unterkunftDokumente(U) const META = { fassung: '2026-10-05', titel: 'Prüfdokument', seitenkopf: 'Prüfdokument', nav: [{ href: '/dashboard.html', text: 'Portal' }] } const KOPF = '# Titel\n\n**Fassung 2026-10-05**\n\n' /** HTML in Klartext: Tags weg, Entitäten zurück, Leerraum normalisiert. */ const klartext = (html) => html .replace(/