Ctrl K
ComunidadGuías…

backend/tests/test_cleanup_signs_embedded.py

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

Archivo original ↗Preguntar a KiBot
"""Tests for the embedded-stream strip path in services.cleanup_signs (Task 6)."""

from unittest.mock import MagicMock, patch


def _settings(media, level="signs_forced"):
    s = MagicMock()
    s.cleanup_signs_removal_level = level
    s.media_path = str(media)
    return s


def test_strips_signs_embedded_stream(tmp_path):
    from services.cleanup_signs import execute_signs_cleanup

    video = tmp_path / "Ep.mkv"
    video.write_bytes(b"fake")

    probe = {
        "streams": [
            {
                "codec_type": "subtitle",
                "codec_name": "ass",
                "disposition": {},
                "tags": {"language": "eng", "title": "Dialogue"},
            },
            {
                "codec_type": "subtitle",
                "codec_name": "ass",
                "disposition": {"forced": 1},
                "tags": {"language": "eng", "title": "Signs"},
            },
        ]
    }
    with (
        patch("config.get_settings", return_value=_settings(tmp_path)),
        patch("remux.get_media_streams", return_value=probe),
        patch(
            "remux.remove_subtitle_streams_by_index", return_value=str(tmp_path / "Ep.mkv.bak")
        ) as strip,
    ):
        result = execute_signs_cleanup(
            str(tmp_path), {"strip_embedded": True, "keep_languages": ["en"]}, dry_run=False
        )

    # subtitle order-index 1 (the forced "Signs" track) must be dropped
    strip.assert_called_once()
    assert strip.call_args[0][1] == [1]
    assert result["stripped_files"] == 1
    assert result["stripped_tracks"] == 1


def test_embedded_dry_run_does_not_strip(tmp_path):
    from services.cleanup_signs import execute_signs_cleanup

    video = tmp_path / "Ep.mkv"
    video.write_bytes(b"fake")
    probe = {
        "streams": [
            {
                "codec_type": "subtitle",
                "codec_name": "ass",
                "disposition": {"forced": 1},
                "tags": {"language": "eng", "title": "Signs"},
            },
            {
                "codec_type": "subtitle",
                "codec_name": "ass",
                "disposition": {},
                "tags": {"language": "eng", "title": "Dialogue"},
            },
        ]
    }
    with (
        patch("config.get_settings", return_value=_settings(tmp_path)),
        patch("remux.get_media_streams", return_value=probe),
        patch("remux.remove_subtitle_streams_by_index") as strip,
    ):
        result = execute_signs_cleanup(str(tmp_path), {"strip_embedded": True}, dry_run=True)
    strip.assert_not_called()
    assert result["would_strip_tracks"] == 1


def test_embedded_last_track_guard_keeps_only_lang_track(tmp_path):
    """When the signs track is the ONLY keep-language subtitle, it must not be dropped."""
    from services.cleanup_signs import execute_signs_cleanup

    video = tmp_path / "Ep.mkv"
    video.write_bytes(b"fake")
    probe = {
        "streams": [
            {
                "codec_type": "subtitle",
                "codec_name": "ass",
                "disposition": {"forced": 1},
                "tags": {"language": "eng", "title": "Signs"},
            },
        ]
    }
    with (
        patch("config.get_settings", return_value=_settings(tmp_path)),
        patch("remux.get_media_streams", return_value=probe),
        patch("remux.remove_subtitle_streams_by_index") as strip,
    ):
        result = execute_signs_cleanup(
            str(tmp_path),
            {"strip_embedded": True, "keep_languages": ["en"]},
            dry_run=False,
        )
    strip.assert_not_called()
    assert result["stripped_files"] == 0


def test_embedded_lone_foreign_signs_track_is_kept(tmp_path):
    """A lone jpn forced/signs track is the only jpn sub → must NOT be stripped,
    even though jpn is not a keep-language. An eng signs track with an eng
    dialogue peer IS stripped (eng count 2 → 1)."""
    from services.cleanup_signs import execute_signs_cleanup

    video = tmp_path / "Ep.mkv"
    video.write_bytes(b"fake")
    probe = {
        "streams": [
            # sub_index 0: eng dialogue (full, kept)
            {
                "codec_type": "subtitle",
                "codec_name": "ass",
                "disposition": {},
                "tags": {"language": "eng", "title": "Dialogue"},
            },
            # sub_index 1: eng forced "Signs" → strippable (eng peer remains)
            {
                "codec_type": "subtitle",
                "codec_name": "ass",
                "disposition": {"forced": 1},
                "tags": {"language": "eng", "title": "Signs"},
            },
            # sub_index 2: jpn forced "Signs" → lone jpn sub, must be kept
            {
                "codec_type": "subtitle",
                "codec_name": "ass",
                "disposition": {"forced": 1},
                "tags": {"language": "jpn", "title": "Signs"},
            },
        ]
    }
    with (
        patch("config.get_settings", return_value=_settings(tmp_path)),
        patch("remux.get_media_streams", return_value=probe),
        patch(
            "remux.remove_subtitle_streams_by_index", return_value=str(tmp_path / "Ep.mkv.bak")
        ) as strip,
    ):
        result = execute_signs_cleanup(
            str(tmp_path),
            {"strip_embedded": True, "keep_languages": ["de", "en"]},
            dry_run=False,
        )

    # Only the eng signs track (sub_index 1) is dropped; jpn (sub_index 2) kept.
    strip.assert_called_once()
    assert strip.call_args[0][1] == [1]
    assert result["stripped_files"] == 1
    assert result["stripped_tracks"] == 1


def test_embedded_not_triggered_when_flag_false(tmp_path):
    """strip_embedded=False must not probe any video files."""
    from services.cleanup_signs import execute_signs_cleanup

    video = tmp_path / "Ep.mkv"
    video.write_bytes(b"fake")
    with (
        patch("config.get_settings", return_value=_settings(tmp_path)),
        patch("remux.get_media_streams") as probe_mock,
        patch("remux.remove_subtitle_streams_by_index") as strip,
    ):
        result = execute_signs_cleanup(str(tmp_path), {"strip_embedded": False}, dry_run=False)
    probe_mock.assert_not_called()
    strip.assert_not_called()
    assert result["stripped_files"] == 0