"""Tests for configuration module.""" import pytest from pathlib import Path import tempfile from delegation_mcp.config import ( DelegationConfig, DelegationRule, OrchestratorConfig, ConfigValidationError, ) def test_delegation_rule_creation(): """Test creating a delegation rule.""" rule = DelegationRule( pattern="security|audit", delegate_to="gemini", priority=5, requires_approval=False, description="Security tasks", ) assert rule.pattern == "security|audit" assert rule.delegate_to == "gemini" assert rule.priority == 5 def test_orchestrator_config_creation(): """Test creating orchestrator configuration.""" config = OrchestratorConfig( name="claude", command="claude", enabled=True, ) assert config.name == "claude" assert config.command == "claude" assert config.enabled is True assert config.timeout == 300 # default def test_delegation_config_find_rule(): """Test finding matching delegation rule.""" config = DelegationConfig( orchestrator="claude", rules=[ DelegationRule( pattern="security|audit", delegate_to="gemini", priority=5, ), DelegationRule( pattern="refactor", delegate_to="aider", priority=3, ), ], ) # Should match security rule rule = config.find_delegation_rule("Run a security audit") assert rule is not None assert rule.delegate_to == "gemini" # Should match refactor rule rule = config.find_delegation_rule("Refactor the code") assert rule is not None assert rule.delegate_to == "aider" # Should not match any rule rule = config.find_delegation_rule("Explain Python") assert rule is None def test_config_save_and_load(): """Test saving and loading configuration.""" with tempfile.TemporaryDirectory() as tmpdir: config_path = Path(tmpdir) / "test_config.yaml" # Create and save config config = DelegationConfig( orchestrator="claude", rules=[ DelegationRule( pattern="test", delegate_to="gemini", priority=1, ), ], ) config.to_yaml(config_path) # Load config loaded_config = DelegationConfig.from_yaml(config_path, validate=False) assert loaded_config.orchestrator == "claude" assert len(loaded_config.rules) == 1 assert loaded_config.rules[0].pattern == "test" # ============================================================================ # Validation Tests # ============================================================================ def test_validate_minimum_agents_success(): """Test validation passes with 2 or more enabled agents.""" config = DelegationConfig( orchestrator="claude", orchestrators={ "claude": OrchestratorConfig(name="claude", command="claude", enabled=True), "gemini": OrchestratorConfig(name="gemini", command="gemini", enabled=True), "aider": OrchestratorConfig(name="aider", command="aider", enabled=False), }, rules=[], ) # Should not raise exception config.validate() def test_validate_minimum_agents_failure_zero(): """Test validation fails with no enabled agents.""" config = DelegationConfig( orchestrator="claude", orchestrators={ "claude": OrchestratorConfig(name="claude", command="claude", enabled=False), "gemini": OrchestratorConfig(name="gemini", command="gemini", enabled=False), }, rules=[], ) with pytest.raises(ConfigValidationError) as exc_info: config.validate() assert "At least 2 agents must be enabled" in str(exc_info.value) assert "only 0 are enabled" in str(exc_info.value) def test_validate_minimum_agents_failure_one(): """Test validation fails with only one enabled agent.""" config = DelegationConfig( orchestrator="claude", orchestrators={ "claude": OrchestratorConfig(name="claude", command="claude", enabled=True), "gemini": OrchestratorConfig(name="gemini", command="gemini", enabled=False), }, rules=[], ) with pytest.raises(ConfigValidationError) as exc_info: config.validate() assert "At least 2 agents must be enabled" in str(exc_info.value) assert "only 1 is enabled" in str(exc_info.value) def test_validate_regex_patterns_success(): """Test validation passes with valid regex patterns.""" config = DelegationConfig( orchestrator="claude", orchestrators={ "claude": OrchestratorConfig(name="claude", command="claude", enabled=True), "gemini": OrchestratorConfig(name="gemini", command="gemini", enabled=True), }, rules=[ DelegationRule(pattern="security|audit", delegate_to="gemini", priority=5), DelegationRule(pattern="refactor.*code", delegate_to="claude", priority=3), DelegationRule(pattern="^test", delegate_to="gemini", priority=2), ], ) # Should not raise exception config.validate() def test_validate_regex_patterns_failure(): """Test validation fails with invalid regex patterns.""" config = DelegationConfig( orchestrator="claude", orchestrators={ "claude": OrchestratorConfig(name="claude", command="claude", enabled=True), "gemini": OrchestratorConfig(name="gemini", command="gemini", enabled=True), }, rules=[ DelegationRule( pattern="valid_pattern", delegate_to="gemini", priority=5 ), DelegationRule( pattern="[invalid(regex", delegate_to="claude", priority=3 ), # Invalid regex DelegationRule( pattern="(?P