"""Shared fixtures: yt-dlp is always replaced by fakes (no network).""" import json import shutil import subprocess from pathlib import Path import pytest @pytest.fixture def fake_yt_dlp(): """Factory for a subprocess.run stand-in. It answers the info request with `info` and writes `vtt` where yt-dlp would write the subtitle file. `run.calls` records every command. """ def make(info, vtt="WEBVTT\n", write=True, fail_download=False): calls = [] def run(command, capture_output, text): calls.append(command) if "--dump-single-json" in command: return subprocess.CompletedProcess(command, 0, json.dumps(info), "") if fail_download: return subprocess.CompletedProcess(command, 1, "", "HTTP Error 429") track = command[command.index("--sub-langs") + 1] template = command[command.index("-o") + 1] if write: Path(template.replace("%(ext)s", f"{track}.vtt")).write_text( vtt, encoding="utf-8" ) return subprocess.CompletedProcess(command, 0, "", "") run.calls = calls return run return make @pytest.fixture def yt_dlp_installed(monkeypatch): monkeypatch.setattr(shutil, "which", lambda name: f"/usr/bin/{name}")