From d8041aefc86d55a5461b6feb981ffa1d11a7ed0a Mon Sep 17 00:00:00 2001 From: Lee Unsworth Date: Fri, 29 May 2020 14:10:23 +0100 Subject: [PATCH 1/3] Updates tests for replace execution --- flumine/execution/simulatedexecution.py | 2 +- tests/test_execution.py | 78 +++++++++++++++---------- tests/test_simulated.py | 11 ---- 3 files changed, 47 insertions(+), 44 deletions(-) diff --git a/flumine/execution/simulatedexecution.py b/flumine/execution/simulatedexecution.py index fead496d..6d54e9ee 100644 --- a/flumine/execution/simulatedexecution.py +++ b/flumine/execution/simulatedexecution.py @@ -107,7 +107,7 @@ def execute_replace( order_package.package_type, ) # add to blotter - market = self.markets.markets[order.market_id] + market = order_package.market market.place_order(replacement_order, execute=False) replacement_order.executable() elif place_instruction_report.status == "FAILURE": diff --git a/tests/test_execution.py b/tests/test_execution.py index 96bd4da2..a68b8fc6 100644 --- a/tests/test_execution.py +++ b/tests/test_execution.py @@ -1,11 +1,12 @@ import unittest from unittest import mock +from unittest.mock import call +from flumine.clients.clients import ExchangeType +from flumine.exceptions import OrderExecutionError from flumine.execution.baseexecution import BaseExecution, OrderPackageType from flumine.execution.betfairexecution import BetfairExecution from flumine.execution.simulatedexecution import SimulatedExecution -from flumine.clients.clients import ExchangeType -from flumine.exceptions import OrderExecutionError class BaseExecutionTest(unittest.TestCase): @@ -705,55 +706,68 @@ def test_execute_update_failure(self, mock__order_logger): @mock.patch("flumine.execution.simulatedexecution.SimulatedExecution._order_logger") def test_execute_replace(self, mock__order_logger): + mock_market = mock.Mock() + self.mock_flumine.markets.markets = {"1.234": mock_market} + mock_order = mock.Mock() + mock_order.market_id = "1.234" mock_order_package = mock.Mock() mock_order_package.__iter__ = mock.Mock(return_value=iter([mock_order])) - mock_order_package.replace_instructions = [2.03] - mock_order_package.info = {} - + mock_order_package.replace_instructions = [{"newPrice": 2.03}] mock_replacement_order = mock.Mock() mock_replacement_order_package = mock.Mock() mock_replacement_order_package.__iter__ = mock.Mock( - return_value=iter([mock_replacement_order]) + return_value=iter([mock_order]) ) - mock_replacement_order_package.info = {} mock_sim_resp = mock.Mock() mock_sim_resp.status = "SUCCESS" - mock_sim_resp.cancel_instruction_report = mock.Mock() - mock_sim_resp.cancel_instruction_report.status = "SUCCESS" - mock_sim_resp.place_instruction_report = mock.Mock() - mock_sim_resp.place_instruction_report.status = "SUCCESS" - mock_order.simulated.replace.return_value = mock_sim_resp + mock_order.simulated.cancel.return_value = mock_sim_resp + mock_replacement_order.simulated.place.return_value = mock_sim_resp + mock_order.trade.create_order_replacement.return_value = mock_replacement_order + self.execution.execute_replace(mock_order_package, None) - mock_order.simulated.replace.assert_called_with(2.03) - # mock__order_logger.assert_called_with( - # mock_order, mock_sim_resp.cancel_instruction_report, mock_order_package.package_type - # ) - # mock__order_logger.assert_called_with( - # mock_replacement_order, mock_sim_resp.place_instruction_report, mock_order_package.package_type - # ) - mock_order.execution_complete.assert_called_with() + mock_order.simulated.cancel.assert_called() + mock_replacement_order.simulated.place.assert_called() + + mock__order_logger.assert_has_calls( + [ + call(mock_order, mock_sim_resp, OrderPackageType.CANCEL), + call( + mock_replacement_order, + mock_sim_resp, + mock_order_package.package_type, + ), + ] + ) + mock_order.execution_complete.assert_called() + mock_replacement_order.executable.assert_called() @mock.patch("flumine.execution.simulatedexecution.SimulatedExecution._order_logger") def test_execute_replace_failure(self, mock__order_logger): mock_order = mock.Mock() mock_order_package = mock.Mock() mock_order_package.__iter__ = mock.Mock(return_value=iter([mock_order])) - mock_order_package.replace_instructions = [2.04] - mock_order_package.info = {} + mock_order_package.replace_instructions = [{"newPrice": 2.54}] + mock_replacement_order = mock.Mock() + mock_replacement_order_package = mock.Mock() + mock_replacement_order_package.__iter__ = mock.Mock( + return_value=iter([mock_order]) + ) mock_sim_resp = mock.Mock() mock_sim_resp.status = "FAILURE" - mock_sim_resp.cancel_instruction_report = mock.Mock() - mock_sim_resp.cancel_instruction_report.status = "FAILURE" - mock_sim_resp.place_instruction_report = mock.Mock() - mock_sim_resp.place_instruction_report.status = "FAILURE" + mock_order.simulated.cancel.return_value = mock_sim_resp + mock_replacement_order.simulated.place.return_value = mock_sim_resp + mock_order.trade.create_order_replacement.return_value = mock_replacement_order - mock_order.simulated.replace.return_value = mock_sim_resp self.execution.execute_replace(mock_order_package, None) - mock_order.simulated.replace.assert_called_with(2.04) - # mock__order_logger.assert_called_with( - # mock_order, mock_sim_resp.cancel_instruction_report, mock_order_package.package_type - # ) - mock_order.executable.assert_called_with() + mock_order.simulated.cancel.assert_called() + mock_replacement_order.simulated.place.assert_called() + + mock__order_logger.assert_called_with( + mock_order, mock_sim_resp, OrderPackageType.CANCEL + ) + + mock_order.executable.assert_called() + mock_replacement_order.executable.assert_not_called() diff --git a/tests/test_simulated.py b/tests/test_simulated.py index dad3921f..c1a5019c 100644 --- a/tests/test_simulated.py +++ b/tests/test_simulated.py @@ -168,17 +168,6 @@ def test_update_else(self): self.assertEqual(resp.status, "FAILURE") self.assertEqual(resp.error_code, "BET_ACTION_ERROR") - def test_replace(self): - resp = self.simulated.replace({"newPrice": 1.50}) - self.assertEqual(resp.status, "SUCCESS") - self.assertEqual(self.mock_order_type.price, 1.50) - - def test_replace_else(self): - self.simulated.order.order_type.ORDER_TYPE = OrderTypes.MARKET_ON_CLOSE - resp = self.simulated.replace({"newPrice": 2.03}) - self.assertEqual(resp.status, "FAILURE") - self.assertEqual(resp.error_code, "BET_ACTION_ERROR") - def test__get_runner(self): mock_market_book = mock.Mock() mock_runner = mock.Mock(selection_id=1234, handicap=1) From 58280da226ddfec8c401e0053830e834a8927f23 Mon Sep 17 00:00:00 2001 From: Lee Unsworth Date: Fri, 29 May 2020 14:15:29 +0100 Subject: [PATCH 2/3] 3.5 fixes --- tests/test_execution.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test_execution.py b/tests/test_execution.py index a68b8fc6..dd3431b9 100644 --- a/tests/test_execution.py +++ b/tests/test_execution.py @@ -727,8 +727,8 @@ def test_execute_replace(self, mock__order_logger): mock_order.trade.create_order_replacement.return_value = mock_replacement_order self.execution.execute_replace(mock_order_package, None) - mock_order.simulated.cancel.assert_called() - mock_replacement_order.simulated.place.assert_called() + mock_order.simulated.cancel.assert_called_with() + mock_replacement_order.simulated.place.assert_called_with() mock__order_logger.assert_has_calls( [ @@ -740,8 +740,8 @@ def test_execute_replace(self, mock__order_logger): ), ] ) - mock_order.execution_complete.assert_called() - mock_replacement_order.executable.assert_called() + mock_order.execution_complete.assert_called_with() + mock_replacement_order.executable.assert_called_with() @mock.patch("flumine.execution.simulatedexecution.SimulatedExecution._order_logger") def test_execute_replace_failure(self, mock__order_logger): @@ -762,12 +762,12 @@ def test_execute_replace_failure(self, mock__order_logger): mock_order.trade.create_order_replacement.return_value = mock_replacement_order self.execution.execute_replace(mock_order_package, None) - mock_order.simulated.cancel.assert_called() - mock_replacement_order.simulated.place.assert_called() + mock_order.simulated.cancel.assert_called_with() + mock_replacement_order.simulated.place.assert_called_with() mock__order_logger.assert_called_with( mock_order, mock_sim_resp, OrderPackageType.CANCEL ) - mock_order.executable.assert_called() + mock_order.executable.assert_called_with() mock_replacement_order.executable.assert_not_called() From 622cf1a23ecadfd5fb1e797dcc28c25b61ed46c7 Mon Sep 17 00:00:00 2001 From: Lee Unsworth Date: Fri, 29 May 2020 14:34:42 +0100 Subject: [PATCH 3/3] 3.5 fixes --- tests/test_execution.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tests/test_execution.py b/tests/test_execution.py index dd3431b9..052f5182 100644 --- a/tests/test_execution.py +++ b/tests/test_execution.py @@ -728,8 +728,11 @@ def test_execute_replace(self, mock__order_logger): self.execution.execute_replace(mock_order_package, None) mock_order.simulated.cancel.assert_called_with() - mock_replacement_order.simulated.place.assert_called_with() - + mock_replacement_order.simulated.place.assert_called_with( + mock_order_package.market.market_book, + {"newPrice": 2.03}, + self.execution._bet_id, + ) mock__order_logger.assert_has_calls( [ call(mock_order, mock_sim_resp, OrderPackageType.CANCEL), @@ -749,6 +752,7 @@ def test_execute_replace_failure(self, mock__order_logger): mock_order_package = mock.Mock() mock_order_package.__iter__ = mock.Mock(return_value=iter([mock_order])) mock_order_package.replace_instructions = [{"newPrice": 2.54}] + mock_replacement_order = mock.Mock() mock_replacement_order_package = mock.Mock() mock_replacement_order_package.__iter__ = mock.Mock( @@ -763,7 +767,11 @@ def test_execute_replace_failure(self, mock__order_logger): self.execution.execute_replace(mock_order_package, None) mock_order.simulated.cancel.assert_called_with() - mock_replacement_order.simulated.place.assert_called_with() + mock_replacement_order.simulated.place.assert_called_with( + mock_order_package.market.market_book, + {"newPrice": 2.54}, + self.execution._bet_id, + ) mock__order_logger.assert_called_with( mock_order, mock_sim_resp, OrderPackageType.CANCEL