Gästetexte: Hinweis-Dokument ohne Entwurf-Wort, Archiv-Schutz

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-05 04:21:17 +00:00
1 parent 495d5ad9ca
commit 722c686690
5 files changed
+62 -9

No files matched your search

+13
View File
@@ -546,6 +546,19 @@ test('Hinweise-Dokument: Formular-Hinweis (Sie/Du) und alle Zustimmungstexte ste
}
})
test('hinweise_ohne_entwurf: das Hinweise-Dokument nennt kein „Entwurf“ (auch nicht klein) und sagt, dass Vorlagen und Widget für die Abschnitte 4 bis 6 maßgeblich sind', () => {
const md = lies('docs/rechtliches/termine-hinweise.md').replace(/\r/g, '')
assert.ok(!/Entwurf/i.test(md), 'termine-hinweise.md: das Wort Entwurf steht noch im Dokument')
assert.ok(md.includes('## 5. Widerrufshinweis in der Bestätigungs-E-Mail'))
assert.ok(md.includes('## 6. Widerrufsfunktion (Texte)'))
const kopf = md.split('\n')[2]
assert.ok(kopf.includes('Die Abschnitte 4 bis 6 geben Texte des Widgets und der Mails wieder'), 'Zeile 3 sagt, was die Abschnitte 4 bis 6 sind')
assert.ok(kopf.includes('maßgeblich sind die Mailvorlagen und das Widget'), 'Zeile 3 nennt Vorlagen und Widget als maßgeblich')
// die genannten Quellen gibt es
assert.ok(md.includes('server/mail-templates/G02 Termin bestaetigt.html') && existsSync(new URL('../server/mail-templates/G02 Termin bestaetigt.html', import.meta.url)))
assert.ok(md.includes('server/services/termine/einstellungen.js') && existsSync(new URL('../server/services/termine/einstellungen.js', import.meta.url)))
})
test('Datenschutz-Absatz: Löschfristen der Vorgaben, Sie- und Du-Fassung, Auftragsverarbeiter und Gesundheitshinweis', () => {
const md = lies('docs/rechtliches/termine-datenschutz-absatz.md').replace(/\r/g, '')
assert.ok(/Fassung Sie/i.test(md) && /Fassung Du/i.test(md))
+29
View File
@@ -60,6 +60,35 @@ test('archiv_aktuelle_fassung: --check vergleicht mit der eingecheckten Datei (E
assert.match(meldungen[0], /Aufruf: node scripts\/termine-texte-archiv\.mjs \[--check\]/)
})
test('archiv_schutz: eine abweichende Datei der aktuellen Fassung wird nur mit --force überschrieben; gleiche oder neue Dateien bleiben erlaubt', (t) => {
const root = mitTempRoot(t)
const ziel = join(root, archivPfad())
const meldungen = []
const mitFehler = { log: () => {}, fehler: (m) => meldungen.push(m) }
// neue Datei und identische Datei: erlaubt
assert.equal(lauf([], { ...mitFehler, root }), 0)
assert.equal(readFileSync(ziel, 'utf8'), baueArchiv())
assert.equal(lauf([], { ...mitFehler, root }), 0, 'derselbe Inhalt darf erneut geschrieben werden')
assert.deepEqual(meldungen, [])
// abweichende Datei (zum Beispiel die ausgelieferte Fassung mit einem nachträglich geänderten Text): Exit 1, Datei unverändert
const ausgeliefert = `${baueArchiv()}Nachträglich geändert.\n`
writeFileSync(ziel, ausgeliefert)
assert.equal(lauf([], { ...mitFehler, root }), 1)
assert.equal(readFileSync(ziel, 'utf8'), ausgeliefert, 'ohne --force bleibt die Datei, wie sie war')
assert.match(meldungen[0], /weicht ab/)
assert.match(meldungen[0], /--force/)
assert.ok(meldungen[0].includes(archivPfad()), 'die Meldung nennt die Datei')
// mit --force wird überschrieben
assert.equal(lauf(['--force'], { ...mitFehler, root }), 0)
assert.equal(readFileSync(ziel, 'utf8'), baueArchiv())
// --check bleibt schreibfrei; --force zusammen mit --check ist ein falscher Aufruf
writeFileSync(ziel, ausgeliefert)
assert.equal(lauf(['--check'], { ...mitFehler, root }), 1)
assert.equal(readFileSync(ziel, 'utf8'), ausgeliefert)
assert.equal(lauf(['--check', '--force'], { ...mitFehler, root }), 2)
assert.equal(readFileSync(ziel, 'utf8'), ausgeliefert)
})
test('archiv_inhalt: alle Gästetexte stehen wörtlich im Archiv, die Betriebsangaben als Platzhalter', () => {
const text = baueArchiv()
const zitat = (s) => s.split('\n').map((z) => (z === '' ? '>' : `> ${z}`)).join('\n')