X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=tests%2Ftest_market.py;h=07188aca1d7c7344d315d0501f1740fe0ed4511b;hb=4b598ca6f91236c94da250282ac8c89c7d947ee2;hp=ab3cd5e0aebe83cbacacb822d29b439564ff70d1;hpb=30700830b6c0aaaa59c148ebd8edb6931040ed13;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FCryptoportfolio%2FTrader.git diff --git a/tests/test_market.py b/tests/test_market.py index ab3cd5e..07188ac 100644 --- a/tests/test_market.py +++ b/tests/test_market.py @@ -174,7 +174,7 @@ class MarketTest(WebMockTestCase): base_currency='BTC', compute_value='average', available_balance_only=False, liquidity='medium', only=None, repartition=None) - m.report.log_balances.assert_called_once_with(tag="tag") + m.report.log_balances.assert_called_once_with(tag="tag", checkpoint=None) compute_trades.reset_mock() with self.subTest(available_balance_only=True),\ @@ -186,14 +186,17 @@ class MarketTest(WebMockTestCase): return { "average": D("0.000001") } if c1 == "ETH" and c2 == "BTC": return { "average": D("0.1") } + if c1 == "FOO" and c2 == "BTC": + return { "average": D("0.1") } self.fail("Should not be called with {}, {}".format(c1, c2)) get_ticker.side_effect = _get_ticker repartition.return_value = { - "DOGE": (D("0.25"), "short"), - "BTC": (D("0.25"), "long"), - "ETH": (D("0.25"), "long"), - "XMR": (D("0.25"), "long"), + "DOGE": (D("0.20"), "short"), + "BTC": (D("0.20"), "long"), + "ETH": (D("0.20"), "long"), + "XMR": (D("0.20"), "long"), + "FOO": (D("0.20"), "long"), } m = market.Market(self.ccxt, self.market_args()) self.ccxt.fetch_all_balances.return_value = { @@ -210,12 +213,12 @@ class MarketTest(WebMockTestCase): "total": D("5.0") }, "BTC": { - "exchange_free": D("0.075"), + "exchange_free": D("0.065"), "exchange_used": D("0.02"), - "exchange_total": D("0.095"), - "margin_available": D("0.025"), + "exchange_total": D("0.085"), + "margin_available": D("0.035"), "margin_in_position": D("0.01"), - "margin_total": D("0.035"), + "margin_total": D("0.045"), "total": D("0.13") }, "ETH": { @@ -224,6 +227,12 @@ class MarketTest(WebMockTestCase): "exchange_total": D("1.0"), "total": D("1.0") }, + "FOO": { + "exchange_free": D("0.1"), + "exchange_used": D("0.0"), + "exchange_total": D("0.1"), + "total": D("0.1"), + }, } m.balances.fetch_balances(tag="tag") @@ -236,12 +245,13 @@ class MarketTest(WebMockTestCase): self.assertEqual(portfolio.Amount("BTC", "-0.025"), new_repartition["DOGE"] - values_in_base["DOGE"]) - self.assertEqual(portfolio.Amount("BTC", "0.025"), - new_repartition["ETH"] - values_in_base["ETH"]) self.assertEqual(0, - new_repartition["ZRC"] - values_in_base["ZRC"]) + new_repartition["ETH"] - values_in_base["ETH"]) + self.assertIsNone(new_repartition.get("ZRC")) self.assertEqual(portfolio.Amount("BTC", "0.025"), new_repartition["XMR"]) + self.assertEqual(portfolio.Amount("BTC", "0.015"), + new_repartition["FOO"] - values_in_base["FOO"]) compute_trades.reset_mock() with self.subTest(available_balance_only=True, balance=0),\ @@ -381,12 +391,16 @@ class MarketTest(WebMockTestCase): order_mock2.trade = trade_mock trade_mock.tick_actions_recreate.return_value = "tick1" + new_order_mock = mock.Mock() + trade_mock.prepare_order.return_value = new_order_mock m.follow_orders() trade_mock.tick_actions_recreate.assert_called_once_with(2) trade_mock.prepare_order.assert_called_once_with(compute_value="tick1") m.report.log_error.assert_called_once_with("follow_orders", message=mock.ANY) + m.report.log_order.assert_called_with(order_mock2, 2, new_order=new_order_mock) + new_order_mock.run.assert_called_once_with() @mock.patch.object(market.BalanceStore, "fetch_balances") def test_move_balance(self, fetch_balances): @@ -883,6 +897,17 @@ class MarketTest(WebMockTestCase): store_report.assert_called_once() log_error.assert_not_called() + process.reset_mock() + log_error.reset_mock() + store_report.reset_mock() + with self.subTest(authentication_error=True): + m.ccxt.check_required_credentials.side_effect = market.ccxt.AuthenticationError + + m.process(["some_action"], before=True) + log_error.assert_called_with("market_authentication", message="Impossible to authenticate to market") + store_report.assert_called_once() + + m.ccxt.check_required_credentials.side_effect = True process.reset_mock() log_error.reset_mock() store_report.reset_mock() @@ -890,7 +915,7 @@ class MarketTest(WebMockTestCase): process.side_effect = Exception("bouh") m.process(["some_action"], before=True) - log_error.assert_called_with("market_process", exception=mock.ANY) + log_error.assert_called_with("market_process", exception=mock.ANY, message=mock.ANY) store_report.assert_called_once() @@ -964,7 +989,7 @@ class ProcessorTest(WebMockTestCase): process_step.reset_mock() processor.process("sell_needed", steps=["before", "after"]) - self.assertEqual(3, process_step.call_count) + self.assertEqual(4, process_step.call_count) def test_method_arguments(self): ccxt = mock.Mock(spec=market.ccxt.poloniexE) @@ -1002,17 +1027,17 @@ class ProcessorTest(WebMockTestCase): processor = market.Processor(self.m) with mock.patch.object(processor, "run_action") as run_action: - step = processor.scenarios["sell_needed"][1] + step = processor.scenarios["sell_needed"][2] processor.process_step("foo", step, {"foo":"bar"}) self.m.report.log_stage.assert_has_calls([ - mock.call("process_foo__1_sell_begin"), - mock.call("process_foo__1_sell_end"), + mock.call("process_foo__2_sell_begin"), + mock.call("process_foo__2_sell_end"), ]) self.m.balances.fetch_balances.assert_has_calls([ - mock.call(tag="process_foo__1_sell_begin", log_tickers=True), - mock.call(tag="process_foo__1_sell_end", log_tickers=True), + mock.call(tag="process_foo__2_sell_begin"), + mock.call(tag="process_foo__2_sell_end"), ]) self.assertEqual(5, run_action.call_count) @@ -1029,9 +1054,37 @@ class ProcessorTest(WebMockTestCase): with mock.patch.object(processor, "run_action") as run_action: step = processor.scenarios["sell_needed"][0] + processor.process_step("foo", step, {"foo":"bar"}) + + self.m.report.log_stage.assert_has_calls([ + mock.call("process_foo__0_print_balances_begin"), + mock.call("process_foo__0_print_balances_end"), + ]) + self.m.balances.fetch_balances.assert_has_calls([ + mock.call(add_portfolio=True, checkpoint='end', + log_tickers=True, + add_usdt=True, + tag='process_foo__0_print_balances_begin') + ]) + + self.assertEqual(0, run_action.call_count) + + self.m.reset_mock() + with mock.patch.object(processor, "run_action") as run_action: + step = processor.scenarios["sell_needed"][1] + processor.process_step("foo", step, {"foo":"bar"}) self.m.balances.fetch_balances.assert_not_called() + self.m.reset_mock() + with mock.patch.object(processor, "run_action") as run_action: + step = processor.scenarios["print_balances"][0] + + processor.process_step("foo", step, {"foo":"bar"}) + self.m.balances.fetch_balances.assert_called_once_with( + add_portfolio=True, add_usdt=True, log_tickers=True, + tag='process_foo__1_print_balances_begin') + def test_parse_args(self): processor = market.Processor(self.m)