5b14af8ea1
Mechanical cleanup via `ruff check --fix` + `ruff format`: - cli.py, test_auth.py: import sorting (isort convention) - cli.py: remove unused AuthenticationError import in _run_setup - config.py: remove unused `field` import - test_auth.py: remove unused MagicMock import - test_config.py: remove unused Path import No functional change. All 131 tests remain green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
169 lines
4.8 KiB
Python
169 lines
4.8 KiB
Python
"""Tests for config.py."""
|
|
|
|
|
|
import pytest
|
|
import yaml
|
|
|
|
from mcp_synology_container.config import (
|
|
AppConfig,
|
|
ConnectionConfig,
|
|
_merge_env_overrides,
|
|
_validate_config,
|
|
load_config,
|
|
save_config,
|
|
)
|
|
|
|
|
|
def test_validate_config_minimal():
|
|
raw = {
|
|
"schema_version": 1,
|
|
"connection": {"host": "nas.local"},
|
|
}
|
|
config = _validate_config(raw)
|
|
assert config.connection.host == "nas.local"
|
|
assert config.connection.port == 443 # default when https=True
|
|
assert config.connection.https is True
|
|
assert config.connection.verify_ssl is True
|
|
assert config.compose_base_path == "/volume1/docker"
|
|
assert config.alias is None
|
|
|
|
|
|
def test_validate_config_full():
|
|
raw = {
|
|
"schema_version": 1,
|
|
"alias": "HomeNAS",
|
|
"compose_base_path": "/volume2/containers",
|
|
"connection": {
|
|
"host": "192.168.1.100",
|
|
"port": 5001,
|
|
"https": True,
|
|
"verify_ssl": False,
|
|
},
|
|
}
|
|
config = _validate_config(raw)
|
|
assert config.alias == "HomeNAS"
|
|
assert config.compose_base_path == "/volume2/containers"
|
|
assert config.connection.host == "192.168.1.100"
|
|
assert config.connection.port == 5001
|
|
assert config.connection.verify_ssl is False
|
|
|
|
|
|
def test_validate_config_wrong_schema_version():
|
|
raw = {
|
|
"schema_version": 99,
|
|
"connection": {"host": "nas.local"},
|
|
}
|
|
with pytest.raises(ValueError, match="schema_version"):
|
|
_validate_config(raw)
|
|
|
|
|
|
def test_validate_config_missing_host():
|
|
raw = {
|
|
"schema_version": 1,
|
|
"connection": {},
|
|
}
|
|
with pytest.raises(ValueError, match="connection.host"):
|
|
_validate_config(raw)
|
|
|
|
|
|
def test_validate_config_missing_connection():
|
|
raw = {"schema_version": 1}
|
|
with pytest.raises(ValueError, match="connection.host"):
|
|
_validate_config(raw)
|
|
|
|
|
|
def test_merge_env_overrides_host(monkeypatch):
|
|
monkeypatch.setenv("SYNOLOGY_HOST", "192.168.1.50")
|
|
raw: dict = {"schema_version": 1, "connection": {}}
|
|
result = _merge_env_overrides(raw)
|
|
assert result["connection"]["host"] == "192.168.1.50"
|
|
|
|
|
|
def test_merge_env_overrides_port(monkeypatch):
|
|
monkeypatch.setenv("SYNOLOGY_PORT", "8080")
|
|
raw: dict = {"schema_version": 1, "connection": {}}
|
|
result = _merge_env_overrides(raw)
|
|
assert result["connection"]["port"] == 8080 # coerced to int
|
|
|
|
|
|
def test_merge_env_overrides_https_true(monkeypatch):
|
|
monkeypatch.setenv("SYNOLOGY_HTTPS", "true")
|
|
raw: dict = {"schema_version": 1, "connection": {}}
|
|
result = _merge_env_overrides(raw)
|
|
assert result["connection"]["https"] is True
|
|
|
|
|
|
def test_merge_env_overrides_https_false(monkeypatch):
|
|
monkeypatch.setenv("SYNOLOGY_HTTPS", "false")
|
|
raw: dict = {"schema_version": 1, "connection": {}}
|
|
result = _merge_env_overrides(raw)
|
|
assert result["connection"]["https"] is False
|
|
|
|
|
|
def test_base_url_https():
|
|
config = AppConfig(
|
|
schema_version=1,
|
|
connection=ConnectionConfig(host="nas.local", port=443, https=True, verify_ssl=True),
|
|
)
|
|
assert config.base_url == "https://nas.local:443"
|
|
|
|
|
|
def test_base_url_http():
|
|
config = AppConfig(
|
|
schema_version=1,
|
|
connection=ConnectionConfig(host="192.168.1.1", port=5000, https=False, verify_ssl=True),
|
|
)
|
|
assert config.base_url == "http://192.168.1.1:5000"
|
|
|
|
|
|
def test_keyring_service():
|
|
config = AppConfig(
|
|
schema_version=1,
|
|
connection=ConnectionConfig(host="mynas.local", port=443, https=True, verify_ssl=True),
|
|
)
|
|
assert config.keyring_service == "mcp-synology-container/mynas.local"
|
|
|
|
|
|
def test_load_config_file_not_found():
|
|
with pytest.raises(FileNotFoundError):
|
|
load_config("/nonexistent/path/config.yaml")
|
|
|
|
|
|
def test_save_and_load_config(tmp_path):
|
|
config = AppConfig(
|
|
schema_version=1,
|
|
connection=ConnectionConfig(
|
|
host="test.nas.local",
|
|
port=5001,
|
|
https=True,
|
|
verify_ssl=False,
|
|
),
|
|
compose_base_path="/data/docker",
|
|
alias="TestNAS",
|
|
)
|
|
|
|
config_file = tmp_path / "config.yaml"
|
|
save_config(config, config_file)
|
|
|
|
assert config_file.exists()
|
|
loaded = load_config(config_file)
|
|
|
|
assert loaded.connection.host == "test.nas.local"
|
|
assert loaded.connection.port == 5001
|
|
assert loaded.connection.https is True
|
|
assert loaded.connection.verify_ssl is False
|
|
assert loaded.compose_base_path == "/data/docker"
|
|
assert loaded.alias == "TestNAS"
|
|
|
|
|
|
def test_save_config_no_alias(tmp_path):
|
|
config = AppConfig(
|
|
schema_version=1,
|
|
connection=ConnectionConfig(host="nas.local", port=443, https=True, verify_ssl=True),
|
|
)
|
|
config_file = tmp_path / "config.yaml"
|
|
save_config(config, config_file)
|
|
|
|
raw = yaml.safe_load(config_file.read_text())
|
|
assert "alias" not in raw
|