Initial implementation

This commit is contained in:
2026-04-13 14:22:37 +02:00
commit a0c1b6ed93
26 changed files with 4125 additions and 0 deletions
+154
View File
@@ -0,0 +1,154 @@
"""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