feat: implement comprehensive configuration management system with web interface and database support
CI / lint-test-build (push) Failing after 1m18s

This commit is contained in:
2026-06-02 17:23:58 +02:00
parent 815284289e
commit 00bd2d664d
5 changed files with 520 additions and 0 deletions
+189
View File
@@ -0,0 +1,189 @@
"""Unit tests for configuration management system."""
import pytest
from unittest.mock import Mock, patch
from arbitrade.config.service import ConfigurationService
from arbitrade.config.settings import Settings
from arbitrade.storage.db import DuckDBStore
from arbitrade.storage.repositories import AuditRepository
@pytest.fixture
def mock_settings():
"""Create a mock settings object."""
settings = Mock(spec=Settings)
settings.app_env = "test"
return settings
@pytest.fixture
def mock_store():
"""Create a mock database store."""
store = Mock(spec=DuckDBStore)
return store
@pytest.fixture
def mock_audit_repo():
"""Create a mock audit repository."""
audit_repo = Mock(spec=AuditRepository)
return audit_repo
def test_configuration_service_initialization(
mock_settings, mock_store, mock_audit_repo
):
"""Test that ConfigurationService initializes correctly."""
# Create service instance
service = ConfigurationService(mock_settings, mock_store, mock_audit_repo)
# Verify attributes are set
assert service._settings == mock_settings
assert service._store == mock_store
assert service._audit_repo == mock_audit_repo
assert service._config_version == 0
assert isinstance(service._loaded_settings, dict)
def test_configuration_service_get_setting(
mock_settings, mock_store, mock_audit_repo
):
"""Test getting configuration settings."""
# Create service instance
service = ConfigurationService(mock_settings, mock_store, mock_audit_repo)
# Set up mock loaded settings
service._loaded_settings = {"test_key": "test_value"}
# Test getting existing setting
result = service.get_setting("test_key", "default")
assert result == "test_value"
# Test getting non-existing setting with default
result = service.get_setting("non_existing", "default")
assert result == "default"
def test_configuration_service_set_setting(
mock_settings, mock_store, mock_audit_repo
):
"""Test setting configuration settings."""
# Create service instance
service = ConfigurationService(mock_settings, mock_store, mock_audit_repo)
# Mock the repository
with patch('arbitrade.config.service.ConfigSettingRepository') as mock_repo_class:
mock_repo_instance = Mock()
mock_repo_class.return_value = mock_repo_instance
# Mock the setting creation
mock_created_setting = Mock()
mock_created_setting.updated_at = "2023-01-01T00:00:00"
mock_repo_instance.create_setting.return_value = mock_created_setting
# Set a setting
service.set_setting("test_key", "test_value", "test_user")
# Verify repository was called
mock_repo_class.assert_called_once_with(mock_store)
mock_repo_instance.create_setting.assert_called_once()
def test_configuration_service_hot_reload_detection(
mock_settings, mock_store, mock_audit_repo
):
"""Test hot-reload detection functionality."""
# Create service instance
service = ConfigurationService(mock_settings, mock_store, mock_audit_repo)
# Initially should not be outdated
assert service.is_config_outdated() is False
# Test with mock repository that returns a timestamp
with patch('arbitrade.config.service.ConfigSettingRepository') as mock_repo_class:
mock_repo_instance = Mock()
mock_repo_class.return_value = mock_repo_instance
# Mock the latest updated at timestamp
from datetime import datetime
mock_repo_instance.get_latest_updated_at.return_value = datetime.now()
# Should detect as outdated when timestamp exists
assert service.is_config_outdated() is True
def test_configuration_service_reload_if_changed(
mock_settings, mock_store, mock_audit_repo
):
"""Test hot-reload functionality."""
# Create service instance
service = ConfigurationService(mock_settings, mock_store, mock_audit_repo)
# Mock the repository
with patch('arbitrade.config.service.ConfigSettingRepository') as mock_repo_class:
mock_repo_instance = Mock()
mock_repo_class.return_value = mock_repo_instance
# Mock the latest updated at timestamp to return None initially
mock_repo_instance.get_latest_updated_at.return_value = None
# Should not reload when not outdated
result = service.reload_if_changed()
assert result is False
assert service.get_config_version() == 0
# Mock the latest updated at timestamp to return a value
from datetime import datetime
mock_repo_instance.get_latest_updated_at.return_value = datetime.now()
# Should reload when outdated
result = service.reload_if_changed()
assert result is True
assert service.get_config_version() == 1
def test_configuration_service_get_config_version(
mock_settings, mock_store, mock_audit_repo
):
"""Test getting configuration version."""
# Create service instance
service = ConfigurationService(mock_settings, mock_store, mock_audit_repo)
# Should start at version 0
assert service.get_config_version() == 0
# After setting a value, version should increment
with patch('arbitrade.config.service.ConfigSettingRepository') as mock_repo_class:
mock_repo_instance = Mock()
mock_repo_class.return_value = mock_repo_instance
mock_created_setting = Mock()
mock_created_setting.updated_at = "2023-01-01T00:00:00"
mock_repo_instance.create_setting.return_value = mock_created_setting
service.set_setting("test_key", "test_value", "test_user")
assert service.get_config_version() == 1
def test_configuration_service_get_last_updated_at(
mock_settings, mock_store, mock_audit_repo
):
"""Test getting last updated timestamp."""
# Create service instance
service = ConfigurationService(mock_settings, mock_store, mock_audit_repo)
# Should start with None
assert service.get_last_updated_at() is None
# After setting a value, should have timestamp
with patch('arbitrade.config.service.ConfigSettingRepository') as mock_repo_class:
mock_repo_instance = Mock()
mock_repo_class.return_value = mock_repo_instance
mock_created_setting = Mock()
mock_created_setting.updated_at = "2023-01-01T00:00:00"
mock_repo_instance.create_setting.return_value = mock_created_setting
service.set_setting("test_key", "test_value", "test_user")
assert service.get_last_updated_at() == "2023-01-01T00:00:00"