// @vitest-environment node /** * Der Lader der Datenschutzerklärung. * * Gleiche Bauform wie `lizenzen.test.ts`: `datenschutzBilden` ist absichtlich * von `datenschutzLesen` getrennt, damit die Formprüfung ohne Electron und * ohne Dateisystem läuft. Geprüft wird vor allem der Fall, in dem etwas * fehlt — denn dort entscheidet sich, ob der Nutzende eine Begründung * bekommt oder einen leeren Bereich. */ import { describe, expect, it, vi } from 'vitest'; vi.mock('electron', () => ({ app: { isPackaged: false, getAppPath: (): string => process.cwd(), }, })); const { datenschutzBilden, datenschutzLesen, datenschutzZuruecksetzen } = await import('../src/main/datenschutz'); const GUELTIG = JSON.stringify({ quellpruefsumme: 'a'.repeat(64), fassung: '1.5', stand: '30.08.2026', bloecke: [ { art: 'ueberschrift', ebene: 2, text: '1. Wer verantwortlich ist', kennung: 'wer' }, { art: 'absatz', teile: [{ art: 'text', text: 'Ein Satz.' }] }, ], }); describe('datenschutzBilden', () => { it('nimmt eine vollständige Datei an', () => { const angaben = datenschutzBilden(GUELTIG, null); expect(angaben.warnung).toBeNull(); expect(angaben.erklaerung?.fassung).toBe('1.5'); expect(angaben.erklaerung?.bloecke).toHaveLength(2); }); it('reicht die Warnung durch, wenn gar nichts gelesen werden konnte', () => { const angaben = datenschutzBilden(null, 'Datei nicht gefunden.'); expect(angaben.erklaerung).toBeNull(); expect(angaben.warnung).toBe('Datei nicht gefunden.'); }); it('nennt einen Grund, wenn die Datei kein gültiges JSON ist', () => { const angaben = datenschutzBilden('{kaputt', null); expect(angaben.erklaerung).toBeNull(); /* Ein leerer Bereich ohne Begründung wäre die schlechteste Auskunft: Der Nutzende hielte die Erklärung für nicht vorhanden statt für nicht ladbar – beim Datenschutz der falscheste aller Eindrücke. */ expect(angaben.warnung ?? '').toContain('nicht lesbar'); }); it('lehnt eine Datei ohne Blöcke ab, statt einen leeren Text zu zeigen', () => { const leer = JSON.stringify({ quellpruefsumme: 'a'.repeat(64), fassung: '1.5', stand: '30.08.2026', bloecke: [], }); const angaben = datenschutzBilden(leer, null); expect(angaben.erklaerung).toBeNull(); expect(angaben.warnung ?? '').toContain('unvollständig'); }); it('lehnt eine Datei ohne Fassungsangabe ab', () => { const ohneFassung = JSON.stringify({ quellpruefsumme: 'a'.repeat(64), stand: '30.08.2026', bloecke: [{ art: 'absatz', teile: [] }], }); expect(datenschutzBilden(ohneFassung, null).erklaerung).toBeNull(); }); it('wirft fremde Blockarten heraus, statt sie durchzureichen', () => { /* Die Oberfläche kennt vier Arten. Eine fünfte käme aus einer neueren Datei in einer älteren Anwendung – sie würde still nichts anzeigen. Herausgefiltert fällt sie wenigstens in der Blockzahl auf. */ const gemischt = JSON.stringify({ quellpruefsumme: 'a'.repeat(64), fassung: '1.5', stand: '30.08.2026', bloecke: [ { art: 'absatz', teile: [{ art: 'text', text: 'Bleibt.' }] }, { art: 'tabelle', kopf: [], zeilen: [] }, ], }); expect(datenschutzBilden(gemischt, null).erklaerung?.bloecke).toHaveLength(1); }); }); describe('datenschutzLesen', () => { it('findet die echte Datei im Quellbaum', () => { datenschutzZuruecksetzen(); const angaben = datenschutzLesen(); expect(angaben.warnung, angaben.warnung ?? '').toBeNull(); expect(angaben.erklaerung?.bloecke.length ?? 0).toBeGreaterThan(100); expect(angaben.erklaerung?.fassung).toMatch(/^\d+\.\d+$/u); }); it('liest nur einmal', () => { datenschutzZuruecksetzen(); const erste = datenschutzLesen(); const zweite = datenschutzLesen(); expect(zweite).toBe(erste); }); });