lsa-planer

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

/ tests ui wiederanlaufanzeige.test.ts

2,7 KB Rohdatei
tests/ui/wiederanlaufanzeige.test.ts — 79 Zeilen
1 import { beforeAll, describe, expect, it, vi } from 'vitest';
2 import { createStandardIntersectionProject } from '@/domain/model/factory';
3 import { ladeSitzung, saveSession } from '@/services/storage';
4
5 /**
6 * Nach einem Wiederanlauf sagen Kopfzeile, Fenstertitel und Statusleiste
7 * dasselbe (Befund 20, zweiter Anlauf).
8 *
9 * Der erste Anlauf hielt den Sachverhalt "steht in keiner Datei" neben `dirty`
10 * in einem Hilfsmerker in `src/main.ts` und reichte ihn nur den fuenf Waechtern
11 * vor dem Verwerfen zu. Die Anzeige las weiter `store.getState()`. Gemessen
12 * standen danach drei Auskuenfte ueber denselben Stand nebeneinander:
13 *
14 * - Kopfzeile: "Bestand · gespeichert"
15 * - Fenstertitel: ohne Aufzaehlungspunkt, also "gespeichert"
16 * - Statusleiste: "Nicht als Datei gespeichert"
17 *
18 * und Strg+N fragte im selben Augenblick zurueck. Der Anwender kann daraus
19 * nicht schliessen, ob seine Handarbeit gesichert ist. Der Merker gehoert
20 * deshalb in den Zustandsspeicher selbst, damit alle Ausgaben aus derselben
21 * Quelle schoepfen.
22 *
23 * Geprueft wird am echten Einstiegspunkt: `src/main.ts` wird eingelesen und
24 * startet die ganze Anwendung; nur der Sitzungsspeicher ist ersetzt.
25 */
26
27 vi.mock('@/services/storage', async (importOriginal) => {
28 const echt = await importOriginal<typeof import('@/services/storage')>();
29 return {
30 ...echt,
31 ladeSitzung: vi.fn(),
32 saveSession: vi.fn(),
33 addRecoveryPoint: vi.fn(),
34 };
35 });
36
37 async function warte(ms = 0): Promise<void> {
38 await new Promise((fertig) => setTimeout(fertig, ms));
39 }
40
41 beforeAll(async () => {
42 vi.mocked(ladeSitzung).mockResolvedValue({
43 art: 'geladen',
44 stand: {
45 project: createStandardIntersectionProject(),
46 issues: [],
47 repaired: false,
48 migrated: false,
49 sourceVersion: '13',
50 intergreenComparison: [],
51 },
52 });
53 vi.mocked(saveSession).mockResolvedValue({ ok: true, message: '' });
54
55 localStorage.clear();
56 document.body.replaceChildren();
57 const wurzel = document.createElement('div');
58 wurzel.id = 'anwendung';
59 document.body.append(wurzel);
60
61 await import('@/main');
62 await warte(20);
63 });
64
65 describe('Anzeige nach dem Wiederanlauf aus dem Sitzungsspeicher', () => {
66 it('meldet in der Kopfzeile ungespeicherte Änderungen', () => {
67 const info = document.getElementById('kopf-projektinfo');
68 expect(info?.textContent).toContain('ungespeicherte Änderungen');
69 });
70
71 it('setzt den Aufzählungspunkt in den Fenstertitel', () => {
72 expect(document.title.startsWith('• ')).toBe(true);
73 });
74
75 it('sagt in der Statusleiste weiterhin, dass keine Datei dahintersteht', () => {
76 const leiste = document.querySelector('.leiste');
77 expect(leiste?.textContent).toContain('Nicht als Datei gespeichert');
78 });
79 });