mirror of
https://github.com/b3nw/nginx-proxy-manager-mcp.git
synced 2026-06-09 23:09:40 -05:00
ddaf4190f9
- Introduced ServerRegistry to manage multiple NPM instances - Added support for NPM_SERVERS JSON environment variable - Updated all tools to support optional 'server' targeting - Implemented clone_proxy_host, sync_access_lists, and sync_certificates tools - Transitioned get_proxy_host_logs to API-based retrieval with local fallback - Added comprehensive test suite for multi-server management and sync operations Co-authored-by: claw-io <agent@ben.io>
98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
"""Tests for ServerRegistry."""
|
|
|
|
import pytest
|
|
|
|
from npm_mcp.config import settings
|
|
from npm_mcp.server import ServerRegistry
|
|
|
|
|
|
def test_registry_fallback_to_single_server(monkeypatch):
|
|
"""Test that registry falls back to single-server settings when empty."""
|
|
monkeypatch.setattr(settings, "api_url", "http://test-url:81/api")
|
|
monkeypatch.setattr(settings, "identity", "test-user")
|
|
monkeypatch.setattr(settings, "secret", "test-pass")
|
|
|
|
registry = ServerRegistry(configs=[], default=None)
|
|
|
|
assert registry.list_names() == ["default"]
|
|
assert registry.get_default() == "default"
|
|
|
|
client = registry.get()
|
|
assert client.base_url == "http://test-url:81/api"
|
|
assert client._identity == "test-user"
|
|
|
|
|
|
def test_registry_multiple_servers():
|
|
"""Test that multiple servers are correctly registered."""
|
|
configs = [
|
|
{"name": "prod", "url": "http://prod:81/api", "identity": "p", "secret": "ps"},
|
|
{"name": "dev", "url": "http://dev:81/api", "identity": "d", "secret": "ds"},
|
|
]
|
|
|
|
registry = ServerRegistry(configs=configs, default="prod")
|
|
|
|
assert set(registry.list_names()) == {"prod", "dev"}
|
|
assert registry.get_default() == "prod"
|
|
|
|
prod_client = registry.get("prod")
|
|
assert prod_client.base_url == "http://prod:81/api"
|
|
|
|
dev_client = registry.get("dev")
|
|
assert dev_client.base_url == "http://dev:81/api"
|
|
|
|
|
|
def test_registry_get_default_fallback():
|
|
"""Test that get() falls back to default server when name is None/empty."""
|
|
configs = [
|
|
{"name": "prod", "url": "http://prod:81/api", "identity": "p", "secret": "ps"},
|
|
{"name": "dev", "url": "http://dev:81/api", "identity": "d", "secret": "ds"},
|
|
]
|
|
|
|
registry = ServerRegistry(configs=configs, default="dev")
|
|
|
|
# Name is None
|
|
client = registry.get(None)
|
|
assert client.base_url == "http://dev:81/api"
|
|
|
|
# Name is empty string
|
|
client_empty = registry.get("")
|
|
assert client_empty.base_url == "http://dev:81/api"
|
|
|
|
|
|
def test_registry_single_client_no_default_specified():
|
|
"""Test that get() succeeds if there is only 1 server, even if no default is specified."""
|
|
configs = [
|
|
{"name": "only-one", "url": "http://only:81/api", "identity": "o", "secret": "os"}
|
|
]
|
|
|
|
registry = ServerRegistry(configs=configs, default=None)
|
|
|
|
assert registry.get_default() is None
|
|
client = registry.get()
|
|
assert client.base_url == "http://only:81/api"
|
|
|
|
|
|
def test_registry_multiple_clients_no_default_raises():
|
|
"""Test that get() raises KeyError if multiple servers are defined but no default is set."""
|
|
configs = [
|
|
{"name": "prod", "url": "http://prod:81/api", "identity": "p", "secret": "ps"},
|
|
{"name": "dev", "url": "http://dev:81/api", "identity": "d", "secret": "ds"},
|
|
]
|
|
|
|
registry = ServerRegistry(configs=configs, default=None)
|
|
|
|
with pytest.raises(KeyError, match="Multiple servers configured but no default server"):
|
|
registry.get()
|
|
|
|
|
|
def test_registry_invalid_name_raises():
|
|
"""Test that get() raises KeyError for non-existent server names."""
|
|
configs = [
|
|
{"name": "prod", "url": "http://prod:81/api", "identity": "p", "secret": "ps"},
|
|
]
|
|
|
|
registry = ServerRegistry(configs=configs, default="prod")
|
|
|
|
with pytest.raises(KeyError, match="Server 'non-existent' not found"):
|
|
registry.get("non-existent")
|