lsa-planer

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

/ tests ui wiederanlaufUnberuehrt.test.ts

3,4 KB Rohdatei
tests/ui/wiederanlaufUnberuehrt.test.ts — 91 Zeilen
1 import { beforeAll, describe, expect, it, vi } from 'vitest';
2 import { createEmptyProject } from '@/domain/model/factory';
3 import { ladeSitzung, saveSession } from '@/services/storage';
4
5 /**
6 * Ein unberuehrter Wiederanlauf ist kein ungespeicherter Stand.
7 *
8 * Befund 20 verlangt zu Recht: Was aus dem Sitzungsspeicher kommt, steht in
9 * keiner Datei, und "Neu", "Öffnen" und "Schließen" duerfen es nicht ohne
10 * Rueckfrage verwerfen. Die Behebung setzte den Merker aber fuer JEDEN
11 * wiederhergestellten Stand.
12 *
13 * Damit galt auch das leere Startprojekt als ungespeichert - und zwar bei jedem
14 * zweiten Start: Wer das Programm oeffnet, nichts eingibt und wieder schliesst,
15 * bekommt seinen unberuehrten Stand beim Verlassen in den Sitzungsspeicher
16 * geschrieben (`AutoSave.beimVerlassen`). Beim naechsten Start kam er als
17 * 'geladen' zurueck, der Fenstertitel trug den Aufzaehlungspunkt, und das
18 * Schliessen fragte "Ungespeicherte Änderungen" - ueber eine Arbeit, die es
19 * nie gab.
20 *
21 * Am gebauten Stand gemessen (`e2e/rauchtest.spec.ts`, Titel
22 * "• Projekt – Neues Projekt – LSA-Planer Professional"): Die Rueckfrage hielt
23 * dort das Fenster offen, bis der Rauchtest ablief.
24 *
25 * Das ist die gefaehrliche Richtung fuer eine Rueckfrage: Wer sie bei jedem
26 * Schliessen sieht, ohne je etwas geaendert zu haben, klickt sie weg - und
27 * damit auch dann, wenn sie einmal einen echten Knotenpunkt schuetzt.
28 *
29 * Geprueft wird am echten Einstiegspunkt: `src/main.ts` wird eingelesen und
30 * startet die ganze Anwendung; nur der Sitzungsspeicher ist ersetzt. Das
31 * Gegenstueck - ein wiederhergestellter Stand MIT Inhalt - steht in
32 * `wiederanlaufanzeige.test.ts` und muss gruen bleiben.
33 */
34
35 vi.mock('@/services/storage', async (importOriginal) => {
36 const echt = await importOriginal<typeof import('@/services/storage')>();
37 return {
38 ...echt,
39 ladeSitzung: vi.fn(),
40 saveSession: vi.fn(),
41 addRecoveryPoint: vi.fn(),
42 };
43 });
44
45 async function warte(ms = 0): Promise<void> {
46 await new Promise((fertig) => setTimeout(fertig, ms));
47 }
48
49 beforeAll(async () => {
50 vi.mocked(ladeSitzung).mockResolvedValue({
51 art: 'geladen',
52 stand: {
53 // Genau das, was ein frischer Start auch liefert - nur eben aus dem
54 // Sitzungsspeicher.
55 project: createEmptyProject(),
56 issues: [],
57 repaired: false,
58 migrated: false,
59 sourceVersion: '13',
60 intergreenComparison: [],
61 },
62 });
63 vi.mocked(saveSession).mockResolvedValue({ ok: true, message: '' });
64
65 localStorage.clear();
66 document.body.replaceChildren();
67 const wurzel = document.createElement('div');
68 wurzel.id = 'anwendung';
69 document.body.append(wurzel);
70
71 await import('@/main');
72 await warte(20);
73 });
74
75 describe('Wiederanlauf mit einem unberuehrten Projekt', () => {
76 it('setzt keinen Aufzählungspunkt in den Fenstertitel', () => {
77 expect(document.title.startsWith('• ')).toBe(false);
78 });
79
80 it('meldet in der Kopfzeile keine ungespeicherten Änderungen', () => {
81 const info = document.getElementById('kopf-projektinfo');
82 expect(info?.textContent).not.toContain('ungespeicherte Änderungen');
83 });
84
85 it('sagt in der Statusleiste weiterhin, dass keine Datei dahintersteht', () => {
86 // Das bleibt richtig und ist etwas anderes als "geaendert": Ein neues
87 // Projekt steht in keiner Datei, egal woher es kommt.
88 const leiste = document.querySelector('.leiste');
89 expect(leiste?.textContent).toContain('Nicht als Datei gespeichert');
90 });
91 });