109 lines
3.3 KiB
Python
109 lines
3.3 KiB
Python
"""Tests for strategies API endpoints."""
|
|
|
|
import pytest
|
|
from unittest.mock import Mock, patch, MagicMock
|
|
from fastapi.testclient import TestClient
|
|
|
|
from backend.main import app
|
|
from src.core.database import Strategy
|
|
|
|
|
|
@pytest.fixture
|
|
def client():
|
|
"""Test client fixture."""
|
|
return TestClient(app)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_strategy_registry():
|
|
"""Mock strategy registry."""
|
|
registry = Mock()
|
|
registry.list_available.return_value = ["RSIStrategy", "MACDStrategy"]
|
|
return registry
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_strategy():
|
|
"""Mock strategy object."""
|
|
strategy = Mock(spec=Strategy)
|
|
strategy.id = 1
|
|
strategy.name = "Test Strategy"
|
|
strategy.type = "RSIStrategy"
|
|
strategy.status = "active" # Use string instead of enum
|
|
strategy.symbol = "BTC/USD"
|
|
strategy.params = {}
|
|
return strategy
|
|
|
|
|
|
|
|
class TestListStrategies:
|
|
"""Tests for GET /api/strategies."""
|
|
|
|
@patch('backend.api.strategies.get_db')
|
|
def test_list_strategies_success(self, mock_get_db, client):
|
|
"""Test listing strategies."""
|
|
mock_db = Mock()
|
|
mock_session = Mock()
|
|
mock_db.get_session.return_value = mock_session
|
|
mock_get_db.return_value = mock_db
|
|
|
|
mock_session.query.return_value.all.return_value = []
|
|
|
|
response = client.get("/api/strategies")
|
|
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert isinstance(data, list)
|
|
|
|
|
|
class TestGetStrategy:
|
|
"""Tests for GET /api/strategies/{strategy_id}."""
|
|
|
|
@patch('backend.api.strategies.get_db')
|
|
def test_get_strategy_success(self, mock_get_db, client, mock_strategy):
|
|
"""Test getting strategy by ID."""
|
|
mock_db = Mock()
|
|
mock_session = Mock()
|
|
mock_db.get_session.return_value = mock_session
|
|
mock_get_db.return_value = mock_db
|
|
|
|
mock_session.query.return_value.filter_by.return_value.first.return_value = mock_strategy
|
|
|
|
response = client.get("/api/strategies/1")
|
|
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["id"] == 1
|
|
|
|
@patch('backend.api.strategies.get_db')
|
|
def test_get_strategy_not_found(self, mock_get_db, client):
|
|
"""Test getting non-existent strategy."""
|
|
mock_db = Mock()
|
|
mock_session = Mock()
|
|
mock_db.get_session.return_value = mock_session
|
|
mock_get_db.return_value = mock_db
|
|
|
|
mock_session.query.return_value.filter_by.return_value.first.return_value = None
|
|
|
|
response = client.get("/api/strategies/999")
|
|
|
|
assert response.status_code == 404
|
|
assert "Strategy not found" in response.json()["detail"]
|
|
|
|
|
|
class TestListAvailableStrategyTypes:
|
|
"""Tests for GET /api/strategies/types."""
|
|
|
|
@patch('backend.api.strategies.get_strategy_registry')
|
|
def test_list_strategy_types_success(self, mock_get_registry, client, mock_strategy_registry):
|
|
"""Test listing available strategy types."""
|
|
mock_get_registry.return_value = mock_strategy_registry
|
|
|
|
response = client.get("/api/strategies/types")
|
|
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert isinstance(data, list)
|
|
assert "RSIStrategy" in data
|
|
|