Skip to content

Commit 4d9e389

Browse files
committed
Further progress towards switching to responses
1 parent 8acf675 commit 4d9e389

File tree

3 files changed

+86
-78
lines changed

3 files changed

+86
-78
lines changed

src/mock_vws/_requests_mock_server/decorators.py

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -118,45 +118,47 @@ def __enter__(self) -> Self:
118118
"""
119119
compiled_url_patterns: set[re.Pattern[str]] = set()
120120

121-
with RequestsMock(assert_all_requests_are_fired=False) as mock:
122-
for vws_route in self._mock_vws_api.routes:
123-
url_pattern = urljoin(
124-
base=self._base_vws_url,
125-
url=f"{vws_route.path_pattern}$",
121+
mock = RequestsMock(assert_all_requests_are_fired=False)
122+
for vws_route in self._mock_vws_api.routes:
123+
url_pattern = urljoin(
124+
base=self._base_vws_url,
125+
url=f"{vws_route.path_pattern}$",
126+
)
127+
compiled_url_pattern = re.compile(pattern=url_pattern)
128+
compiled_url_patterns.add(compiled_url_pattern)
129+
130+
for vws_http_method in vws_route.http_methods:
131+
mock.add_callback(
132+
method=vws_http_method,
133+
url=compiled_url_pattern,
134+
callback=getattr(self._mock_vws_api, vws_route.route_name),
126135
)
127-
compiled_url_pattern = re.compile(pattern=url_pattern)
128-
compiled_url_patterns.add(compiled_url_pattern)
129-
130-
for vws_http_method in vws_route.http_methods:
131-
mock.add_callback(
132-
method=vws_http_method,
133-
url=compiled_url_pattern,
134-
callback=getattr(
135-
self._mock_vws_api, vws_route.route_name
136-
),
137-
)
138-
139-
for vwq_route in self._mock_vwq_api.routes:
140-
url_pattern = urljoin(
141-
base=self._base_vwq_url,
142-
url=f"{vwq_route.path_pattern}$",
136+
137+
for vwq_route in self._mock_vwq_api.routes:
138+
url_pattern = urljoin(
139+
base=self._base_vwq_url,
140+
url=f"{vwq_route.path_pattern}$",
141+
)
142+
compiled_url_pattern = re.compile(pattern=url_pattern)
143+
compiled_url_patterns.add(compiled_url_pattern)
144+
145+
for vwq_http_method in vwq_route.http_methods:
146+
mock.add_callback(
147+
method=vwq_http_method,
148+
url=compiled_url_pattern,
149+
callback=getattr(self._mock_vwq_api, vwq_route.route_name),
143150
)
144-
compiled_url_pattern = re.compile(pattern=url_pattern)
145-
compiled_url_patterns.add(compiled_url_pattern)
146-
147-
for vwq_http_method in vwq_route.http_methods:
148-
mock.add_callback(
149-
method=vwq_http_method,
150-
url=compiled_url_pattern,
151-
callback=getattr(
152-
self._mock_vwq_api, vwq_route.route_name
153-
),
154-
)
155-
156-
if self._real_http:
157-
mock.add_passthru(prefix=re.compile(".*"))
158-
self._mock = mock
159-
self._mock.start()
151+
152+
if self._real_http:
153+
combined_pattern = "|".join(
154+
f"(?:{pattern.pattern})" for pattern in compiled_url_patterns
155+
)
156+
negated_pattern = f"(?!{combined_pattern})."
157+
compiled_negated_pattern = re.compile(pattern=negated_pattern)
158+
mock.add_passthru(prefix=compiled_negated_pattern)
159+
160+
self._mock = mock
161+
self._mock.start()
160162

161163
return self
162164

src/mock_vws/_requests_mock_server/mock_web_services_api.py

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@
99
import dataclasses
1010
import datetime
1111
import email.utils
12+
import json
1213
import uuid
1314
from collections.abc import Callable
1415
from http import HTTPMethod, HTTPStatus
15-
from typing import SupportsFloat
16+
from typing import Any, SupportsFloat
1617
from zoneinfo import ZoneInfo
1718

19+
from requests import Request, Response
20+
from requests.models import PreparedRequest
21+
1822
from mock_vws._constants import ResultCodes, TargetStatuses
1923
from mock_vws._database_matchers import get_database_matching_server_keys
2024
from mock_vws._mock_common import Route, json_dump
@@ -125,7 +129,7 @@ def __init__(
125129
path_pattern="/targets",
126130
http_methods={HTTPMethod.POST},
127131
)
128-
def add_target(self, request: "Request", context: "Context") -> str:
132+
def add_target(self, request: PreparedRequest) -> Response:
129133
"""
130134
Add a target.
131135
@@ -137,7 +141,7 @@ def add_target(self, request: "Request", context: "Context") -> str:
137141
request_headers=request.headers,
138142
request_body=_body_bytes(request=request),
139143
request_method=request.method,
140-
request_path=request.path,
144+
request_path=request.path_url,
141145
databases=self._target_manager.databases,
142146
)
143147
except ValidatorError as exc:
@@ -149,23 +153,23 @@ def add_target(self, request: "Request", context: "Context") -> str:
149153
request_headers=request.headers,
150154
request_body=_body_bytes(request=request),
151155
request_method=request.method,
152-
request_path=request.path,
156+
request_path=request.path_url,
153157
databases=self._target_manager.databases,
154158
)
155159

