import { describe, expect, it } from 'vitest' import { PLATZHALTER, benutztePlatzhalter, bestellungsabsatzFehlt, platzhalterErsetzen, } from '@/lib/schreiben/platzhalter' /** * Platzhalter in Schreibvorlagen. * * Der Grundsatz, den jede Prüfung hier absichert: NICHTS geht * stillschweigend schief. Fehlende Daten werden zur sichtbaren Lücke, * unbekannte Platzhalter zur Markierung — nie zu einer leeren Stelle, die * erst der Empfänger bemerkt. */ describe('Ersetzen', () => { it('setzt bekannte Werte ein', () => { const ergebnis = platzhalterErsetzen('Sehr geehrte Damen und Herren, {{betreuer_name}} hier.', { betreuer_name: 'Florian Wilde', }) expect(ergebnis.text).toBe('Sehr geehrte Damen und Herren, Florian Wilde hier.') expect(ergebnis.luecken).toHaveLength(0) expect(ergebnis.unbekannte).toHaveLength(0) }) it('macht aus fehlenden Daten eine sichtbare Lücke', () => { const ergebnis = platzhalterErsetzen('Az. {{aktenzeichen_gericht}}', {}) expect(ergebnis.text).toBe('Az. [Aktenzeichen des Gerichts]') expect(ergebnis.luecken).toEqual(['aktenzeichen_gericht']) }) it('behandelt leere Zeichenketten wie fehlende Daten', () => { const ergebnis = platzhalterErsetzen('{{betreuungsgericht}}', { betreuungsgericht: ' ' }) expect(ergebnis.text).toContain('[Betreuungsgericht]') }) it('markiert unbekannte Platzhalter, statt abzubrechen', () => { // Ein Tippfehler in der Vorlage darf das Schreiben nicht verhindern — // aber er muss ins Auge springen. const ergebnis = platzhalterErsetzen('Hallo {{betreur_name}}!', {}) expect(ergebnis.text).toBe('Hallo [Unbekannter Platzhalter: {{betreur_name}}]!') expect(ergebnis.unbekannte).toEqual(['betreur_name']) }) it('verträgt Leerzeichen in den Klammern', () => { const ergebnis = platzhalterErsetzen('{{ betreuer_name }}', { betreuer_name: 'F. Wilde' }) expect(ergebnis.text).toBe('F. Wilde') }) it('ersetzt mehrere Vorkommen und meldet jede Lücke nur einmal', () => { const ergebnis = platzhalterErsetzen('{{stichtag}} und nochmal {{stichtag}}', {}) expect(ergebnis.luecken).toEqual(['stichtag']) expect(ergebnis.text.match(/\[Stichtag\]/g)).toHaveLength(2) }) it('lässt Text ohne Platzhalter unangetastet', () => { const text = 'Ein Brief ohne alles. Auch { einzelne } Klammern bleiben.' expect(platzhalterErsetzen(text, {}).text).toBe(text) }) }) describe('Platzhalterliste', () => { it('beschreibt jeden Platzhalter mit Beschriftung und Quelle', () => { // Die Liste steht neben dem Editor - niemand soll Namen raten müssen. for (const platzhalter of PLATZHALTER) { expect(platzhalter.beschriftung.length, platzhalter.name).toBeGreaterThan(3) expect(platzhalter.quelle.length, platzhalter.name).toBeGreaterThan(3) } }) it('findet die benutzten Platzhalter einer Vorlage', () => { expect( benutztePlatzhalter('{{betreuer_name}} an {{vertrag_gesellschaft}}, nochmal {{betreuer_name}}'), ).toEqual(['betreuer_name', 'vertrag_gesellschaft']) }) }) describe('Bestellungsabsatz-Warnung', () => { it('ist zufrieden mit dem Platzhalter', () => { expect(bestellungsabsatzFehlt('Text mit {{bestellungsabsatz}} darin.')).toBe(false) }) it('ist zufrieden mit einem von Hand geschriebenen Nachweis', () => { // Wer den Absatz ausformuliert hat, wird nicht gegängelt. expect( bestellungsabsatzFehlt( 'Durch Beschluss des Amtsgerichts bin ich zum Betreuer bestellt.', ), ).toBe(false) }) it('warnt bei einer Vorlage ohne jeden Nachweis', () => { expect(bestellungsabsatzFehlt('Sehr geehrte Damen und Herren, bitte um Auskunft.')).toBe(true) }) it('lässt sich nicht von einem halben Nachweis täuschen', () => { // "Beschluss" allein (etwa der Beschluss der Eigentümerversammlung) // ist kein Bestellungsnachweis. expect(bestellungsabsatzFehlt('Zum Beschluss der Eigentümerversammlung...')).toBe(true) }) })