diff options
Diffstat (limited to 'test.py')
-rw-r--r-- | test.py | 136 |
1 files changed, 126 insertions, 10 deletions
@@ -17,13 +17,12 @@ class AmountTest(unittest.TestCase): | |||
17 | self.assertEqual(amount, amount.in_currency("ETC", None)) | 17 | self.assertEqual(amount, amount.in_currency("ETC", None)) |
18 | 18 | ||
19 | ticker_mock = unittest.mock.Mock() | 19 | ticker_mock = unittest.mock.Mock() |
20 | with mock.patch.object(portfolio.Amount, 'get_ticker', new=ticker_mock): | 20 | with mock.patch.object(portfolio.Trade, 'get_ticker', new=ticker_mock): |
21 | ticker_mock.return_value = None | 21 | ticker_mock.return_value = None |
22 | portfolio.Amount.get_ticker = ticker_mock | ||
23 | 22 | ||
24 | self.assertRaises(Exception, amount.in_currency, "ETH", None) | 23 | self.assertRaises(Exception, amount.in_currency, "ETH", None) |
25 | 24 | ||
26 | with mock.patch.object(portfolio.Amount, 'get_ticker', new=ticker_mock): | 25 | with mock.patch.object(portfolio.Trade, 'get_ticker', new=ticker_mock): |
27 | ticker_mock.return_value = { | 26 | ticker_mock.return_value = { |
28 | "average": 0.3, | 27 | "average": 0.3, |
29 | "foo": "bar", | 28 | "foo": "bar", |
@@ -35,10 +34,6 @@ class AmountTest(unittest.TestCase): | |||
35 | self.assertEqual(amount, converted_amount.linked_to) | 34 | self.assertEqual(amount, converted_amount.linked_to) |
36 | self.assertEqual("bar", converted_amount.ticker["foo"]) | 35 | self.assertEqual("bar", converted_amount.ticker["foo"]) |
37 | 36 | ||
38 | @unittest.skip("TODO") | ||
39 | def test_get_ticker(self): | ||
40 | pass | ||
41 | |||
42 | def test__abs(self): | 37 | def test__abs(self): |
43 | amount = portfolio.Amount("SC", -120) | 38 | amount = portfolio.Amount("SC", -120) |
44 | self.assertEqual(120, abs(amount).value) | 39 | self.assertEqual(120, abs(amount).value) |
@@ -276,7 +271,7 @@ class BalanceTest(unittest.TestCase): | |||
276 | "total": 0.0 | 271 | "total": 0.0 |
277 | }, | 272 | }, |
278 | } | 273 | } |
279 | self.patcher = mock.patch.multiple(portfolio.Balance, known_balances={}, trades={}) | 274 | self.patcher = mock.patch.multiple(portfolio.Balance, known_balances={}) |
280 | self.patcher.start() | 275 | self.patcher.start() |
281 | 276 | ||
282 | def test_values(self): | 277 | def test_values(self): |
@@ -292,7 +287,7 @@ class BalanceTest(unittest.TestCase): | |||
292 | self.assertEqual(0.30, balance.used.value) | 287 | self.assertEqual(0.30, balance.used.value) |
293 | self.assertEqual("BTC", balance.currency) | 288 | self.assertEqual("BTC", balance.currency) |
294 | 289 | ||
295 | @mock.patch.object(portfolio.Amount, "get_ticker") | 290 | @mock.patch.object(portfolio.Trade, "get_ticker") |
296 | def test_in_currency(self, get_ticker): | 291 | def test_in_currency(self, get_ticker): |
297 | portfolio.Balance.known_balances = { | 292 | portfolio.Balance.known_balances = { |
298 | "BTC": portfolio.Balance("BTC", 0.65, 0.35, 0.30), | 293 | "BTC": portfolio.Balance("BTC", 0.65, 0.35, 0.30), |
@@ -352,7 +347,7 @@ class BalanceTest(unittest.TestCase): | |||
352 | self.assertEqual(7.5, amounts["XEM"].value) | 347 | self.assertEqual(7.5, amounts["XEM"].value) |
353 | 348 | ||
354 | @mock.patch.object(portfolio.Portfolio, "repartition_pertenthousand") | 349 | @mock.patch.object(portfolio.Portfolio, "repartition_pertenthousand") |
355 | @mock.patch.object(portfolio.Amount, "get_ticker") | 350 | @mock.patch.object(portfolio.Trade, "get_ticker") |
356 | @mock.patch.object(portfolio.Trade, "compute_trades") | 351 | @mock.patch.object(portfolio.Trade, "compute_trades") |
357 | def test_prepare_trades(self, compute_trades, get_ticker, repartition): | 352 | def test_prepare_trades(self, compute_trades, get_ticker, repartition): |
358 | repartition.return_value = { | 353 | repartition.return_value = { |
@@ -393,5 +388,126 @@ class BalanceTest(unittest.TestCase): | |||
393 | def tearDown(self): | 388 | def tearDown(self): |
394 | self.patcher.stop() | 389 | self.patcher.stop() |
395 | 390 | ||
391 | class TradeTest(unittest.TestCase): | ||
392 | import time | ||
393 | |||
394 | def setUp(self): | ||
395 | super(TradeTest, self).setUp() | ||
396 | |||
397 | self.patcher = mock.patch.multiple(portfolio.Trade, | ||
398 | ticker_cache={}, | ||
399 | ticker_cache_timestamp=self.time.time(), | ||
400 | fees_cache={}, | ||
401 | trades={}) | ||
402 | self.patcher.start() | ||
403 | |||
404 | def test_get_ticker(self): | ||
405 | market = mock.Mock() | ||
406 | market.fetch_ticker.side_effect = [ | ||
407 | { "bid": 1, "ask": 3 }, | ||
408 | portfolio.ccxt.ExchangeError("foo"), | ||
409 | { "bid": 10, "ask": 40 }, | ||
410 | portfolio.ccxt.ExchangeError("foo"), | ||
411 | portfolio.ccxt.ExchangeError("foo"), | ||
412 | ] | ||
413 | |||
414 | ticker = portfolio.Trade.get_ticker("ETH", "ETC", market) | ||
415 | market.fetch_ticker.assert_called_with("ETH/ETC") | ||
416 | self.assertEqual(1, ticker["bid"]) | ||
417 | self.assertEqual(3, ticker["ask"]) | ||
418 | self.assertEqual(2, ticker["average"]) | ||
419 | self.assertFalse(ticker["inverted"]) | ||
420 | |||
421 | ticker = portfolio.Trade.get_ticker("ETH", "XVG", market) | ||
422 | self.assertEqual(0.0625, ticker["average"]) | ||
423 | self.assertTrue(ticker["inverted"]) | ||
424 | self.assertIn("original", ticker) | ||
425 | self.assertEqual(10, ticker["original"]["bid"]) | ||
426 | |||
427 | ticker = portfolio.Trade.get_ticker("XVG", "XMR", market) | ||
428 | self.assertIsNone(ticker) | ||
429 | |||
430 | market.fetch_ticker.assert_has_calls([ | ||
431 | mock.call("ETH/ETC"), | ||
432 | mock.call("ETH/XVG"), | ||
433 | mock.call("XVG/ETH"), | ||
434 | mock.call("XVG/XMR"), | ||
435 | mock.call("XMR/XVG"), | ||
436 | ]) | ||
437 | |||
438 | market2 = mock.Mock() | ||
439 | market2.fetch_ticker.side_effect = [ | ||
440 | { "bid": 1, "ask": 3 }, | ||
441 | { "bid": 1.2, "ask": 3.5 }, | ||
442 | ] | ||
443 | ticker1 = portfolio.Trade.get_ticker("ETH", "ETC", market2) | ||
444 | ticker2 = portfolio.Trade.get_ticker("ETH", "ETC", market2) | ||
445 | ticker3 = portfolio.Trade.get_ticker("ETC", "ETH", market2) | ||
446 | market2.fetch_ticker.assert_called_once_with("ETH/ETC") | ||
447 | self.assertEqual(1, ticker1["bid"]) | ||
448 | self.assertDictEqual(ticker1, ticker2) | ||
449 | self.assertDictEqual(ticker1, ticker3["original"]) | ||
450 | |||
451 | ticker4 = portfolio.Trade.get_ticker("ETH", "ETC", market2, refresh=True) | ||
452 | ticker5 = portfolio.Trade.get_ticker("ETH", "ETC", market2) | ||
453 | self.assertEqual(1.2, ticker4["bid"]) | ||
454 | self.assertDictEqual(ticker4, ticker5) | ||
455 | |||
456 | market3 = mock.Mock() | ||
457 | market3.fetch_ticker.side_effect = [ | ||
458 | { "bid": 1, "ask": 3 }, | ||
459 | { "bid": 1.2, "ask": 3.5 }, | ||
460 | ] | ||
461 | ticker6 = portfolio.Trade.get_ticker("ETH", "ETC", market3) | ||
462 | portfolio.Trade.ticker_cache_timestamp -= 4 | ||
463 | ticker7 = portfolio.Trade.get_ticker("ETH", "ETC", market3) | ||
464 | portfolio.Trade.ticker_cache_timestamp -= 2 | ||
465 | ticker8 = portfolio.Trade.get_ticker("ETH", "ETC", market3) | ||
466 | self.assertDictEqual(ticker6, ticker7) | ||
467 | self.assertEqual(1.2, ticker8["bid"]) | ||
468 | |||
469 | @unittest.skip("TODO") | ||
470 | def test_values_assertion(self): | ||
471 | pass | ||
472 | |||
473 | @unittest.skip("TODO") | ||
474 | def test_fetch_fees(self): | ||
475 | pass | ||
476 | |||
477 | @unittest.skip("TODO") | ||
478 | def test_compute_trades(self): | ||
479 | pass | ||
480 | |||
481 | @unittest.skip("TODO") | ||
482 | def test_action(self): | ||
483 | pass | ||
484 | |||
485 | @unittest.skip("TODO") | ||
486 | def test_action(self): | ||
487 | pass | ||
488 | |||
489 | @unittest.skip("TODO") | ||
490 | def test_order_action(self): | ||
491 | pass | ||
492 | |||
493 | @unittest.skip("TODO") | ||
494 | def test_prepare_order(self): | ||
495 | pass | ||
496 | |||
497 | @unittest.skip("TODO") | ||
498 | def test_all_orders(self): | ||
499 | pass | ||
500 | |||
501 | @unittest.skip("TODO") | ||
502 | def test_follow_orders(self): | ||
503 | pass | ||
504 | |||
505 | @unittest.skip("TODO") | ||
506 | def test__repr(self): | ||
507 | pass | ||
508 | |||
509 | def tearDown(self): | ||
510 | self.patcher.stop() | ||
511 | |||
396 | if __name__ == '__main__': | 512 | if __name__ == '__main__': |
397 | unittest.main() | 513 | unittest.main() |