import os import sys from datetime import datetime PROJECT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) if PROJECT_DIR not in sys.path: sys.path.insert(0, PROJECT_DIR) from app.db import altcoin_db def test_strategy_version_from_meta(): original_get_meta = altcoin_db.get_meta try: altcoin_db.get_meta = lambda: {"strategy_version": "v2026.04.30-r1"} assert altcoin_db.get_meta().get("strategy_version") == "v2026.04.30-r1" finally: altcoin_db.get_meta = original_get_meta def test_create_recommendation_persists_strategy_version(monkeypatch): original_get_conn = altcoin_db.get_conn original_meta = altcoin_db.get_meta class FakeCursor: lastrowid = 321 class FakeConn: def __init__(self): self.sql = None self.params = None self.committed = False self.closed = False def execute(self, sql, params=()): self.sql = sql self.params = params return FakeCursor() def commit(self): self.committed = True def close(self): self.closed = True fake_conn = FakeConn() monkeypatch.setattr(altcoin_db, "get_conn", lambda: fake_conn) monkeypatch.setattr(altcoin_db, "get_meta", lambda: {"strategy_version": "v2026.04.30-r2"}) rec_id = altcoin_db.create_recommendation( symbol="AI/USDT", rec_state="加速", rec_score=7, entry_price=1.23, stop_loss=1.1, tp1=1.4, tp2=1.6, sector="AI", signals=["量价齐飞"], is_meme=0, entry_plan={"entry_action": "可即刻买入"}, direction="多头启动", ) assert rec_id == 321 assert "strategy_version" in fake_conn.sql assert fake_conn.params[-1] == "v2026.04.30-r2" assert fake_conn.committed is True assert fake_conn.closed is True altcoin_db.get_conn = original_get_conn altcoin_db.get_meta = original_meta def test_derive_execution_fields_exposes_strategy_version(): item = { "status": "active", "action_status": "持有", "entry_plan_json": "{}", "strategy_version": "v2026.04.30-r3", } result = altcoin_db._derive_execution_fields(item) assert result["strategy_version"] == "v2026.04.30-r3" assert result["strategy_version_label"] == "策略版本 v2026.04.30-r3"