Files
human-experience-filter-art/tests/test_probe.py
T
Ben Stull 19104f94cd feat: ffprobe wrapper (tools.probe)
Per sub-project-2 plan Task 3 / spec §5.1. Parses ffprobe JSON into a Probe
(streams + format); subprocess runner injectable so tests never shell out.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 06:23:24 -07:00

66 lines
1.8 KiB
Python

import json
from tools.probe import Probe, probe_file
def _runner_for(payload):
def fake_runner(args): # mimics subprocess.run(...).stdout
return json.dumps(payload)
return fake_runner
def test_probe_parses_streams_and_format():
runner = _runner_for(
{
"streams": [
{
"codec_type": "video",
"width": 1920,
"height": 1080,
"disposition": {"attached_pic": 0},
},
{"codec_type": "audio"},
],
"format": {"duration": "12.5"},
}
)
p = probe_file("x.mp4", runner=runner)
assert isinstance(p, Probe)
assert any(s["codec_type"] == "video" for s in p.streams)
assert p.format["duration"] == "12.5"
def test_probe_audio_only():
runner = _runner_for(
{"streams": [{"codec_type": "audio"}], "format": {"duration": "30.0"}}
)
p = probe_file("x.mp3", runner=runner)
assert [s["codec_type"] for s in p.streams] == ["audio"]
def test_probe_audio_with_cover_art():
runner = _runner_for(
{
"streams": [
{"codec_type": "audio"},
{
"codec_type": "video",
"width": 600,
"height": 600,
"disposition": {"attached_pic": 1},
},
],
"format": {"duration": "200.0"},
}
)
p = probe_file("x.mp3", runner=runner)
cover = [s for s in p.streams if s.get("disposition", {}).get("attached_pic")]
assert len(cover) == 1
def test_probe_handles_missing_keys():
runner = _runner_for({})
p = probe_file("x.mp4", runner=runner)
assert p.streams == [] and p.format == {}