@@ -38,6 +38,19 @@ def fail_response(self, response):
3838 response ._content = json .dumps ({"error" : error }).encode ('utf-8' )
3939 return response
4040
41+ @pytest .fixture ()
42+ def rate_limit_response (self , response ):
43+ response .status_code = 422
44+ error = {
45+ "code" : "rate_limit_exceeded" ,
46+ "message" : "limit of 10 requests per hour reached" ,
47+ "details" : {
48+
49+ }
50+ }
51+ response ._content = json .dumps ({"error" : error }).encode ('utf-8' )
52+ return response
53+
4154 def test__get_user_agent (self , client ):
4255 user_agent = client ._get_user_agent ()
4356 assert user_agent == "hcloud-python/0.0.0"
@@ -114,3 +127,23 @@ def test_request_500_empty_content(self, mocked_requests, client, fail_response)
114127 assert error .code == 500
115128 assert error .message == "Internal Server Error"
116129 assert error .details ["content" ] == ""
130+
131+ def test_request_limit (self , mocked_requests , client , rate_limit_response ):
132+ client .retry_wait_time = 0
133+ mocked_requests .request .return_value = rate_limit_response
134+ with pytest .raises (HcloudAPIException ) as exception_info :
135+ client .request ("POST" , "http://url.com" , params = {"argument" : "value" }, timeout = 2 )
136+ error = exception_info .value
137+ assert mocked_requests .request .call_count == 5
138+ assert error .code == "rate_limit_exceeded"
139+ assert error .message == "limit of 10 requests per hour reached"
140+
141+ def test_request_limit_then_success (self , mocked_requests , client , rate_limit_response ):
142+ client .retry_wait_time = 0
143+ response = requests .Response ()
144+ response .status_code = 200
145+ response ._content = json .dumps ({"result" : "data" }).encode ('utf-8' )
146+ mocked_requests .request .side_effect = [rate_limit_response , response ]
147+
148+ client .request ("POST" , "http://url.com" , params = {"argument" : "value" }, timeout = 2 )
149+ assert mocked_requests .request .call_count == 2
0 commit comments