from __future__ import annotations import importlib.util import json from pathlib import Path import pytest SCRIPT = Path(__file__).resolve().parents[2] / "scripts/reconcile_mediarr_validation_window.py" SPEC = importlib.util.spec_from_file_location("mediarr_validation_window", SCRIPT) assert SPEC is not None and SPEC.loader is not None window = importlib.util.module_from_spec(SPEC) SPEC.loader.exec_module(window) def _projects(timeout: int = 1800) -> dict: return { "jens/mediarr": { "branch": "master", "slug": "mediarr", "source_dir": "/srv/example/appdata/mediarr/source", "compose_files": ["docker-compose.unraid.yml"], "compose_project": "mediarr", "containers": ["mediarr"], "gitea_repository_id": 42, "gitea_webhook_secret_file": "jens__mediarr", "validation": {**window.EXPECTED_VALIDATION, "timeout_seconds": timeout}, }, "jens/other": {"validation": {"timeout_seconds": 1800}}, } def test_accepts_only_exact_old_or_new_mediarr_policy() -> None: assert window._validate(_projects()) == 1800 assert window._validate(_projects(3600)) == 3600 for mutate in ( lambda value: value["jens/mediarr"]["validation"].update(timeout_seconds=7200), lambda value: value["jens/mediarr"].update(containers=["other"]), lambda value: value["jens/mediarr"]["validation"].update(required=False), ): value = _projects() mutate(value) with pytest.raises(RuntimeError): window._validate(value) def test_refuses_active_mediarr_delivery_and_ignores_other_projects( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: monkeypatch.setattr(window, "INBOX", tmp_path) (tmp_path / "other.json").write_text( json.dumps({"repository": "jens/other", "status": "deploying"}), encoding="utf-8" ) window._no_active_delivery() (tmp_path / "mediarr.json").write_text( json.dumps({"repository": "jens/mediarr", "status": "awaiting_validation"}), encoding="utf-8", ) with pytest.raises(RuntimeError, match="active delivery"): window._no_active_delivery() def test_refuses_invalid_delivery_record(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setattr(window, "INBOX", tmp_path) (tmp_path / "broken.json").write_text("{", encoding="utf-8") with pytest.raises(RuntimeError, match="invalid"): window._no_active_delivery()