Skip to content

Commit 98d54b2

Browse files
marwin-rothTh3Un1q3
andauthoredOct 22, 2024··
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

+17-11
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

+6-25
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

-16
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}'

‎tests/fixtures/cassettes/test_update_device_error_handling_device_id.yaml

+459
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,331 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept-Encoding:
6+
- gzip, deflate
7+
Connection:
8+
- keep-alive
9+
User-Agent:
10+
- python-requests/2.32.3
11+
accept:
12+
- application/json
13+
x-emn-origin-app:
14+
- PythonSDK
15+
x-emn-origin-app-version:
16+
- 0.3.10
17+
method: GET
18+
uri: https://cdn.emnify.net/api/v1/endpoint
19+
response:
20+
body:
21+
string: '{"message":"token contains an invalid number of segments"}'
22+
headers:
23+
Access-Control-Allow-Headers:
24+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages
25+
Access-Control-Allow-Methods:
26+
- GET, POST, PATCH, PUT, DELETE
27+
Access-Control-Allow-Origin:
28+
- '*'
29+
Access-Control-Expose-Headers:
30+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages,Location,X-Count,X-Per-Page,X-Pages,X-Page
31+
Access-Control-Max-Age:
32+
- '86400'
33+
Cache-Control:
34+
- max-age=0
35+
Connection:
36+
- keep-alive
37+
Content-Length:
38+
- '58'
39+
Content-Type:
40+
- application/json
41+
Date:
42+
- Tue, 22 Oct 2024 08:51:25 GMT
43+
Server:
44+
- CloudFront
45+
Strict-Transport-Security:
46+
- max-age=31536000
47+
Via:
48+
- 1.1 549ff9961325ec88cf02baa6f818172a.cloudfront.net (CloudFront)
49+
X-Amz-Cf-Id:
50+
- agNQF7KmJC3KgclDy9k5RkO5ptLi8xT-kMwZ9esseDWUULb_RJ2T2Q==
51+
X-Amz-Cf-Pop:
52+
- MUC50-P3
53+
X-Amzn-Trace-Id:
54+
- Root=1-6717678d-6d5469fe7358e9a749e86895
55+
X-Cache:
56+
- Error from cloudfront
57+
X-Content-Type-Options:
58+
- nosniff
59+
X-Frame-Options:
60+
- DENY
61+
x-amz-apigw-id:
62+
- AC0eNEjJDoEEulw=
63+
x-amzn-ErrorType:
64+
- AccessDeniedException
65+
x-amzn-RequestId:
66+
- 4216cde7-4e23-46ef-b9a5-d7fdd72d35b5
67+
status:
68+
code: 401
69+
message: Unauthorized
70+
- request:
71+
body: '{}'
72+
headers:
73+
Accept-Encoding:
74+
- gzip, deflate
75+
Connection:
76+
- keep-alive
77+
Content-Length:
78+
- '443'
79+
Content-Type:
80+
- application/json
81+
User-Agent:
82+
- python-requests/2.32.3
83+
accept:
84+
- application/json
85+
x-emn-origin-app:
86+
- PythonSDK
87+
x-emn-origin-app-version:
88+
- 0.3.10
89+
method: POST
90+
uri: https://cdn.emnify.net/api/v1/authenticate
91+
response:
92+
body:
93+
string: '{"auth_token": "test"}'
94+
headers:
95+
Access-Control-Allow-Headers:
96+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages
97+
Access-Control-Allow-Methods:
98+
- GET, POST, PATCH, PUT, DELETE
99+
Access-Control-Allow-Origin:
100+
- '*'
101+
Access-Control-Expose-Headers:
102+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages,Location,X-Count,X-Per-Page,X-Pages,X-Page
103+
Access-Control-Max-Age:
104+
- '86400'
105+
Cache-Control:
106+
- max-age=0
107+
Connection:
108+
- keep-alive
109+
Content-Length:
110+
- '376'
111+
Content-Type:
112+
- application/json; charset=utf-8
113+
Date:
114+
- Tue, 22 Oct 2024 08:51:25 GMT
115+
Server:
116+
- CloudFront
117+
Strict-Transport-Security:
118+
- max-age=31536000
119+
Via:
120+
- 1.1 b36a9cc0b5286fd650732f1458855500.cloudfront.net (CloudFront)
121+
X-Amz-Cf-Id:
122+
- ugYXlPhf4btqrORAXnU7y7KLQfAJTd__7SWKELNJO5t3bH8hvPg_Sg==
123+
X-Amz-Cf-Pop:
124+
- MUC50-P3
125+
X-Amzn-Trace-Id:
126+
- Root=1-6717678d-16ac81d90b3208a83af3df98
127+
X-Cache:
128+
- Miss from cloudfront
129+
X-Content-Type-Options:
130+
- nosniff
131+
X-Frame-Options:
132+
- DENY
133+
etag:
134+
- W/"178-oGWrxzarbnilnl+pwVahfAhsdCI"
135+
x-amz-apigw-id:
136+
- AC0ePEYTjoEEYeA=
137+
x-amzn-Remapped-content-length:
138+
- '376'
139+
x-amzn-RequestId:
140+
- 0a6195ba-8732-4218-ac47-e1ba9617431c
141+
x-powered-by:
142+
- Express
143+
status:
144+
code: 200
145+
message: OK
146+
- request:
147+
body: null
148+
headers:
149+
Accept-Encoding:
150+
- gzip, deflate
151+
Connection:
152+
- keep-alive
153+
User-Agent:
154+
- python-requests/2.32.3
155+
accept:
156+
- application/json
157+
x-emn-origin-app:
158+
- PythonSDK
159+
x-emn-origin-app-version:
160+
- 0.3.10
161+
method: GET
162+
uri: https://cdn.emnify.net/api/v1/endpoint
163+
response:
164+
body:
165+
string: !!binary |
166+
H4sIAAAAAAAAA8ySW4/TMBCF/0rkJxBpNb4lTt6W7fLchxUvCEXBcakhN8VOYYX63xmX3rS06SKE
167+
hJQoyfgcZzzn+/CD2IrklKpMSUVjogdTeoMlwoCxGYgZpI+U5ZDgNQeAN3gDiUldOl+MfXVSixmF
168+
GUW1zGmaU3WubsvGoOqdHZyPFmZjtYlePXwvm742r3Hdl58drt+PzneNGaK7OFoO3RejffQ2Phju
169+
4+i9GZzt2gjmFF22L8qqGowLXoo1lc1peKZpWG2MJXk71vWv96Lu9FeSr8ramZg4X/oRffsBxKQy
170+
Tg+297g97rawrvxU49G2obnBrlZFP3QrW5uDRfIsUfJ4tIVZlWPto2VXW/0UbM4Moe3ffAJkkk34
171+
TqcqXF/qo5EKlcjtNj6PLFPXI2MiZ3I6Mo7SGchHSlGaw6XI+nXXmqjt2CmlXWly/Oo4fsKlFAmn
172+
GAlPeQaU3A4Dnofx0N7OIk2SY8+VabpId5uo/+swnG0OWiGAcoHNWa3DN8EAFAce5gVJyjENTvar
173+
xTfr10U9rtvLusAnbn1op/BPvSn2IN4g8057u9lFGFhpXBgyyyRIwOlm+AsVosK6q4JcMJ4kPGNU
174+
MsFl+oeAJUxeA4zngNSwacB2apoFwIDlAi4AttzTtIdreROu7Blc7H+GK4UzuNDYXyWLqymy6AvJ
175+
ovRfkgXXyZIvIOvjTwAAAP//AwAob5oobwYAAA==
176+
headers:
177+
Access-Control-Allow-Headers:
178+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages
179+
Access-Control-Allow-Methods:
180+
- GET, POST, PATCH, PUT, DELETE
181+
Access-Control-Allow-Origin:
182+
- '*'
183+
Access-Control-Expose-Headers:
184+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages,Location,X-Count,X-Per-Page,X-Pages,X-Page
185+
Access-Control-Max-Age:
186+
- '86400'
187+
Cache-Control:
188+
- max-age=0
189+
Connection:
190+
- keep-alive
191+
Content-Encoding:
192+
- gzip
193+
Content-Type:
194+
- application/json; charset=utf-8
195+
Date:
196+
- Tue, 22 Oct 2024 08:51:26 GMT
197+
Etag:
198+
- W/"66f-47bqRZcNSVmpIA3InBwVYNxifjM"
199+
Server:
200+
- CloudFront
201+
Strict-Transport-Security:
202+
- max-age=31536000
203+
Transfer-Encoding:
204+
- chunked
205+
Vary:
206+
- Accept-Encoding
207+
Via:
208+
- 1.1 b9c5f3514baef1f70c91fc9b0be37d2e.cloudfront.net (CloudFront)
209+
X-Amz-Cf-Id:
210+
- xZGlRefi6aHD-rg9pN2r9_QOeUOSOsM4bx8rcblpP_txIbNGNFdn8w==
211+
X-Amz-Cf-Pop:
212+
- MUC50-P3
213+
X-Amzn-Trace-Id:
214+
- Root=1-6717678e-4c9eedcf3d4d548913801759
215+
X-Cache:
216+
- Miss from cloudfront
217+
X-Content-Type-Options:
218+
- nosniff
219+
X-Count:
220+
- '3'
221+
X-Count-Per-Page:
222+
- '1000'
223+
X-Current-Page:
224+
- '1'
225+
X-Frame-Options:
226+
- DENY
227+
X-Page:
228+
- '1'
229+
X-Pages:
230+
- '1'
231+
X-Per-Page:
232+
- '1000'
233+
X-Powered-By:
234+
- Express
235+
X-Sort:
236+
- id
237+
X-Total-Count:
238+
- '3'
239+
X-Total-Pages:
240+
- '1'
241+
x-amz-apigw-id:
242+
- AC0eRGY1DoEEJrg=
243+
x-amzn-Remapped-Content-Length:
244+
- '1647'
245+
x-amzn-RequestId:
246+
- 2c01fdbf-3e92-480c-b045-65d499a5efcc
247+
status:
248+
code: 200
249+
message: OK
250+
- request:
251+
body: '{"service_profile": {"id": -1}}'
252+
headers:
253+
Accept-Encoding:
254+
- gzip, deflate
255+
Connection:
256+
- keep-alive
257+
Content-Length:
258+
- '31'
259+
Content-Type:
260+
- application/json
261+
User-Agent:
262+
- python-requests/2.32.3
263+
accept:
264+
- application/json
265+
x-emn-origin-app:
266+
- PythonSDK
267+
x-emn-origin-app-version:
268+
- 0.3.10
269+
method: PATCH
270+
uri: https://cdn.emnify.net/api/v1/endpoint/11898581
271+
response:
272+
body:
273+
string: !!binary |
274+
H4sIAAAAAAAAAGWOzQqCQBSFX+VyN24sFFr5AIHbIjcRMTjHGrJ7h3G0hfjuiUhQbc/fd0ZGCBqu
275+
tVpwke+yLF2VqA8IF1yK72NlWmdNdCp741pYTvmJrjO3ucQnP1sgiPXqJNLwCdMyxetkx8V5/OXl
276+
/7ylf0CDAKnxhToiDK4G+aDN/INeLt6ptJRs8oREIzXai93ydJneHOsf4NoAAAA=
277+
headers:
278+
Access-Control-Allow-Headers:
279+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages
280+
Access-Control-Allow-Methods:
281+
- GET, POST, PATCH, PUT, DELETE
282+
Access-Control-Allow-Origin:
283+
- '*'
284+
Access-Control-Expose-Headers:
285+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages,Location,X-Count,X-Per-Page,X-Pages,X-Page
286+
Access-Control-Max-Age:
287+
- '86400'
288+
Cache-Control:
289+
- max-age=0
290+
Connection:
291+
- keep-alive
292+
Content-Encoding:
293+
- gzip
294+
Content-Length:
295+
- '161'
296+
Content-Type:
297+
- application/json; charset=UTF-8
298+
Date:
299+
- Tue, 22 Oct 2024 08:51:26 GMT
300+
Server:
301+
- CloudFront
302+
Strict-Transport-Security:
303+
- max-age=31536000
304+
Vary:
305+
- Accept-Encoding
306+
Via:
307+
- 1.1 f620f5422d3678dbdbb8544d75a30f78.cloudfront.net (CloudFront)
308+
X-Amz-Cf-Id:
309+
- FDuUwkenu4XQDAXTGyWjwr-74bg1MYLXsES9VRBSPVpirWy7bgtb2A==
310+
X-Amz-Cf-Pop:
311+
- MUC50-P3
312+
X-Amzn-Trace-Id:
313+
- Root=1-6717678e-544ffbfd75da969e588d38b8
314+
X-Cache:
315+
- Error from cloudfront
316+
X-Content-Type-Options:
317+
- nosniff
318+
X-Frame-Options:
319+
- DENY
320+
x-amz-apigw-id:
321+
- AC0eUE_YjoEETqg=
322+
x-amzn-Remapped-Content-Length:
323+
- '161'
324+
x-amzn-Remapped-Date:
325+
- Tue, 22 Oct 2024 08:51:26 GMT
326+
x-amzn-RequestId:
327+
- dccbc2b5-864f-48c3-ab0e-563b3db17905
328+
status:
329+
code: 422
330+
message: ''
331+
version: 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,322 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept-Encoding:
6+
- gzip, deflate
7+
Connection:
8+
- keep-alive
9+
User-Agent:
10+
- python-requests/2.32.3
11+
accept:
12+
- application/json
13+
x-emn-origin-app:
14+
- PythonSDK
15+
x-emn-origin-app-version:
16+
- 0.3.10
17+
method: GET
18+
uri: https://cdn.emnify.net/api/v1/endpoint
19+
response:
20+
body:
21+
string: '{"message":"token contains an invalid number of segments"}'
22+
headers:
23+
Access-Control-Allow-Headers:
24+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages
25+
Access-Control-Allow-Methods:
26+
- GET, POST, PATCH, PUT, DELETE
27+
Access-Control-Allow-Origin:
28+
- '*'
29+
Access-Control-Expose-Headers:
30+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages,Location,X-Count,X-Per-Page,X-Pages,X-Page
31+
Access-Control-Max-Age:
32+
- '86400'
33+
Cache-Control:
34+
- max-age=0
35+
Connection:
36+
- keep-alive
37+
Content-Length:
38+
- '58'
39+
Content-Type:
40+
- application/json
41+
Date:
42+
- Tue, 22 Oct 2024 08:51:26 GMT
43+
Server:
44+
- CloudFront
45+
Strict-Transport-Security:
46+
- max-age=31536000
47+
Via:
48+
- 1.1 bc8243121fd94c5b2714caac07caccde.cloudfront.net (CloudFront)
49+
X-Amz-Cf-Id:
50+
- n2Qllz3AeRJKxm2euz-MlkdLJAt0pQ1QHzRWI20C6yQ2m2BBiP-P9Q==
51+
X-Amz-Cf-Pop:
52+
- MUC50-P3
53+
X-Amzn-Trace-Id:
54+
- Root=1-6717678e-3b44bc680efe4a6a601391e0
55+
X-Cache:
56+
- Error from cloudfront
57+
X-Content-Type-Options:
58+
- nosniff
59+
X-Frame-Options:
60+
- DENY
61+
x-amz-apigw-id:
62+
- AC0eYGpGDoEEfNQ=
63+
x-amzn-ErrorType:
64+
- AccessDeniedException
65+
x-amzn-RequestId:
66+
- a448be80-95f6-40ea-921b-36bc7dac1fda
67+
status:
68+
code: 401
69+
message: Unauthorized
70+
- request:
71+
body: '{}'
72+
headers:
73+
Accept-Encoding:
74+
- gzip, deflate
75+
Connection:
76+
- keep-alive
77+
Content-Length:
78+
- '443'
79+
Content-Type:
80+
- application/json
81+
User-Agent:
82+
- python-requests/2.32.3
83+
accept:
84+
- application/json
85+
x-emn-origin-app:
86+
- PythonSDK
87+
x-emn-origin-app-version:
88+
- 0.3.10
89+
method: POST
90+
uri: https://cdn.emnify.net/api/v1/authenticate
91+
response:
92+
body:
93+
string: '{"auth_token": "test"}'
94+
headers:
95+
Access-Control-Allow-Headers:
96+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages
97+
Access-Control-Allow-Methods:
98+
- GET, POST, PATCH, PUT, DELETE
99+
Access-Control-Allow-Origin:
100+
- '*'
101+
Access-Control-Expose-Headers:
102+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages,Location,X-Count,X-Per-Page,X-Pages,X-Page
103+
Access-Control-Max-Age:
104+
- '86400'
105+
Cache-Control:
106+
- max-age=0
107+
Connection:
108+
- keep-alive
109+
Content-Length:
110+
- '376'
111+
Content-Type:
112+
- application/json; charset=utf-8
113+
Date:
114+
- Tue, 22 Oct 2024 08:51:27 GMT
115+
Server:
116+
- CloudFront
117+
Strict-Transport-Security:
118+
- max-age=31536000
119+
Via:
120+
- 1.1 549ff9961325ec88cf02baa6f818172a.cloudfront.net (CloudFront)
121+
X-Amz-Cf-Id:
122+
- cMiSxdH_MnQ46Shzpxbm5-MaidpTERJITWcGqbAOBFNlqiNpCzEtCw==
123+
X-Amz-Cf-Pop:
124+
- MUC50-P3
125+
X-Amzn-Trace-Id:
126+
- Root=1-6717678f-400b4e055db41ddd4587c28c
127+
X-Cache:
128+
- Miss from cloudfront
129+
X-Content-Type-Options:
130+
- nosniff
131+
X-Frame-Options:
132+
- DENY
133+
etag:
134+
- W/"178-XL/v2PhmKhgoHrTJC+/IhH1S1DY"
135+
x-amz-apigw-id:
136+
- AC0ebGZ0joEEgZg=
137+
x-amzn-Remapped-content-length:
138+
- '376'
139+
x-amzn-RequestId:
140+
- 10c23bcd-d2ea-4b7d-a1ca-00aa34d76a8d
141+
x-powered-by:
142+
- Express
143+
status:
144+
code: 200
145+
message: OK
146+
- request:
147+
body: null
148+
headers:
149+
Accept-Encoding:
150+
- gzip, deflate
151+
Connection:
152+
- keep-alive
153+
User-Agent:
154+
- python-requests/2.32.3
155+
accept:
156+
- application/json
157+
x-emn-origin-app:
158+
- PythonSDK
159+
x-emn-origin-app-version:
160+
- 0.3.10
161+
method: GET
162+
uri: https://cdn.emnify.net/api/v1/endpoint
163+
response:
164+
body:
165+
string: !!binary |
166+
H4sIAAAAAAAAA8ySW4/TMBCF/0rkJxBpNb4lTt6W7fLchxUvCEXBcakhN8VOYYX63xmX3rS06SKE
167+
hJQoyfgcZzzn+/CD2IrklKpMSUVjogdTeoMlwoCxGYgZpI+U5ZDgNQeAN3gDiUldOl+MfXVSixmF
168+
GUW1zGmaU3WubsvGoOqdHZyPFmZjtYlePXwvm742r3Hdl58drt+PzneNGaK7OFoO3RejffQ2Phju
169+
4+i9GZzt2gjmFF22L8qqGowLXoo1lc1peKZpWG2MJXk71vWv96Lu9FeSr8ramZg4X/oRffsBxKQy
170+
Tg+297g97rawrvxU49G2obnBrlZFP3QrW5uDRfIsUfJ4tIVZlWPto2VXW/0UbM4Moe3ffAJkkk34
171+
TqcqXF/qo5EKlcjtNj6PLFPXI2MiZ3I6Mo7SGchHSlGaw6XI+nXXmqjt2CmlXWly/Oo4fsKlFAmn
172+
GAlPeQaU3A4Dnofx0N7OIk2SY8+VabpId5uo/+swnG0OWiGAcoHNWa3DN8EAFAce5gVJyjENTvar
173+
xTfr10U9rtvLusAnbn1op/BPvSn2IN4g8057u9lFGFhpXBgyyyRIwOlm+AsVosK6q4JcMJ4kPGNU
174+
MsFl+oeAJUxeA4zngNSwacB2apoFwIDlAi4AttzTtIdreROu7Blc7H+GK4UzuNDYXyWLqymy6AvJ
175+
ovRfkgXXyZIvIOvjTwAAAP//AwAob5oobwYAAA==
176+
headers:
177+
Access-Control-Allow-Headers:
178+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages
179+
Access-Control-Allow-Methods:
180+
- GET, POST, PATCH, PUT, DELETE
181+
Access-Control-Allow-Origin:
182+
- '*'
183+
Access-Control-Expose-Headers:
184+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages,Location,X-Count,X-Per-Page,X-Pages,X-Page
185+
Access-Control-Max-Age:
186+
- '86400'
187+
Cache-Control:
188+
- max-age=0
189+
Connection:
190+
- keep-alive
191+
Content-Encoding:
192+
- gzip
193+
Content-Type:
194+
- application/json; charset=utf-8
195+
Date:
196+
- Tue, 22 Oct 2024 08:51:27 GMT
197+
Etag:
198+
- W/"66f-47bqRZcNSVmpIA3InBwVYNxifjM"
199+
Server:
200+
- CloudFront
201+
Strict-Transport-Security:
202+
- max-age=31536000
203+
Transfer-Encoding:
204+
- chunked
205+
Vary:
206+
- Accept-Encoding
207+
Via:
208+
- 1.1 ca623c10f2a669c8a9af30362937ebac.cloudfront.net (CloudFront)
209+
X-Amz-Cf-Id:
210+
- WGC5CvmtMKkuFRYzAmEC2W-GAtbcrzB_Njs-6uqxxNdU7hk7ZD9Kpg==
211+
X-Amz-Cf-Pop:
212+
- MUC50-P3
213+
X-Amzn-Trace-Id:
214+
- Root=1-6717678f-6b49eaa90841def21cf6ea1c
215+
X-Cache:
216+
- Miss from cloudfront
217+
X-Content-Type-Options:
218+
- nosniff
219+
X-Count:
220+
- '3'
221+
X-Count-Per-Page:
222+
- '1000'
223+
X-Current-Page:
224+
- '1'
225+
X-Frame-Options:
226+
- DENY
227+
X-Page:
228+
- '1'
229+
X-Pages:
230+
- '1'
231+
X-Per-Page:
232+
- '1000'
233+
X-Powered-By:
234+
- Express
235+
X-Sort:
236+
- id
237+
X-Total-Count:
238+
- '3'
239+
X-Total-Pages:
240+
- '1'
241+
x-amz-apigw-id:
242+
- AC0edG_NDoEEfJg=
243+
x-amzn-Remapped-Content-Length:
244+
- '1647'
245+
x-amzn-RequestId:
246+
- 4faa2e22-18d9-48c8-9ecc-8ba0d92a16c8
247+
status:
248+
code: 200
249+
message: OK
250+
- request:
251+
body: '{"service_profile": {"id": 540569}}'
252+
headers:
253+
Accept-Encoding:
254+
- gzip, deflate
255+
Connection:
256+
- keep-alive
257+
Content-Length:
258+
- '35'
259+
Content-Type:
260+
- application/json
261+
User-Agent:
262+
- python-requests/2.32.3
263+
accept:
264+
- application/json
265+
x-emn-origin-app:
266+
- PythonSDK
267+
x-emn-origin-app-version:
268+
- 0.3.10
269+
method: PATCH
270+
uri: https://cdn.emnify.net/api/v1/endpoint/11898581
271+
response:
272+
body:
273+
string: ''
274+
headers:
275+
Access-Control-Allow-Headers:
276+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages
277+
Access-Control-Allow-Methods:
278+
- GET, POST, PATCH, PUT, DELETE
279+
Access-Control-Allow-Origin:
280+
- '*'
281+
Access-Control-Expose-Headers:
282+
- Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Count-Per-Page,X-Current-Page,X-Sort,X-Total-Count,X-Total-Pages,Location,X-Count,X-Per-Page,X-Pages,X-Page
283+
Access-Control-Max-Age:
284+
- '86400'
285+
Cache-Control:
286+
- max-age=0
287+
Connection:
288+
- keep-alive
289+
Content-Length:
290+
- '0'
291+
Content-Type:
292+
- application/json
293+
Date:
294+
- Tue, 22 Oct 2024 08:51:27 GMT
295+
Server:
296+
- CloudFront
297+
Strict-Transport-Security:
298+
- max-age=31536000
299+
Via:
300+
- 1.1 ca623c10f2a669c8a9af30362937ebac.cloudfront.net (CloudFront)
301+
X-Amz-Cf-Id:
302+
- VrNcMgYC07ytMb7gFBuNNwfTMM1y9vViJSLoiGGiSouHNcNGEbxc_Q==
303+
X-Amz-Cf-Pop:
304+
- MUC50-P3
305+
X-Amzn-Trace-Id:
306+
- Root=1-6717678f-5572a33e5d06e016005bbbf2
307+
X-Cache:
308+
- Miss from cloudfront
309+
X-Content-Type-Options:
310+
- nosniff
311+
X-Frame-Options:
312+
- DENY
313+
x-amz-apigw-id:
314+
- AC0ehF3pDoEENUA=
315+
x-amzn-Remapped-Date:
316+
- Tue, 22 Oct 2024 08:51:27 GMT
317+
x-amzn-RequestId:
318+
- 9a9c81ee-0391-4db3-95d6-cfc77da5914e
319+
status:
320+
code: 204
321+
message: No Content
322+
version: 1

