Ctrl K
ComunidadGuías…

backend/tests/test_embedded_streams.py

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

Archivo original ↗Preguntar a KiBot
"""Tests for get_all_subtitle_streams in ass_utils."""

from unittest.mock import patch

import pytest

PROBE_EN_ASS_JA_SRT = {
    "streams": [
        {"codec_type": "video", "codec_name": "h264"},
        {"codec_type": "audio", "codec_name": "aac", "tags": {"language": "jpn"}},
        {"codec_type": "subtitle", "codec_name": "ass", "tags": {"language": "eng"}},
        {"codec_type": "subtitle", "codec_name": "subrip", "tags": {"language": "jpn"}},
        {"codec_type": "subtitle", "codec_name": "ass", "tags": {"language": "deu"}},
    ]
}

PROBE_EMPTY = {"streams": []}

PROBE_NO_SUBS = {
    "streams": [
        {"codec_type": "video", "codec_name": "h264"},
        {"codec_type": "audio", "codec_name": "aac"},
    ]
}

PROBE_UNKNOWN_CODEC = {
    "streams": [
        {"codec_type": "subtitle", "codec_name": "dvd_subtitle", "tags": {"language": "eng"}},
        {"codec_type": "subtitle", "codec_name": "ass", "tags": {"language": "eng"}},
    ]
}

PROBE_DUPLICATE = {
    "streams": [
        {"codec_type": "subtitle", "codec_name": "ass", "tags": {"language": "eng"}},
        {"codec_type": "subtitle", "codec_name": "ass", "tags": {"language": "eng"}},
    ]
}


@pytest.fixture(autouse=True)
def mock_lang_tags():
    """Mock _get_language_tags to avoid real config loading."""

    def fake_tags(lang):
        mapping = {
            "de": {"deu", "ger", "de"},
            "en": {"eng", "en"},
            "ja": {"jpn", "ja"},
        }
        return mapping.get(lang, {lang})

    with patch("config._get_language_tags", side_effect=fake_tags):
        yield


def test_returns_all_non_target_streams():
    from ass_utils import get_all_subtitle_streams

    result = get_all_subtitle_streams(PROBE_EN_ASS_JA_SRT, exclude_language="de")
    langs = {r["lang"] for r in result}
    assert "eng" in langs
    assert "jpn" in langs
    assert "deu" not in langs


def test_excludes_target_language():
    from ass_utils import get_all_subtitle_streams

    result = get_all_subtitle_streams(PROBE_EN_ASS_JA_SRT, exclude_language="en")
    langs = {r["lang"] for r in result}
    assert "eng" not in langs
    assert "deu" in langs


def test_formats_correctly():
    from ass_utils import get_all_subtitle_streams

    result = get_all_subtitle_streams(PROBE_EN_ASS_JA_SRT, exclude_language="de")
    by_lang = {r["lang"]: r["format"] for r in result}
    assert by_lang["eng"] == "ass"
    assert by_lang["jpn"] == "srt"


def test_empty_probe_returns_empty():
    from ass_utils import get_all_subtitle_streams

    assert get_all_subtitle_streams(PROBE_EMPTY) == []


def test_no_subtitle_streams_returns_empty():
    from ass_utils import get_all_subtitle_streams

    assert get_all_subtitle_streams(PROBE_NO_SUBS) == []


def test_skips_unknown_codecs():
    from ass_utils import get_all_subtitle_streams

    result = get_all_subtitle_streams(PROBE_UNKNOWN_CODEC)
    assert len(result) == 1
    assert result[0]["format"] == "ass"


def test_deduplicates_same_lang_format():
    from ass_utils import get_all_subtitle_streams

    result = get_all_subtitle_streams(PROBE_DUPLICATE)
    assert len(result) == 1


def test_no_exclude_returns_all():
    from ass_utils import get_all_subtitle_streams

    result = get_all_subtitle_streams(PROBE_EN_ASS_JA_SRT, exclude_language=None)
    assert len(result) == 3  # eng, jpn, deu