""" Changing the node's TMDB language wipes the cached fiches (`ops.set_tmdb_config`). The cache is keyed by TMDB id alone and records no language, so a fiche fetched under the old language would be served for its whole 30-day TTL. An operator who sets the language *after* browsing the library once — the ordinary order, since browsing is what triggers the lazy fetch — would keep seeing the old language otherwise (found live: a whole library indexed in English before "Français" was chosen, 2026-09-26). Only the language change clears; a no-op re-set or a token-only change must leave the cache alone, or every unrelated settings save would throw the library's metadata away. """ import pytest from meshbay_node import ops from meshbay_node.media_cache import MediaCache from meshbay_node.roster import Roster pytestmark = pytest.mark.asyncio async def _state(tmp_path): roster = Roster(db_path=tmp_path / "roster.db") await roster.open() cache = MediaCache(db_path=tmp_path / "media_cache.db") await cache.open() state = {"roster": roster, "media_cache": cache, "node_user_id": "operator"} return state, roster, cache async def _seed(cache): await cache.set_tmdb_meta("1668", "tv", {"name": "Friends"}) await cache.set_season_meta("1668", 1, {"overview": "Season one"}) async def test_changing_language_clears_the_metadata_cache(tmp_path): state, roster, cache = await _state(tmp_path) try: await ops.set_tmdb_config(state, language="") # start at default/English await _seed(cache) await ops.set_tmdb_config(state, language="fr-FR") assert await cache.get_tmdb_meta("1668", "tv") is None assert await cache.get_season_meta("1668", 1) is None finally: await roster.close() await cache.close() async def test_re_setting_the_same_language_keeps_the_cache(tmp_path): state, roster, cache = await _state(tmp_path) try: await ops.set_tmdb_config(state, language="fr-FR") await _seed(cache) await ops.set_tmdb_config(state, language="fr-FR") assert await cache.get_tmdb_meta("1668", "tv") == {"name": "Friends"} assert await cache.get_season_meta("1668", 1) == {"overview": "Season one"} finally: await roster.close() await cache.close() async def test_token_only_change_keeps_the_cache(tmp_path): state, roster, cache = await _state(tmp_path) try: await ops.set_tmdb_config(state, language="fr-FR") await _seed(cache) # language=None means "leave the language" — not a language change, # so the fiches stay. await ops.set_tmdb_config(state, token="a-custom-token") assert await cache.get_tmdb_meta("1668", "tv") == {"name": "Friends"} assert await cache.get_season_meta("1668", 1) == {"overview": "Season one"} finally: await roster.close() await cache.close()