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
|
"""
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"
|