‎tests/test_emnify.py

+68-25
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import string
44
import vcr
55
import os
6+
import json
67

78
from unittest import TestCase
89
from emnify.emnify import EMnify as emnify_client
@@ -15,31 +16,46 @@ def vcr_cassette_dir(request):
1516
return os.path.join('tests/fixtures', 'cassettes')
1617

1718

18-
vcr_shared_parameters = {
19-
'filter_headers': ['authorization'],
20-
'filter_post_data_parameters': ['application_token', 'username', 'password'],
21-
}
19+
def scrub_response_string():
20+
def before_record_response(response):
21+
try:
22+
decoded_response = json.loads(response['body']['string'])
23+
if 'auth_token' in decoded_response:
24+
anonymized_response = decoded_response | {"auth_token": "test"}
25+
response['body']['string'] = json.dumps(anonymized_response).encode('UTF-8')
26+
except Exception as err:
27+
print(f"Can't modify response {err=}, {type(err)=}")
28+
return response
29+
30+
return before_record_response
31+
32+
vcr_instance = vcr.VCR(
33+
before_record_response=scrub_response_string(),
34+
filter_headers=['authorization'],
35+
filter_post_data_parameters=['application_token', 'username', 'password'],
36+
)
2237

2338
class EMnifyTest(TestCase):
39+
2440
def setUp(self) -> None:
2541
self.token = os.environ.get('EMNIFY_SDK_APPLICATION_TOKEN', 'test_token')
2642