156-
given_active_flag = request.json().get("active_flag")
160+
given_active_flag = request_json.get("active_flag")
157161
active_flag = {
158162
None: True,
159163
True: True,
160164
False: False,
161165
}[given_active_flag]
162166

163-
application_metadata = request.json().get("application_metadata")
167+
application_metadata = request_json.get("application_metadata")
164168

165169
new_target = Target(
166-
name=request.json()["name"],
167-
width=request.json()["width"],
168-
image_value=base64.b64decode(s=request.json()["image"]),
170+
name=request_json["name"],
171+
width=request_json["width"],
172+
image_value=base64.b64decode(s=request_json["image"]),
169173
active_flag=active_flag,
170174
processing_time_seconds=self._processing_time_seconds,
171175
application_metadata=application_metadata,
@@ -202,7 +206,7 @@ def add_target(self, request: "Request", context: "Context") -> str:
202206
path_pattern=f"/targets/{_TARGET_ID_PATTERN}",
203207
http_methods={HTTPMethod.DELETE},
204208
)
205-
def delete_target(self, request: "Request", context: "Context") -> str:
209+
def delete_target(self, request: PreparedRequest) -> Response:
206210
"""
207211
Delete a target.
208212
@@ -214,7 +218,7 @@ def delete_target(self, request: "Request", context: "Context") -> str:
214218
request_headers=request.headers,
215219
request_body=_body_bytes(request=request),
216220
request_method=request.method,
217-
request_path=request.path,
221+
request_path=request.path_url,
218222
databases=self._target_manager.databases,
219223
)
220224
except ValidatorError as exc:
@@ -227,7 +231,7 @@ def delete_target(self, request: "Request", context: "Context") -> str:
227231
request_headers=request.headers,
228232
request_body=_body_bytes(request=request),
229233
request_method=request.method,
230-
request_path=request.path,
234+
request_path=request.path_url,
231235
databases=self._target_manager.databases,
232236
)
233237

@@ -269,19 +273,20 @@ def delete_target(self, request: "Request", context: "Context") -> str:
269273
return body_json
270274

271275
@route(path_pattern="/summary", http_methods={HTTPMethod.GET})
272-
def database_summary(self, request: "Request", context: "Context") -> str:
276+
def database_summary(self, request: "Request") -> str:
273277
"""
274278
Get a database summary report.
275279
276280
Fake implementation of
277281
https://developer.vuforia.com/library/web-api/cloud-targets-web-services-api#summary-report
278282
"""
283+
breakpoint()
279284
try:
280285
run_services_validators(
281286
request_headers=request.headers,
282287
request_body=_body_bytes(request=request),
283288
request_method=request.method,
284-
request_path=request.path,
289+
request_path=request.path_url,
285290
databases=self._target_manager.databases,
286291
)
287292
except ValidatorError as exc:
@@ -295,7 +300,7 @@ def database_summary(self, request: "Request", context: "Context") -> str:
295300
request_headers=request.headers,
296301
request_body=_body_bytes(request=request),
297302
request_method=request.method,
298-
request_path=request.path,
303+
request_path=request.path_url,
299304
databases=self._target_manager.databases,
300305
)
301306

@@ -335,7 +340,7 @@ def database_summary(self, request: "Request", context: "Context") -> str:
335340
return body_json
336341

337342
@route(path_pattern="/targets", http_methods={HTTPMethod.GET})
338-
def target_list(self, request: "Request", context: "Context") -> str:
343+
def target_list(self, request: PreparedRequest) -> Response:
339344
"""
340345
Get a list of all targets.
341346
@@ -347,7 +352,7 @@ def target_list(self, request: "Request", context: "Context") -> str:
347352
request_headers=request.headers,
348353
request_body=_body_bytes(request=request),
349354
request_method=request.method,
350-
request_path=request.path,
355+
request_path=request.path_url,
351356
databases=self._target_manager.databases,
352357
)
353358
except ValidatorError as exc:
@@ -359,7 +364,7 @@ def target_list(self, request: "Request", context: "Context") -> str:
359364
request_headers=request.headers,
360365
request_body=_body_bytes(request=request),
361366
request_method=request.method,
362-
request_path=request.path,
367+
request_path=request.path_url,
363368
databases=self._target_manager.databases,
364369
)
365370

