Files
crypto_trader/tests/integration/backend/test_api_workflows.py

96 lines
3.4 KiB
Python

"""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()