27-
@vcr.use_cassette('tests/fixtures/cassettes/get_all_devices.yaml', **vcr_shared_parameters)
43+
@vcr_instance.use_cassette('tests/fixtures/cassettes/get_all_devices.yaml')
2844
def test_get_devices_list(self):
2945
emnify = emnify_client(app_token=self.token)
3046
devices = [i for i in emnify.devices.get_devices_list()]
3147
self.assertGreater(len(devices), 0)
3248
self.assertIsInstance(devices[0], emnify.devices.device_model)
3349

34-
@vcr.use_cassette('tests/fixtures/cassettes/device_events.yaml', **vcr_shared_parameters)
50+
@vcr_instance.use_cassette('tests/fixtures/cassettes/device_events.yaml')
3551
def test_get_device_events_list(self):
3652
emnify = emnify_client(app_token=self.token)
3753
devices = [i for i in emnify.devices.get_devices_list()]
3854
device_events = [i for i in emnify.devices.get_device_events_list(devices[3])]
3955
self.assertGreater(len(device_events), 0)
4056
self.assertIsInstance(device_events[0], emnify.devices.event_model)
4157

42-
@vcr.use_cassette('tests/fixtures/cassettes/create_device.yaml', **vcr_shared_parameters)
58+
@vcr_instance.use_cassette('tests/fixtures/cassettes/create_device.yaml')
4359
def test_create_device(self):
4460
emnify = emnify_client(app_token=self.token)
4561
for _ in range(0, 2):
@@ -64,40 +80,40 @@ def test_create_device(self):
6480
self.assertNotEqual(prev_devices_count, current_devices_count)
6581
self.assertGreater(current_devices_count, prev_devices_count)
6682

