// @vitest-environment node // Reiner Main-Prozess-Test ohne Fenster; jsdom wird hier nicht gebraucht. import { describe, expect, it, vi } from 'vitest'; /* `fenster.ts` zieht beim Laden Electron und die Einstellungen herein. Für die reine Entscheidungsfunktion genügt eine Attrappe – ein Fenster wird hier nie erzeugt. */ vi.mock('electron', () => ({ BrowserWindow: function BrowserWindowAttrappe(): void { /* Nie aufgerufen: Diese Datei prüft eine reine Funktion, kein Fenster. */ }, dialog: { showErrorBox: (): void => undefined, showMessageBoxSync: (): number => 0 }, nativeTheme: { shouldUseDarkColors: false, shouldUseHighContrastColors: false }, app: { getPath: (): string => '.', isPackaged: false, getAppPath: (): string => '.' }, })); const { absturzAntwort, NEULADEVERSUCHE, SCHLEIFENFENSTER_MS } = await import('../src/main/fenster'); /** * Die Antwort auf einen gestorbenen Renderer. * * Bis 0.22.0 gab es keine: `render-process-gone` löschte nur den Merker der * laufenden Prüfung. Der Fehlerauffang der Oberfläche greift bei Ausnahmen im * Renderbaum – stirbt der Renderer-Prozess selbst, kommt er nicht mehr zum * Zuge, und es blieb ein weißes Fenster ohne Text, Fokus oder Ansage stehen. * `docs/stand.md` 8.1 führte den Absturzfall als erledigt; gedeckt war nur * die eine Hälfte. */ describe('Antwort auf einen gestorbenen Renderer', () => { it('lädt beim ersten Absturz neu', () => { expect(absturzAntwort('crashed', 0, 0)).toBe('neu-laden'); }); it('lädt auch beim zweiten Absturz neu', () => { expect(absturzAntwort('oom', NEULADEVERSUCHE - 1, 1000)).toBe('neu-laden'); }); it('gibt nach dem letzten Versuch auf, statt eine Schleife zu drehen', () => { /* Stürzt der Renderer schon beim Laden ab, führte unbegrenztes Neuladen zu einem Fenster, das sich nicht mehr bedienen und kaum beenden lässt. */ expect(absturzAntwort('crashed', NEULADEVERSUCHE, 1000)).toBe('aufgeben'); }); it('fängt nach einer langen Ruhe wieder von vorn an', () => { /* Ein Absturz von gestern darf den von heute nicht mitzählen: Sonst bekäme das dritte Vorkommnis in einem Jahr kein Neuladen mehr. */ expect(absturzAntwort('crashed', NEULADEVERSUCHE, SCHLEIFENFENSTER_MS + 1)).toBe('neu-laden'); }); it.each(['clean-exit', 'killed'])('lässt %s in Ruhe', (grund) => { /* Das gewöhnliche Beenden und ein Abschuss von außen sind kein Absturz. Sie neu zu laden hieße, ein geschlossenes Fenster wieder aufzumachen. */ expect(absturzAntwort(grund, 0, 0)).toBe('ruhen'); }); it('behandelt jeden anderen Grund als Absturz', () => { /* Chromium kennt mehr Gründe als hier aufgezählt (`launch-failed`, `integrity-failure`, `crashed`, `oom`). Ein unbekannter Grund darf nicht dazu führen, dass das Fenster weiß stehen bleibt. */ expect(absturzAntwort('launch-failed', 0, 0)).toBe('neu-laden'); expect(absturzAntwort('integrity-failure', 0, 0)).toBe('neu-laden'); }); });