diff options
Diffstat (limited to 'tests/integration')
| -rw-r--r-- | tests/integration/test_backtest_end_to_end.py | 11 | ||||
| -rw-r--r-- | tests/integration/test_order_execution_flow.py | 11 | ||||
| -rw-r--r-- | tests/integration/test_portfolio_tracking_flow.py | 17 | ||||
| -rw-r--r-- | tests/integration/test_strategy_signal_flow.py | 15 |
4 files changed, 29 insertions, 25 deletions
diff --git a/tests/integration/test_backtest_end_to_end.py b/tests/integration/test_backtest_end_to_end.py index 4a484f5..fbc0a24 100644 --- a/tests/integration/test_backtest_end_to_end.py +++ b/tests/integration/test_backtest_end_to_end.py @@ -9,19 +9,20 @@ sys.path.insert( sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "strategy-engine")) sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "backtester" / "src")) +from datetime import UTC, datetime, timedelta from decimal import Decimal -from datetime import datetime, timedelta, timezone -from shared.models import Candle from backtester.engine import BacktestEngine +from shared.models import Candle + -def _generate_candles(prices: list[float], symbol="BTCUSDT") -> list[Candle]: +def _generate_candles(prices: list[float], symbol="AAPL") -> list[Candle]: return [ Candle( symbol=symbol, timeframe="1h", - open_time=datetime(2025, 1, 1, tzinfo=timezone.utc) + timedelta(hours=i), + open_time=datetime(2025, 1, 1, tzinfo=UTC) + timedelta(hours=i), open=Decimal(str(p)), high=Decimal(str(p + 100)), low=Decimal(str(p - 100)), @@ -47,7 +48,7 @@ def test_backtest_rsi_strategy_end_to_end(): result = engine.run(candles) assert result.strategy_name == "rsi" - assert result.symbol == "BTCUSDT" + assert result.symbol == "AAPL" assert result.initial_balance == Decimal("10000") assert result.detailed is not None assert result.detailed.total_trades >= 0 diff --git a/tests/integration/test_order_execution_flow.py b/tests/integration/test_order_execution_flow.py index d842d29..2beb388 100644 --- a/tests/integration/test_order_execution_flow.py +++ b/tests/integration/test_order_execution_flow.py @@ -5,21 +5,22 @@ from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "order-executor" / "src")) -import pytest from decimal import Decimal from unittest.mock import AsyncMock -from shared.models import Signal, OrderSide, OrderStatus +import pytest from order_executor.executor import OrderExecutor from order_executor.risk_manager import RiskManager +from shared.models import OrderSide, OrderStatus, Signal + @pytest.mark.asyncio async def test_signal_to_order_flow(): """A valid signal passes risk checks and produces a filled order.""" signal = Signal( strategy="rsi", - symbol="BTC/USDT", + symbol="AAPL", side=OrderSide.BUY, price=Decimal("50000"), quantity=Decimal("0.01"), @@ -52,7 +53,7 @@ async def test_signal_to_order_flow(): assert order is not None assert order.status == OrderStatus.FILLED - assert order.symbol == "BTC/USDT" + assert order.symbol == "AAPL" assert order.side == OrderSide.BUY # Verify order was persisted and published @@ -66,7 +67,7 @@ async def test_signal_rejected_by_risk_manager(): """A signal that exceeds position size is rejected.""" signal = Signal( strategy="rsi", - symbol="BTC/USDT", + symbol="AAPL", side=OrderSide.BUY, price=Decimal("50000"), quantity=Decimal("100"), # Way too large diff --git a/tests/integration/test_portfolio_tracking_flow.py b/tests/integration/test_portfolio_tracking_flow.py index 80a781c..d91a265 100644 --- a/tests/integration/test_portfolio_tracking_flow.py +++ b/tests/integration/test_portfolio_tracking_flow.py @@ -9,9 +9,10 @@ sys.path.insert( from decimal import Decimal -from shared.models import Order, OrderSide, OrderType, OrderStatus from portfolio_manager.portfolio import PortfolioTracker +from shared.models import Order, OrderSide, OrderStatus, OrderType + def test_portfolio_tracks_buy_sell_cycle(): """Buy then sell should update position and reset on full sell.""" @@ -19,7 +20,7 @@ def test_portfolio_tracks_buy_sell_cycle(): buy_order = Order( signal_id="sig-1", - symbol="BTCUSDT", + symbol="AAPL", side=OrderSide.BUY, type=OrderType.MARKET, price=Decimal("50000"), @@ -28,14 +29,14 @@ def test_portfolio_tracks_buy_sell_cycle(): ) tracker.apply_order(buy_order) - pos = tracker.get_position("BTCUSDT") + pos = tracker.get_position("AAPL") assert pos is not None assert pos.quantity == Decimal("0.1") assert pos.avg_entry_price == Decimal("50000") sell_order = Order( signal_id="sig-2", - symbol="BTCUSDT", + symbol="AAPL", side=OrderSide.SELL, type=OrderType.MARKET, price=Decimal("55000"), @@ -44,7 +45,7 @@ def test_portfolio_tracks_buy_sell_cycle(): ) tracker.apply_order(sell_order) - pos = tracker.get_position("BTCUSDT") + pos = tracker.get_position("AAPL") assert pos is None # Fully sold @@ -55,7 +56,7 @@ def test_portfolio_weighted_average_on_multiple_buys(): tracker.apply_order( Order( signal_id="s1", - symbol="BTCUSDT", + symbol="AAPL", side=OrderSide.BUY, type=OrderType.MARKET, price=Decimal("50000"), @@ -66,7 +67,7 @@ def test_portfolio_weighted_average_on_multiple_buys(): tracker.apply_order( Order( signal_id="s2", - symbol="BTCUSDT", + symbol="AAPL", side=OrderSide.BUY, type=OrderType.MARKET, price=Decimal("60000"), @@ -75,6 +76,6 @@ def test_portfolio_weighted_average_on_multiple_buys(): ) ) - pos = tracker.get_position("BTCUSDT") + pos = tracker.get_position("AAPL") assert pos.quantity == Decimal("0.2") assert pos.avg_entry_price == Decimal("55000") # weighted avg diff --git a/tests/integration/test_strategy_signal_flow.py b/tests/integration/test_strategy_signal_flow.py index 448329f..3f7ec35 100644 --- a/tests/integration/test_strategy_signal_flow.py +++ b/tests/integration/test_strategy_signal_flow.py @@ -8,15 +8,16 @@ sys.path.insert( ) sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "strategy-engine")) -import pytest +from datetime import UTC, datetime from decimal import Decimal -from datetime import datetime, timezone from unittest.mock import AsyncMock -from shared.models import Candle -from shared.events import CandleEvent +import pytest from strategy_engine.engine import StrategyEngine +from shared.events import CandleEvent +from shared.models import Candle + @pytest.fixture def candles(): @@ -26,9 +27,9 @@ def candles(): price = Decimal(str(100 - i * 2)) # 100, 98, 96... base.append( Candle( - symbol="BTCUSDT", + symbol="AAPL", timeframe="1m", - open_time=datetime(2025, 1, 1, i, 0, tzinfo=timezone.utc), + open_time=datetime(2025, 1, 1, i, 0, tzinfo=UTC), open=price, high=price + 1, low=price - 1, @@ -54,7 +55,7 @@ async def test_strategy_engine_produces_signals_from_candles(candles): engine = StrategyEngine(broker=broker, strategies=[strategy]) - await engine.process_once("candles.BTCUSDT", "$") + await engine.process_once("candles.AAPL", "$") # With 20 declining candles (100->62), RSI should be very low # Check if broker.publish was called with a signal |
