diff options
Diffstat (limited to 'test.py')
-rw-r--r-- | test.py | 56 |
1 files changed, 50 insertions, 6 deletions
@@ -101,7 +101,7 @@ class poloniexETest(unittest.TestCase): | |||
101 | retry_call.assert_called_with(request, | 101 | retry_call.assert_called_with(request, |
102 | delay=1, tries=10, fargs=["foo"], | 102 | delay=1, tries=10, fargs=["foo"], |
103 | fkwargs={'api': 'public', 'method': 'GET', 'params': {}, 'headers': None, 'body': None}, | 103 | fkwargs={'api': 'public', 'method': 'GET', 'params': {}, 'headers': None, 'body': None}, |
104 | exceptions=(market.ccxt.RequestTimeout,)) | 104 | exceptions=(market.ccxt.RequestTimeout, market.ccxt.InvalidNonce)) |
105 | request.assert_not_called() | 105 | request.assert_not_called() |
106 | 106 | ||
107 | with self.subTest(desc="private GET"): | 107 | with self.subTest(desc="private GET"): |
@@ -109,7 +109,7 @@ class poloniexETest(unittest.TestCase): | |||
109 | retry_call.assert_called_with(request, | 109 | retry_call.assert_called_with(request, |
110 | delay=1, tries=10, fargs=["foo"], | 110 | delay=1, tries=10, fargs=["foo"], |
111 | fkwargs={'api': 'private', 'method': 'GET', 'params': {}, 'headers': None, 'body': None}, | 111 | fkwargs={'api': 'private', 'method': 'GET', 'params': {}, 'headers': None, 'body': None}, |
112 | exceptions=(market.ccxt.RequestTimeout,)) | 112 | exceptions=(market.ccxt.RequestTimeout, market.ccxt.InvalidNonce)) |
113 | request.assert_not_called() | 113 | request.assert_not_called() |
114 | 114 | ||
115 | with self.subTest(desc="private POST regexp"): | 115 | with self.subTest(desc="private POST regexp"): |
@@ -117,7 +117,7 @@ class poloniexETest(unittest.TestCase): | |||
117 | retry_call.assert_called_with(request, | 117 | retry_call.assert_called_with(request, |
118 | delay=1, tries=10, fargs=["returnFoo"], | 118 | delay=1, tries=10, fargs=["returnFoo"], |
119 | fkwargs={'api': 'private', 'method': 'POST', 'params': {}, 'headers': None, 'body': None}, | 119 | fkwargs={'api': 'private', 'method': 'POST', 'params': {}, 'headers': None, 'body': None}, |
120 | exceptions=(market.ccxt.RequestTimeout,)) | 120 | exceptions=(market.ccxt.RequestTimeout, market.ccxt.InvalidNonce)) |
121 | request.assert_not_called() | 121 | request.assert_not_called() |
122 | 122 | ||
123 | with self.subTest(desc="private POST non-regexp"): | 123 | with self.subTest(desc="private POST non-regexp"): |
@@ -125,7 +125,7 @@ class poloniexETest(unittest.TestCase): | |||
125 | retry_call.assert_called_with(request, | 125 | retry_call.assert_called_with(request, |
126 | delay=1, tries=10, fargs=["getMarginPosition"], | 126 | delay=1, tries=10, fargs=["getMarginPosition"], |
127 | fkwargs={'api': 'private', 'method': 'POST', 'params': {}, 'headers': None, 'body': None}, | 127 | fkwargs={'api': 'private', 'method': 'POST', 'params': {}, 'headers': None, 'body': None}, |
128 | exceptions=(market.ccxt.RequestTimeout,)) | 128 | exceptions=(market.ccxt.RequestTimeout, market.ccxt.InvalidNonce)) |
129 | request.assert_not_called() | 129 | request.assert_not_called() |
130 | retry_call.reset_mock() | 130 | retry_call.reset_mock() |
131 | request.reset_mock() | 131 | request.reset_mock() |
@@ -1461,16 +1461,18 @@ class MarketTest(WebMockTestCase): | |||
1461 | 1461 | ||
1462 | m.ccxt.transfer_balance.side_effect = [ | 1462 | m.ccxt.transfer_balance.side_effect = [ |
1463 | market.ccxt.RequestTimeout, | 1463 | market.ccxt.RequestTimeout, |
1464 | market.ccxt.InvalidNonce, | ||
1464 | True | 1465 | True |
1465 | ] | 1466 | ] |
1466 | m.move_balances() | 1467 | m.move_balances() |
1467 | self.ccxt.transfer_balance.assert_has_calls([ | 1468 | self.ccxt.transfer_balance.assert_has_calls([ |
1468 | mock.call("BTC", 3, "exchange", "margin"), | 1469 | mock.call("BTC", 3, "exchange", "margin"), |
1470 | mock.call("BTC", 3, "exchange", "margin"), | ||
1469 | mock.call("BTC", 3, "exchange", "margin") | 1471 | mock.call("BTC", 3, "exchange", "margin") |
1470 | ]) | 1472 | ]) |
1471 | self.assertEqual(2, fetch_balances.call_count) | 1473 | self.assertEqual(3, fetch_balances.call_count) |
1472 | m.report.log_error.assert_called_with(mock.ANY, message="Retrying", exception=mock.ANY) | 1474 | m.report.log_error.assert_called_with(mock.ANY, message="Retrying", exception=mock.ANY) |
1473 | self.assertEqual(2, m.report.log_move_balances.call_count) | 1475 | self.assertEqual(3, m.report.log_move_balances.call_count) |
1474 | 1476 | ||
1475 | self.ccxt.transfer_balance.reset_mock() | 1477 | self.ccxt.transfer_balance.reset_mock() |
1476 | m.report.reset_mock() | 1478 | m.report.reset_mock() |
@@ -3214,6 +3216,48 @@ class OrderTest(WebMockTestCase): | |||
3214 | self.m.report.log_error.assert_called_with(mock.ANY, message="Giving up Order(buy long 0.00096060 ETH at 0.1 BTC [pending])", exception=mock.ANY) | 3216 | self.m.report.log_error.assert_called_with(mock.ANY, message="Giving up Order(buy long 0.00096060 ETH at 0.1 BTC [pending])", exception=mock.ANY) |
3215 | 3217 | ||
3216 | self.m.reset_mock() | 3218 | self.m.reset_mock() |
3219 | with self.subTest(invalid_nonce=True): | ||
3220 | with self.subTest(retry_success=True): | ||
3221 | order = portfolio.Order("buy", portfolio.Amount("ETH", "0.001"), | ||
3222 | D("0.1"), "BTC", "long", self.m, "trade") | ||
3223 | self.m.ccxt.create_order.side_effect = [ | ||
3224 | portfolio.InvalidNonce, | ||
3225 | portfolio.InvalidNonce, | ||
3226 | { "id": 123 }, | ||
3227 | ] | ||
3228 | order.run() | ||
3229 | self.m.ccxt.create_order.assert_has_calls([ | ||
3230 | mock.call('ETH/BTC', 'limit', 'buy', D('0.0010'), account='exchange', price=D('0.1')), | ||
3231 | mock.call('ETH/BTC', 'limit', 'buy', D('0.0010'), account='exchange', price=D('0.1')), | ||
3232 | mock.call('ETH/BTC', 'limit', 'buy', D('0.0010'), account='exchange', price=D('0.1')), | ||
3233 | ]) | ||
3234 | self.assertEqual(3, self.m.ccxt.create_order.call_count) | ||
3235 | self.assertEqual(3, order.tries) | ||
3236 | self.m.report.log_error.assert_called() | ||
3237 | self.assertEqual(2, self.m.report.log_error.call_count) | ||
3238 | self.m.report.log_error.assert_called_with(mock.ANY, message="Retrying after invalid nonce", exception=mock.ANY) | ||
3239 | self.assertEqual(123, order.id) | ||
3240 | |||
3241 | self.m.reset_mock() | ||
3242 | with self.subTest(retry_success=False): | ||
3243 | order = portfolio.Order("buy", portfolio.Amount("ETH", "0.001"), | ||
3244 | D("0.1"), "BTC", "long", self.m, "trade") | ||
3245 | self.m.ccxt.create_order.side_effect = [ | ||
3246 | portfolio.InvalidNonce, | ||
3247 | portfolio.InvalidNonce, | ||
3248 | portfolio.InvalidNonce, | ||
3249 | portfolio.InvalidNonce, | ||
3250 | portfolio.InvalidNonce, | ||
3251 | ] | ||
3252 | order.run() | ||
3253 | self.assertEqual(5, self.m.ccxt.create_order.call_count) | ||
3254 | self.assertEqual(5, order.tries) | ||
3255 | self.m.report.log_error.assert_called() | ||
3256 | self.assertEqual(5, self.m.report.log_error.call_count) | ||
3257 | self.m.report.log_error.assert_called_with(mock.ANY, message="Giving up Order(buy long 0.00100000 ETH at 0.1 BTC [pending]) after invalid nonce", exception=mock.ANY) | ||
3258 | self.assertEqual("error", order.status) | ||
3259 | |||
3260 | self.m.reset_mock() | ||
3217 | with self.subTest(request_timeout=True): | 3261 | with self.subTest(request_timeout=True): |
3218 | order = portfolio.Order("buy", portfolio.Amount("ETH", "0.001"), | 3262 | order = portfolio.Order("buy", portfolio.Amount("ETH", "0.001"), |
3219 | D("0.1"), "BTC", "long", self.m, "trade") | 3263 | D("0.1"), "BTC", "long", self.m, "trade") |