import { test, after } from 'node:test' import assert from 'node:assert/strict' import { existsSync, readFileSync } from 'node:fs' import http from 'node:http' import express from 'express' import { useTestEnv } from './support/testEnv.js' // Rechtstext-Entwürfe und Einbau-Anleitung von "Öffnungszeiten live" (Task 33, Spec 9, 4.6, Z19, Z20). // Alles hier ist Entwurf für die Rechtsrunde: die Leistungsbeschreibung steht als statische Seite unter // public/vertragsunterlagen/ (wie die der News-Pinnwand, Register-Adresse seit Task 5 festgelegt); die Texte für // Datenschutzerklärung, K02/K03 und die Kanzlei-Fragen sind Markdown-Entwürfe, die keinen Code und keine // veröffentlichte Seite ändern. useTestEnv({ appwriteUrl: 'http://127.0.0.1:1', stripeUrl: 'http://127.0.0.1:1' }) const { config } = await import('../server/config.js') const { featureConfig, featureHaken } = await import('../server/services/featureRegistry.js') const root = (rel) => new URL(`../${rel}`, import.meta.url) const lies = (rel) => readFileSync(root(rel), 'utf8').replace(/\r/g, '') /** Sichtbarer Text einer HTML-Seite: ohne Kommentare, Skripte, Stile und Tags, Leerraum zusammengefasst. */ const sichtbar = (html) => html .replace(//g, ' ') .replace(/<(script|style)[\s\S]*?<\/\1>/g, ' ') .replace(/<[^>]+>/g, ' ') .replace(/ /g, ' ') .replace(/\s+/g, ' ') .trim() const norm = (text) => text.replace(/\s+/g, ' ').trim() const LB_PFAD = 'public/vertragsunterlagen/zeiten-leistungsbeschreibung.html' const LB_URL = '/vertragsunterlagen/zeiten-leistungsbeschreibung.html' const lb = () => lies(LB_PFAD) // ---------------------------------------------------------------------------------------------- Leistungsbeschreibung // Dieselbe Auslieferung wie in server/index.js: express.static(public) (die Adresse ist das Register des Terminplaners nicht, sondern // der "vertragsunterlagen"-Weg der News-Pinnwand; die versionierten /rechtliches-Seiten samt PDF gibt es nur für die Terminplaner-Sätze) const app = express() app.use(express.static(new URL('../public/', import.meta.url).pathname)) const server = await new Promise((resolve) => { const s = http.createServer(app).listen(0, '127.0.0.1', () => resolve(s)) }) after(() => new Promise((resolve) => server.close(resolve))) const baseUrl = `http://127.0.0.1:${server.address().port}` test('Leistungsbeschreibung ist erreichbar und als Entwurf markiert', async () => { const antwort = await fetch(baseUrl + LB_URL) assert.equal(antwort.status, 200) assert.match(antwort.headers.get('content-type') || '', /^text\/html/) const html = await antwort.text() assert.equal(html, lb(), 'die ausgelieferte Seite ist die Datei im Repo') // Entwurf: nur als HTML-Kommentar (der Kunde sieht nichts davon); der Test "Bestelltexte ohne ENTWURF" prüft das Register, nicht die Seite assert.ok(html.includes(''), 'Kopf-Kommentar fehlt') assert.ok(html.indexOf('