@@ -395,7 +400,7 @@ def target_list(self, request: "Request", context: "Context") -> str:
395400
path_pattern=f"/targets/{_TARGET_ID_PATTERN}",
396401
http_methods={HTTPMethod.GET},
397402
)
398-
def get_target(self, request: "Request", context: "Context") -> str:
403+
def get_target(self, request: PreparedRequest) -> Response:
399404
"""
400405
Get details of a target.
401406
@@ -407,7 +412,7 @@ def get_target(self, request: "Request", context: "Context") -> str:
407412
request_headers=request.headers,
408413
request_body=_body_bytes(request=request),
409414
request_method=request.method,
410-
request_path=request.path,
415+
request_path=request.path_url,
411416
databases=self._target_manager.databases,
412417
)
413418
except ValidatorError as exc:
@@ -419,7 +424,7 @@ def get_target(self, request: "Request", context: "Context") -> str:
419424
request_headers=request.headers,
420425
request_body=_body_bytes(request=request),
421426
request_method=request.method,
422-
request_path=request.path,
427+
request_path=request.path_url,
423428
databases=self._target_manager.databases,
424429
)
425430
target_id = request.path.split(sep="/")[-1]
@@ -463,7 +468,7 @@ def get_target(self, request: "Request", context: "Context") -> str:
463468
path_pattern=f"/duplicates/{_TARGET_ID_PATTERN}",
464469
http_methods={HTTPMethod.GET},
465470
)
466-
def get_duplicates(self, request: "Request", context: "Context") -> str:
471+
def get_duplicates(self, request: PreparedRequest) -> Response:
467472
"""
468473
Get targets which may be considered duplicates of a given target.
469474
@@ -475,7 +480,7 @@ def get_duplicates(self, request: "Request", context: "Context") -> str:
475480
request_headers=request.headers,
476481
request_body=_body_bytes(request=request),
477482
request_method=request.method,
478-
request_path=request.path,
483+
request_path=request.path_url,
479484
databases=self._target_manager.databases,
480485
)
481486
except ValidatorError as exc:
@@ -487,7 +492,7 @@ def get_duplicates(self, request: "Request", context: "Context") -> str:
487492
request_headers=request.headers,
488493
request_body=_body_bytes(request=request),
489494
request_method=request.method,
490-
request_path=request.path,
495+
request_path=request.path_url,
491496
databases=self._target_manager.databases,
492497
)
493498
target_id = request.path.split(sep="/")[-1]
@@ -537,7 +542,7 @@ def get_duplicates(self, request: "Request", context: "Context") -> str:
537542
path_pattern=f"/targets/{_TARGET_ID_PATTERN}",
538543
http_methods={HTTPMethod.PUT},
539544
)
540-
def update_target(self, request: "Request", context: "Context") -> str:
545+
def update_target(self, request: PreparedRequest) -> Response:
541546
"""
542547
Update a target.
543548
@@ -548,20 +553,20 @@ def update_target(self, request: "Request", context: "Context") -> str:
548553
run_services_validators(
549554
request_headers=request.headers,
550555
request_body=_body_bytes(request=request),
551-
request_method=request.method,
552-
request_path=request.path,
556+
request_method=request.method or "",
557+
request_path=request.path_url,
553558
databases=self._target_manager.databases,
554559
)
555560
except ValidatorError as exc:
556-
context.headers = exc.headers
561+
request.headers = exc.headers
557562
context.status_code = exc.status_code
558563
return exc.response_text
559564

560565
database = get_database_matching_server_keys(
561566
request_headers=request.headers,
562567
request_body=_body_bytes(request=request),
563568
request_method=request.method,
564-
request_path=request.path,
569+
request_path=request.path_url,
565570
databases=self._target_manager.databases,
566571
)
567572

@@ -581,26 +586,27 @@ def update_target(self, request: "Request", context: "Context") -> str:
581586
context.status_code = exception.status_code
582587
return exception.response_text
583588

584-
width = request.json().get("width", target.width)
585-
name = request.json().get("name", target.name)
586-
active_flag = request.json().get("active_flag", target.active_flag)
587-
application_metadata = request.json().get(
589+
request_json: dict[str, Any] = json.loads(s=request.body or b"")
590+
width = request_json.get("width", target.width)
591+
name = request_json.get("name", target.name)
592+
active_flag = request_json.get("active_flag", target.active_flag)
593+
application_metadata = request_json.get(
588594
"application_metadata",
589595
target.application_metadata,
590596
)
591597

592598
image_value = target.image_value
593-
if "image" in request.json():
594-
image_value = base64.b64decode(s=request.json()["image"])
599+
if "image" in request_json:
600+
image_value = base64.b64decode(s=request_json["image"])
595601

596-
if "active_flag" in request.json() and active_flag is None:
602+
if "active_flag" in request_json and active_flag is None:
597603
fail_exception = FailError(status_code=HTTPStatus.BAD_REQUEST)
598604
context.headers = fail_exception.headers
599605
context.status_code = fail_exception.status_code
600606
return fail_exception.response_text
601607

602608
if (
603-
"application_metadata" in request.json()
609+
"application_metadata" in request_json
604610
and application_metadata is None
605611
):
606612
fail_exception = FailError(status_code=HTTPStatus.BAD_REQUEST)
@@ -646,7 +652,7 @@ def update_target(self, request: "Request", context: "Context") -> str:
646652
path_pattern=f"/summary/{_TARGET_ID_PATTERN}",
647653
http_methods={HTTPMethod.GET},
648654
)
649-
def target_summary(self, request: "Request", context: "Context") -> str:
655+
def target_summary(self, request: PreparedRequest) -> Response:
650656
"""
651657
Get a summary report for a target.
652658
@@ -658,7 +664,7 @@ def target_summary(self, request: "Request", context: "Context") -> str:
658664
request_headers=request.headers,
659665
request_body=_body_bytes(request=request),
660666
request_method=request.method,
661-
request_path=request.path,
667+
request_path=request.path_url,
662668
databases=self._target_manager.databases,
663669
)
664670
except ValidatorError as exc:
@@ -670,7 +676,7 @@ def target_summary(self, request: "Request", context: "Context") -> str:
670676
request_headers=request.headers,
671677
request_body=_body_bytes(request=request),
672678
request_method=request.method,
673-
request_path=request.path,
679+
request_path=request.path_url,
674680
databases=self._target_manager.databases,
675681
)
676682
target_id = request.path.split(sep="/")[-1]

tests/mock_vws/test_requests_mock_usage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def test_default() -> None:
8080
By default, the mock stops any requests made with `requests` to
8181
non-Vuforia addresses, but not to mocked Vuforia endpoints.
8282
"""
83-
with MockVWS():
83+
with MockVWS() as mock:
8484
with pytest.raises(
8585
expected_exception=requests.exceptions.ConnectionError
8686
):

0 commit comments

Comments
 (0)