import json 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 from app.db.analytics import get_observation_candidates def test_observation_candidates_expose_coin_state_as_watch_pool(monkeypatch, tmp_path): db_path = tmp_path / "obs.db" monkeypatch.setattr(altcoin_db, "DB_PATH", str(db_path)) import app.db.schema as schema monkeypatch.setattr(schema, "DB_PATH", str(db_path), raising=False) altcoin_db.init_db() detail = { "price": 1.23, "signals": ["当前4H静K蓄力", "大户偏多(69%)"], "market_context": {"trigger_context": {"trigger_status": "current"}}, "derivatives_context": {"top_trader_long_pct": 69}, "sector_context": {"hot_sectors": ["AI_DePIN"]}, } conn = altcoin_db.get_conn() conn.execute( """ INSERT INTO coin_state ( symbol, state, score, anomaly_type, sector, leader_status, detected_at, detail_json ) VALUES (?, ?, ?, ?, ?, ?, ?, ?) """, ( "OBS/USDT", "蓄力", 5, "", "AI_DePIN", "", datetime.now().isoformat(), json.dumps(detail, ensure_ascii=False), ), ) conn.commit() conn.close() data = get_observation_candidates(limit=10) assert data["summary"]["source"] == "coin_state" assert len(data["items"]) == 1 item = data["items"][0] assert item["symbol"] == "OBS/USDT" assert item["display_bucket"] == "watch_pool" assert item["execution_status"] == "observe" assert item["entry_triggered"] == 0 assert item["current_price"] == 1.23 assert item["signals"] == ["当前4H静K蓄力", "大户偏多(69%)"]