waffensachkunde

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

/ app tests fenster.test.ts

3,0 KB Rohdatei
app/tests/fenster.test.ts — 65 Zeilen
1 // @vitest-environment node
2 // Reiner Main-Prozess-Test ohne Fenster; jsdom wird hier nicht gebraucht.
3
4 import { describe, expect, it, vi } from 'vitest';
5
6 /* `fenster.ts` zieht beim Laden Electron und die Einstellungen herein. Für
7 die reine Entscheidungsfunktion genügt eine Attrappe – ein Fenster wird
8 hier nie erzeugt. */
9 vi.mock('electron', () => ({
10 BrowserWindow: function BrowserWindowAttrappe(): void {
11 /* Nie aufgerufen: Diese Datei prüft eine reine Funktion, kein Fenster. */
12 },
13 dialog: { showErrorBox: (): void => undefined, showMessageBoxSync: (): number => 0 },
14 nativeTheme: { shouldUseDarkColors: false, shouldUseHighContrastColors: false },
15 app: { getPath: (): string => '.', isPackaged: false, getAppPath: (): string => '.' },
16 }));
17
18 const { absturzAntwort, NEULADEVERSUCHE, SCHLEIFENFENSTER_MS } =
19 await import('../src/main/fenster');
20
21 /**
22 * Die Antwort auf einen gestorbenen Renderer.
23 *
24 * Bis 0.22.0 gab es keine: `render-process-gone` löschte nur den Merker der
25 * laufenden Prüfung. Der Fehlerauffang der Oberfläche greift bei Ausnahmen im
26 * Renderbaum – stirbt der Renderer-Prozess selbst, kommt er nicht mehr zum
27 * Zuge, und es blieb ein weißes Fenster ohne Text, Fokus oder Ansage stehen.
28 * `docs/stand.md` 8.1 führte den Absturzfall als erledigt; gedeckt war nur
29 * die eine Hälfte.
30 */
31 describe('Antwort auf einen gestorbenen Renderer', () => {
32 it('lädt beim ersten Absturz neu', () => {
33 expect(absturzAntwort('crashed', 0, 0)).toBe('neu-laden');
34 });
35
36 it('lädt auch beim zweiten Absturz neu', () => {
37 expect(absturzAntwort('oom', NEULADEVERSUCHE - 1, 1000)).toBe('neu-laden');
38 });
39
40 it('gibt nach dem letzten Versuch auf, statt eine Schleife zu drehen', () => {
41 /* Stürzt der Renderer schon beim Laden ab, führte unbegrenztes Neuladen
42 zu einem Fenster, das sich nicht mehr bedienen und kaum beenden lässt. */
43 expect(absturzAntwort('crashed', NEULADEVERSUCHE, 1000)).toBe('aufgeben');
44 });
45
46 it('fängt nach einer langen Ruhe wieder von vorn an', () => {
47 /* Ein Absturz von gestern darf den von heute nicht mitzählen: Sonst
48 bekäme das dritte Vorkommnis in einem Jahr kein Neuladen mehr. */
49 expect(absturzAntwort('crashed', NEULADEVERSUCHE, SCHLEIFENFENSTER_MS + 1)).toBe('neu-laden');
50 });
51
52 it.each(['clean-exit', 'killed'])('lässt %s in Ruhe', (grund) => {
53 /* Das gewöhnliche Beenden und ein Abschuss von außen sind kein Absturz.
54 Sie neu zu laden hieße, ein geschlossenes Fenster wieder aufzumachen. */
55 expect(absturzAntwort(grund, 0, 0)).toBe('ruhen');
56 });
57
58 it('behandelt jeden anderen Grund als Absturz', () => {
59 /* Chromium kennt mehr Gründe als hier aufgezählt (`launch-failed`,
60 `integrity-failure`, `crashed`, `oom`). Ein unbekannter Grund darf
61 nicht dazu führen, dass das Fenster weiß stehen bleibt. */
62 expect(absturzAntwort('launch-failed', 0, 0)).toBe('neu-laden');
63 expect(absturzAntwort('integrity-failure', 0, 0)).toBe('neu-laden');
64 });
65 });