"""Tests for modules/images.py.""" import pytest from unittest.mock import AsyncMock def make_mock_mcp(): tools: dict = {} class MockMCP: def tool(self): def decorator(fn): tools[fn.__name__] = fn return fn return decorator return MockMCP(), tools def make_config(): from mcp_synology_container.config import AppConfig, ConnectionConfig return AppConfig( schema_version=1, connection=ConnectionConfig(host="nas.local", port=443, https=True, verify_ssl=True), ) SAMPLE_IMAGES = { "images": [ { "id": "sha256:aaaa", "repository": "nginx", "tags": ["1.24"], "size": 50 * 1024 * 1024, "upgradable": True, }, { "id": "sha256:bbbb", "repository": "postgres", "tags": ["15"], "size": 80 * 1024 * 1024, "upgradable": False, }, { "id": "sha256:cccc", "repository": "redis", "tags": ["7"], "size": 30 * 1024 * 1024, "upgradable": False, }, ] } @pytest.mark.asyncio async def test_check_image_updates_all(): from mcp_synology_container.modules.images import register_images client = AsyncMock() client.request.return_value = SAMPLE_IMAGES mcp, tools = make_mock_mcp() register_images(mcp, make_config(), client) result = await tools["check_image_updates"]() assert "nginx:1.24" in result assert "UPDATE AVAILABLE" in result assert "postgres:15" in result @pytest.mark.asyncio async def test_check_image_updates_all_up_to_date(): from mcp_synology_container.modules.images import register_images client = AsyncMock() client.request.return_value = { "images": [ {"id": "sha256:aaaa", "repository": "nginx", "tags": ["1.24"], "size": 50 * 1024 * 1024, "upgradable": False}, ] } mcp, tools = make_mock_mcp() register_images(mcp, make_config(), client) result = await tools["check_image_updates"]() assert "All images are up to date" in result @pytest.mark.asyncio async def test_check_image_updates_no_images(): from mcp_synology_container.modules.images import register_images client = AsyncMock() client.request.return_value = {"images": []} mcp, tools = make_mock_mcp() register_images(mcp, make_config(), client) result = await tools["check_image_updates"]() assert "No images found" in result @pytest.mark.asyncio async def test_check_image_updates_api_error(): from mcp_synology_container.modules.images import register_images from mcp_synology_container.dsm_client import SynologyError client = AsyncMock() client.request.side_effect = SynologyError("API unavailable", code=102) mcp, tools = make_mock_mcp() register_images(mcp, make_config(), client) result = await tools["check_image_updates"]() assert "Error" in result @pytest.mark.asyncio async def test_check_image_updates_for_project(): from mcp_synology_container.modules.images import register_images project_list = { "uuid-1": { "id": "uuid-1", "name": "myapp", "status": "RUNNING", "containerIds": ["abc123"], } } project_detail = { "containers": [ {"Image": "sha256:aaaa", "Config": {"Image": "nginx:1.24"}}, ] } client = AsyncMock() async def mock_request(api, method, **kwargs): if api == "SYNO.Docker.Image": return SAMPLE_IMAGES if api == "SYNO.Docker.Project" and method == "list": return project_list if api == "SYNO.Docker.Project" and method == "get": return project_detail return {} client.request.side_effect = mock_request mcp, tools = make_mock_mcp() register_images(mcp, make_config(), client) result = await tools["check_image_updates"](project_name="myapp") assert "myapp" in result assert "nginx:1.24" in result