from fastapi.testclient import TestClient from app.db import auth_db from app.services import market_overview from app.web import routes_market, web_server def _login_subscribed_user(email="market-user@example.com"): reg = auth_db.register_user(email, "StrongPass123") auth_db.verify_email(email, reg["verification_code"]) user = auth_db.get_user_by_email(email) auth_db.claim_free_trial(user["id"]) return auth_db.login_user(email, "StrongPass123")["token"] def test_crypto_market_overview_uses_full_market_inputs(monkeypatch): monkeypatch.setattr(market_overview.altcoin_screener, "fetch_all_tickers", lambda: { "AAA/USDT": {"price": 1, "change_24h": 7, "volume_24h": 100_000_000}, "BBB/USDT": {"price": 2, "change_24h": 4, "volume_24h": 60_000_000}, "CCC/USDT": {"price": 3, "change_24h": -1, "volume_24h": 30_000_000}, "DDD/USDT": {"price": 4, "change_24h": -6, "volume_24h": 20_000_000}, }) monkeypatch.setattr(market_overview, "_funding_snapshot", lambda: { "AAA/USDT": 0.0002, "BBB/USDT": -0.0001, "CCC/USDT": 0.0012, }) monkeypatch.setattr(market_overview.altcoin_screener.exchange, "fetch_tickers", lambda *args, **kwargs: { "BTC/USDT": {"last": 100_000, "percentage": 1.5, "quoteVolume": 1_000_000_000}, "ETH/USDT": {"last": 5_000, "percentage": 2.1, "quoteVolume": 800_000_000}, }) monkeypatch.setattr(market_overview, "_benchmark_overview", lambda pairs=None: { "BTC/USDT": {"symbol": "BTC/USDT", "price": 100_000, "change_24h": 1.5, "volume_24h": 1_000_000_000}, "ETH/USDT": {"symbol": "ETH/USDT", "price": 5_000, "change_24h": 2.1, "volume_24h": 800_000_000}, }) overview = market_overview.compute_crypto_market_overview() assert overview["source"] == "binance_spot_usdt_market" assert overview["sample_count"] == 4 assert overview["up_count"] == 2 assert overview["down_count"] == 2 assert overview["hot_count_5pct"] == 1 assert overview["crash_count_5pct"] == 1 assert overview["benchmarks"]["BTC/USDT"]["change_24h"] == 1.5 assert overview["top_gainers"][0]["symbol"] == "AAA/USDT" assert overview["top_volume"][0]["symbol"] == "AAA/USDT" assert overview["funding"]["sample_count"] == 3 assert overview["funding"]["extreme_positive_count"] == 1 def test_market_overview_api_returns_crypto_market_not_candidate_stats(monkeypatch): monkeypatch.setattr(routes_market, "get_crypto_market_overview", lambda: { "updated_at": "2026-05-17T12:00:00", "source": "binance_spot_usdt_market", "sample_count": 2, "state": {"label": "结构性行情", "tone": "neutral", "summary": "精选机会"}, "benchmarks": {}, "top_gainers": [], "top_volume": [], "funding": {"sample_count": 0}, }) token = _login_subscribed_user() client = TestClient(web_server.app) client.cookies.set("altcoin_session", token) resp = client.get("/api/market/overview") assert resp.status_code == 200 data = resp.json() assert data["market"]["crypto_market"]["source"] == "binance_spot_usdt_market" assert "stats" not in data["market"] assert "market_context_overview" not in data["market"] assert "onchain" not in data["market"] assert resp.headers["cache-control"] == "no-cache, no-store, must-revalidate"