waffensachkunde

Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.

/ app tests datenschutz-lader.test.ts

3,9 KB Rohdatei
app/tests/datenschutz-lader.test.ts — 119 Zeilen
1 // @vitest-environment node
2 /**
3 * Der Lader der Datenschutzerklärung.
4 *
5 * Gleiche Bauform wie `lizenzen.test.ts`: `datenschutzBilden` ist absichtlich
6 * von `datenschutzLesen` getrennt, damit die Formprüfung ohne Electron und
7 * ohne Dateisystem läuft. Geprüft wird vor allem der Fall, in dem etwas
8 * fehlt — denn dort entscheidet sich, ob der Nutzende eine Begründung
9 * bekommt oder einen leeren Bereich.
10 */
11
12 import { describe, expect, it, vi } from 'vitest';
13
14 vi.mock('electron', () => ({
15 app: {
16 isPackaged: false,
17 getAppPath: (): string => process.cwd(),
18 },
19 }));
20
21 const { datenschutzBilden, datenschutzLesen, datenschutzZuruecksetzen } =
22 await import('../src/main/datenschutz');
23
24 const GUELTIG = JSON.stringify({
25 quellpruefsumme: 'a'.repeat(64),
26 fassung: '1.5',
27 stand: '30.08.2026',
28 bloecke: [
29 { art: 'ueberschrift', ebene: 2, text: '1. Wer verantwortlich ist', kennung: 'wer' },
30 { art: 'absatz', teile: [{ art: 'text', text: 'Ein Satz.' }] },
31 ],
32 });
33
34 describe('datenschutzBilden', () => {
35 it('nimmt eine vollständige Datei an', () => {
36 const angaben = datenschutzBilden(GUELTIG, null);
37
38 expect(angaben.warnung).toBeNull();
39 expect(angaben.erklaerung?.fassung).toBe('1.5');
40 expect(angaben.erklaerung?.bloecke).toHaveLength(2);
41 });
42
43 it('reicht die Warnung durch, wenn gar nichts gelesen werden konnte', () => {
44 const angaben = datenschutzBilden(null, 'Datei nicht gefunden.');
45
46 expect(angaben.erklaerung).toBeNull();
47 expect(angaben.warnung).toBe('Datei nicht gefunden.');
48 });
49
50 it('nennt einen Grund, wenn die Datei kein gültiges JSON ist', () => {
51 const angaben = datenschutzBilden('{kaputt', null);
52
53 expect(angaben.erklaerung).toBeNull();
54 /* Ein leerer Bereich ohne Begründung wäre die schlechteste Auskunft:
55 Der Nutzende hielte die Erklärung für nicht vorhanden statt für nicht
56 ladbar – beim Datenschutz der falscheste aller Eindrücke. */
57 expect(angaben.warnung ?? '').toContain('nicht lesbar');
58 });
59
60 it('lehnt eine Datei ohne Blöcke ab, statt einen leeren Text zu zeigen', () => {
61 const leer = JSON.stringify({
62 quellpruefsumme: 'a'.repeat(64),
63 fassung: '1.5',
64 stand: '30.08.2026',
65 bloecke: [],
66 });
67
68 const angaben = datenschutzBilden(leer, null);
69
70 expect(angaben.erklaerung).toBeNull();
71 expect(angaben.warnung ?? '').toContain('unvollständig');
72 });
73
74 it('lehnt eine Datei ohne Fassungsangabe ab', () => {
75 const ohneFassung = JSON.stringify({
76 quellpruefsumme: 'a'.repeat(64),
77 stand: '30.08.2026',
78 bloecke: [{ art: 'absatz', teile: [] }],
79 });
80
81 expect(datenschutzBilden(ohneFassung, null).erklaerung).toBeNull();
82 });
83
84 it('wirft fremde Blockarten heraus, statt sie durchzureichen', () => {
85 /* Die Oberfläche kennt vier Arten. Eine fünfte käme aus einer neueren
86 Datei in einer älteren Anwendung – sie würde still nichts anzeigen.
87 Herausgefiltert fällt sie wenigstens in der Blockzahl auf. */
88 const gemischt = JSON.stringify({
89 quellpruefsumme: 'a'.repeat(64),
90 fassung: '1.5',
91 stand: '30.08.2026',
92 bloecke: [
93 { art: 'absatz', teile: [{ art: 'text', text: 'Bleibt.' }] },
94 { art: 'tabelle', kopf: [], zeilen: [] },
95 ],
96 });
97
98 expect(datenschutzBilden(gemischt, null).erklaerung?.bloecke).toHaveLength(1);
99 });
100 });
101
102 describe('datenschutzLesen', () => {
103 it('findet die echte Datei im Quellbaum', () => {
104 datenschutzZuruecksetzen();
105 const angaben = datenschutzLesen();
106
107 expect(angaben.warnung, angaben.warnung ?? '').toBeNull();
108 expect(angaben.erklaerung?.bloecke.length ?? 0).toBeGreaterThan(100);
109 expect(angaben.erklaerung?.fassung).toMatch(/^\d+\.\d+$/u);
110 });
111
112 it('liest nur einmal', () => {
113 datenschutzZuruecksetzen();
114 const erste = datenschutzLesen();
115 const zweite = datenschutzLesen();
116
117 expect(zweite).toBe(erste);
118 });
119 });