67-
@vcr.use_cassette('tests/fixtures/cassettes/send_sms_to_device.yaml', **vcr_shared_parameters)
83+
@vcr_instance.use_cassette('tests/fixtures/cassettes/send_sms_to_device.yaml')
6884
def test_send_sms(self):
6985
emnify = emnify_client(app_token=self.token)
7086
devices = [i for i in emnify.devices.get_devices_list()]
7187
sms = emnify.devices.sms_create_model(payload='sample_test_payload')
7288
emnify.devices.send_sms(device=devices[0], sms=sms)
7389

74-
@vcr.use_cassette('tests/fixtures/cassettes/get_all_device_sms.yaml', **vcr_shared_parameters)
90+
@vcr_instance.use_cassette('tests/fixtures/cassettes/get_all_device_sms.yaml')
7591
def test_get_device_sms_list(self):
7692
emnify = emnify_client(app_token=self.token)
7793
sms_instances = [i for i in emnify.devices.get_device_sms_list(device=11379224)]
7894
self.assertGreater(len(sms_instances), 0)
7995
self.assertIsInstance(sms_instances[0], emnify.devices.list_sms_model)
8096

81-
@vcr.use_cassette('tests/fixtures/cassettes/get_sim_list.yaml', **vcr_shared_parameters)
97+
@vcr_instance.use_cassette('tests/fixtures/cassettes/get_sim_list.yaml')
8298
def test_get_sim_list(self):
8399
emnify = emnify_client(app_token=self.token)
84100
sims = [i for i in emnify.sim.get_sim_list()]
85101
if sims:
86102
self.assertIsInstance(sims[0], emnify.sim.get_sim_list_model)
87103

