alphax/tests/test_price_tracker_watch_only_guard.py
2026-05-18 00:58:19 +08:00

48 lines
1.9 KiB
Python

import os
import sys
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.services import price_tracker
def test_watch_only_recommendation_is_skipped_before_take_profit_push(monkeypatch):
rec = {
"id": 1,
"symbol": "QNT/USDT",
"entry_price": 100.0,
"stop_loss": 95.0,
"tp1": 110.0,
"tp2": 120.0,
"entry_plan": {},
"entry_triggered": 0,
"display_bucket": "watch_pool",
"execution_status": "observe",
"action_status": "观察",
}
monkeypatch.setattr(price_tracker, "get_active_recommendations", lambda actionable_only=True: [rec])
monkeypatch.setattr(price_tracker.exchange, "fetch_ticker", lambda symbol: {"last": 102.0})
monkeypatch.setattr(price_tracker, "update_latest_price_cache", lambda *args, **kwargs: None)
monkeypatch.setattr(price_tracker, "update_recommendation_tracking", lambda rec_id, current_price: {"status": "active"})
monkeypatch.setattr(price_tracker, "analyze_tracking_signals", lambda symbol, rec, current_price: {
"action_status": "持有",
"sell_signals": [],
"buy_signals": [],
"exhaustion": {"severity": "low"},
"pnl_pct": 0.0,
})
monkeypatch.setattr(price_tracker, "apply_recommendation_state_transition", lambda *args, **kwargs: {"action_status": "观察", "push_required": False})
pushed = []
monkeypatch.setattr(price_tracker, "push_trade_action_update", lambda *args, **kwargs: pushed.append((args, kwargs)) or True)
monkeypatch.setattr(price_tracker, "expire_old_recommendations", lambda: None)
monkeypatch.setattr(price_tracker, "get_stats", lambda: {"active_count": 1})
output = price_tracker.track_prices()
assert output["tracked_count"] == 0
assert output["results"][0]["status"] == "skipped_watch_only"
assert pushed == []