#!/usr/bin/env python3 """Focused offline tests for the model-oriented Radarr overlay.""" from __future__ import annotations import importlib.util import sys import types import unittest from pathlib import Path SOURCE = Path(__file__).parents[1] / "platform/mcp/patches/mcp_radarr.py" def load_module(): utilities = types.ModuleType("agent_utilities.mcp_utilities") utilities.dispatch = lambda *args, **kwargs: None utilities.public_actions = lambda client: client.actions utilities.run_blocking = lambda *args, **kwargs: None sys.modules["agent_utilities"] = types.ModuleType("agent_utilities") sys.modules["agent_utilities.mcp_utilities"] = utilities fastmcp = types.ModuleType("fastmcp") fastmcp.FastMCP = object sys.modules["fastmcp"] = fastmcp pydantic = types.ModuleType("pydantic") pydantic.Field = lambda *args, **kwargs: kwargs.get("default") sys.modules["pydantic"] = pydantic auth = types.ModuleType("arr_mcp.auth") auth.get_radarr_client = lambda: None sys.modules["arr_mcp"] = types.ModuleType("arr_mcp") sys.modules["arr_mcp.auth"] = auth spec = importlib.util.spec_from_file_location("radarr_patch", SOURCE) module = importlib.util.module_from_spec(spec) assert spec.loader spec.loader.exec_module(module) return module class RadarrPatchTests(unittest.TestCase): def setUp(self): self.module = load_module() self.movies = [{ "id": 12, "title": "Example", "year": 2024, "hasFile": True, "alternateTitles": [{"title": "large unwanted block"}], "movieFile": { "id": 44, "relativePath": "Example.mkv", "size": 2147483648, "quality": {"quality": {"name": "Bluray-1080p"}}, "mediaInfo": { "videoCodec": "x264", "resolution": "1920x1080", "videoBitDepth": 8, "audioCodec": "EAC3", "audioLanguages": "ger/eng", "subtitles": "ger", }, }, }] def test_inventory_is_compact_and_alias_aware(self): result = self.module._compact_inventory(self.movies, codecs="h264") self.assertEqual(result["totalMatched"], 1) self.assertEqual(result["movies"][0]["videoCodec"], "x264") self.assertEqual(result["movies"][0]["sizeGiB"], 2.0) self.assertNotIn("alternateTitles", result["movies"][0]) def test_filter_and_pagination_return_valid_bounded_data(self): result = self.module._compact_inventory(self.movies * 5, query="example", offset=1, limit=2) self.assertEqual(result["returned"], 2) self.assertTrue(result["hasMore"]) def test_internal_transport_and_power_actions_are_hidden(self): client = types.SimpleNamespace(actions=["get_movie", "request", "post_system_shutdown", "get_queue"]) self.assertEqual(self.module._safe_actions(client), ["get_movie", "get_queue"]) if __name__ == "__main__": unittest.main()