/**
 * Die Navigationssperre am laufenden Programm.
 *
 * Eigene Datei mit eigener Anwendungsinstanz, und das mit Grund: Eine
 * abgebrochene Navigation gilt für Playwright weiterhin als laufend. Jeder
 * Locator, der danach in derselben Seite benutzt wird – auch in einem
 * späteren Test –, läuft in die Zeitüberschreitung. Die Instanz wird deshalb
 * nach diesem Test verworfen.
 */
import { type ElectronApplication, type Page } from '@playwright/test';

import { appStarten, bauPruefen } from './electron-hilfe';
import { expect, konsoleErwartet, test } from './konsolenwache';

// `undefined`, solange der beforeAll-Hook übersprungen wurde.
let app: ElectronApplication | undefined;
let fenster: Page;

test.beforeAll(async () => {
  // Fehlender oder veralteter Bau ist ein Fehler, kein Grund zum Schweigen.
  bauPruefen();
  ({ app, fenster } = await appStarten());
});

test.afterAll(async () => {
  await app?.close();
});

test('lässt den Renderer nicht auf eine fremde Datei navigieren', async () => {
  /* Das Protokoll `file:` allein darf nicht genügen: Das Preload-Skript hängt
     am `webContents` und würde auch für die neue Seite wieder eingespielt.
     Eine heruntergeladene HTML-Datei hätte damit die volle Bridge in der
     Hand. */
  const vorher = fenster.url();

  /* Der Hauptprozess schreibt jede abgewiesene Navigation in die Konsole
     (`src/main/sicherheit.ts`). Hier ist diese Warnung kein Mangel, sondern
     der Beleg, dass die Sperre gegriffen hat – überall sonst wäre sie ein
     Alarm, deshalb gilt die Anmeldung nur für diesen Test. */
  konsoleErwartet(
    /^\[sicherheit\] Navigation blockiert: file:\/\/\/C:\/Windows\/win\.ini$/u,
    'Genau diese Navigation löst der Test absichtlich aus; die Warnung ist ihr Beleg.',
  );

  await fenster.evaluate(() => {
    globalThis.location.href = 'file:///C:/Windows/win.ini';
  });
  // Kurz warten: Eine Navigation bräuchte einen Moment; die Sperre nicht.
  await fenster.waitForTimeout(500);

  expect(fenster.url()).toBe(vorher);

  /* Bewusst über `evaluate` statt über einen Locator – siehe Dateikopf. */
  const ueberschrift = await fenster.evaluate(
    () => document.querySelector('h1')?.textContent ?? '',
  );
  expect(ueberschrift).toBe('Waffensachkunde – Lernsoftware');

  const bruecke = await fenster.evaluate(
    () => typeof (globalThis as Record<string, unknown>)['lernApp'],
  );
  expect(bruecke).toBe('object');
});
