Merge pull request #37 from aguzererler/fix-max-positions-validation-test-9122767223538480688

🧪 Add comprehensive unit tests for portfolio config validation
This commit is contained in:
ahmet guzererler 2026-03-21 02:36:49 +01:00 committed by GitHub
commit 2becf7fca4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 104 additions and 0 deletions

View File

@ -0,0 +1,104 @@
"""Tests for tradingagents/portfolio/config.py."""
import pytest
from tradingagents.portfolio.config import validate_config
def test_validate_config_valid():
"""Happy path: valid configuration."""
cfg = {
"max_positions": 10,
"max_position_pct": 0.1,
"max_sector_pct": 0.3,
"min_cash_pct": 0.05,
"default_budget": 100000.0
}
# Should not raise any exception
validate_config(cfg)
def test_validate_config_max_positions_invalid():
"""max_positions must be >= 1."""
cfg = {
"max_positions": 0,
"max_position_pct": 0.1,
"max_sector_pct": 0.3,
"min_cash_pct": 0.05,
"default_budget": 100000.0
}
with pytest.raises(ValueError, match=r"max_positions must be >= 1"):
validate_config(cfg)
cfg["max_positions"] = -1
with pytest.raises(ValueError, match=r"max_positions must be >= 1"):
validate_config(cfg)
def test_validate_config_max_position_pct_invalid():
"""max_position_pct must be in (0, 1]."""
cfg = {
"max_positions": 10,
"max_position_pct": 0.0,
"max_sector_pct": 0.3,
"min_cash_pct": 0.05,
"default_budget": 100000.0
}
with pytest.raises(ValueError, match=r"max_position_pct must be in \(0, 1\]"):
validate_config(cfg)
cfg["max_position_pct"] = 1.1
with pytest.raises(ValueError, match=r"max_position_pct must be in \(0, 1\]"):
validate_config(cfg)
def test_validate_config_max_sector_pct_invalid():
"""max_sector_pct must be in (0, 1]."""
cfg = {
"max_positions": 10,
"max_position_pct": 0.1,
"max_sector_pct": 0.0,
"min_cash_pct": 0.05,
"default_budget": 100000.0
}
with pytest.raises(ValueError, match=r"max_sector_pct must be in \(0, 1\]"):
validate_config(cfg)
cfg["max_sector_pct"] = 1.1
with pytest.raises(ValueError, match=r"max_sector_pct must be in \(0, 1\]"):
validate_config(cfg)
def test_validate_config_min_cash_pct_invalid():
"""min_cash_pct must be in [0, 1)."""
cfg = {
"max_positions": 10,
"max_position_pct": 0.1,
"max_sector_pct": 0.3,
"min_cash_pct": -0.1,
"default_budget": 100000.0
}
with pytest.raises(ValueError, match=r"min_cash_pct must be in \[0, 1\)"):
validate_config(cfg)
cfg["min_cash_pct"] = 1.0
with pytest.raises(ValueError, match=r"min_cash_pct must be in \[0, 1\)"):
validate_config(cfg)
def test_validate_config_default_budget_invalid():
"""default_budget must be > 0."""
cfg = {
"max_positions": 10,
"max_position_pct": 0.1,
"max_sector_pct": 0.3,
"min_cash_pct": 0.05,
"default_budget": 0.0
}
with pytest.raises(ValueError, match=r"default_budget must be > 0"):
validate_config(cfg)
def test_validate_config_sum_constraints_invalid():
"""min_cash_pct + max_position_pct must be <= 1.0."""
cfg = {
"max_positions": 10,
"max_position_pct": 0.6,
"max_sector_pct": 0.3,
"min_cash_pct": 0.5,
"default_budget": 100000.0
}
with pytest.raises(ValueError, match=r"must be <= 1.0"):
validate_config(cfg)