Skip to content

Commit 65c20c6

Browse files
committed
test: add create_order tests for validate_symbol data source check (#247)
Add 3 tests covering create_order with validate_symbol: - rejects when no data source registered for the pair - accepts when matching data source exists - default behavior skips validation
1 parent 6249c23 commit 65c20c6

4 files changed

Lines changed: 58 additions & 5 deletions

File tree

tests/app/algorithm/test_validate_symbol.py

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from investing_algorithm_framework import PortfolioConfiguration, \
2-
MarketCredential, OrderSide, DataSource
2+
MarketCredential, OrderSide, OrderType, DataSource
33
from investing_algorithm_framework.domain import OperationalException
44
from tests.resources import TestBase
55
from tests.resources.strategies_for_testing import StrategyOne
@@ -170,4 +170,57 @@ def test_error_message_lists_registered_symbols(self):
170170
self.assertIn("BTC/EUR", error_msg)
171171
self.assertIn("ETH/EUR", error_msg)
172172
self.assertIn("validate_symbol=False", error_msg)
173-
self.assertIn("validate_symbol=False", error_msg)
173+
174+
# ── create_order tests ──────────────────────────────────────────
175+
176+
def test_create_order_rejects_missing_data_source(self):
177+
"""create_order with validate_symbol=True rejects when no
178+
data source is registered for the pair."""
179+
self.app.add_strategy(StrategyOne)
180+
181+
with self.assertRaises(OperationalException) as cm:
182+
self.app.context.create_order(
183+
target_symbol="BTC",
184+
amount=1,
185+
price=10,
186+
order_type=OrderType.LIMIT,
187+
order_side=OrderSide.BUY,
188+
validate_symbol=True,
189+
)
190+
191+
error_msg = str(cm.exception)
192+
self.assertIn("BTC/EUR", error_msg)
193+
self.assertIn("No data source registered", error_msg)
194+
195+
def test_create_order_accepts_with_matching_data_source(self):
196+
"""create_order with validate_symbol=True passes when a
197+
data source exists for the pair."""
198+
self.app.add_strategy(StrategyOne)
199+
self._register_data_source("BTC/EUR")
200+
201+
self.app.context.create_order(
202+
target_symbol="BTC",
203+
amount=1,
204+
price=10,
205+
order_type=OrderType.LIMIT,
206+
order_side=OrderSide.BUY,
207+
validate_symbol=True,
208+
)
209+
order_repository = self.app.container.order_repository()
210+
order = order_repository.find({"target_symbol": "BTC"})
211+
self.assertIsNotNone(order)
212+
213+
def test_create_order_default_skips_validation(self):
214+
"""create_order without validate_symbol allows any symbol."""
215+
self.app.add_strategy(StrategyOne)
216+
217+
self.app.context.create_order(
218+
target_symbol="UNKNOWN",
219+
amount=1,
220+
price=10,
221+
order_type=OrderType.LIMIT,
222+
order_side=OrderSide.BUY,
223+
)
224+
order_repository = self.app.container.order_repository()
225+
order = order_repository.find({"target_symbol": "UNKNOWN"})
226+
self.assertIsNotNone(order)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"algorithm_id": "TestStrategy"
2+
"algorithm_id": "BacktestTestStrategy"
33
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"backtest_start_date": "2023-12-01 00:00:00", "backtest_date_range_name": null, "backtest_end_date": "2023-12-02 00:00:00", "trading_symbol": "EUR", "initial_unallocated": 1000.0, "number_of_runs": 1441, "portfolio_snapshots": [{"metadata": "MetaData()", "portfolio_id": "1", "trading_symbol": "EUR", "pending_value": 0.0, "unallocated": 1000.0, "total_net_gain": 0.0, "total_revenue": 0.0, "total_cost": 0.0, "cash_flow": 0.0, "net_size": 1000.0, "created_at": "2023-12-01T00:00:00+00:00", "total_value": 1000.0}, {"metadata": "MetaData()", "portfolio_id": "1", "trading_symbol": "EUR", "pending_value": 0.0, "unallocated": 1000.0, "total_net_gain": 0.0, "total_revenue": 0.0, "total_cost": 0.0, "cash_flow": 0.0, "net_size": 1000.0, "created_at": "2023-12-02T00:00:00+00:00", "total_value": 1000.0}], "trades": [], "orders": [], "positions": [{"symbol": "EUR", "amount": 1000.0, "cost": 1000.0, "portfolio_id": 1}], "created_at": "2026-04-20 19:53:20", "symbols": [], "number_of_days": 0, "number_of_trades": 0, "number_of_trades_closed": 0, "number_of_trades_open": 0, "number_of_orders": 0, "number_of_positions": 0, "metadata": {}, "signals": {}, "signal_events": []}
1+
{"backtest_start_date": "2023-12-01 00:00:00", "backtest_date_range_name": null, "backtest_end_date": "2023-12-02 00:00:00", "trading_symbol": "EUR", "initial_unallocated": 1000.0, "number_of_runs": 1441, "portfolio_snapshots": [{"metadata": "MetaData()", "portfolio_id": "1", "trading_symbol": "EUR", "pending_value": 0.0, "unallocated": 1000.0, "total_net_gain": 0.0, "total_revenue": 0.0, "total_cost": 0.0, "cash_flow": 0.0, "net_size": 1000.0, "created_at": "2023-12-01T00:00:00+00:00", "total_value": 1000.0}, {"metadata": "MetaData()", "portfolio_id": "1", "trading_symbol": "EUR", "pending_value": 0.0, "unallocated": 1000.0, "total_net_gain": 0.0, "total_revenue": 0.0, "total_cost": 0.0, "cash_flow": 0.0, "net_size": 1000.0, "created_at": "2023-12-02T00:00:00+00:00", "total_value": 1000.0}], "trades": [], "orders": [], "positions": [{"symbol": "EUR", "amount": 1000.0, "cost": 1000.0, "portfolio_id": 1}], "created_at": "2026-04-22 08:04:47", "symbols": [], "number_of_days": 0, "number_of_trades": 0, "number_of_trades_closed": 0, "number_of_trades_open": 0, "number_of_orders": 0, "number_of_positions": 0, "metadata": {}, "signals": {}, "signal_events": []}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"backtest_start_date": "2023-12-02 00:00:00", "backtest_date_range_name": null, "backtest_end_date": "2023-12-03 00:00:00", "trading_symbol": "EUR", "initial_unallocated": 1000.0, "number_of_runs": 1441, "portfolio_snapshots": [{"metadata": "MetaData()", "portfolio_id": "1", "trading_symbol": "EUR", "pending_value": 0.0, "unallocated": 1000.0, "total_net_gain": 0.0, "total_revenue": 0.0, "total_cost": 0.0, "cash_flow": 0.0, "net_size": 1000.0, "created_at": "2023-12-02T00:00:00+00:00", "total_value": 1000.0}, {"metadata": "MetaData()", "portfolio_id": "1", "trading_symbol": "EUR", "pending_value": 0.0, "unallocated": 1000.0, "total_net_gain": 0.0, "total_revenue": 0.0, "total_cost": 0.0, "cash_flow": 0.0, "net_size": 1000.0, "created_at": "2023-12-03T00:00:00+00:00", "total_value": 1000.0}], "trades": [], "orders": [], "positions": [{"symbol": "EUR", "amount": 1000.0, "cost": 1000.0, "portfolio_id": 1}], "created_at": "2026-04-20 19:56:42", "symbols": [], "number_of_days": 0, "number_of_trades": 0, "number_of_trades_closed": 0, "number_of_trades_open": 0, "number_of_orders": 0, "number_of_positions": 0, "metadata": {}, "signals": {}, "signal_events": []}
1+
{"backtest_start_date": "2023-12-02 00:00:00", "backtest_date_range_name": null, "backtest_end_date": "2023-12-03 00:00:00", "trading_symbol": "EUR", "initial_unallocated": 1000.0, "number_of_runs": 1441, "portfolio_snapshots": [{"metadata": "MetaData()", "portfolio_id": "1", "trading_symbol": "EUR", "pending_value": 0.0, "unallocated": 1000.0, "total_net_gain": 0.0, "total_revenue": 0.0, "total_cost": 0.0, "cash_flow": 0.0, "net_size": 1000.0, "created_at": "2023-12-02T00:00:00+00:00", "total_value": 1000.0}, {"metadata": "MetaData()", "portfolio_id": "1", "trading_symbol": "EUR", "pending_value": 0.0, "unallocated": 1000.0, "total_net_gain": 0.0, "total_revenue": 0.0, "total_cost": 0.0, "cash_flow": 0.0, "net_size": 1000.0, "created_at": "2023-12-03T00:00:00+00:00", "total_value": 1000.0}], "trades": [], "orders": [], "positions": [{"symbol": "EUR", "amount": 1000.0, "cost": 1000.0, "portfolio_id": 1}], "created_at": "2026-04-22 08:04:18", "symbols": [], "number_of_days": 0, "number_of_trades": 0, "number_of_trades_closed": 0, "number_of_trades_open": 0, "number_of_orders": 0, "number_of_positions": 0, "metadata": {}, "signals": {}, "signal_events": []}

0 commit comments

Comments
 (0)