Skip to content

Commit 98d54b2

Browse files
chore: test for update device error handling (#235) (#236)
* [Automated] Version Bump from 0.3.9 to 0.3.10 * Add error handling for UpdateDevice call for status code 404 * Add error handling for UpdateDevice call for status code 400 * Add tests for UpdateDevice api call * Add tests for UpdateDevice api call * Change response handlers in device api to be handled by BaseApiManager * Change response handlers in sim api and general api_manager.py * Add function to anonymize response before recording * Remove unnecessary print statement --------- Co-authored-by: Mikhail Gubenko <[email protected]> Co-authored-by: Th3Un1q3 <[email protected]>
1 parent 4274734 commit 98d54b2

7 files changed

+1203
-77
lines changed

emnify/api_manager.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88

99
MAIN_URL = os.environ.get('EMNIFY_SDK_API_ENDPOINT_URL', 'https://cdn.emnify.net/api')
1010

11-
MAX_PAGES_IN_PAGINATOR = 1000 # with regular page size 1000...2000 gives max 2_000_000 records
11+
MAX_PAGES_IN_PAGINATOR = 1000 # with regular page size 1000...2000 gives max 2_000_000 records
12+
1213

1314
class BaseApiManager:
1415
"""
@@ -18,8 +19,10 @@ class BaseApiManager:
1819
response_handlers = {
1920
200: 'return_unwrapped',
2021
201: 'return_success',
21-
401: 'unauthorised',
2222
204: 'return_success',
23+
400: 'process_exception',
24+
401: 'unauthorised',
25+
404: 'process_exception',
2326
409: 'process_exception',
2427
422: 'process_exception'
2528
}
@@ -47,7 +50,8 @@ def process_exception(self, response: requests.Response, client, data: dict = No
4750
raise emnify_errors.ValidationErrorException(f'{response.json()}')
4851

4952
def return_paginator(
50-
self, response: requests.Response, client, data: dict = None, files=None, path_params: dict = None, query_params: dict = None
53+
self, response: requests.Response, client, data: dict = None, files=None, path_params: dict = None,
54+
query_params: dict = None
5155
) -> typing.Generator:
5256
query_params = query_params or {}
5357
page = query_params.get('page', 1) if query_params else 1
@@ -92,7 +96,7 @@ def call_api(self, client, data: dict = None, files=None, path_params: dict = No
9296
"Unknown status code {status_code}".format(status_code=response.status_code)
9397
)
9498

95-
return getattr(self, self.response_handlers[response.status_code])\
99+
return getattr(self, self.response_handlers[response.status_code]) \
96100
(response, client, data=data, files=files, query_params=query_params, path_params=path_params)
97101

98102
def make_get_request(self, main_url: str, method_name: str, headers: dict, params: str = None):
@@ -101,10 +105,12 @@ def make_get_request(self, main_url: str, method_name: str, headers: dict, param
101105
def make_post_request(self, main_url: str, method_name: str, headers: dict, params: dict = None, data: dict = None):
102106
return requests.post(self.resource_path(main_url, method_name), headers=headers, json=data, params=params)
103107

104-
def make_patch_request(self, main_url: str, method_name: str, headers: dict, params: dict = None, data: dict = None):
108+
def make_patch_request(self, main_url: str, method_name: str, headers: dict, params: dict = None,
109+
data: dict = None):
105110
return requests.patch(self.resource_path(main_url, method_name), headers=headers, json=data, params=params)
106111

107-
def make_delete_request(self, main_url: str, method_name: str, headers: dict, params: dict = None, data: dict = None):
112+
def make_delete_request(self, main_url: str, method_name: str, headers: dict, params: dict = None,
113+
data: dict = None):
108114
return requests.delete(self.resource_path(main_url, method_name), headers=headers, json=data, params=params)
109115

110116
def make_put_request(self, main_url: str, method_name: str, headers: dict, params: dict = None, data: dict = None):
@@ -158,11 +164,11 @@ class Authenticate(BaseApiManager):
158164
request_url_prefix = emnify_constants.AuthenticateRequestsUrl.V1_AUTHENTICATE.value
159165
request_method_name = emnify_constants.RequestsType.POST.value
160166

161-
response_handlers = {
162-
200: 'return_unwrapped',
163-
401: 'unauthorised',
164-
404: 'unexpected_error'
165-
}
167+
def __init__(self, *args, **kwargs):
168+
super().__init__(*args, **kwargs)
169+
self.response_handlers = self.response_handlers.copy() | {
170+
404: 'unexpected_error'
171+
}
166172

167173
def unauthorised(
168174
self, response: requests.Response, client, data: dict = None, files=None, path_params: list = None, **kwargs

emnify/modules/device/api_call_manager.py

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
class GetAllDevicesApiCall(BaseApiManager):
88
request_url_prefix = '/v1/endpoint'
99
request_method_name = RequestsType.GET.value
10-
response_handlers = {
11-
200: 'return_paginator',
12-
401: 'unauthorised',
13-
}
10+
11+
def __init__(self, *args, **kwargs):
12+
super().__init__(*args, **kwargs)
13+
self.response_handlers = self.response_handlers.copy() | {
14+
200: 'return_paginator'
15+
}
1416

1517

1618
class GetEventsByDevice(BaseApiManager):
@@ -27,12 +29,6 @@ def __init__(self, *args, **kwargs):
2729
class CreateDevice(BaseApiManager):
2830
request_url_prefix = '/v1/endpoint'
2931
request_method_name = RequestsType.POST.value
30-
response_handlers = {
31-
200: 'return_unwrapped',
32-
201: 'return_success',
33-
401: 'unauthorised',
34-
422: 'process_exception'
35-
}
3632

3733
def return_success(self, response: requests.Response, client, data: dict = None, *args, **kwargs) -> True:
3834
return int(response.headers.get('Location').split('/')[-1])
@@ -46,10 +42,6 @@ class GetAllSmsFromDevice(BaseApiManager):
4642
class SendSmsToDevice(BaseApiManager):
4743
request_url_prefix = '/v1/endpoint/{endpoint_id}/sms'
4844
request_method_name = RequestsType.POST.value
49-
response_handlers = {
50-
201: 'return_success',
51-
401: 'unauthorised',
52-
}
5345

5446

5547
class RetrieveDevice(BaseApiManager):
@@ -60,11 +52,6 @@ class RetrieveDevice(BaseApiManager):
6052
class UpdateDevice(BaseApiManager):
6153
request_url_prefix = RequestUrls.ENDPOINT_IN_URL.value
6254
request_method_name = RequestsType.PATCH.value
63-
response_handlers = {
64-
204: 'return_success',
65-
401: 'unauthorised',
66-
422: 'process_exception'
67-
}
6855

6956

7057
class DeleteDevice(BaseApiManager):
@@ -106,12 +93,6 @@ class GetDeviceConnectivity(BaseApiManager):
10693
request_url_prefix = '/v1/endpoint/{endpoint_id}/connectivity'
10794
request_method_name = RequestsType.GET.value
10895

109-
response_handlers = {
110-
200: 'return_unwrapped',
111-
401: 'unauthorised',
112-
422: 'process_exception',
113-
}
114-
11596
def process_exception(self, response: requests.Response, client, data: dict = None, *args, **kwargs):
11697
raise ValidationErrorException(
11798
'device_id is not valid'

emnify/modules/sim/api_call_manager.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,6 @@ class SimActivateApi(BaseApiManager):
1919
request_url_prefix = '/v1/sim_batch/bic/{bic}'
2020
request_method_name = RequestsType.PATCH.value
2121

22-
response_handlers = {
23-
200: 'return_unwrapped',
24-
401: 'unauthorised',
25-
422: 'process_exception'
26-
}
27-
2822
def process_exception(self, response: requests.Response, client, data: dict = None, *args, **kwargs):
2923
raise ValidationErrorException('Invalid bic number')
3024

@@ -33,16 +27,6 @@ class SimUpdateApi(BaseApiManager):
3327
request_url_prefix = '/v1/sim/{sim}'
3428
request_method_name = RequestsType.PATCH.value
3529

36-
response_handlers = {
37-
204: 'return_success',
38-
401: 'unauthorised',
39-
400: 'process_exception',
40-
422: 'unauthorised'
41-
}
42-
43-
def process_exception(self, response: requests.Response, client, data: dict = None, *args, **kwargs):
44-
raise ValidationErrorException(response.json())
45-
4630

4731
class SimRetrieveApi(BaseApiManager):
4832
request_url_prefix = '/v1/sim/{sim}'

0 commit comments

Comments
 (0)