summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-01 17:13:00 +0900
committerTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-01 17:13:00 +0900
commita6bf0057d32df7ed0a1d6ec6d19daf74a0de5c0f (patch)
treeb1a080386dcb106fb5404e0100ab5a0e8703e8d0
parent66368d580cf569b50a33e438f2287a977e6fc704 (diff)
feat: medium priority improvements
- Add 30 edge case tests (zero volume, empty data, extreme values, strategy reset, notifier failures) - Fix VWAP division by zero on zero-price candles - Add DB transaction rollback on errors + transaction() context manager - Add parameter validation to all 7 strategies with 41 validation tests - Fix lint issues across test files
-rw-r--r--services/strategy-engine/tests/test_strategy_validation.py14
-rw-r--r--shared/tests/test_db.py2
-rw-r--r--tests/edge_cases/test_empty_data.py10
-rw-r--r--tests/edge_cases/test_extreme_values.py1
-rw-r--r--tests/edge_cases/test_notifier_failures.py1
-rw-r--r--tests/edge_cases/test_zero_volume.py1
6 files changed, 17 insertions, 12 deletions
diff --git a/services/strategy-engine/tests/test_strategy_validation.py b/services/strategy-engine/tests/test_strategy_validation.py
index a832a15..debab1f 100644
--- a/services/strategy-engine/tests/test_strategy_validation.py
+++ b/services/strategy-engine/tests/test_strategy_validation.py
@@ -204,12 +204,14 @@ class TestVwapValidation:
class TestVolumeProfileValidation:
def test_valid_params(self):
s = VolumeProfileStrategy()
- s.configure({
- "lookback_period": 100,
- "num_bins": 50,
- "value_area_pct": 0.7,
- "quantity": "0.01",
- })
+ s.configure(
+ {
+ "lookback_period": 100,
+ "num_bins": 50,
+ "value_area_pct": 0.7,
+ "quantity": "0.01",
+ }
+ )
def test_lookback_too_small(self):
s = VolumeProfileStrategy()
diff --git a/shared/tests/test_db.py b/shared/tests/test_db.py
index 59bf009..04efe9e 100644
--- a/shared/tests/test_db.py
+++ b/shared/tests/test_db.py
@@ -330,7 +330,7 @@ class TestTransactionContextManager:
db._session_factory = MagicMock(return_value=mock_session)
with pytest.raises(ValueError, match="test error"):
- async with db.transaction() as session:
+ async with db.transaction() as _session:
raise ValueError("test error")
mock_session.rollback.assert_awaited_once()
diff --git a/tests/edge_cases/test_empty_data.py b/tests/edge_cases/test_empty_data.py
index 2449b90..ebd8467 100644
--- a/tests/edge_cases/test_empty_data.py
+++ b/tests/edge_cases/test_empty_data.py
@@ -1,18 +1,20 @@
"""Tests for empty/zero data edge cases."""
import sys
-from datetime import datetime, timezone, timedelta
+from datetime import timedelta
from decimal import Decimal
from pathlib import Path
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"))
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "order-executor" / "src"))
-sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "portfolio-manager" / "src"))
+sys.path.insert(
+ 0, str(Path(__file__).resolve().parents[2] / "services" / "portfolio-manager" / "src")
+)
-from shared.models import Candle, Signal, OrderSide, Position
+from shared.models import Signal, OrderSide
from backtester.engine import BacktestEngine
-from backtester.metrics import TradeRecord, compute_detailed_metrics
+from backtester.metrics import compute_detailed_metrics
from portfolio_manager.portfolio import PortfolioTracker
from order_executor.risk_manager import RiskManager
from strategies.rsi_strategy import RsiStrategy
diff --git a/tests/edge_cases/test_extreme_values.py b/tests/edge_cases/test_extreme_values.py
index fe9dc1a..e5bfb1a 100644
--- a/tests/edge_cases/test_extreme_values.py
+++ b/tests/edge_cases/test_extreme_values.py
@@ -20,6 +20,7 @@ from order_executor.risk_manager import RiskManager
def _candle(close: str, volume: str = "1000", idx: int = 0) -> Candle:
from datetime import timedelta
+
base = datetime(2025, 1, 1, tzinfo=timezone.utc)
return Candle(
symbol="BTCUSDT",
diff --git a/tests/edge_cases/test_notifier_failures.py b/tests/edge_cases/test_notifier_failures.py
index 4ba781f..ad33368 100644
--- a/tests/edge_cases/test_notifier_failures.py
+++ b/tests/edge_cases/test_notifier_failures.py
@@ -1,6 +1,5 @@
"""Tests for TelegramNotifier failure modes."""
-import asyncio
import logging
import sys
from pathlib import Path
diff --git a/tests/edge_cases/test_zero_volume.py b/tests/edge_cases/test_zero_volume.py
index 0aefa07..71a1d71 100644
--- a/tests/edge_cases/test_zero_volume.py
+++ b/tests/edge_cases/test_zero_volume.py
@@ -17,6 +17,7 @@ from strategies.rsi_strategy import RsiStrategy
def _candle(close: str, volume: str = "0", idx: int = 0) -> Candle:
base = datetime(2025, 1, 1, tzinfo=timezone.utc)
from datetime import timedelta
+
return Candle(
symbol="BTCUSDT",
timeframe="1h",