0.1.0NOVA 0.1.0 for Windows is out. Free download; the installer is GPL-licensed because of its bundled engine.Download

How NOVA is tested

Test layers, fixtures and how to run them.

As writtenPublished unedited from the NOVA repository. Links to other repository files open on GitHub.Engineering record · docs/testing/README.md

Prerequisites (Windows)

  • Rust (MSVC toolchain), Node 20+, pnpm, Visual Studio Build Tools, WebView2
  • FFmpeg with libx264, libx265, libvpx-vp9, libopus on PATH (fixture generation only)
bash scripts/fetch-libmpv.sh        # pinned libmpv → vendor/libmpv (hash-checked)
bash scripts/generate-fixtures.sh   # synthetic media → tests/fixtures/media
pnpm install

Suites

CommandWhat it proves
cargo test -p nova-playback-apiState reducer rules, stale-session filtering, input validation, JSON contract shape
cargo test -p nova-playback-mpvReal libmpv (headless: vo=null, ao=null) against the fixture corpus: load, duration, tracks, pause/seek/resume, rapid seeks, EOF and replay, invalid/truncated media, missing files, rapid file switching, track selection, volume/mute/speed confirmation, stop, and engine create/destroy leak check
cargo test -p nova-domainQueue rules: ordering, cursor after remove/move, ends
cargo test -p nova-applicationQueue service against a fake backend: auto-advance once per own session, previous-restarts, validation
cargo test -p nova-storageSQLite migrations, newer-schema refusal, corrupt file, identity (moved/copied/replaced), constraints; resume_restart: real libmpv + services + SQLite file across two simulated restarts
cargo test -p nova-libraryScanner on real folders + SQLite: rescan no-op, rename/move, deleted folder + recovery, unplugged root, cancel, interrupted scan, junction loop, ScanManager. Opt-in 20k benchmark: cargo test -p nova-library --release -- --ignored --nocapture
pnpm --filter @nova/desktop testFrontend: snapshot ordering, formatting, shortcuts, virtual list, HomeView/LibraryView component tests (jsdom; IPC mocked at the client boundary)
pnpm --filter @nova/desktop checkTypeScript strict type check

Override the engine with NOVA_LIBMPV_PATH=....

Media compatibility harness

See docs/compat/README.md. The harness is opt-in (--ignored) because the corpus is about 650 MB and a run takes about 75 s.

Manual / visual verification (rendering gate)

Headless tests cannot prove pixels reach the screen or A/V sync. For that:

pnpm --filter @nova/desktop dev     # in one terminal (Vite)
NOVA_STATS=1 target/debug/nova-desktop.exe tests/fixtures/media/h264_aac_1080p30_30s.mp4

NOVA_STATS=1 logs engine-measured avsync, dropped frames, video output, GPU context and active hardware decoder every 2 s. NOVA_HWDEC=no forces software decoding.

The fixtures carry a sync pattern: a white bar flashes for the first 100 ms of every second while the audio beeps. Watch/listen for alignment.

Caution for automated GUI checks

Synthetic keyboard input goes to whatever window is in the foreground. Any GUI driver must verify NOVA is the foreground window before sending input or capturing the screen, and should not run while someone is using the machine.

Corpus

All media is synthesized by scripts/generate-fixtures.sh from FFmpeg lavfi sources (no third-party content), so it is freely distributable and reproducible. Generated files are git-ignored.

FilePurpose
h264_aac_1080p30_30s.mp4Baseline H.264/AAC, timecode + sync pattern
hevc_aac_1080p24_10s.mkvHEVC/Matroska
vp9_opus_720p30_10s.webmVP9/Opus/WebM
h264_aac_360p30_180s.mp43-minute file for resume rules (≥ 60 s)
multitrack_h264_2a_2s_10s.mkv2 audio (eng/fra, titled) + 2 subtitle tracks
truncated_h264.mp4First 200 KB of the baseline (damaged file)
not_media.mp4Text file with a media extension