88-
@vcr.use_cassette('tests/fixtures/cassettes/activate_sim_by_bic_200.yaml', **vcr_shared_parameters)
104+
@vcr_instance.use_cassette('tests/fixtures/cassettes/activate_sim_by_bic_200.yaml')
89105
def test_activate_sim_by_one_size_batch_bic_200(self):
90106
bics = [ # BIC CODES
91107
'valid_bic_code',
92108
'invalid_bic_code'
93-
]
109+
]
94110
emnify = emnify_client(app_token=self.token)
95111
bic = bics[0]
96112
response = emnify.sim.register_sim(bic=bic)
97113
self.assertIsInstance(response, list)
98114
self.assertIsInstance(response[0], emnify.sim.get_sim_list_model)
99115

100-
@vcr.use_cassette('tests/fixtures/cassettes/activate_sim_by_bic_422.yaml', **vcr_shared_parameters)
116+
@vcr_instance.use_cassette('tests/fixtures/cassettes/activate_sim_by_bic_422.yaml')
101117
def test_activate_sim_by_one_size_batch_bic_422(self):
102118
bics = [ # BIC CODES
103119
'valid_bic_code',
@@ -110,7 +126,7 @@ def test_activate_sim_by_one_size_batch_bic_422(self):
110126
except emnify_errors.ValidationErrorException as e:
111127
self.assertEqual(str(e), 'Invalid bic number')
112128

113-
@vcr.use_cassette('tests/fixtures/cassettes/create_device_with_sim.yaml', **vcr_shared_parameters)
129+
@vcr_instance.use_cassette('tests/fixtures/cassettes/create_device_with_sim.yaml')
114130
def test_create_device_with_sim(self):
115131
emnify = emnify_client(app_token=self.token)
116132
sims = [i for i in emnify.sim.get_sim_list()]
@@ -134,7 +150,7 @@ def test_create_device_with_sim(self):
134150
response = emnify.devices.create_device(device=device)
135151
self.assertEqual(response, 11380016)
136152

137-
@vcr.use_cassette('tests/fixtures/cassettes/test_activate_disactivate_device.yaml', **vcr_shared_parameters)
153+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_activate_disactivate_device.yaml')
138154
def test_activate_disactivate_device(self):
139155
emnify = emnify_client(app_token=self.token)
140156
devices = [i for i in emnify.devices.get_devices_list()]
@@ -143,7 +159,7 @@ def test_activate_disactivate_device(self):
143159
][0]
144160
emnify.devices.change_status(active_device_with_sim.id, disable=True)
145161

