}
helper.print_orders(market)
prepare_trades.assert_called_with(market, base_currency="BTC",
- compute_value="average")
+ compute_value="average", debug=True)
prepare_orders.assert_called_with(compute_value="average")
print_all_with_order.assert_called()
self.assertRegex(stdout_mock.getvalue(), "Balance")
+ @mock.patch.object(helper, "prepare_trades")
+ @mock.patch.object(helper, "follow_orders")
+ @mock.patch.object(portfolio.TradeStore, "prepare_orders")
+ @mock.patch.object(portfolio.TradeStore, "print_all_with_order")
+ @mock.patch.object(portfolio.TradeStore, "run_orders")
+ @mock.patch('sys.stdout', new_callable=StringIO)
+ def test_process_sell_needed__1_sell(self, stdout_mock, run_orders,
+ print_all_with_order, prepare_orders, follow_orders,
+ prepare_trades):
+ market = mock.Mock()
+ portfolio.BalanceStore.all = {
+ "BTC": portfolio.Balance("BTC", {
+ "total": "0.65",
+ "exchange_total":"0.65",
+ "exchange_free": "0.35",
+ "exchange_used": "0.30"}),
+ "ETH": portfolio.Balance("ETH", {
+ "total": 3,
+ "exchange_total": 3,
+ "exchange_free": 3,
+ "exchange_used": 0}),
+ }
+ helper.process_sell_needed__1_sell(market)
+ prepare_trades.assert_called_with(market, base_currency="BTC",
+ debug=False)
+ prepare_orders.assert_called_with(compute_value="average",
+ only="dispose")
+ print_all_with_order.assert_called()
+ run_orders.assert_called()
+ follow_orders.assert_called()
+ self.assertRegex(stdout_mock.getvalue(), "Balance")
+
+ @mock.patch.object(helper, "update_trades")
+ @mock.patch.object(helper, "follow_orders")
+ @mock.patch.object(helper, "move_balances")
+ @mock.patch.object(portfolio.TradeStore, "prepare_orders")
+ @mock.patch.object(portfolio.TradeStore, "print_all_with_order")
+ @mock.patch.object(portfolio.TradeStore, "run_orders")
+ @mock.patch('sys.stdout', new_callable=StringIO)
+ def test_process_sell_needed__2_buy(self, stdout_mock, run_orders,
+ print_all_with_order, prepare_orders, move_balances,
+ follow_orders, update_trades):
+ market = mock.Mock()
+ portfolio.BalanceStore.all = {
+ "BTC": portfolio.Balance("BTC", {
+ "total": "0.65",
+ "exchange_total":"0.65",
+ "exchange_free": "0.35",
+ "exchange_used": "0.30"}),
+ "ETH": portfolio.Balance("ETH", {
+ "total": 3,
+ "exchange_total": 3,
+ "exchange_free": 3,
+ "exchange_used": 0}),
+ }
+ helper.process_sell_needed__2_buy(market)
+ update_trades.assert_called_with(market, base_currency="BTC",
+ debug=False, only="acquire")
+ prepare_orders.assert_called_with(compute_value="average",
+ only="acquire")
+ print_all_with_order.assert_called()
+ move_balances.assert_called_with(market, debug=False)
+ run_orders.assert_called()
+ follow_orders.assert_called()
+ self.assertRegex(stdout_mock.getvalue(), "Balance")
+
+ @mock.patch.object(helper, "prepare_trades_to_sell_all")
+ @mock.patch.object(helper, "follow_orders")
+ @mock.patch.object(portfolio.TradeStore, "prepare_orders")
+ @mock.patch.object(portfolio.TradeStore, "print_all_with_order")
+ @mock.patch.object(portfolio.TradeStore, "run_orders")
+ @mock.patch('sys.stdout', new_callable=StringIO)
+ def test_process_sell_all__1_sell(self, stdout_mock, run_orders,
+ print_all_with_order, prepare_orders, follow_orders,
+ prepare_trades_to_sell_all):
+ market = mock.Mock()
+ portfolio.BalanceStore.all = {
+ "BTC": portfolio.Balance("BTC", {
+ "total": "0.65",
+ "exchange_total":"0.65",
+ "exchange_free": "0.35",
+ "exchange_used": "0.30"}),
+ "ETH": portfolio.Balance("ETH", {
+ "total": 3,
+ "exchange_total": 3,
+ "exchange_free": 3,
+ "exchange_used": 0}),
+ }
+ helper.process_sell_all__1_all_sell(market)
+ prepare_trades_to_sell_all.assert_called_with(market, base_currency="BTC",
+ debug=False)
+ prepare_orders.assert_called_with(compute_value="average")
+ print_all_with_order.assert_called()
+ run_orders.assert_called()
+ follow_orders.assert_called()
+ self.assertRegex(stdout_mock.getvalue(), "Balance")
+
+ @mock.patch.object(helper, "prepare_trades")
+ @mock.patch.object(helper, "follow_orders")
+ @mock.patch.object(helper, "move_balances")
+ @mock.patch.object(portfolio.TradeStore, "prepare_orders")
+ @mock.patch.object(portfolio.TradeStore, "print_all_with_order")
+ @mock.patch.object(portfolio.TradeStore, "run_orders")
+ @mock.patch('sys.stdout', new_callable=StringIO)
+ def test_process_sell_all__2_all_buy(self, stdout_mock, run_orders,
+ print_all_with_order, prepare_orders, move_balances,
+ follow_orders, prepare_trades):
+ market = mock.Mock()
+ portfolio.BalanceStore.all = {
+ "BTC": portfolio.Balance("BTC", {
+ "total": "0.65",
+ "exchange_total":"0.65",
+ "exchange_free": "0.35",
+ "exchange_used": "0.30"}),
+ "ETH": portfolio.Balance("ETH", {
+ "total": 3,
+ "exchange_total": 3,
+ "exchange_free": 3,
+ "exchange_used": 0}),
+ }
+ helper.process_sell_all__2_all_buy(market)
+ prepare_trades.assert_called_with(market, base_currency="BTC",
+ debug=False)
+ prepare_orders.assert_called_with()
+ print_all_with_order.assert_called()
+ move_balances.assert_called_with(market, debug=False)
+ run_orders.assert_called()
+ follow_orders.assert_called()
+ self.assertRegex(stdout_mock.getvalue(), "Balance")
+
@unittest.skipUnless("unit" in limits, "Unit skipped")
class TradeStoreTest(WebMockTestCase):
order = portfolio.Order("buy", portfolio.Amount("ETH", 10),
D("0.1"), "BTC", "long", "market", "trade")
order.mouvements.append(portfolio.Mouvement("ETH", "BTC", {
- "id": 42, "type": "buy", "fee": "0.0015",
+ "tradeID": 42, "type": "buy", "fee": "0.0015",
"date": "2017-12-30 12:00:12", "rate": "0.1",
"amount": "3", "total": "0.3"
}))
order.mouvements.append(portfolio.Mouvement("ETH", "BTC", {
- "id": 43, "type": "buy", "fee": "0.0015",
+ "tradeID": 43, "type": "buy", "fee": "0.0015",
"date": "2017-12-30 13:00:12", "rate": "0.2",
"amount": "2", "total": "0.4"
}))
market = mock.Mock()
market.privatePostReturnOrderTrades.return_value = [
{
- "id": 42, "type": "buy", "fee": "0.0015",
+ "tradeID": 42, "type": "buy", "fee": "0.0015",
"date": "2017-12-30 12:00:12", "rate": "0.1",
"amount": "3", "total": "0.3"
},
{
- "id": 43, "type": "buy", "fee": "0.0015",
+ "tradeID": 43, "type": "buy", "fee": "0.0015",
"date": "2017-12-30 13:00:12", "rate": "0.2",
"amount": "2", "total": "0.4"
}
self.assertEqual(42, order.mouvements[0].id)
self.assertEqual(43, order.mouvements[1].id)
+ market.privatePostReturnOrderTrades.side_effect = portfolio.ExchangeError
+ order = portfolio.Order("buy", portfolio.Amount("ETH", 10),
+ D("0.1"), "BTC", "long", market, "trade")
+ order.fetch_mouvements()
+ self.assertEqual(0, len(order.mouvements))
+
def test_mark_finished_order(self):
market = mock.Mock()
order = portfolio.Order("buy", portfolio.Amount("ETH", 10),
self.assertRegex(stdout_mock.getvalue(), "error when running market.create_order")
self.assertRegex(stdout_mock.getvalue(), "Exception: bouh")
+ market.create_order.reset_mock()
+ with self.subTest(dust_amount_exception=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", market, "trade")
+ market.create_order.side_effect = portfolio.ExchangeNotAvailable
+ order.run()
+ market.create_order.assert_called_once()
+ self.assertEqual(0, len(order.results))
+ self.assertEqual("closed", order.status)
+ mark_finished_order.assert_called_once()
+
+
@unittest.skipUnless("unit" in limits, "Unit skipped")
class MouvementTest(WebMockTestCase):
def test_values(self):
mouvement = portfolio.Mouvement("ETH", "BTC", {
- "id": 42, "type": "buy", "fee": "0.0015",
+ "tradeID": 42, "type": "buy", "fee": "0.0015",
"date": "2017-12-30 12:00:12", "rate": "0.1",
"amount": "10", "total": "1"
})
self.assertEqual(portfolio.Amount("ETH", "10"), mouvement.total)
self.assertEqual(portfolio.Amount("BTC", "1"), mouvement.total_in_base)
+ mouvement = portfolio.Mouvement("ETH", "BTC", { "foo": "bar" })
+ self.assertIsNone(mouvement.date)
+ self.assertIsNone(mouvement.id)
+ self.assertIsNone(mouvement.action)
+ self.assertEqual(-1, mouvement.fee_rate)
+ self.assertEqual(0, mouvement.rate)
+ self.assertEqual(portfolio.Amount("ETH", 0), mouvement.total)
+ self.assertEqual(portfolio.Amount("BTC", 0), mouvement.total_in_base)
+
@unittest.skipUnless("acceptance" in limits, "Acceptance skipped")
class AcceptanceTest(WebMockTestCase):
@unittest.expectedFailure
market.fetch_order.return_value = { "status": "closed", "datetime": "2018-01-20 13:40:00" }
market.privatePostReturnOrderTrades.return_value = [
{
- "id": 42, "type": "buy", "fee": "0.0015",
+ "tradeID": 42, "type": "buy", "fee": "0.0015",
"date": "2017-12-30 12:00:12", "rate": "0.1",
"amount": "10", "total": "1"
}