feat(v5): Ein Smoke-Beweis, der KLICKT — Playwright durch das echte Programm
WAS: `npm run klick` startet das ECHTE Rippy (Electron, Haupt, Kern, Fenster, Datenbank) mit eigenem Profil (--profil, --klick-smoke: ohne Tray, Updater, Toasts), einem nachgebauten Laufwerk (RIPPY_FAKE_LAUFWERK) und nachgebauten Werkzeugen (bau/klick/fake-*.cjs) — und klickt sich durch: Rippen → Dialog → Sprachen je Titel (jpn statt deu) → Rollen auf Folge → Staffel 1, ab Folge 3 → Vorschau → Rip → Warteschlange → Kompression → Ablage als S01E03/S01E04 unter Serien\…\Season 01 → Einstellungen/Roh-Dateien → Roh loeschen → Ereignisse. Bilder liegen in beweise/klick/. Die Naht dafuer (kern/werkzeuge/aufruf.ts): Zeigt ein Werkzeug-Pfad auf ein Node-Skript, laeuft es ueber die eigene Laufzeit (ELECTRON_RUN_AS_NODE) — fuer EXE-Pfade aendert sich nichts. WARUM: Beide Fehler vom 01.09.2026 waren Verkabelung; 261 Unit-Tests sahen keinen. Der Klick-Beweis haette beide gefunden. NEBENBEFUND: Die CSP blockte eingebettete Schrift-Teile (data:-Fonts der fontsource-Pakete) — Konsolenfehler im gebauten Fenster, jetzt font-src. Dazu test/messung.spuren.test.ts: HandBrake-Scan einer echten Roh-Datei auf Verlangen (RIPPY_MESSUNG_MKV). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
e3ce8220f1
commit
6dd1b0bc7a
@@ -0,0 +1,31 @@
|
||||
// Die Werkzeug-Naht (kern/werkzeuge/aufruf.ts, 5.4.0): echte EXE-Pfade
|
||||
// gehen unverändert durch; Node-Skripte (die Nachbauten des Klick-Beweises)
|
||||
// laufen über die eigene Laufzeit mit ELECTRON_RUN_AS_NODE.
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { istSkript, werkzeugStart } from '../src/kern/werkzeuge/aufruf'
|
||||
|
||||
describe('werkzeugStart', () => {
|
||||
it('eine EXE bleibt eine EXE — Argumente und Umgebung unverändert', () => {
|
||||
const start = werkzeugStart('C:\\Programme\\MakeMKV\\makemkvcon.exe', ['-r', 'info', 'dev:G:'], { PATH: 'x' })
|
||||
expect(start.programm).toBe('C:\\Programme\\MakeMKV\\makemkvcon.exe')
|
||||
expect(start.args).toEqual(['-r', 'info', 'dev:G:'])
|
||||
expect(start.env).toEqual({ PATH: 'x' })
|
||||
})
|
||||
|
||||
it('ein Skript läuft über die eigene Laufzeit, das Skript wird erstes Argument', () => {
|
||||
const start = werkzeugStart('F:\\rippy\\bau\\klick\\fake-makemkvcon.cjs', ['-r', 'info'], { PATH: 'x' })
|
||||
expect(start.programm).toBe(process.execPath)
|
||||
expect(start.args).toEqual(['F:\\rippy\\bau\\klick\\fake-makemkvcon.cjs', '-r', 'info'])
|
||||
expect(start.env['ELECTRON_RUN_AS_NODE']).toBe('1')
|
||||
expect(start.env['PATH']).toBe('x')
|
||||
})
|
||||
|
||||
it('istSkript kennt .cjs/.mjs/.js — und sonst nichts', () => {
|
||||
expect(istSkript('a.cjs')).toBe(true)
|
||||
expect(istSkript('A.MJS')).toBe(true)
|
||||
expect(istSkript('a.js')).toBe(true)
|
||||
expect(istSkript('HandBrakeCLI.exe')).toBe(false)
|
||||
expect(istSkript('a.json')).toBe(false)
|
||||
expect(istSkript('')).toBe(false)
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,31 @@
|
||||
// MESSUNG an einer ECHTEN Roh-Datei: Welche Ton- und Untertitelspuren hat
|
||||
// MakeMKV wirklich in die MKV geschrieben? (5.4.0, Regel D)
|
||||
//
|
||||
// RIPPY_MESSUNG_MKV="E:\Rippy\roh\bluray-…\title_t00.mkv" npx vitest run test/messung.spuren.test.ts --reporter=verbose
|
||||
//
|
||||
// Der Anlass: Der Auswahl-Dialog zeigt die Sprachen, die der Info-Lauf an
|
||||
// der DISC gemessen hat. Ob sie alle in der Datei landen, entscheidet
|
||||
// MakeMKVs Auswahlregel (werkzeuge/spurauswahl.ts). Diese Messung fragt die
|
||||
// Datei selbst — über denselben HandBrake-Scan, den die Kompression benutzt
|
||||
// (komprimieren/scan.ts). Läuft nur auf Verlangen und nur unter Windows.
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
const datei = process.env.RIPPY_MESSUNG_MKV ?? ''
|
||||
const messen = datei.length > 0 && process.platform === 'win32'
|
||||
|
||||
describe.skipIf(!messen)('Spuren einer echten Roh-Datei', () => {
|
||||
it('HandBrake-Scan liefert Ton- und Untertitelspuren mit Sprachcode', { timeout: 180_000 }, async () => {
|
||||
const { finden } = await import('../src/kern/werkzeuge/katalog')
|
||||
const { spurenScannen } = await import('../src/kern/komprimieren/scan')
|
||||
const handbrake = finden('handbrake', '')
|
||||
expect(handbrake.length, 'HandBrakeCLI nicht gefunden').toBeGreaterThan(0)
|
||||
const start = Date.now()
|
||||
const spuren = await spurenScannen(handbrake, datei)
|
||||
console.log(`MESSUNG Scan: ${((Date.now() - start) / 1000).toFixed(1)} s — ${datei}`)
|
||||
expect(spuren, 'Scan lieferte nichts').not.toBeNull()
|
||||
console.log(`MESSUNG Dauer: ${Math.round(spuren!.dauerS / 60)} min`)
|
||||
for (const a of spuren!.audio) console.log(`MESSUNG Ton ${a.nr}: ${a.lang} — ${a.beschreibung}`)
|
||||
for (const u of spuren!.untertitel) console.log(`MESSUNG Untertitel ${u.nr}: ${u.lang} — ${u.beschreibung}`)
|
||||
expect(spuren!.audio.length).toBeGreaterThan(0)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user