workspace-v1/projects/trading-platform/apps/ml-engine/tests/test_api.py
rckrdmrd 66161b1566 feat: Workspace-v1 complete migration with NEXUS v3.4
Sistema NEXUS v3.4 migrado con:

Estructura principal:
- core/orchestration: Sistema SIMCO + CAPVED (27 directivas, 28 perfiles)
- core/catalog: Catalogo de funcionalidades reutilizables
- shared/knowledge-base: Base de conocimiento compartida
- devtools/scripts: Herramientas de desarrollo
- control-plane/registries: Control de servicios y CI/CD
- orchestration/: Configuracion de orquestacion de agentes

Proyectos incluidos (11):
- gamilit (submodule -> GitHub)
- trading-platform (OrbiquanTIA)
- erp-suite con 5 verticales:
  - erp-core, construccion, vidrio-templado
  - mecanicas-diesel, retail, clinicas
- betting-analytics
- inmobiliaria-analytics
- platform_marketing_content
- pos-micro, erp-basico

Configuracion:
- .gitignore completo para Node.js/Python/Docker
- gamilit como submodule (git@github.com:rckrdmrd/gamilit-workspace.git)
- Sistema de puertos estandarizado (3005-3199)

Generated with NEXUS v3.4 Migration System
EPIC-010: Configuracion Git y Repositorios
2026-01-04 03:37:42 -06:00

192 lines
5.0 KiB
Python

"""
Test ML Engine API endpoints
"""
import pytest
from fastapi.testclient import TestClient
from datetime import datetime
from src.api.main import app
@pytest.fixture
def client():
"""Create test client"""
return TestClient(app)
def test_health_check(client):
"""Test health check endpoint"""
response = client.get("/health")
assert response.status_code == 200
data = response.json()
assert data["status"] == "healthy"
assert "version" in data
assert "timestamp" in data
assert isinstance(data["models_loaded"], bool)
def test_list_models(client):
"""Test list models endpoint"""
response = client.get("/models")
assert response.status_code == 200
assert isinstance(response.json(), list)
def test_list_symbols(client):
"""Test list symbols endpoint"""
response = client.get("/symbols")
assert response.status_code == 200
symbols = response.json()
assert isinstance(symbols, list)
assert "XAUUSD" in symbols
assert "EURUSD" in symbols
def test_predict_range(client):
"""Test range prediction endpoint"""
request_data = {
"symbol": "XAUUSD",
"timeframe": "15m",
"horizon": "15m"
}
response = client.post("/predict/range", json=request_data)
# May return 503 if models not loaded, which is acceptable
assert response.status_code in [200, 503]
if response.status_code == 200:
data = response.json()
assert isinstance(data, list)
assert len(data) > 0
def test_predict_tpsl(client):
"""Test TP/SL prediction endpoint"""
request_data = {
"symbol": "XAUUSD",
"timeframe": "15m",
"horizon": "15m"
}
response = client.post("/predict/tpsl?rr_config=rr_2_1", json=request_data)
# May return 503 if models not loaded
assert response.status_code in [200, 503]
if response.status_code == 200:
data = response.json()
assert "prob_tp_first" in data
assert "rr_config" in data
assert "confidence" in data
def test_generate_signal(client):
"""Test signal generation endpoint"""
request_data = {
"symbol": "XAUUSD",
"timeframe": "15m",
"horizon": "15m"
}
response = client.post("/generate/signal?rr_config=rr_2_1", json=request_data)
# May return 503 if models not loaded
assert response.status_code in [200, 503]
if response.status_code == 200:
data = response.json()
assert "signal_id" in data
assert "symbol" in data
assert "direction" in data
assert "entry_price" in data
assert "stop_loss" in data
assert "take_profit" in data
def test_amd_detection(client):
"""Test AMD phase detection endpoint"""
response = client.post("/api/amd/XAUUSD?timeframe=15m&lookback_periods=100")
# May return 503 if AMD detector not loaded
assert response.status_code in [200, 503]
if response.status_code == 200:
data = response.json()
assert "phase" in data
assert "confidence" in data
assert "strength" in data
assert "characteristics" in data
assert "signals" in data
assert "trading_bias" in data
def test_backtest(client):
"""Test backtesting endpoint"""
request_data = {
"symbol": "XAUUSD",
"start_date": "2024-01-01T00:00:00",
"end_date": "2024-02-01T00:00:00",
"initial_capital": 10000.0,
"risk_per_trade": 0.02,
"rr_config": "rr_2_1",
"filter_by_amd": True,
"min_confidence": 0.55
}
response = client.post("/api/backtest", json=request_data)
# May return 503 if backtester not loaded
assert response.status_code in [200, 503]
if response.status_code == 200:
data = response.json()
assert "total_trades" in data
assert "winrate" in data
assert "net_profit" in data
assert "profit_factor" in data
assert "max_drawdown" in data
def test_train_models(client):
"""Test model training endpoint"""
request_data = {
"symbol": "XAUUSD",
"start_date": "2023-01-01T00:00:00",
"end_date": "2024-01-01T00:00:00",
"models_to_train": ["range_predictor", "tpsl_classifier"],
"use_walk_forward": True,
"n_splits": 5
}
response = client.post("/api/train/full", json=request_data)
# May return 503 if pipeline not loaded
assert response.status_code in [200, 503]
if response.status_code == 200:
data = response.json()
assert "status" in data
assert "models_trained" in data
assert "metrics" in data
assert "model_paths" in data
def test_websocket_connection(client):
"""Test WebSocket connection"""
with client.websocket_connect("/ws/signals") as websocket:
# Send a test message
websocket.send_text("test")
# Receive response
data = websocket.receive_json()
assert "type" in data
assert "data" in data
if __name__ == "__main__":
pytest.main([__file__, "-v"])