95 lines
3.3 KiB
Python
95 lines
3.3 KiB
Python
#!/usr/bin/env python3
|
|
"""Regression tests for declarative, update-safe MCPHub settings."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import importlib.util
|
|
import json
|
|
import os
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).parents[1]
|
|
SOURCE = ROOT / "platform/mcphub/configure-settings.py"
|
|
|
|
|
|
def load_module():
|
|
spec = importlib.util.spec_from_file_location("configure_settings", SOURCE)
|
|
module = importlib.util.module_from_spec(spec)
|
|
assert spec.loader
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
class MCPHubSettingsTests(unittest.TestCase):
|
|
def setUp(self):
|
|
self.module = load_module()
|
|
self.temp = tempfile.TemporaryDirectory()
|
|
self.root = Path(self.temp.name)
|
|
self.secrets = self.root / "secrets"
|
|
self.secrets.mkdir()
|
|
(self.secrets / "remote.env").write_text(
|
|
"REMOTE_URL=http://example.test/mcp\nTOKEN=secret-value\n",
|
|
encoding="utf-8",
|
|
)
|
|
self.registry = self.root / "registry.json"
|
|
self.registry.write_text(json.dumps({
|
|
"version": 1,
|
|
"servers": [
|
|
{
|
|
"id": "remote-local",
|
|
"hermes_id": "remote",
|
|
"hub": {
|
|
"type": "streamable-http",
|
|
"secret_file": "remote.env",
|
|
"url": "${REMOTE_URL}",
|
|
"headers": {"Authorization": "Bearer ${TOKEN}"},
|
|
"enabled": True,
|
|
},
|
|
},
|
|
{"id": "client-only", "url": "http://unused/mcp"},
|
|
],
|
|
}), encoding="utf-8")
|
|
|
|
def tearDown(self):
|
|
self.temp.cleanup()
|
|
|
|
def test_registry_renders_only_hub_servers_and_expands_secrets(self):
|
|
servers = self.module.registry_servers(self.registry, self.secrets, {})
|
|
self.assertEqual(list(servers), ["remote"])
|
|
self.assertEqual(servers["remote"]["url"], "http://example.test/mcp")
|
|
self.assertEqual(
|
|
servers["remote"]["headers"]["Authorization"],
|
|
"Bearer secret-value",
|
|
)
|
|
|
|
def test_existing_enabled_toggle_survives_reconciliation(self):
|
|
servers = self.module.registry_servers(
|
|
self.registry, self.secrets, {"remote": {"enabled": False}}
|
|
)
|
|
self.assertFalse(servers["remote"]["enabled"])
|
|
|
|
def test_missing_secret_fails_closed(self):
|
|
os.unlink(self.secrets / "remote.env")
|
|
with self.assertRaises(SystemExit):
|
|
self.module.registry_servers(self.registry, self.secrets, {})
|
|
|
|
def test_hermes_group_is_recoverable_and_bounded(self):
|
|
settings = {"groups": [{"id": "keep", "name": "other", "servers": []}]}
|
|
self.module.ensure_hermes_group(settings)
|
|
self.module.ensure_hermes_group(settings)
|
|
groups = settings["groups"]
|
|
self.assertEqual(len([group for group in groups if group["name"] == "hermes"]), 1)
|
|
hermes = next(group for group in groups if group["name"] == "hermes")
|
|
fritzbox = next(item for item in hermes["servers"] if item["name"] == "fritzbox")
|
|
self.assertEqual(
|
|
fritzbox["tools"],
|
|
["list_services", "list_actions", "describe_action", "call_action"],
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|