Ctrl K
ComunidadGuías…

backend/tests/test_episode_video_path.py

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Tests for services.episode_video_path.resolve_episode_video_path (V1.6 GAP-B).

Episode combine/upload/track endpoints previously resolved paths via the Sonarr
client only, returning 503 on a standalone install. The resolver now also
handles standalone episodes (wanted_items rows keyed by id).
"""

from __future__ import annotations

from datetime import UTC, datetime
from unittest.mock import MagicMock, patch

from services.episode_video_path import resolve_episode_video_path


def test_sonarr_mode_returns_mapped_existing_path(app_ctx):
    client = MagicMock()
    client.get_episode_file_path.return_value = "/sonarr/media/ep.mkv"
    with (
        patch("sonarr_client.get_sonarr_client", return_value=client),
        patch("config.map_path", return_value="/local/media/ep.mkv"),
        patch("os.path.exists", return_value=True),
    ):
        assert resolve_episode_video_path(42) == "/local/media/ep.mkv"
    client.get_episode_file_path.assert_called_once_with(42)


def test_sonarr_mode_missing_file_returns_none(app_ctx):
    client = MagicMock()
    client.get_episode_file_path.return_value = None
    with patch("sonarr_client.get_sonarr_client", return_value=client):
        assert resolve_episode_video_path(99) is None


def test_standalone_mode_resolves_via_wanted_items(app_ctx, temp_db, tmp_path):
    from db.models.core import WantedItem
    from db.models.standalone import StandaloneSeries
    from extensions import db

    video = tmp_path / "ep.mkv"
    video.write_bytes(b"x")
    now = datetime.now(UTC)
    # The path must lie inside the folder of the series that owns the row.
    db.session.add(
        StandaloneSeries(id=1, title="S", folder_path=str(tmp_path), created_at=now, updated_at=now)
    )
    wi = WantedItem(
        item_type="episode",
        title="Standalone Ep",
        file_path=str(video),
        standalone_series_id=1,
        status="wanted",
        added_at=now,
        updated_at=now,
    )
    db.session.add(wi)
    db.session.commit()

    with patch("sonarr_client.get_sonarr_client", return_value=None):
        # Known standalone episode → its video path.
        assert resolve_episode_video_path(wi.id) == str(video)
        # Unknown id → None (was a 503 before the fix).
        assert resolve_episode_video_path(wi.id + 9999) is None


def test_standalone_row_without_file_on_disk_returns_none(app_ctx, temp_db, tmp_path):
    from db.models.core import WantedItem
    from extensions import db

    now = datetime.now(UTC)
    wi = WantedItem(
        item_type="episode",
        title="Gone",
        file_path=str(tmp_path / "missing.mkv"),
        standalone_series_id=1,
        status="wanted",
        added_at=now,
        updated_at=now,
    )
    db.session.add(wi)
    db.session.commit()

    with patch("sonarr_client.get_sonarr_client", return_value=None):
        assert resolve_episode_video_path(wi.id) is None