mirror of
https://github.com/Xe138/AI-Trader.git
synced 2026-04-01 17:17:24 -04:00
feat: add comprehensive config validation
This commit is contained in:
@@ -2,7 +2,7 @@ import pytest
|
||||
import json
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
from tools.config_merger import load_config, ConfigValidationError, merge_configs
|
||||
from tools.config_merger import load_config, ConfigValidationError, merge_configs, validate_config
|
||||
|
||||
|
||||
def test_load_config_valid_json():
|
||||
@@ -76,3 +76,101 @@ def test_merge_configs_does_not_mutate_inputs():
|
||||
|
||||
assert default["a"] == 1 # Original unchanged
|
||||
assert result["a"] == 2
|
||||
|
||||
|
||||
def test_validate_config_valid():
|
||||
"""Test validation passes for valid config"""
|
||||
config = {
|
||||
"agent_type": "BaseAgent",
|
||||
"models": [
|
||||
{"name": "test", "basemodel": "openai/gpt-4", "signature": "test", "enabled": True}
|
||||
],
|
||||
"agent_config": {
|
||||
"max_steps": 30,
|
||||
"max_retries": 3,
|
||||
"initial_cash": 10000.0
|
||||
},
|
||||
"log_config": {"log_path": "./data"}
|
||||
}
|
||||
|
||||
validate_config(config) # Should not raise
|
||||
|
||||
|
||||
def test_validate_config_missing_required_field():
|
||||
"""Test validation fails for missing required field"""
|
||||
config = {"agent_type": "BaseAgent"} # Missing models, agent_config, log_config
|
||||
|
||||
with pytest.raises(ConfigValidationError, match="Missing required field"):
|
||||
validate_config(config)
|
||||
|
||||
|
||||
def test_validate_config_no_enabled_models():
|
||||
"""Test validation fails when no models are enabled"""
|
||||
config = {
|
||||
"agent_type": "BaseAgent",
|
||||
"models": [
|
||||
{"name": "test", "basemodel": "openai/gpt-4", "signature": "test", "enabled": False}
|
||||
],
|
||||
"agent_config": {"max_steps": 30, "max_retries": 3, "initial_cash": 10000.0},
|
||||
"log_config": {"log_path": "./data"}
|
||||
}
|
||||
|
||||
with pytest.raises(ConfigValidationError, match="At least one model must be enabled"):
|
||||
validate_config(config)
|
||||
|
||||
|
||||
def test_validate_config_duplicate_signatures():
|
||||
"""Test validation fails for duplicate model signatures"""
|
||||
config = {
|
||||
"agent_type": "BaseAgent",
|
||||
"models": [
|
||||
{"name": "test1", "basemodel": "openai/gpt-4", "signature": "same", "enabled": True},
|
||||
{"name": "test2", "basemodel": "openai/gpt-5", "signature": "same", "enabled": True}
|
||||
],
|
||||
"agent_config": {"max_steps": 30, "max_retries": 3, "initial_cash": 10000.0},
|
||||
"log_config": {"log_path": "./data"}
|
||||
}
|
||||
|
||||
with pytest.raises(ConfigValidationError, match="Duplicate model signature"):
|
||||
validate_config(config)
|
||||
|
||||
|
||||
def test_validate_config_invalid_max_steps():
|
||||
"""Test validation fails for invalid max_steps"""
|
||||
config = {
|
||||
"agent_type": "BaseAgent",
|
||||
"models": [{"name": "test", "basemodel": "openai/gpt-4", "signature": "test", "enabled": True}],
|
||||
"agent_config": {"max_steps": 0, "max_retries": 3, "initial_cash": 10000.0},
|
||||
"log_config": {"log_path": "./data"}
|
||||
}
|
||||
|
||||
with pytest.raises(ConfigValidationError, match="max_steps must be > 0"):
|
||||
validate_config(config)
|
||||
|
||||
|
||||
def test_validate_config_invalid_date_format():
|
||||
"""Test validation fails for invalid date format"""
|
||||
config = {
|
||||
"agent_type": "BaseAgent",
|
||||
"date_range": {"init_date": "2025-13-01", "end_date": "2025-12-31"}, # Invalid month
|
||||
"models": [{"name": "test", "basemodel": "openai/gpt-4", "signature": "test", "enabled": True}],
|
||||
"agent_config": {"max_steps": 30, "max_retries": 3, "initial_cash": 10000.0},
|
||||
"log_config": {"log_path": "./data"}
|
||||
}
|
||||
|
||||
with pytest.raises(ConfigValidationError, match="Invalid date format"):
|
||||
validate_config(config)
|
||||
|
||||
|
||||
def test_validate_config_end_before_init():
|
||||
"""Test validation fails when end_date before init_date"""
|
||||
config = {
|
||||
"agent_type": "BaseAgent",
|
||||
"date_range": {"init_date": "2025-12-31", "end_date": "2025-01-01"},
|
||||
"models": [{"name": "test", "basemodel": "openai/gpt-4", "signature": "test", "enabled": True}],
|
||||
"agent_config": {"max_steps": 30, "max_retries": 3, "initial_cash": 10000.0},
|
||||
"log_config": {"log_path": "./data"}
|
||||
}
|
||||
|
||||
with pytest.raises(ConfigValidationError, match="init_date must be <= end_date"):
|
||||
validate_config(config)
|
||||
|
||||
Reference in New Issue
Block a user