lsa-planer

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

/ tests ui datenschutzKurzhilfeBrowserbetrieb.test.ts

3,3 KB Rohdatei
tests/ui/datenschutzKurzhilfeBrowserbetrieb.test.ts — 89 Zeilen
1 import { beforeAll, describe, expect, it, vi } from 'vitest';
2 import { ladeSitzung, saveSession } from '@/services/storage';
3
4 /**
5 * Kurzhilfe, Abschnitt "Bei Störungen", im Browserbetrieb (npm run dev) -
6 * Fassung 5.43.0.
7 *
8 * Seit Fassung 5.43.0 nennt der Abschnitt zuerst den Menueweg
9 * "Hilfe → Fehlerprotokoll speichern …" und danach den Pfad des Protokolls
10 * (tests/ui/datenschutzAnsicht.test.ts, mit Desktop-Bruecke). Im Browserbetrieb
11 * gibt es weder Protokoll noch Anwendungsmenue: Dort steht allein der Satz, der
12 * das sagt (Kommentar in src/main.ts). Bis 5.42.1 stand dort derselbe Absatz
13 * wie im Desktopprogramm, mit der Bitte, "diese Datei" beizulegen, und darunter
14 * der Satz an der Stelle des Pfads.
15 *
16 * Eine eigene Datei, weil `src/main.ts` je Datei einmal startet und hier ohne
17 * `window.lsaPlaner` starten muss - so, wie die Anwendung im Browser startet.
18 */
19
20 vi.mock('@/services/storage', async (importOriginal) => {
21 const echt = await importOriginal<typeof import('@/services/storage')>();
22 return {
23 ...echt,
24 ladeSitzung: vi.fn(),
25 saveSession: vi.fn(),
26 addRecoveryPoint: vi.fn(),
27 };
28 });
29
30 const HINWEIS =
31 'Im Browserbetrieb steht kein Protokoll zur Verfügung; Fehler erscheinen in der Entwicklerkonsole.';
32
33 async function warte(ms = 0): Promise<void> {
34 await new Promise((fertig) => setTimeout(fertig, ms));
35 }
36
37 function kurzhilfe(): HTMLElement | null {
38 return (
39 [...document.querySelectorAll<HTMLElement>('.dialog-hintergrund')].find(
40 (k) => k.querySelector('h2')?.textContent?.trim() === 'Kurzhilfe',
41 ) ?? null
42 );
43 }
44
45 beforeAll(async () => {
46 vi.mocked(ladeSitzung).mockResolvedValue({ art: 'leer' });
47 vi.mocked(saveSession).mockResolvedValue({ ok: true, message: '' });
48
49 document.body.replaceChildren();
50 const wurzel = document.createElement('div');
51 wurzel.id = 'anwendung';
52 document.body.append(wurzel);
53
54 await import('@/main');
55 await warte(50);
56 });
57
58 describe('Kurzhilfe im Browserbetrieb: "Bei Störungen"', () => {
59 it('läuft wirklich ohne Desktop-Brücke', () => {
60 // Vorbedingung: Sonst prueft der Fall darunter den Desktopzweig.
61 expect((window as unknown as { lsaPlaner?: unknown }).lsaPlaner).toBeUndefined();
62 });
63
64 it('zeigt allein den Hinweis - keinen Menüweg, keinen Pfad', async () => {
65 window.dispatchEvent(new KeyboardEvent('keydown', { key: 'F1', bubbles: true }));
66 await warte(20);
67 const kasten = kurzhilfe();
68 expect(kasten, 'F1 hat die Kurzhilfe nicht geöffnet').not.toBeNull();
69
70 const ueberschrift = [...kasten!.querySelectorAll('h3')].find(
71 (h) => h.textContent === 'Bei Störungen',
72 );
73 expect(ueberschrift, 'Abschnitt "Bei Störungen" fehlt').toBeDefined();
74
75 // Der Abschnitt ist der letzte der Kurzhilfe: alles nach seiner Ueberschrift.
76 const abschnitt: Element[] = [];
77 for (let k = ueberschrift!.nextElementSibling; k !== null; k = k.nextElementSibling) {
78 abschnitt.push(k);
79 }
80 expect(abschnitt.map((k) => [k.tagName, k.textContent])).toEqual([['P', HINWEIS]]);
81
82 // Auch nicht nachtraeglich: Im Desktopzweig fuellt ein Versprechen den Pfad.
83 await warte(20);
84 const text = abschnitt.map((k) => k.textContent).join(' ');
85 expect(text).toBe(HINWEIS);
86 expect(text).not.toContain('Fehlerprotokoll speichern');
87 expect(text).not.toContain('Pfad');
88 });
89 });