X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FCryptoportfolio%2FTrader.git;a=blobdiff_plain;f=test.py;h=955e2a180caf92b2da8211a37c6502dfff58f291;hp=52d737d7528f773261242e0830146415ddb1f487;hb=f70bb858007cd3be6766ee0aa4a3d9133952eb98;hpb=d24bb10c3cad1f144b76022481f46b4524873f4b diff --git a/test.py b/test.py index 52d737d..955e2a1 100644 --- a/test.py +++ b/test.py @@ -2073,24 +2073,68 @@ class OrderTest(WebMockTestCase): mock.patch.object(portfolio.Order, "mark_finished_order") as mark_finished_order: order = portfolio.Order("buy", portfolio.Amount("ETH", 0.001), D("0.1"), "BTC", "long", self.m, "trade") - self.m.ccxt.create_order.side_effect = portfolio.ExchangeNotAvailable + self.m.ccxt.create_order.side_effect = portfolio.InvalidOrder order.run() self.m.ccxt.create_order.assert_called_once() self.assertEqual(0, len(order.results)) self.assertEqual("closed", order.status) mark_finished_order.assert_called_once() + self.m.ccxt.order_precision.return_value = 8 self.m.ccxt.create_order.reset_mock() - with self.subTest(dust_amount_exception=True),\ + with self.subTest(insufficient_funds=True),\ mock.patch.object(portfolio.Order, "mark_finished_order") as mark_finished_order: - order = portfolio.Order("buy", portfolio.Amount("ETH", 0.001), + order = portfolio.Order("buy", portfolio.Amount("ETH", "0.001"), D("0.1"), "BTC", "long", self.m, "trade") - self.m.ccxt.create_order.side_effect = portfolio.InvalidOrder + self.m.ccxt.create_order.side_effect = [ + portfolio.InsufficientFunds, + portfolio.InsufficientFunds, + portfolio.InsufficientFunds, + { "id": 123 }, + ] order.run() - self.m.ccxt.create_order.assert_called_once() + self.m.ccxt.create_order.assert_has_calls([ + mock.call('ETH/BTC', 'limit', 'buy', D('0.0010'), account='exchange', price=D('0.1')), + mock.call('ETH/BTC', 'limit', 'buy', D('0.00099'), account='exchange', price=D('0.1')), + mock.call('ETH/BTC', 'limit', 'buy', D('0.0009801'), account='exchange', price=D('0.1')), + mock.call('ETH/BTC', 'limit', 'buy', D('0.00097029'), account='exchange', price=D('0.1')), + ]) + self.assertEqual(4, self.m.ccxt.create_order.call_count) + self.assertEqual(1, len(order.results)) + self.assertEqual("open", order.status) + self.assertEqual(4, order.tries) + self.m.report.log_error.assert_called() + self.assertEqual(4, self.m.report.log_error.call_count) + + self.m.ccxt.order_precision.return_value = 8 + self.m.ccxt.create_order.reset_mock() + self.m.report.log_error.reset_mock() + with self.subTest(insufficient_funds=True),\ + mock.patch.object(portfolio.Order, "mark_finished_order") as mark_finished_order: + order = portfolio.Order("buy", portfolio.Amount("ETH", "0.001"), + D("0.1"), "BTC", "long", self.m, "trade") + self.m.ccxt.create_order.side_effect = [ + portfolio.InsufficientFunds, + portfolio.InsufficientFunds, + portfolio.InsufficientFunds, + portfolio.InsufficientFunds, + portfolio.InsufficientFunds, + ] + order.run() + self.m.ccxt.create_order.assert_has_calls([ + mock.call('ETH/BTC', 'limit', 'buy', D('0.0010'), account='exchange', price=D('0.1')), + mock.call('ETH/BTC', 'limit', 'buy', D('0.00099'), account='exchange', price=D('0.1')), + mock.call('ETH/BTC', 'limit', 'buy', D('0.0009801'), account='exchange', price=D('0.1')), + mock.call('ETH/BTC', 'limit', 'buy', D('0.00097029'), account='exchange', price=D('0.1')), + mock.call('ETH/BTC', 'limit', 'buy', D('0.00096059'), account='exchange', price=D('0.1')), + ]) + self.assertEqual(5, self.m.ccxt.create_order.call_count) self.assertEqual(0, len(order.results)) - self.assertEqual("closed", order.status) - mark_finished_order.assert_called_once() + self.assertEqual("error", order.status) + self.assertEqual(5, order.tries) + self.m.report.log_error.assert_called() + self.assertEqual(5, self.m.report.log_error.call_count) + self.m.report.log_error.assert_called_with(mock.ANY, message="Giving up Order(buy long 0.00096060 ETH at 0.1 BTC [pending])", exception=mock.ANY) @unittest.skipUnless("unit" in limits, "Unit skipped") @@ -2750,6 +2794,7 @@ class HelperTest(WebMockTestCase): helper.print_balances(self.m) + self.m.report.log_stage.assert_called_once_with("print_balances") self.m.balances.fetch_balances.assert_called_with() self.m.report.print_log.assert_has_calls([ mock.call("total:"),