// @vitest-environment node /** * Die Bausteine gedruckter Dokumente. * * Geprüft wird hier alles, was ohne Electron prüfbar ist: Maskierung, * Struktur, Quellenangabe, Farbkontrast. Ob Chromium daraus ein brauchbares * PDF macht, misst `e2e/druck.spec.ts` am erzeugten Artefakt – behauptet wird * es an keiner Stelle. */ import { readFileSync } from 'node:fs'; import { join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { describe, expect, it } from 'vitest'; import { abschnitt, absatz, dokumentBauen, fusszeilenVorlage, kurzquelle, maskiert, quellensatz, tabelle, type Quellenangabe, } from '../src/shared/druck/dokument'; import { dateiname, lernberichtBauen } from '../src/shared/druck/lernbericht'; import { DRUCK_FARBEN, druckStil } from '../src/shared/druck/stil'; import { seitenFehlerprotokoll, seitenFragenliste } from '../src/shared/druck/umfang'; import type { Lernplan } from '../src/shared/lernplan'; import type { Lernuebersicht } from '../src/shared/lernstand'; import type { Pruefungsverlauf } from '../src/shared/pruefung'; const QUELLE: Quellenangabe = { amtlich: 'Amtlicher Fragenkatalog für die Waffensachkundeprüfung, Stand 16.12.2024.', herausgeber: 'Bundesverwaltungsamt', stand: '2024-12-16', quelleUrl: 'https://www.bva.bund.de/', umfang: { art: 'kein amtlicher wortlaut' }, }; describe('maskiert', () => { it('entschärft alle fünf gefährlichen Zeichen', () => { expect(maskiert(`Müller & Co`)).toBe( '<a href="x" class='y'>Müller & Co</a>', ); }); it('maskiert das kaufmännische Und zuerst', () => { /* Andernfalls würde aus `<` am Ende `<` – die häufigste Falle bei handgeschriebener Maskierung. */ expect(maskiert('<')).toBe('<'); expect(maskiert('<')).toBe('<'); }); }); describe('dokumentBauen', () => { const dokument = dokumentBauen({ titel: 'Testbericht', augenbraue: 'Profil "Max & Moritz"', quelle: QUELLE, schriftgroesse: 'normal', abschnitte: [abschnitt('Erster Teil', [absatz('Ein Satz.')])], }); it('nennt die Sprache am Wurzelelement', () => { expect(dokument).toContain(''); }); it('hat genau eine Hauptüberschrift', () => { expect(dokument.match(/