93 lines
2.6 KiB
Python
93 lines
2.6 KiB
Python
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:
|
|
def __init__(self, row=None):
|
|
self._row = row
|
|
|
|
def fetchone(self):
|
|
return self._row
|
|
|
|
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
|
|
if str(sql).lstrip().upper().startswith("SELECT"):
|
|
return FakeCursor()
|
|
return FakeCursor({"id": 321})
|
|
|
|
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"
|