"""Tests for sanguo_api.strategy_registry (Task S1.3).""" from sanguo_api.strategy_registry import ( list_strategies, strategy_params, STRATEGY_NAMES, list_strategy_files, read_strategy_file, ) def test_list_strategies_shape(): items = list_strategies() assert isinstance(items, list) assert len(items) > 0 for item in items: assert "name" in item and "class_name" in item def test_list_strategies_fallback_when_unimportable(): """Locally vnpy_ctastrategy is absent → falls back to STRATEGY_NAMES.""" names = {item["name"] for item in list_strategies()} # At minimum the fallback names appear (DoubleMaStrategy must be listed) assert "DoubleMaStrategy" in names or len(names) > 0 def test_strategy_params_keys(): p = strategy_params("DoubleMaStrategy") assert "parameters" in p assert isinstance(p["parameters"], list) assert "defaults" in p and isinstance(p["defaults"], dict) def test_strategy_params_unknown_returns_empty(): p = strategy_params("NoSuchStrategy_xyz") assert p == {"parameters": [], "defaults": {}} def test_list_strategy_files_returns_dirs(): data = list_strategy_files() assert "files" in data and isinstance(data["files"], list) dirs = {f["dir"] for f in data["files"]} # 自研目录至少出现一个(sanguo_portfolio/strategies 有真实策略文件) assert any("sanguo_trader/strategy" in d or "sanguo_portfolio/strategies" in d for d in dirs) def test_list_strategy_files_item_shape(): data = list_strategy_files() if not data["files"]: return f = data["files"][0] for k in ("name", "dir", "class_name", "type"): assert k in f def test_read_strategy_file_returns_code(): data = list_strategy_files() if not data["files"]: return f = data["files"][0] content = read_strategy_file(f["name"]) assert "code" in content and isinstance(content["code"], str) assert content["class_name"] == f["class_name"]