from types import SimpleNamespace from videoclean.cli import _build_parser from videoclean.engine import WipeEngine def test_cli_defaults_to_auto_detection(): args = _build_parser().parse_args(["clean", "input.mp4"]) assert args.detect_mode == "auto" def test_explicit_modes_remain_available(): for mode in ("fast", "balanced", "sensitive"): args = _build_parser().parse_args(["clean", "input.mp4", "--detect-mode", mode]) assert args.detect_mode == mode def test_auto_mode_runs_balanced_then_sensitive(monkeypatch, tmp_path): empty = SimpleNamespace(candidates=[]) found = SimpleNamespace(candidates=[]) calls = [] def fake_detect(*args, **kwargs): calls.append(kwargs["sample_count"]) return empty if len(calls) == 1 else found monkeypatch.setattr("videoclean.detect.detect_clean_candidates", fake_detect) monkeypatch.setattr("videoclean.detect._default_detector", lambda: object()) monkeypatch.setattr("videoclean.detect.write_clean_artifacts", lambda *args: None) monkeypatch.setattr("videoclean.engine.WipeEngine._build_recognizer", staticmethod(lambda mode: None)) engine = WipeEngine(task="clean", detect_mode="auto", ocr="off") result, selected, snapshot, directed = engine._detect_clean( "input.mp4", object(), [], None, [], None, "off", str(tmp_path), False, "dbnet" ) assert calls == [24, 80] assert snapshot["detect_mode"] == "auto" assert snapshot["effective_detect_mode"] == "sensitive" assert selected == set() assert directed is False def test_explicit_fast_does_not_retry(monkeypatch, tmp_path): calls = [] def fake_detect(*args, **kwargs): calls.append(kwargs["sample_count"]) return SimpleNamespace(candidates=[]) monkeypatch.setattr("videoclean.detect.detect_clean_candidates", fake_detect) monkeypatch.setattr("videoclean.detect._default_detector", lambda: object()) monkeypatch.setattr("videoclean.detect.write_clean_artifacts", lambda *args: None) monkeypatch.setattr("videoclean.engine.WipeEngine._build_recognizer", staticmethod(lambda mode: None)) engine = WipeEngine(task="clean", detect_mode="fast", ocr="off") _, _, snapshot, _ = engine._detect_clean( "input.mp4", object(), [], None, [], None, "off", str(tmp_path), False, "dbnet" ) assert calls == [24] assert snapshot["effective_detect_mode"] == "fast"