146-
@vcr.use_cassette('tests/fixtures/cassettes/test_update_device.yaml', **vcr_shared_parameters)
162+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_update_device.yaml')
147163
def test_update_device(self):
148164
emnify = emnify_client(app_token=self.token)
149165
device = [i for i in emnify.devices.get_devices_list()][0]
@@ -153,7 +169,34 @@ def test_update_device(self):
153169
updated_device = emnify.devices.retrieve_device(device_id=device.id)
154170
self.assertNotEqual(device.name, updated_device.name)
155171

156-
@vcr.use_cassette('tests/fixtures/cassettes/test_delete_device.yaml', **vcr_shared_parameters)
172+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_update_device_with_service_profile.yaml')
173+
def test_update_device_with_service_profile(self):
174+
emnify = emnify_client(app_token=self.token)
175+
device = [i for i in emnify.devices.get_devices_list()][0]
176+
service_profile_for_update = emnify.devices.service_profile_model(id=device.service_profile.id)
177+
device_model_for_update = emnify.devices.device_update_model(service_profile=service_profile_for_update)
178+
self.assertTrue(emnify.devices.update_device(device_id=device.id, device=device_model_for_update))
179+
180+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_update_device_error_handling_device_id.yaml')
181+
def test_update_device_error_handling_device_id(self):
182+
for device_id in [-1, None]:
183+
with self.subTest(device_id=device_id):
184+
emnify = emnify_client(app_token=self.token)
185+
device_model_for_update = emnify.devices.device_update_model()
186+
with pytest.raises(emnify_errors.ValidationErrorException):
187+
emnify.devices.update_device(device_id=device_id, device=device_model_for_update)
188+
189+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_update_device_error_handling_service_profile.yaml')
190+
def test_update_device_error_handling_service_profile_id(self):
191+
emnify = emnify_client(app_token=self.token)
192+
device = [i for i in emnify.devices.get_devices_list()][0]
193+
non_existing_service_profile_id = -1
194+
service_profile_for_update = emnify.devices.service_profile_model(id=non_existing_service_profile_id)
195+
device_model_for_update = emnify.devices.device_update_model(service_profile=service_profile_for_update)
196+
with pytest.raises(emnify_errors.ValidationErrorException):
197+
emnify.devices.update_device(device_id=device.id, device=device_model_for_update)
198+
199+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_delete_device.yaml')
157200
def test_delete_device(self):
158201
emnify = emnify_client(app_token=self.token)
159202
all_devices = [i for i in emnify.devices.get_devices_list()]
@@ -169,15 +212,15 @@ def test_delete_device(self):
169212
self.assertEqual(changed_sim.status.description, 'Suspended')
170213
self.assertGreater(len_before_delete, len_after_delete)
171214

