aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/tests/test_tmdb_language_fallback.py
blob: 52fe4c4802dd62f85bf000e1b6e49f63516e35eb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
"""
TMDB doesn't fall back server-side for a field with no translation in the
requested language — it returns "" (or an empty list) for that one field,
not the English text, confirmed live against a real French query. The TMDB
website itself covers exactly this gap client-side by falling back to
English per field; `_tmdb_build_meta` (webrtc_server.py) mirrors that,
rather than discarding an otherwise-good localized response over one empty
field, or silently showing a blank overview/poster.
"""

import pytest

from meshbay_node.transport.webrtc_server import WebRTCPeerSession

pytestmark = pytest.mark.asyncio


class FakeTmdbClient:
    def __init__(self, localized: dict, english: dict, credits: dict | None = None):
        self._localized = localized
        self._english = english
        self._credits = credits or {"cast": [], "crew": []}
        self.calls: list[tuple[str, str | None]] = []

    async def movie_details(self, tmdb_id, language=None):
        self.calls.append(("movie_details", language))
        return self._english if language == "en-US" else self._localized

    async def tv_details(self, tmdb_id, language=None):
        self.calls.append(("tv_details", language))
        return self._english if language == "en-US" else self._localized

    async def movie_credits(self, tmdb_id):
        return self._credits

    async def tv_credits(self, tmdb_id):
        return self._credits


async def test_empty_overview_falls_back_to_english_but_keeps_localized_poster():
    localized = {
        "title": "Une Série", "original_title": "Une Série",
        "overview": "",  # no French translation on TMDB for this field
        "poster_path": "/fr-poster.jpg", "backdrop_path": "/fr-backdrop.jpg",
        "genres": [{"name": "Comédie"}], "vote_average": 7.2,
        "first_air_date": "2016-01-01",
    }
    english = {
        "title": "A Series", "original_title": "Une Série",
        "overview": "A real English overview.",
        "poster_path": "/en-poster.jpg", "backdrop_path": "/en-backdrop.jpg",
        "genres": [{"name": "Comedy"}], "vote_average": 7.2,
        "first_air_date": "2016-01-01",
    }
    client = FakeTmdbClient(localized, english)

    meta = await WebRTCPeerSession._tmdb_build_meta(client, "108353", "tv", {"id": 108353})

    assert meta["overview"] == "A real English overview.", (
        "the empty localized field must fall back to the English value")
    assert meta["poster_path"] == "/fr-poster.jpg", (
        "a non-empty localized field must NOT be overwritten by the English fallback"
    )
    assert meta["genres"] == ["Comédie"], "localized genres were present — kept as-is"
    assert ("tv_details", "en-US") in client.calls, "the fallback fetch must actually happen"


async def test_fully_populated_localized_response_never_triggers_a_fallback_call():
    localized = {
        "title": "Une Série", "overview": "Un résumé complet en français.",
        "poster_path": "/fr-poster.jpg", "genres": [{"name": "Comédie"}],
        "vote_average": 7.2,
    }
    client = FakeTmdbClient(localized, english={"overview": "should never be used"})

    meta = await WebRTCPeerSession._tmdb_build_meta(client, "108353", "tv", {"id": 108353})

    assert meta["overview"] == "Un résumé complet en français."
    assert client.calls == [("tv_details", None)], (
        "a fully translated response must not cost a second TMDB request")


async def test_completely_untranslated_response_falls_back_entirely():
    localized = {"overview": "", "poster_path": None, "genres": []}
    english = {
        "title": "A Series", "original_title": "Une Série",
        "overview": "A real English overview.", "poster_path": "/en-poster.jpg",
        "genres": [{"name": "Comedy"}], "vote_average": 7.2,
        "release_date": "2016-01-01",
    }
    client = FakeTmdbClient(localized, english)

    meta = await WebRTCPeerSession._tmdb_build_meta(client, "418517", "movie", {"id": 418517})

    assert meta["overview"] == "A real English overview."
    assert meta["poster_path"] == "/en-poster.jpg"
    assert meta["genres"] == ["Comedy"]
    assert meta["title"] == "A Series"