Files

96 lines
3.4 KiB
Python
Raw Permalink Normal View History

"""Integration tests for API workflows."""
import pytest
from fastapi.testclient import TestClient
from unittest.mock import patch, Mock
from backend.main import app
@pytest.fixture
def client():
"""Test client fixture."""
return TestClient(app)
@pytest.mark.integration
class TestTradingWorkflow:
"""Test complete trading workflow through API."""
@patch('backend.api.trading.get_trading_engine')
@patch('backend.api.trading.get_db')
def test_complete_trading_workflow(self, mock_get_db, mock_get_engine, client):
"""Test: Place order → Check order status → Get positions."""
# Setup mocks
mock_engine = Mock()
mock_order = Mock()
mock_order.id = 1
mock_order.symbol = "BTC/USD"
mock_order.side = "buy"
mock_order.status = "filled"
mock_engine.execute_order.return_value = mock_order
mock_get_engine.return_value = mock_engine
mock_db = Mock()
mock_session = Mock()
mock_db.get_session.return_value = mock_session
mock_get_db.return_value = mock_db
# Mock order query
mock_session.query.return_value.filter_by.return_value.order_by.return_value.limit.return_value.all.return_value = [mock_order]
mock_session.query.return_value.filter_by.return_value.first.return_value = mock_order
# Place order
order_data = {
"exchange_id": 1,
"symbol": "BTC/USD",
"side": "buy",
"order_type": "market",
"quantity": "0.1",
"paper_trading": True
}
create_response = client.post("/api/trading/orders", json=order_data)
assert create_response.status_code == 200
order_id = create_response.json()["id"]
# Get order status
status_response = client.get(f"/api/trading/orders/{order_id}")
assert status_response.status_code == 200
assert status_response.json()["id"] == order_id
# Get orders list
orders_response = client.get("/api/trading/orders")
assert orders_response.status_code == 200
assert isinstance(orders_response.json(), list)
@pytest.mark.integration
class TestPortfolioWorkflow:
"""Test portfolio workflow through API."""
@patch('backend.api.portfolio.get_portfolio_tracker')
def test_portfolio_workflow(self, mock_get_tracker, client):
"""Test: Get current portfolio → Get portfolio history."""
mock_tracker = Mock()
mock_tracker.get_current_portfolio.return_value = {
"positions": [],
"performance": {"total_return": 0.1},
"timestamp": "2025-01-01T00:00:00"
}
mock_tracker.get_portfolio_history.return_value = [
{"timestamp": "2025-01-01T00:00:00", "total_value": 1000.0, "total_pnl": 0.0}
]
mock_get_tracker.return_value = mock_tracker
# Get current portfolio
current_response = client.get("/api/portfolio/current?paper_trading=true")
assert current_response.status_code == 200
assert "positions" in current_response.json()
# Get portfolio history
history_response = client.get("/api/portfolio/history?paper_trading=true&days=30")
assert history_response.status_code == 200
assert "dates" in history_response.json()