]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git/blobdiff - test.py
Add method to wait for portfolio update
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git] / test.py
diff --git a/test.py b/test.py
index 19655213cb8a71e54dd3925ba1c13090f37904ad..56167f4043c94207d532557542a31459ff591eb1 100644 (file)
--- a/test.py
+++ b/test.py
@@ -32,7 +32,7 @@ class WebMockTestCase(unittest.TestCase):
                 mock.patch.multiple(portfolio.TradeStore,
                     all=[],
                     debug=False),
-                mock.patch.multiple(portfolio.Portfolio, data=None, liquidities={}),
+                mock.patch.multiple(portfolio.Portfolio, last_date=None, data=None, liquidities={}),
                 mock.patch.multiple(portfolio.Computation,
                     computations=portfolio.Computation.computations),
                 mock.patch.multiple(helper,
@@ -102,7 +102,8 @@ class PortfolioTest(WebMockTestCase):
                 'SC':   (D("0.0623"), "long"),
                 'ZEC':  (D("0.3701"), "long"),
                 }
-        self.assertDictEqual(expected, liquidities["high"]['2018-01-08'])
+        date = portfolio.datetime(2018, 1, 8)
+        self.assertDictEqual(expected, liquidities["high"][date])
 
         expected = {
                 'BTC':  (D("1.1102e-16"), "long"),
@@ -117,13 +118,17 @@ class PortfolioTest(WebMockTestCase):
                 'VIA':  (D("0.1"), "long"),
                 'XCP':  (D("0.1"), "long"),
                 }
-        self.assertDictEqual(expected, liquidities["medium"]['2018-01-08'])
+        self.assertDictEqual(expected, liquidities["medium"][date])
+        self.assertEqual(portfolio.datetime(2018, 1, 15), portfolio.Portfolio.last_date)
 
         # It doesn't refetch the data when available
         portfolio.Portfolio.parse_cryptoportfolio()
 
         self.assertEqual(1, self.wm.call_count)
 
+        portfolio.Portfolio.parse_cryptoportfolio(refetch=True)
+        self.assertEqual(2, self.wm.call_count)
+
     def test_repartition(self):
         expected_medium = {
                 'BTC':   (D("1.1102e-16"), "long"),
@@ -151,6 +156,48 @@ class PortfolioTest(WebMockTestCase):
         self.assertEqual(expected_medium, portfolio.Portfolio.repartition(liquidity="medium"))
         self.assertEqual(expected_high, portfolio.Portfolio.repartition(liquidity="high"))
 
+        self.assertEqual(1, self.wm.call_count)
+
+        portfolio.Portfolio.repartition()
+        self.assertEqual(1, self.wm.call_count)
+
+        portfolio.Portfolio.repartition(refetch=True)
+        self.assertEqual(2, self.wm.call_count)
+
+    @mock.patch.object(portfolio.time, "sleep")
+    @mock.patch.object(portfolio.Portfolio, "repartition")
+    def test_wait_for_recent(self, repartition, sleep):
+        self.call_count = 0
+        def _repartition(refetch):
+            self.assertTrue(refetch)
+            self.call_count += 1
+            portfolio.Portfolio.last_date = portfolio.datetime.now()\
+                - portfolio.timedelta(10)\
+                + portfolio.timedelta(self.call_count)
+        repartition.side_effect = _repartition
+
+        portfolio.Portfolio.wait_for_recent()
+        sleep.assert_called_with(30)
+        self.assertEqual(6, sleep.call_count)
+        self.assertEqual(7, repartition.call_count)
+
+        sleep.reset_mock()
+        repartition.reset_mock()
+        portfolio.Portfolio.last_date = None
+        self.call_count = 0
+        portfolio.Portfolio.wait_for_recent(delta=15)
+        sleep.assert_not_called()
+        self.assertEqual(1, repartition.call_count)
+
+        sleep.reset_mock()
+        repartition.reset_mock()
+        portfolio.Portfolio.last_date = None
+        self.call_count = 0
+        portfolio.Portfolio.wait_for_recent(delta=1)
+        sleep.assert_called_with(30)
+        self.assertEqual(9, sleep.call_count)
+        self.assertEqual(10, repartition.call_count)
+
 @unittest.skipUnless("unit" in limits, "Unit skipped")
 class AmountTest(WebMockTestCase):
     def test_values(self):
@@ -220,6 +267,8 @@ class AmountTest(WebMockTestCase):
         amount4 = portfolio.Amount("ETH", 0.0)
         self.assertEqual(amount1, amount1 + amount4)
 
+        self.assertEqual(amount1, amount1 + 0)
+
     def test__radd(self):
         amount = portfolio.Amount("XVG", "12.9")
 
@@ -241,6 +290,13 @@ class AmountTest(WebMockTestCase):
         amount4 = portfolio.Amount("ETH", 0.0)
         self.assertEqual(amount1, amount1 - amount4)
 
+    def test__rsub(self):
+        amount = portfolio.Amount("ETH", "1.6")
+        with self.assertRaises(Exception):
+            3 - amount
+
+        self.assertEqual(portfolio.Amount("ETH", "-1.6"), -amount)
+
     def test__mul(self):
         amount = portfolio.Amount("XEM", 11)