lsa-planer

LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.

/ tests electron schriftsicherungFehlschlag.test.ts

3,9 KB Rohdatei
tests/electron/schriftsicherungFehlschlag.test.ts — 102 Zeilen
1 import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2 import { existsSync, mkdirSync, mkdtempSync, rmSync } from 'node:fs';
3 import { tmpdir } from 'node:os';
4 import path from 'node:path';
5 import {
6 SCHRIFT_STANDARD,
7 liesSchriftgroesse,
8 schreibeSchriftgroesse,
9 schriftsicherung,
10 } from '../../electron/schriftgroesse';
11
12 /**
13 * Befund 11: Eine misslungene Sicherung der Schriftgroesse
14 * verwarf die Stufe endgueltig - auch beim Programmende.
15 *
16 * `schreibe()` setzte `letzteGesicherte = wert` VOR dem Schreibversuch, und
17 * `schreibeSchriftgroesse` verschluckte jeden Schreibfehler ohne Rueckmeldung.
18 * Danach galt der Wert als gesichert, obwohl nichts auf dem Datentraeger stand:
19 * `offen` war `null`, der Fruehausstieg in `plane` griff bei demselben Wert, und
20 * das `jetzt()` aus `before-quit` (electron/main.ts) fand nichts mehr vor. Wer
21 * 175 % einstellte, waehrend der Profilabgleich oder ein Virenwaechter
22 * `ansicht.json` kurz sperrte, sass beim naechsten Start wieder vor 100 %.
23 *
24 * Nachgestellt wird der Fehlschlag ueber ein Verzeichnis, das es noch nicht
25 * gibt - derselbe Wurf (ENOENT) wie bei einer voruebergehend unerreichbaren
26 * Ordnerumleitung. Danach entsteht das Verzeichnis: Der Sperrgrund ist fort,
27 * und die Anwendung muss die Gelegenheit zum Nachholen noch haben.
28 */
29
30 describe('Schriftgroesse: eine misslungene Sicherung wird als solche gefuehrt', () => {
31 let ordner = '';
32 /** Der Ort, an dem `ansicht.json` liegt - anfangs unerreichbar. */
33 let profil = '';
34 let datei = '';
35
36 beforeEach(() => {
37 vi.useFakeTimers();
38 ordner = mkdtempSync(path.join(tmpdir(), 'lsa-hauptprozess-schrift-'));
39 profil = path.join(ordner, 'profil');
40 datei = path.join(profil, 'ansicht.json');
41 });
42
43 afterEach(() => {
44 vi.useRealTimers();
45 rmSync(ordner, { recursive: true, force: true });
46 });
47
48 it('meldet zurück, ob wirklich geschrieben wurde', () => {
49 expect(schreibeSchriftgroesse(datei, 175), 'Fehlschlag als Erfolg gemeldet').toBe(false);
50 mkdirSync(profil);
51 expect(schreibeSchriftgroesse(datei, 175), 'gelungene Schreibung nicht gemeldet').toBe(true);
52 expect(liesSchriftgroesse(datei)).toBe(175);
53 });
54
55 it('holt beim Programmende nach, was der erste Versuch nicht schreiben konnte', () => {
56 const sicherung = schriftsicherung(datei, SCHRIFT_STANDARD, 750);
57
58 // Ansicht -> Schriftgröße -> 175 %, die Ruhezeit laeuft ab.
59 sicherung.plane(175);
60 vi.advanceTimersByTime(800);
61 expect(existsSync(datei), 'die Schreibung ist wider Erwarten gelungen').toBe(false);
62
63 // Abends ist der Sperrgrund laengst fort.
64 mkdirSync(profil);
65
66 // `app.on('before-quit')` in electron/main.ts ruft genau das.
67 sicherung.jetzt();
68 expect(liesSchriftgroesse(datei), 'beim Programmende nichts nachgeholt').toBe(175);
69 });
70
71 it('schreibt beim erneuten Einstellen desselben Werts, wenn er nie ankam', () => {
72 const sicherung = schriftsicherung(datei, SCHRIFT_STANDARD, 750);
73 sicherung.plane(175);
74 vi.advanceTimersByTime(800);
75
76 mkdirSync(profil);
77
78 // Ein Auswahlpunkt loest seinen Handler auch dann aus, wenn er bereits
79 // markiert ist - der Anwender stellt 175 % noch einmal ein.
80 sicherung.plane(175);
81 vi.advanceTimersByTime(800);
82 expect(liesSchriftgroesse(datei), 'der Fruehausstieg griff auf einen Wert, der nie ankam').toBe(
83 175,
84 );
85 });
86
87 it('bleibt beim gelungenen Weg bei einer einzigen Schreibung je Wert', () => {
88 // Gegenprobe zu Befund B5: Ist der Wert wirklich gesichert, darf dieselbe
89 // Stufe kein zweites Mal geschrieben werden.
90 mkdirSync(profil);
91 const sicherung = schriftsicherung(datei, SCHRIFT_STANDARD, 750);
92 sicherung.plane(150);
93 vi.advanceTimersByTime(800);
94 expect(liesSchriftgroesse(datei)).toBe(150);
95
96 rmSync(datei);
97 sicherung.plane(150);
98 vi.advanceTimersByTime(800);
99 sicherung.jetzt();
100 expect(existsSync(datei), 'derselbe Wert wurde ein zweites Mal geschrieben').toBe(false);
101 });
102 });