import os import pytest from src.config import Config def test_config_loads_symbol(): os.environ["SYMBOL"] = "XRPUSDT" os.environ["LEVERAGE"] = "10" cfg = Config() assert cfg.symbol == "XRPUSDT" assert cfg.leverage == 10 def test_config_dynamic_margin_params(): os.environ["MARGIN_MAX_RATIO"] = "0.50" os.environ["MARGIN_MIN_RATIO"] = "0.20" os.environ["MARGIN_DECAY_RATE"] = "0.0006" cfg = Config() assert cfg.margin_max_ratio == 0.50 assert cfg.margin_min_ratio == 0.20 assert cfg.margin_decay_rate == 0.0006 def test_config_loads_symbols_list(): """SYMBOLS 환경변수로 쉼표 구분 리스트를 로드한다.""" os.environ["SYMBOLS"] = "XRPUSDT,TRXUSDT,DOGEUSDT" os.environ.pop("SYMBOL", None) cfg = Config() assert cfg.symbols == ["XRPUSDT", "TRXUSDT", "DOGEUSDT"] def test_config_fallback_to_symbol(): """SYMBOLS 미설정 시 SYMBOL에서 1개짜리 리스트로 변환한다.""" os.environ.pop("SYMBOLS", None) os.environ["SYMBOL"] = "XRPUSDT" cfg = Config() assert cfg.symbols == ["XRPUSDT"] def test_config_correlation_symbols(): """상관관계 심볼 로드.""" os.environ["CORRELATION_SYMBOLS"] = "BTCUSDT,ETHUSDT" cfg = Config() assert cfg.correlation_symbols == ["BTCUSDT", "ETHUSDT"] def test_config_max_same_direction_default(): """동일 방향 최대 수 기본값 2.""" cfg = Config() assert cfg.max_same_direction == 2 def test_config_rejects_zero_leverage(): """LEVERAGE=0은 ValueError.""" os.environ["LEVERAGE"] = "0" with pytest.raises(ValueError, match="LEVERAGE"): Config() os.environ["LEVERAGE"] = "10" # 복원 def test_config_rejects_invalid_margin_ratio(): """MARGIN_MAX_RATIO가 0이면 ValueError.""" os.environ["MARGIN_MAX_RATIO"] = "0" with pytest.raises(ValueError, match="MARGIN_MAX_RATIO"): Config() os.environ["MARGIN_MAX_RATIO"] = "0.50" # 복원 def test_config_rejects_min_gt_max_margin(): """MARGIN_MIN > MAX이면 ValueError.""" os.environ["MARGIN_MIN_RATIO"] = "0.80" os.environ["MARGIN_MAX_RATIO"] = "0.50" with pytest.raises(ValueError, match="MARGIN_MIN_RATIO"): Config() os.environ["MARGIN_MIN_RATIO"] = "0.20" # 복원