diff options
Diffstat (limited to 'tests/test_store.py')
-rw-r--r-- | tests/test_store.py | 118 |
1 files changed, 104 insertions, 14 deletions
diff --git a/tests/test_store.py b/tests/test_store.py index 12999d3..ee7e063 100644 --- a/tests/test_store.py +++ b/tests/test_store.py | |||
@@ -391,6 +391,18 @@ class BalanceStoreTest(WebMockTestCase): | |||
391 | tag=None, ticker_currency='FOO', tickers='tickers', | 391 | tag=None, ticker_currency='FOO', tickers='tickers', |
392 | type='type') | 392 | type='type') |
393 | 393 | ||
394 | balance_store = market.BalanceStore(self.m) | ||
395 | |||
396 | with self.subTest(add_portfolio=True),\ | ||
397 | mock.patch.object(market.Portfolio, "repartition") as repartition: | ||
398 | repartition.return_value = { | ||
399 | "DOGE": D("0.5"), | ||
400 | "USDT": D("0.5"), | ||
401 | } | ||
402 | balance_store.fetch_balances(add_portfolio=True) | ||
403 | self.assertListEqual(["USDT", "XVG", "XMR", "DOGE"], list(balance_store.currencies())) | ||
404 | |||
405 | |||
394 | @mock.patch.object(market.Portfolio, "repartition") | 406 | @mock.patch.object(market.Portfolio, "repartition") |
395 | def test_dispatch_assets(self, repartition): | 407 | def test_dispatch_assets(self, repartition): |
396 | self.m.ccxt.fetch_all_balances.return_value = self.fetch_balance | 408 | self.m.ccxt.fetch_all_balances.return_value = self.fetch_balance |
@@ -1101,7 +1113,8 @@ class PortfolioTest(WebMockTestCase): | |||
1101 | self.wm.get(market.Portfolio.URL, text=self.json_response) | 1113 | self.wm.get(market.Portfolio.URL, text=self.json_response) |
1102 | 1114 | ||
1103 | @mock.patch.object(market.Portfolio, "parse_cryptoportfolio") | 1115 | @mock.patch.object(market.Portfolio, "parse_cryptoportfolio") |
1104 | def test_get_cryptoportfolio(self, parse_cryptoportfolio): | 1116 | @mock.patch.object(market.Portfolio, "store_cryptoportfolio") |
1117 | def test_get_cryptoportfolio(self, store_cryptoportfolio, parse_cryptoportfolio): | ||
1105 | with self.subTest(parallel=False): | 1118 | with self.subTest(parallel=False): |
1106 | self.wm.get(market.Portfolio.URL, [ | 1119 | self.wm.get(market.Portfolio.URL, [ |
1107 | {"text":'{ "foo": "bar" }', "status_code": 200}, | 1120 | {"text":'{ "foo": "bar" }', "status_code": 200}, |
@@ -1116,23 +1129,28 @@ class PortfolioTest(WebMockTestCase): | |||
1116 | market.Portfolio.report.log_error.assert_not_called() | 1129 | market.Portfolio.report.log_error.assert_not_called() |
1117 | market.Portfolio.report.log_http_request.assert_called_once() | 1130 | market.Portfolio.report.log_http_request.assert_called_once() |
1118 | parse_cryptoportfolio.assert_called_once_with() | 1131 | parse_cryptoportfolio.assert_called_once_with() |
1132 | store_cryptoportfolio.assert_called_once_with() | ||
1119 | market.Portfolio.report.log_http_request.reset_mock() | 1133 | market.Portfolio.report.log_http_request.reset_mock() |
1120 | parse_cryptoportfolio.reset_mock() | 1134 | parse_cryptoportfolio.reset_mock() |
1135 | store_cryptoportfolio.reset_mock() | ||
1121 | market.Portfolio.data = store.LockedVar(None) | 1136 | market.Portfolio.data = store.LockedVar(None) |
1122 | 1137 | ||
1123 | market.Portfolio.get_cryptoportfolio() | 1138 | market.Portfolio.get_cryptoportfolio() |
1124 | self.assertIsNone(market.Portfolio.data.get()) | 1139 | self.assertIsNone(market.Portfolio.data.get()) |
1125 | self.assertEqual(2, self.wm.call_count) | 1140 | self.assertEqual(2, self.wm.call_count) |
1126 | parse_cryptoportfolio.assert_not_called() | 1141 | parse_cryptoportfolio.assert_not_called() |
1142 | store_cryptoportfolio.assert_not_called() | ||
1127 | market.Portfolio.report.log_error.assert_not_called() | 1143 | market.Portfolio.report.log_error.assert_not_called() |
1128 | market.Portfolio.report.log_http_request.assert_called_once() | 1144 | market.Portfolio.report.log_http_request.assert_called_once() |
1129 | market.Portfolio.report.log_http_request.reset_mock() | 1145 | market.Portfolio.report.log_http_request.reset_mock() |
1130 | parse_cryptoportfolio.reset_mock() | 1146 | parse_cryptoportfolio.reset_mock() |
1147 | store_cryptoportfolio.reset_mock() | ||
1131 | 1148 | ||
1132 | market.Portfolio.data = store.LockedVar("Foo") | 1149 | market.Portfolio.data = store.LockedVar("Foo") |
1133 | market.Portfolio.get_cryptoportfolio() | 1150 | market.Portfolio.get_cryptoportfolio() |
1134 | self.assertEqual(2, self.wm.call_count) | 1151 | self.assertEqual(2, self.wm.call_count) |
1135 | parse_cryptoportfolio.assert_not_called() | 1152 | parse_cryptoportfolio.assert_not_called() |
1153 | store_cryptoportfolio.assert_not_called() | ||
1136 | 1154 | ||
1137 | market.Portfolio.get_cryptoportfolio(refetch=True) | 1155 | market.Portfolio.get_cryptoportfolio(refetch=True) |
1138 | self.assertEqual("Foo", market.Portfolio.data.get()) | 1156 | self.assertEqual("Foo", market.Portfolio.data.get()) |
@@ -1153,6 +1171,7 @@ class PortfolioTest(WebMockTestCase): | |||
1153 | market.Portfolio.get_cryptoportfolio() | 1171 | market.Portfolio.get_cryptoportfolio() |
1154 | self.assertIn("foo", market.Portfolio.data.get()) | 1172 | self.assertIn("foo", market.Portfolio.data.get()) |
1155 | parse_cryptoportfolio.reset_mock() | 1173 | parse_cryptoportfolio.reset_mock() |
1174 | store_cryptoportfolio.reset_mock() | ||
1156 | with self.subTest(worker=False): | 1175 | with self.subTest(worker=False): |
1157 | market.Portfolio.data = store.LockedVar(None) | 1176 | market.Portfolio.data = store.LockedVar(None) |
1158 | market.Portfolio.worker = mock.Mock() | 1177 | market.Portfolio.worker = mock.Mock() |
@@ -1160,6 +1179,7 @@ class PortfolioTest(WebMockTestCase): | |||
1160 | market.Portfolio.get_cryptoportfolio() | 1179 | market.Portfolio.get_cryptoportfolio() |
1161 | notify.assert_called_once_with() | 1180 | notify.assert_called_once_with() |
1162 | parse_cryptoportfolio.assert_not_called() | 1181 | parse_cryptoportfolio.assert_not_called() |
1182 | store_cryptoportfolio.assert_not_called() | ||
1163 | 1183 | ||
1164 | def test_parse_cryptoportfolio(self): | 1184 | def test_parse_cryptoportfolio(self): |
1165 | with self.subTest(description="Normal case"): | 1185 | with self.subTest(description="Normal case"): |
@@ -1223,25 +1243,95 @@ class PortfolioTest(WebMockTestCase): | |||
1223 | self.assertEqual({}, market.Portfolio.liquidities.get("high")) | 1243 | self.assertEqual({}, market.Portfolio.liquidities.get("high")) |
1224 | self.assertEqual(datetime.datetime(1,1,1), market.Portfolio.last_date.get()) | 1244 | self.assertEqual(datetime.datetime(1,1,1), market.Portfolio.last_date.get()) |
1225 | 1245 | ||
1226 | 1246 | @mock.patch.object(store.dbs, "redis_connected") | |
1227 | @mock.patch.object(market.Portfolio, "get_cryptoportfolio") | 1247 | @mock.patch.object(store.dbs, "redis") |
1228 | def test_repartition(self, get_cryptoportfolio): | 1248 | def test_store_cryptoportfolio(self, redis, redis_connected): |
1229 | market.Portfolio.liquidities = store.LockedVar({ | 1249 | store.Portfolio.liquidities = store.LockedVar({ |
1230 | "medium": { | 1250 | "medium": { |
1231 | "2018-03-01": "medium_2018-03-01", | 1251 | datetime.datetime(2018,3,1): "medium_2018-03-01", |
1232 | "2018-03-08": "medium_2018-03-08", | 1252 | datetime.datetime(2018,3,8): "medium_2018-03-08", |
1233 | }, | 1253 | }, |
1234 | "high": { | 1254 | "high": { |
1235 | "2018-03-01": "high_2018-03-01", | 1255 | datetime.datetime(2018,3,1): "high_2018-03-01", |
1236 | "2018-03-08": "high_2018-03-08", | 1256 | datetime.datetime(2018,3,8): "high_2018-03-08", |
1237 | } | 1257 | } |
1238 | }) | 1258 | }) |
1239 | market.Portfolio.last_date = store.LockedVar("2018-03-08") | 1259 | store.Portfolio.last_date = store.LockedVar(datetime.datetime(2018,3,8)) |
1260 | |||
1261 | with self.subTest(redis_connected=False): | ||
1262 | redis_connected.return_value = False | ||
1263 | store.Portfolio.store_cryptoportfolio() | ||
1264 | redis.set.assert_not_called() | ||
1265 | |||
1266 | with self.subTest(redis_connected=True): | ||
1267 | redis_connected.return_value = True | ||
1268 | store.Portfolio.store_cryptoportfolio() | ||
1269 | redis.set.assert_has_calls([ | ||
1270 | mock.call("/cryptoportfolio/repartition/latest", '{"medium": "medium_2018-03-08", "high": "high_2018-03-08"}'), | ||
1271 | mock.call("/cryptoportfolio/repartition/date", "2018-03-08"), | ||
1272 | ]) | ||
1273 | |||
1274 | @mock.patch.object(store.dbs, "redis_connected") | ||
1275 | @mock.patch.object(store.dbs, "redis") | ||
1276 | def test_retrieve_cryptoportfolio(self, redis, redis_connected): | ||
1277 | with self.subTest(redis_connected=False): | ||
1278 | redis_connected.return_value = False | ||
1279 | store.Portfolio.retrieve_cryptoportfolio() | ||
1280 | redis.get.assert_not_called() | ||
1281 | self.assertIsNone(store.Portfolio.data.get()) | ||
1282 | |||
1283 | with self.subTest(redis_connected=True, value=None): | ||
1284 | redis_connected.return_value = True | ||
1285 | redis.get.return_value = None | ||
1286 | store.Portfolio.retrieve_cryptoportfolio() | ||
1287 | self.assertEqual(2, redis.get.call_count) | ||
1288 | |||
1289 | redis.reset_mock() | ||
1290 | with self.subTest(redis_connected=True, value="present"): | ||
1291 | redis_connected.return_value = True | ||
1292 | redis.get.side_effect = [ | ||
1293 | b'{ "medium": "medium_repartition", "high": "high_repartition" }', | ||
1294 | b"2018-03-08" | ||
1295 | ] | ||
1296 | store.Portfolio.retrieve_cryptoportfolio() | ||
1297 | self.assertEqual(2, redis.get.call_count) | ||
1298 | self.assertEqual(datetime.datetime(2018,3,8), store.Portfolio.last_date.get()) | ||
1299 | self.assertEqual("", store.Portfolio.data.get()) | ||
1300 | expected_liquidities = { | ||
1301 | 'high': { datetime.datetime(2018, 3, 8): 'high_repartition' }, | ||
1302 | 'medium': { datetime.datetime(2018, 3, 8): 'medium_repartition' }, | ||
1303 | } | ||
1304 | self.assertEqual(expected_liquidities, store.Portfolio.liquidities.get()) | ||
1305 | |||
1306 | @mock.patch.object(market.Portfolio, "get_cryptoportfolio") | ||
1307 | @mock.patch.object(market.Portfolio, "retrieve_cryptoportfolio") | ||
1308 | def test_repartition(self, retrieve_cryptoportfolio, get_cryptoportfolio): | ||
1309 | with self.subTest(from_cache=False): | ||
1310 | market.Portfolio.liquidities = store.LockedVar({ | ||
1311 | "medium": { | ||
1312 | "2018-03-01": "medium_2018-03-01", | ||
1313 | "2018-03-08": "medium_2018-03-08", | ||
1314 | }, | ||
1315 | "high": { | ||
1316 | "2018-03-01": "high_2018-03-01", | ||
1317 | "2018-03-08": "high_2018-03-08", | ||
1318 | } | ||
1319 | }) | ||
1320 | market.Portfolio.last_date = store.LockedVar("2018-03-08") | ||
1321 | |||
1322 | self.assertEqual("medium_2018-03-08", market.Portfolio.repartition()) | ||
1323 | get_cryptoportfolio.assert_called_once_with() | ||
1324 | retrieve_cryptoportfolio.assert_not_called() | ||
1325 | self.assertEqual("medium_2018-03-08", market.Portfolio.repartition(liquidity="medium")) | ||
1326 | self.assertEqual("high_2018-03-08", market.Portfolio.repartition(liquidity="high")) | ||
1327 | |||
1328 | retrieve_cryptoportfolio.reset_mock() | ||
1329 | get_cryptoportfolio.reset_mock() | ||
1240 | 1330 | ||
1241 | self.assertEqual("medium_2018-03-08", market.Portfolio.repartition()) | 1331 | with self.subTest(from_cache=True): |
1242 | get_cryptoportfolio.assert_called_once_with() | 1332 | self.assertEqual("medium_2018-03-08", market.Portfolio.repartition(from_cache=True)) |
1243 | self.assertEqual("medium_2018-03-08", market.Portfolio.repartition(liquidity="medium")) | 1333 | get_cryptoportfolio.assert_called_once_with() |
1244 | self.assertEqual("high_2018-03-08", market.Portfolio.repartition(liquidity="high")) | 1334 | retrieve_cryptoportfolio.assert_called_once_with() |
1245 | 1335 | ||
1246 | @mock.patch.object(market.time, "sleep") | 1336 | @mock.patch.object(market.time, "sleep") |
1247 | @mock.patch.object(market.Portfolio, "get_cryptoportfolio") | 1337 | @mock.patch.object(market.Portfolio, "get_cryptoportfolio") |