103 lines
2.4 KiB
Python
103 lines
2.4 KiB
Python
"""Tests für REST-API / Dashboard (trademind serve)."""
|
|
import textwrap
|
|
|
|
import pytest
|
|
|
|
from trademind.config import ServerConfig, load
|
|
|
|
|
|
CFG = textwrap.dedent(
|
|
"""
|
|
trading:
|
|
base_currency: BTC
|
|
quote_currency: USDT
|
|
candles: 120
|
|
"""
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def cfg_file(tmp_path):
|
|
p = tmp_path / "config.yaml"
|
|
p.write_text(CFG, encoding="utf-8")
|
|
return str(p)
|
|
|
|
|
|
@pytest.fixture
|
|
def client(cfg_file):
|
|
from fastapi.testclient import TestClient
|
|
|
|
from trademind.server import make_app
|
|
|
|
app = make_app(cfg_file, data="mock", exchange="binance")
|
|
with TestClient(app) as c:
|
|
yield c
|
|
|
|
|
|
def test_server_config_defaults_and_env():
|
|
assert ServerConfig().port == 8080
|
|
assert ServerConfig().host == "0.0.0.0"
|
|
cfg = ServerConfig.from_dict({"port": "9443", "host": "127.0.0.1"})
|
|
assert cfg.port == 9443
|
|
assert cfg.host == "127.0.0.1"
|
|
|
|
|
|
def test_config_load_includes_server(cfg_file):
|
|
cfg = load(cfg_file)
|
|
assert cfg.server.port == 8080
|
|
assert cfg.server.host == "0.0.0.0"
|
|
|
|
|
|
def test_health(client):
|
|
r = client.get("/api/health")
|
|
assert r.status_code == 200
|
|
body = r.json()
|
|
assert body["status"] == "ok"
|
|
assert body["version"]
|
|
|
|
|
|
def test_dashboard_html(client):
|
|
r = client.get("/")
|
|
assert r.status_code == 200
|
|
assert "text/html" in r.headers["content-type"]
|
|
assert "TradeMind" in r.text
|
|
|
|
|
|
def test_status(client):
|
|
r = client.get("/api/status")
|
|
assert r.status_code == 200
|
|
body = r.json()
|
|
assert body["symbol"] == "BTC/USDT"
|
|
assert body["trading"]["candles"] == 120
|
|
assert body["last_run"] is None
|
|
|
|
|
|
def test_signals_mock_data(client):
|
|
r = client.get("/api/signals?limit=10")
|
|
assert r.status_code == 200
|
|
body = r.json()
|
|
assert body["broker"] == "mock"
|
|
sigs = body["signals"]
|
|
assert sigs, "expected at least one signal"
|
|
last = sigs[-1]
|
|
assert last["action"] in (-1, 0, 1, 2)
|
|
assert last["price"] > 0
|
|
assert isinstance(last["score"], (int, float))
|
|
|
|
|
|
def test_paper_run_and_equity(client):
|
|
r = client.post("/api/paper")
|
|
assert r.status_code == 200
|
|
body = r.json()
|
|
assert body["summary"]["final_equity"] > 0
|
|
assert len(body["equity_curve"]) > 1
|
|
|
|
eq = client.get("/api/equity")
|
|
assert eq.status_code == 200
|
|
ebody = eq.json()
|
|
assert ebody["summary"]["final_equity"] > 0
|
|
assert ebody["equity_curve"]
|
|
|
|
st = client.get("/api/status")
|
|
assert st.json()["last_run"]["broker"] == "mock"
|