waffensachkunde

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

/ app e2e navigationssperre.spec.ts

2,4 KB Rohdatei
app/e2e/navigationssperre.spec.ts — 63 Zeilen
1 /**
2 * Die Navigationssperre am laufenden Programm.
3 *
4 * Eigene Datei mit eigener Anwendungsinstanz, und das mit Grund: Eine
5 * abgebrochene Navigation gilt für Playwright weiterhin als laufend. Jeder
6 * Locator, der danach in derselben Seite benutzt wird – auch in einem
7 * späteren Test –, läuft in die Zeitüberschreitung. Die Instanz wird deshalb
8 * nach diesem Test verworfen.
9 */
10 import { type ElectronApplication, type Page } from '@playwright/test';
11
12 import { appStarten, bauPruefen } from './electron-hilfe';
13 import { expect, konsoleErwartet, test } from './konsolenwache';
14
15 // `undefined`, solange der beforeAll-Hook übersprungen wurde.
16 let app: ElectronApplication | undefined;
17 let fenster: Page;
18
19 test.beforeAll(async () => {
20 // Fehlender oder veralteter Bau ist ein Fehler, kein Grund zum Schweigen.
21 bauPruefen();
22 ({ app, fenster } = await appStarten());
23 });
24
25 test.afterAll(async () => {
26 await app?.close();
27 });
28
29 test('lässt den Renderer nicht auf eine fremde Datei navigieren', async () => {
30 /* Das Protokoll `file:` allein darf nicht genügen: Das Preload-Skript hängt
31 am `webContents` und würde auch für die neue Seite wieder eingespielt.
32 Eine heruntergeladene HTML-Datei hätte damit die volle Bridge in der
33 Hand. */
34 const vorher = fenster.url();
35
36 /* Der Hauptprozess schreibt jede abgewiesene Navigation in die Konsole
37 (`src/main/sicherheit.ts`). Hier ist diese Warnung kein Mangel, sondern
38 der Beleg, dass die Sperre gegriffen hat – überall sonst wäre sie ein
39 Alarm, deshalb gilt die Anmeldung nur für diesen Test. */
40 konsoleErwartet(
41 /^\[sicherheit\] Navigation blockiert: file:\/\/\/C:\/Windows\/win\.ini$/u,
42 'Genau diese Navigation löst der Test absichtlich aus; die Warnung ist ihr Beleg.',
43 );
44
45 await fenster.evaluate(() => {
46 globalThis.location.href = 'file:///C:/Windows/win.ini';
47 });
48 // Kurz warten: Eine Navigation bräuchte einen Moment; die Sperre nicht.
49 await fenster.waitForTimeout(500);
50
51 expect(fenster.url()).toBe(vorher);
52
53 /* Bewusst über `evaluate` statt über einen Locator – siehe Dateikopf. */
54 const ueberschrift = await fenster.evaluate(
55 () => document.querySelector('h1')?.textContent ?? '',
56 );
57 expect(ueberschrift).toBe('Waffensachkunde – Lernsoftware');
58
59 const bruecke = await fenster.evaluate(
60 () => typeof (globalThis as Record<string, unknown>)['lernApp'],
61 );
62 expect(bruecke).toBe('object');
63 });