self.wm.stop()
super(WebMockTestCase, self).tearDown()
+@unittest.skipUnless("unit" in limits, "Unit skipped")
+class poloniexETest(unittest.TestCase):
+ def setUp(self):
+ super(poloniexETest, self).setUp()
+ self.wm = requests_mock.Mocker()
+ self.wm.start()
+
+ self.s = market.ccxt.poloniexE()
+
+ def tearDown(self):
+ self.wm.stop()
+ super(poloniexETest, self).tearDown()
+
+ def test_nanoseconds(self):
+ with mock.patch.object(market.ccxt.time, "time") as time:
+ time.return_value = 123456.7890123456
+ self.assertEqual(123456789012345, self.s.nanoseconds())
+
+ def test_nonce(self):
+ with mock.patch.object(market.ccxt.time, "time") as time:
+ time.return_value = 123456.7890123456
+ self.assertEqual(123456789012345, self.s.nonce())
+
+ def test_order_precision(self):
+ self.assertEqual(8, self.s.order_precision("FOO"))
+
+ def test_transfer_balance(self):
+ with self.subTest(success=True),\
+ mock.patch.object(self.s, "privatePostTransferBalance") as t:
+ t.return_value = { "success": 1 }
+ result = self.s.transfer_balance("FOO", 12, "exchange", "margin")
+ t.assert_called_once_with({
+ "currency": "FOO",
+ "amount": 12,
+ "fromAccount": "exchange",
+ "toAccount": "margin",
+ "confirmed": 1
+ })
+ self.assertTrue(result)
+
+ with self.subTest(success=False),\
+ mock.patch.object(self.s, "privatePostTransferBalance") as t:
+ t.return_value = { "success": 0 }
+ self.assertFalse(self.s.transfer_balance("FOO", 12, "exchange", "margin"))
+
+ def test_close_margin_position(self):
+ with mock.patch.object(self.s, "privatePostCloseMarginPosition") as c:
+ self.s.close_margin_position("FOO", "BAR")
+ c.assert_called_with({"currencyPair": "BAR_FOO"})
+
+ def test_tradable_balances(self):
+ with mock.patch.object(self.s, "privatePostReturnTradableBalances") as r:
+ r.return_value = {
+ "FOO": { "exchange": "12.1234", "margin": "0.0123" },
+ "BAR": { "exchange": "1", "margin": "0" },
+ }
+ balances = self.s.tradable_balances()
+ self.assertEqual(["FOO", "BAR"], list(balances.keys()))
+ self.assertEqual(["exchange", "margin"], list(balances["FOO"].keys()))
+ self.assertEqual(D("12.1234"), balances["FOO"]["exchange"])
+ self.assertEqual(["exchange", "margin"], list(balances["BAR"].keys()))
+
+ def test_margin_summary(self):
+ with mock.patch.object(self.s, "privatePostReturnMarginAccountSummary") as r:
+ r.return_value = {
+ "currentMargin": "1.49680968",
+ "lendingFees": "0.0000001",
+ "pl": "0.00008254",
+ "totalBorrowedValue": "0.00673602",
+ "totalValue": "0.01000000",
+ "netValue": "0.01008254",
+ }
+ expected = {
+ 'current_margin': D('1.49680968'),
+ 'gains': D('0.00008254'),
+ 'lending_fees': D('0.0000001'),
+ 'total': D('0.01000000'),
+ 'total_borrowed': D('0.00673602')
+ }
+ self.assertEqual(expected, self.s.margin_summary())
+
@unittest.skipUnless("unit" in limits, "Unit skipped")
class PortfolioTest(WebMockTestCase):
def fill_data(self):
self.assertTrue(ticker["inverted"])
self.assertIn("original", ticker)
self.assertEqual(10, ticker["original"]["bid"])
+ self.assertEqual(25, ticker["original"]["average"])
ticker = m.get_ticker("XVG", "XMR")
self.assertIsNone(ticker)
self.assertTrue(ticker["inverted"])
self.assertIn("original", ticker)
self.assertEqual(10, ticker["original"]["bid"])
+ self.assertEqual(25, ticker["original"]["average"])
ticker = m.get_ticker("XVG", "XMR")
self.assertIsNone(ticker)
self.assertRegex(stdout_mock.getvalue(), "impossible to store report file: FileNotFoundError;")
@mock.patch("helper.process_sell_all__1_all_sell")
- @mock.patch("helper.process_sell_all__2_all_buy")
- @mock.patch("portfolio.Portfolio.wait_for_recent")
- def test_main_process_market(self, wait, buy, sell):
+ @mock.patch("helper.process_sell_all__2_wait")
+ @mock.patch("helper.process_sell_all__3_all_buy")
+ def test_main_process_market(self, buy, wait, sell):
with self.subTest(before=False, after=False):
helper.main_process_market("user", None)
sell.reset_mock()
with self.subTest(action="print_balances"),\
mock.patch("helper.print_balances") as print_balances:
- helper.main_process_market("user", "print_balances")
+ helper.main_process_market("user", ["print_balances"])
buy.assert_not_called()
wait.assert_not_called()
print_balances.assert_called_once_with("user")
with self.subTest(action="print_orders"),\
- mock.patch("helper.print_orders") as print_orders:
- helper.main_process_market("user", "print_orders")
+ mock.patch("helper.print_orders") as print_orders,\
+ mock.patch("helper.print_balances") as print_balances:
+ helper.main_process_market("user", ["print_orders", "print_balances"])
buy.assert_not_called()
wait.assert_not_called()
sell.assert_not_called()
print_orders.assert_called_once_with("user")
+ print_balances.assert_called_once_with("user")
with self.subTest(action="unknown"),\
self.assertRaises(NotImplementedError):
- helper.main_process_market("user", "unknown")
+ helper.main_process_market("user", ["unknown"])
@mock.patch.object(helper, "psycopg2")
def test_fetch_markets(self, psycopg2):
mock.call("process_sell_all__1_all_sell_end")
])
- def test_process_sell_all__2_all_buy(self):
- helper.process_sell_all__2_all_buy(self.m)
+ @mock.patch("portfolio.Portfolio.wait_for_recent")
+ def test_process_sell_all__2_wait(self, wait):
+ helper.process_sell_all__2_wait(self.m)
+
+ wait.assert_called_once_with(self.m)
+ self.m.report.log_stage.assert_has_calls([
+ mock.call("process_sell_all__2_wait_begin"),
+ mock.call("process_sell_all__2_wait_end")
+ ])
+
+ def test_process_sell_all__3_all_buy(self):
+ helper.process_sell_all__3_all_buy(self.m)
self.m.balances.fetch_balances.assert_has_calls([
- mock.call(tag="process_sell_all__2_all_buy_begin"),
- mock.call(tag="process_sell_all__2_all_buy_end"),
+ mock.call(tag="process_sell_all__3_all_buy_begin"),
+ mock.call(tag="process_sell_all__3_all_buy_end"),
])
self.m.prepare_trades.assert_called_with(base_currency="BTC",
liquidity="medium")
self.m.trades.run_orders.assert_called()
self.m.follow_orders.assert_called()
self.m.report.log_stage.assert_has_calls([
- mock.call("process_sell_all__2_all_buy_begin"),
- mock.call("process_sell_all__2_all_buy_end")
+ mock.call("process_sell_all__3_all_buy_begin"),
+ mock.call("process_sell_all__3_all_buy_end")
])
@unittest.skipUnless("acceptance" in limits, "Acceptance skipped")