summaryrefslogtreecommitdiff
path: root/tests/integration
diff options
context:
space:
mode:
Diffstat (limited to 'tests/integration')
-rw-r--r--tests/integration/test_backtest_end_to_end.py11
-rw-r--r--tests/integration/test_order_execution_flow.py11
-rw-r--r--tests/integration/test_portfolio_tracking_flow.py17
-rw-r--r--tests/integration/test_strategy_signal_flow.py15
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