172-
@vcr.use_cassette('tests/fixtures/cassettes/test_list_device_blacklist.yaml', **vcr_shared_parameters)
215+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_list_device_blacklist.yaml')
173216
def test_list_device_blacklist(self):
174217
emnify = emnify_client(app_token=self.token)
175218
device_id = 11380018
176219
operators = [i for i in emnify.devices.get_device_operator_blacklist(device_id=device_id)]
177220
self.assertGreater(len(operators), 0)
178221
self.assertEqual(operators[0].country.name, 'Albania')
179222

180-
@vcr.use_cassette('tests/fixtures/cassettes/test_delete_blacklist_operator.yaml', **vcr_shared_parameters)
223+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_delete_blacklist_operator.yaml')
181224
def test_delete_blacklist_operator(self):
182225
emnify = emnify_client(app_token=self.token)
183226
device_id = 11380018
@@ -187,7 +230,7 @@ def test_delete_blacklist_operator(self):
187230

188231
self.assertGreater(len(previous_operators_list), len(updated_operators_list))
189232

190-
@vcr.use_cassette('tests/fixtures/cassettes/test_add_blacklist_operator.yaml', **vcr_shared_parameters)
233+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_add_blacklist_operator.yaml')
191234
def test_add_blacklist_operator(self):
192235
emnify = emnify_client(app_token=self.token)
193236
device_id = 11380018
@@ -197,7 +240,7 @@ def test_add_blacklist_operator(self):
197240
updated_operators_list = [i for i in emnify.devices.get_device_operator_blacklist(device_id=device_id)]
198241
self.assertGreater(len(updated_operators_list), len(previous_operators_list))
199242

