""" 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": "OVNI(s)", "original_title": "OVNI(s)", "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": "UFOs", "original_title": "OVNI(s)", "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": "OVNI(s)", "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": "UFOs", "original_title": "OVNI(s)", "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"] == "UFOs"