from unittest.mock import MagicMock, patch
class TestTmdbEnglishFallback:
@patch("lib.clients.tmdb.tmdb.TMDb")
@patch("lib.clients.tmdb.tmdb.cache")
@patch("lib.clients.tmdb.tmdb.tmdb_get")
def test_no_fallback_when_localized_data_complete(self, mock_tmdb_get, mock_cache, MockTMDb):
mock_tmdb = MagicMock()
mock_tmdb.language = "ro-RO"
MockTMDb.return_value = mock_tmdb
mock_cache.get.return_value = None
from lib.clients.tmdb.tmdb import TmdbClient
item = {
"id": 123,
"title": "Titlu Românesc",
"overview": "Descriere în română",
"media_type": "movie",
}
metadata = TmdbClient._get_cached_tmdb_item_metadata(item, "movies")
assert metadata["title"] == "Titlu Românesc"
assert metadata["overview"] == "Descriere în română"
# Should NOT call details endpoint for fallback
detail_calls = [
c for c in mock_tmdb_get.call_args_list if c[0][0] in ("movie_details", "tv_details")
]
assert len(detail_calls) == 0
@patch("lib.clients.tmdb.tmdb.TMDb")
@patch("lib.clients.tmdb.tmdb.cache")
@patch("lib.clients.tmdb.tmdb.tmdb_get")
def test_fallback_to_english_when_title_missing(self, mock_tmdb_get, mock_cache, MockTMDb):
mock_tmdb = MagicMock()
mock_tmdb.language = "ro-RO"
MockTMDb.return_value = mock_tmdb
mock_cache.get.return_value = None
def tmdb_get_side_effect(path, params):
if path == "movie_images":
return None
if path == "movie_details":
return {
"id": 123,
"title": "English Title",
"overview": "English overview",
}
return None
mock_tmdb_get.side_effect = tmdb_get_side_effect
from lib.clients.tmdb.tmdb import TmdbClient
item = {
"id": 123,
"title": "",
"name": "",
"overview": "",
"media_type": "movie",
}
metadata = TmdbClient._get_cached_tmdb_item_metadata(item, "movies")
assert metadata["title"] == "English Title"
assert metadata["overview"] == "English overview"
# Should restore original language
assert mock_tmdb.language == "ro-RO"
@patch("lib.clients.tmdb.tmdb.TMDb")
@patch("lib.clients.tmdb.tmdb.cache")
@patch("lib.clients.tmdb.tmdb.tmdb_get")
def test_fallback_to_english_when_overview_missing(self, mock_tmdb_get, mock_cache, MockTMDb):
mock_tmdb = MagicMock()
mock_tmdb.language = "ro-RO"
MockTMDb.return_value = mock_tmdb
mock_cache.get.return_value = None
def tmdb_get_side_effect(path, params):
if path == "movie_images":
return None
if path == "movie_details":
return {
"id": 123,
"title": "Titlu Românesc",
"overview": "English overview",
}
return None
mock_tmdb_get.side_effect = tmdb_get_side_effect
from lib.clients.tmdb.tmdb import TmdbClient
item = {
"id": 123,
"title": "Titlu Românesc",
"overview": "",
"media_type": "movie",
}
metadata = TmdbClient._get_cached_tmdb_item_metadata(item, "movies")
assert metadata["title"] == "Titlu Românesc"
assert metadata["overview"] == "English overview"
@patch("lib.clients.tmdb.tmdb.TMDb")
@patch("lib.clients.tmdb.tmdb.cache")
@patch("lib.clients.tmdb.tmdb.tmdb_get")
def test_fallback_for_tv_shows(self, mock_tmdb_get, mock_cache, MockTMDb):
mock_tmdb = MagicMock()
mock_tmdb.language = "ro-RO"
MockTMDb.return_value = mock_tmdb
mock_cache.get.return_value = None
def tmdb_get_side_effect(path, params):
if path == "tv_images":
return None
if path == "tv_details":
return {
"id": 456,
"name": "English Show Name",
"overview": "English show overview",
}
return None
mock_tmdb_get.side_effect = tmdb_get_side_effect
from lib.clients.tmdb.tmdb import TmdbClient
item = {
"id": 456,
"name": "",
"overview": "",
"media_type": "tv",
}
metadata = TmdbClient._get_cached_tmdb_item_metadata(item, "tv")
assert metadata["name"] == "English Show Name"
assert metadata["overview"] == "English show overview"
assert mock_tmdb.language == "ro-RO"
@patch("lib.clients.tmdb.tmdb.TMDb")
@patch("lib.clients.tmdb.tmdb.cache")
@patch("lib.clients.tmdb.tmdb.tmdb_get")
def test_uses_cached_metadata_when_available(self, mock_tmdb_get, mock_cache, MockTMDb):
mock_tmdb = MagicMock()
mock_tmdb.language = "ro-RO"
MockTMDb.return_value = mock_tmdb
mock_cache.get.return_value = {
"title": "Cached Title",
"overview": "Cached overview",
"images": {"posters": []},
}
from lib.clients.tmdb.tmdb import TmdbClient
item = {
"id": 123,
"title": "",
"overview": "",
"media_type": "movie",
}
metadata = TmdbClient._get_cached_tmdb_item_metadata(item, "movies")
assert metadata["title"] == "Cached Title"
assert metadata["overview"] == "Cached overview"
# Should NOT make any API calls when cache hit
assert mock_tmdb_get.call_count == 0