def test_fetch(): connection = MagicMock() connection.errorhandler = Mock(return_value=None) rest = SnowflakeRestful(host="testaccount.snowflakecomputing.com", port=443, connection=connection) class Cnt: def __init__(self): self.c = 0 def set(self, cnt): self.c = cnt def reset(self): self.set(0) cnt = Cnt() default_parameters = { "method": "POST", "full_url": "https://testaccount.snowflakecomputing.com/", "headers": { "cnt": cnt }, "data": '{"code": 12345}', } NOT_RETRYABLE = 1000 class NotRetryableException(Exception): pass def fake_request_exec(**kwargs): headers = kwargs.get("headers") cnt = headers["cnt"] time.sleep(3) if cnt.c <= 1: # the first two raises failure cnt.c += 1 raise RetryRequest(Exception("can retry")) elif cnt.c == NOT_RETRYABLE: # not retryable exception raise NotRetryableException("cannot retry") else: # return success in the third attempt return {"success": True, "data": "valid data"} # inject a fake method rest._request_exec = fake_request_exec # first two attempts will fail but third will success cnt.reset() ret = rest.fetch(timeout=10, **default_parameters) assert ret == {"success": True, "data": "valid data"} assert not rest._connection.errorhandler.called # no error # first attempt to reach timeout even if the exception is retryable cnt.reset() ret = rest.fetch(timeout=1, **default_parameters) assert ret == {} assert rest._connection.errorhandler.called # error # not retryable excpetion cnt.set(NOT_RETRYABLE) with pytest.raises(NotRetryableException): rest.fetch(timeout=7, **default_parameters) # first attempt fails and will not retry cnt.reset() default_parameters["no_retry"] = True ret = rest.fetch(timeout=10, **default_parameters) assert ret == {} assert cnt.c == 1 # failed on first call - did not retry assert rest._connection.errorhandler.called # error
def test_fetch(): connection = MagicMock() connection.errorhandler = Mock(return_value=None) rest = SnowflakeRestful( host='testaccount.snowflakecomputing.com', port=443, connection=connection) class Cnt(object): def __init__(self): self.c = 0 def set(self, cnt): self.c = cnt def reset(self): self.set(0) cnt = Cnt() default_parameters = { 'method': "POST", 'full_url': "https://testaccount.snowflakecomputing.com/", 'headers': {'cnt': cnt}, 'data': '{"code": 12345}', } NOT_RETRYABLE = 1000 class NotRetryableException(Exception): pass def fake_request_exec(**kwargs): headers = kwargs.get('headers') cnt = headers['cnt'] time.sleep(3) if cnt.c <= 1: # the first two raises failure cnt.c += 1 raise RetryRequest(Exception('can retry')) elif cnt.c == NOT_RETRYABLE: # not retryable exception raise NotRetryableException('cannot retry') else: # return success in the third attempt return {'success': True, 'data': "valid data"} # inject a fake method rest._request_exec = fake_request_exec # first two attempts will fail but third will success cnt.reset() ret = rest.fetch(timeout=10, **default_parameters) assert ret == {'success': True, 'data': "valid data"} assert not rest._connection.errorhandler.called # no error # first attempt to reach timeout even if the exception is retryable cnt.reset() ret = rest.fetch(timeout=1, **default_parameters) assert ret == {} assert rest._connection.errorhandler.called # error # not retryable excpetion cnt.set(NOT_RETRYABLE) with pytest.raises(NotRetryableException): rest.fetch(timeout=7, **default_parameters)