test_config_loader.py•2.78 kB
"""
Unit tests for configuration loader.
"""
import os
from pathlib import Path
import pytest
from pydantic import ValidationError
from mcp_template.core.config_loader import ConfigLoader
from mcp_template.core.settings import Settings
def test_settings_defaults():
"""Test that Settings has reasonable defaults."""
settings = Settings()
assert settings.server.name == "mcp-template-server"
assert settings.server.version == "0.1.0"
assert settings.logging.level.value == "INFO"
assert settings.registry.enabled is True
def test_settings_from_dict():
"""Test loading settings from dictionary."""
config = {
"server": {
"name": "test-server",
"version": "1.0.0",
},
"registry": {
"enabled": False,
},
}
settings = ConfigLoader.from_dict(config)
assert settings.server.name == "test-server"
assert settings.server.version == "1.0.0"
assert settings.registry.enabled is False
def test_settings_validation():
"""Test that invalid settings raise validation errors."""
with pytest.raises(ValidationError):
Settings(
registry={
"url": "invalid-url", # Should fail - no protocol
}
)
def test_env_var_substitution():
"""Test environment variable substitution."""
os.environ["TEST_API_KEY"] = "secret-key-123"
loader = ConfigLoader()
result = loader._substitute_env_vars({
"key": "${TEST_API_KEY}",
"nested": {
"value": "prefix-${TEST_API_KEY}-suffix"
}
})
assert result["key"] == "secret-key-123"
assert result["nested"]["value"] == "prefix-secret-key-123-suffix"
# Cleanup
del os.environ["TEST_API_KEY"]
def test_env_var_missing():
"""Test that missing env vars keep the original string."""
loader = ConfigLoader()
result = loader._substitute_env_vars("${NONEXISTENT_VAR}")
assert result == "${NONEXISTENT_VAR}"
def test_is_production():
"""Test production environment detection."""
from mcp_template.core.settings import Environment
settings = Settings(
registry={
"metadata": {
"environment": Environment.PRODUCTION
}
}
)
assert settings.is_production() is True
def test_is_debug():
"""Test debug mode detection."""
from mcp_template.core.settings import LogLevel
# Debug via server setting
settings1 = Settings(server={"debug": True})
assert settings1.is_debug() is True
# Debug via logging level
settings2 = Settings(logging={"level": LogLevel.DEBUG})
assert settings2.is_debug() is True
# Not debug
settings3 = Settings()
assert settings3.is_debug() is False