200-
@vcr.use_cassette('tests/fixtures/cassettes/test_add_blacklist_operator_error.yaml', **vcr_shared_parameters)
243+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_add_blacklist_operator_error.yaml')
201244
def test_add_blacklist_operator_error(self):
202245
emnify = emnify_client(app_token=self.token)
203246
device_id = 11380018
@@ -209,25 +252,25 @@ def test_add_blacklist_operator_error(self):
209252
else:
210253
self.assertTrue(False)
211254

212-
@vcr.use_cassette('tests/fixtures/cassettes/test_operator_list.yaml', **vcr_shared_parameters)
255+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_operator_list.yaml')
213256
def test_operator_list(self):
214257
emnify = emnify_client(app_token=self.token)
215258
operators = [i for i in emnify.operator.get_operators()]
216259
self.assertGreater(len(operators), 0)
217260

218-
@vcr.use_cassette('tests/fixtures/cassettes/test_reset_connectivity.yaml', **vcr_shared_parameters)
261+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_reset_connectivity.yaml')
219262
def test_reset_connectivity(self):
220263
emnify = emnify_client(app_token=self.token)
221264
device_id = 12132821
222265
self.assertTrue(emnify.devices.reset_connectivity_data(device_id=device_id))
223266

224-
@vcr.use_cassette('tests/fixtures/cassettes/test_reset_connectivity_network.yaml', **vcr_shared_parameters)
267+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_reset_connectivity_network.yaml')
225268
def test_reset_connectivity_network(self):
226269
emnify = emnify_client(app_token=self.token)
227270
device_id = 12132821
228271
self.assertTrue(emnify.devices.reset_connectivity_network(device_id=device_id))
229272

230-
@vcr.use_cassette('tests/fixtures/cassettes/test_get_device_connectivity.yaml', **vcr_shared_parameters)
273+
@vcr_instance.use_cassette('tests/fixtures/cassettes/test_get_device_connectivity.yaml')
231274
def test_get_device_connectivity_data(self):
232275
emnify = emnify_client(app_token=self.token)
233276
device_id = 12132821

0 commit comments

Comments
 (0)
Please sign in to comment.