1616from typing import Any , SupportsFloat
1717from zoneinfo import ZoneInfo
1818
19- from requests import Request , Response
2019from requests .models import PreparedRequest
2120
2221from mock_vws ._constants import ResultCodes , TargetStatuses
@@ -77,7 +76,7 @@ def decorator(method: Callable[..., str]) -> Callable[..., str]:
7776 return decorator
7877
7978
80- def _body_bytes (request : Request ) -> bytes :
79+ def _body_bytes (request : PreparedRequest ) -> bytes :
8180 """
8281 Return the body of a request as bytes.
8382 """
@@ -129,7 +128,9 @@ def __init__(
129128 path_pattern = "/targets" ,
130129 http_methods = {HTTPMethod .POST },
131130 )
132- def add_target (self , request : PreparedRequest ) -> Response :
131+ def add_target (
132+ self , request : PreparedRequest
133+ ) -> tuple [int , dict [str , str ], str ]:
133134 """
134135 Add a target.
135136
@@ -140,23 +141,22 @@ def add_target(self, request: PreparedRequest) -> Response:
140141 run_services_validators (
141142 request_headers = request .headers ,
142143 request_body = _body_bytes (request = request ),
143- request_method = request .method ,
144+ request_method = request .method or "" ,
144145 request_path = request .path_url ,
145146 databases = self ._target_manager .databases ,
146147 )
147148 except ValidatorError as exc :
148- context .headers = exc .headers
149- context .status_code = exc .status_code
150- return exc .response_text
149+ return exc .status_code , exc .headers , exc .response_text
151150
152151 database = get_database_matching_server_keys (
153152 request_headers = request .headers ,
154153 request_body = _body_bytes (request = request ),
155- request_method = request .method ,
154+ request_method = request .method or "" ,
156155 request_path = request .path_url ,
157156 databases = self ._target_manager .databases ,
158157 )
159158
159+ request_json : dict [str , Any ] = json .loads (s = request .body or b"" )
160160 given_active_flag = request_json .get ("active_flag" )
161161 active_flag = {
162162 None : True ,
@@ -206,7 +206,9 @@ def add_target(self, request: PreparedRequest) -> Response:
206206 path_pattern = f"/targets/{ _TARGET_ID_PATTERN } " ,
207207 http_methods = {HTTPMethod .DELETE },
208208 )
209- def delete_target (self , request : PreparedRequest ) -> Response :
209+ def delete_target (
210+ self , request : PreparedRequest
211+ ) -> tuple [int , dict [str , str ], str ]:
210212 """
211213 Delete a target.
212214
@@ -217,25 +219,23 @@ def delete_target(self, request: PreparedRequest) -> Response:
217219 run_services_validators (
218220 request_headers = request .headers ,
219221 request_body = _body_bytes (request = request ),
220- request_method = request .method ,
222+ request_method = request .method or "" ,
221223 request_path = request .path_url ,
222224 databases = self ._target_manager .databases ,
223225 )
224226 except ValidatorError as exc :
225- context .headers = exc .headers
226- context .status_code = exc .status_code
227- return exc .response_text
227+ return exc .status_code , exc .headers , exc .response_text
228228
229229 body : dict [str , str ] = {}
230230 database = get_database_matching_server_keys (
231231 request_headers = request .headers ,
232232 request_body = _body_bytes (request = request ),
233- request_method = request .method ,
233+ request_method = request .method or "" ,
234234 request_path = request .path_url ,
235235 databases = self ._target_manager .databases ,
236236 )
237237
238- target_id = request .path .split (sep = "/" )[- 1 ]
238+ target_id = request .path_url .split (sep = "/" )[- 1 ]
239239 target = database .get_target (target_id = target_id )
240240
241241 if target .status == TargetStatuses .PROCESSING .value :
@@ -259,7 +259,7 @@ def delete_target(self, request: PreparedRequest) -> Response:
259259 "result_code" : ResultCodes .SUCCESS .value ,
260260 }
261261 body_json = json_dump (body = body )
262- context . headers = {
262+ headers = {
263263 "Connection" : "keep-alive" ,
264264 "Content-Length" : str (len (body_json )),
265265 "Content-Type" : "application/json" ,
@@ -270,10 +270,13 @@ def delete_target(self, request: PreparedRequest) -> Response:
270270 "x-aws-region" : "us-east-2, us-west-2" ,
271271 "x-content-type-options" : "nosniff" ,
272272 }
273- return body_json
273+ return HTTPStatus . OK , headers , body_json
274274
275275 @route (path_pattern = "/summary" , http_methods = {HTTPMethod .GET })
276- def database_summary (self , request : "Request" ) -> str :
276+ def database_summary (
277+ self ,
278+ request : PreparedRequest ,
279+ ) -> tuple [int , dict [str , str ], str ]:
277280 """
278281 Get a database summary report.
279282
@@ -285,21 +288,19 @@ def database_summary(self, request: "Request") -> str:
285288 run_services_validators (
286289 request_headers = request .headers ,
287290 request_body = _body_bytes (request = request ),
288- request_method = request .method ,
291+ request_method = request .method or "" ,
289292 request_path = request .path_url ,
290293 databases = self ._target_manager .databases ,
291294 )
292295 except ValidatorError as exc :
293- context .headers = exc .headers
294- context .status_code = exc .status_code
295- return exc .response_text
296+ return exc .status_code , exc .headers , exc .response_text
296297
297298 body : dict [str , str | int ] = {}
298299
299300 database = get_database_matching_server_keys (
300301 request_headers = request .headers ,
301302 request_body = _body_bytes (request = request ),
302- request_method = request .method ,
303+ request_method = request .method or "" ,
303304 request_path = request .path_url ,
304305 databases = self ._target_manager .databases ,
305306 )
@@ -326,7 +327,7 @@ def database_summary(self, request: "Request") -> str:
326327 "request_usage" : 0 ,
327328 }
328329 body_json = json_dump (body = body )
329- context . headers = {
330+ headers = {
330331 "Connection" : "keep-alive" ,
331332 "Content-Length" : str (len (body_json )),
332333 "Content-Type" : "application/json" ,
@@ -337,10 +338,12 @@ def database_summary(self, request: "Request") -> str:
337338 "x-aws-region" : "us-east-2, us-west-2" ,
338339 "x-content-type-options" : "nosniff" ,
339340 }
340- return body_json
341+ return HTTPStatus . OK , headers , body_json
341342
342343 @route (path_pattern = "/targets" , http_methods = {HTTPMethod .GET })
343- def target_list (self , request : PreparedRequest ) -> Response :
344+ def target_list (
345+ self , request : PreparedRequest
346+ ) -> tuple [int , dict [str , str ], str ]:
344347 """
345348 Get a list of all targets.
346349
@@ -351,19 +354,17 @@ def target_list(self, request: PreparedRequest) -> Response:
351354 run_services_validators (
352355 request_headers = request .headers ,
353356 request_body = _body_bytes (request = request ),
354- request_method = request .method ,
357+ request_method = request .method or "" ,
355358 request_path = request .path_url ,
356359 databases = self ._target_manager .databases ,
357360 )
358361 except ValidatorError as exc :
359- context .headers = exc .headers
360- context .status_code = exc .status_code
361- return exc .response_text
362+ return exc .status_code , exc .headers , exc .response_text
362363
363364 database = get_database_matching_server_keys (
364365 request_headers = request .headers ,
365366 request_body = _body_bytes (request = request ),
366- request_method = request .method ,
367+ request_method = request .method or "" ,
367368 request_path = request .path_url ,
368369 databases = self ._target_manager .databases ,
369370 )
@@ -383,7 +384,7 @@ def target_list(self, request: PreparedRequest) -> Response:
383384 "results" : response_results ,
384385 }
385386 body_json = json_dump (body = body )
386- context . headers = {
387+ headers = {
387388 "Connection" : "keep-alive" ,
388389 "Content-Length" : str (len (body_json )),
389390 "Content-Type" : "application/json" ,
@@ -394,13 +395,15 @@ def target_list(self, request: PreparedRequest) -> Response:
394395 "x-aws-region" : "us-east-2, us-west-2" ,
395396 "x-content-type-options" : "nosniff" ,
396397 }
397- return body_json
398+ return HTTPStatus . OK , headers , body_json
398399
399400 @route (
400401 path_pattern = f"/targets/{ _TARGET_ID_PATTERN } " ,
401402 http_methods = {HTTPMethod .GET },
402403 )
403- def get_target (self , request : PreparedRequest ) -> Response :
404+ def get_target (
405+ self , request : PreparedRequest
406+ ) -> tuple [int , dict [str , str ], str ]:
404407 """
405408 Get details of a target.
406409
@@ -411,23 +414,21 @@ def get_target(self, request: PreparedRequest) -> Response:
411414 run_services_validators (
412415 request_headers = request .headers ,
413416 request_body = _body_bytes (request = request ),
414- request_method = request .method ,
417+ request_method = request .method or "" ,
415418 request_path = request .path_url ,
416419 databases = self ._target_manager .databases ,
417420 )
418421 except ValidatorError as exc :
419- context .headers = exc .headers
420- context .status_code = exc .status_code
421- return exc .response_text
422+ return exc .status_code , exc .headers , exc .response_text
422423
423424 database = get_database_matching_server_keys (
424425 request_headers = request .headers ,
425426 request_body = _body_bytes (request = request ),
426- request_method = request .method ,
427+ request_method = request .method or "" ,
427428 request_path = request .path_url ,
428429 databases = self ._target_manager .databases ,
429430 )
430- target_id = request .path .split (sep = "/" )[- 1 ]
431+ target_id = request .path_url .split (sep = "/" )[- 1 ]
431432 target = database .get_target (target_id = target_id )
432433
433434 target_record = {
@@ -451,7 +452,7 @@ def get_target(self, request: PreparedRequest) -> Response:
451452 "status" : target .status ,
452453 }
453454 body_json = json_dump (body = body )
454- context . headers = {
455+ headers = {
455456 "Connection" : "keep-alive" ,
456457 "Content-Length" : str (len (body_json )),
457458 "Content-Type" : "application/json" ,
@@ -462,13 +463,15 @@ def get_target(self, request: PreparedRequest) -> Response:
462463 "x-aws-region" : "us-east-2, us-west-2" ,
463464 "x-content-type-options" : "nosniff" ,
464465 }
465- return body_json
466+ return HTTPStatus . OK , headers , body_json
466467
467468 @route (
468469 path_pattern = f"/duplicates/{ _TARGET_ID_PATTERN } " ,
469470 http_methods = {HTTPMethod .GET },
470471 )
471- def get_duplicates (self , request : PreparedRequest ) -> Response :
472+ def get_duplicates (
473+ self , request : PreparedRequest
474+ ) -> tuple [int , dict [str , str ], str ]:
472475 """
473476 Get targets which may be considered duplicates of a given target.
474477
@@ -479,23 +482,21 @@ def get_duplicates(self, request: PreparedRequest) -> Response:
479482 run_services_validators (
480483 request_headers = request .headers ,
481484 request_body = _body_bytes (request = request ),
482- request_method = request .method ,
485+ request_method = request .method or "" ,
483486 request_path = request .path_url ,
484487 databases = self ._target_manager .databases ,
485488 )
486489 except ValidatorError as exc :
487- context .headers = exc .headers
488- context .status_code = exc .status_code
489- return exc .response_text
490+ return exc .status_code , exc .headers , exc .response_text
490491
491492 database = get_database_matching_server_keys (
492493 request_headers = request .headers ,
493494 request_body = _body_bytes (request = request ),
494- request_method = request .method ,
495+ request_method = request .method or "" ,
495496 request_path = request .path_url ,
496497 databases = self ._target_manager .databases ,
497498 )
498- target_id = request .path .split (sep = "/" )[- 1 ]
499+ target_id = request .path_url .split (sep = "/" )[- 1 ]
499500 target = database .get_target (target_id = target_id )
500501
501502 other_targets = database .targets - {target }
@@ -542,7 +543,9 @@ def get_duplicates(self, request: PreparedRequest) -> Response:
542543 path_pattern = f"/targets/{ _TARGET_ID_PATTERN } " ,
543544 http_methods = {HTTPMethod .PUT },
544545 )
545- def update_target (self , request : PreparedRequest ) -> Response :
546+ def update_target (
547+ self , request : PreparedRequest
548+ ) -> tuple [int , dict [str , str ], str ]:
546549 """
547550 Update a target.
548551
@@ -558,19 +561,17 @@ def update_target(self, request: PreparedRequest) -> Response:
558561 databases = self ._target_manager .databases ,
559562 )
560563 except ValidatorError as exc :
561- request .headers = exc .headers
562- context .status_code = exc .status_code
563- return exc .response_text
564+ return exc .status_code , exc .headers , exc .response_text
564565
565566 database = get_database_matching_server_keys (
566567 request_headers = request .headers ,
567568 request_body = _body_bytes (request = request ),
568- request_method = request .method ,
569+ request_method = request .method or "" ,
569570 request_path = request .path_url ,
570571 databases = self ._target_manager .databases ,
571572 )
572573
573- target_id = request .path .split (sep = "/" )[- 1 ]
574+ target_id = request .path_url .split (sep = "/" )[- 1 ]
574575 target = database .get_target (target_id = target_id )
575576 body : dict [str , str ] = {}
576577
@@ -635,7 +636,7 @@ def update_target(self, request: PreparedRequest) -> Response:
635636 "transaction_id" : uuid .uuid4 ().hex ,
636637 }
637638 body_json = json_dump (body = body )
638- context . headers = {
639+ headers = {
639640 "Connection" : "keep-alive" ,
640641 "Content-Type" : "application/json" ,
641642 "server" : "envoy" ,
@@ -652,7 +653,9 @@ def update_target(self, request: PreparedRequest) -> Response:
652653 path_pattern = f"/summary/{ _TARGET_ID_PATTERN } " ,
653654 http_methods = {HTTPMethod .GET },
654655 )
655- def target_summary (self , request : PreparedRequest ) -> Response :
656+ def target_summary (
657+ self , request : PreparedRequest
658+ ) -> tuple [int , dict [str , str ], str ]:
656659 """
657660 Get a summary report for a target.
658661
@@ -663,7 +666,7 @@ def target_summary(self, request: PreparedRequest) -> Response:
663666 run_services_validators (
664667 request_headers = request .headers ,
665668 request_body = _body_bytes (request = request ),
666- request_method = request .method ,
669+ request_method = request .method or "" ,
667670 request_path = request .path_url ,
668671 databases = self ._target_manager .databases ,
669672 )
@@ -675,11 +678,11 @@ def target_summary(self, request: PreparedRequest) -> Response:
675678 database = get_database_matching_server_keys (
676679 request_headers = request .headers ,
677680 request_body = _body_bytes (request = request ),
678- request_method = request .method ,
681+ request_method = request .method or "" ,
679682 request_path = request .path_url ,
680683 databases = self ._target_manager .databases ,
681684 )
682- target_id = request .path .split (sep = "/" )[- 1 ]
685+ target_id = request .path_url .split (sep = "/" )[- 1 ]
683686 target = database .get_target (target_id = target_id )
684687
685688 date = email .utils .formatdate (
0 commit comments