75 lines
3.3 KiB
Python
75 lines
3.3 KiB
Python
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"
|