diff options
Diffstat (limited to 'test.py')
-rw-r--r-- | test.py | 142 |
1 files changed, 142 insertions, 0 deletions
@@ -251,5 +251,147 @@ class PortfolioTest(unittest.TestCase): | |||
251 | def tearDown(self): | 251 | def tearDown(self): |
252 | self.patcher.stop() | 252 | self.patcher.stop() |
253 | 253 | ||
254 | class BalanceTest(unittest.TestCase): | ||
255 | def setUp(self): | ||
256 | super(BalanceTest, self).setUp() | ||
257 | |||
258 | self.fetch_balance = { | ||
259 | "free": "foo", | ||
260 | "info": "bar", | ||
261 | "used": "baz", | ||
262 | "total": "bazz", | ||
263 | "USDT": { | ||
264 | "free": 6.0, | ||
265 | "used": 1.2, | ||
266 | "total": 7.2 | ||
267 | }, | ||
268 | "XVG": { | ||
269 | "free": 16, | ||
270 | "used": 0.0, | ||
271 | "total": 16 | ||
272 | }, | ||
273 | "XMR": { | ||
274 | "free": 0.0, | ||
275 | "used": 0.0, | ||
276 | "total": 0.0 | ||
277 | }, | ||
278 | } | ||
279 | self.patcher = mock.patch.multiple(portfolio.Balance, known_balances={}, trades={}) | ||
280 | self.patcher.start() | ||
281 | |||
282 | def test_values(self): | ||
283 | balance = portfolio.Balance("BTC", 0.65, 0.35, 0.30) | ||
284 | self.assertEqual(0.65, balance.total.value) | ||
285 | self.assertEqual(0.35, balance.free.value) | ||
286 | self.assertEqual(0.30, balance.used.value) | ||
287 | self.assertEqual("BTC", balance.currency) | ||
288 | |||
289 | balance = portfolio.Balance.from_hash("BTC", { "total": 0.65, "free": 0.35, "used": 0.30}) | ||
290 | self.assertEqual(0.65, balance.total.value) | ||
291 | self.assertEqual(0.35, balance.free.value) | ||
292 | self.assertEqual(0.30, balance.used.value) | ||
293 | self.assertEqual("BTC", balance.currency) | ||
294 | |||
295 | @mock.patch.object(portfolio.Amount, "get_ticker") | ||
296 | def test_in_currency(self, get_ticker): | ||
297 | portfolio.Balance.known_balances = { | ||
298 | "BTC": portfolio.Balance("BTC", 0.65, 0.35, 0.30), | ||
299 | "ETH": portfolio.Balance("ETH", 3, 3, 0), | ||
300 | } | ||
301 | market = mock.Mock() | ||
302 | get_ticker.return_value = { | ||
303 | "bid": 0.09, | ||
304 | "ask": 0.11, | ||
305 | "average": 0.1, | ||
306 | } | ||
307 | |||
308 | amounts = portfolio.Balance.in_currency("BTC", market) | ||
309 | self.assertEqual("BTC", amounts["ETH"].currency) | ||
310 | self.assertEqual(0.65, amounts["BTC"].value) | ||
311 | self.assertEqual(0.30, amounts["ETH"].value) | ||
312 | |||
313 | amounts = portfolio.Balance.in_currency("BTC", market, action="bid") | ||
314 | self.assertEqual(0.65, amounts["BTC"].value) | ||
315 | self.assertEqual(0.27, amounts["ETH"].value) | ||
316 | |||
317 | amounts = portfolio.Balance.in_currency("BTC", market, action="bid", type="used") | ||
318 | self.assertEqual(0.30, amounts["BTC"].value) | ||
319 | self.assertEqual(0, amounts["ETH"].value) | ||
320 | |||
321 | def test_currencies(self): | ||
322 | portfolio.Balance.known_balances = { | ||
323 | "BTC": portfolio.Balance("BTC", 0.65, 0.35, 0.30), | ||
324 | "ETH": portfolio.Balance("ETH", 3, 3, 0), | ||
325 | } | ||
326 | self.assertListEqual(["BTC", "ETH"], list(portfolio.Balance.currencies())) | ||
327 | |||
328 | @mock.patch.object(portfolio.market, "fetch_balance") | ||
329 | def test_fetch_balances(self, fetch_balance): | ||
330 | fetch_balance.return_value = self.fetch_balance | ||
331 | |||
332 | portfolio.Balance.fetch_balances(portfolio.market) | ||
333 | self.assertNotIn("XMR", portfolio.Balance.currencies()) | ||
334 | self.assertEqual(["USDT", "XVG"], list(portfolio.Balance.currencies())) | ||
335 | |||
336 | @mock.patch.object(portfolio.Portfolio, "repartition_pertenthousand") | ||
337 | @mock.patch.object(portfolio.market, "fetch_balance") | ||
338 | def test_dispatch_assets(self, fetch_balance, repartition): | ||
339 | fetch_balance.return_value = self.fetch_balance | ||
340 | portfolio.Balance.fetch_balances(portfolio.market) | ||
341 | |||
342 | self.assertNotIn("XEM", portfolio.Balance.currencies()) | ||
343 | |||
344 | repartition.return_value = { | ||
345 | "XEM": 7500, | ||
346 | "BTC": 2600, | ||
347 | } | ||
348 | |||
349 | amounts = portfolio.Balance.dispatch_assets(portfolio.Amount("BTC", 10.1)) | ||
350 | self.assertIn("XEM", portfolio.Balance.currencies()) | ||
351 | self.assertEqual(2.6, amounts["BTC"].value) | ||
352 | self.assertEqual(7.5, amounts["XEM"].value) | ||
353 | |||
354 | @mock.patch.object(portfolio.Portfolio, "repartition_pertenthousand") | ||
355 | @mock.patch.object(portfolio.Amount, "get_ticker") | ||
356 | @mock.patch.object(portfolio.Trade, "compute_trades") | ||
357 | def test_prepare_trades(self, compute_trades, get_ticker, repartition): | ||
358 | repartition.return_value = { | ||
359 | "XEM": 7500, | ||
360 | "BTC": 2500, | ||
361 | } | ||
362 | get_ticker.side_effect = [ | ||
363 | { "average": 0.0001 }, | ||
364 | { "average": 0.000001 } | ||
365 | ] | ||
366 | market = mock.Mock() | ||
367 | market.fetch_balance.return_value = { | ||
368 | "USDT": { | ||
369 | "free": 10000.0, | ||
370 | "used": 0.0, | ||
371 | "total": 10000.0 | ||
372 | }, | ||
373 | "XVG": { | ||
374 | "free": 10000.0, | ||
375 | "used": 0.0, | ||
376 | "total": 10000.0 | ||
377 | }, | ||
378 | } | ||
379 | portfolio.Balance.prepare_trades(market) | ||
380 | compute_trades.assert_called() | ||
381 | |||
382 | call = compute_trades.call_args | ||
383 | self.assertEqual(market, call[1]["market"]) | ||
384 | self.assertEqual(1, call[0][0]["USDT"].value) | ||
385 | self.assertEqual(0.01, call[0][0]["XVG"].value) | ||
386 | self.assertEqual(0.2525, call[0][1]["BTC"].value) | ||
387 | self.assertEqual(0.7575, call[0][1]["XEM"].value) | ||
388 | |||
389 | def test__repr(self): | ||
390 | balance = portfolio.Balance("BTX", 3, 1, 2) | ||
391 | self.assertEqual("Balance(BTX [1.00000000 BTX/2.00000000 BTX/3.00000000 BTX])", repr(balance)) | ||
392 | |||
393 | def tearDown(self): | ||
394 | self.patcher.stop() | ||
395 | |||
254 | if __name__ == '__main__': | 396 | if __name__ == '__main__': |
255 | unittest.main() | 397 | unittest.main() |