Skip to content

Commit b7a6336

Browse files
Merge pull request #2193 from VWS-Python/ignore-that-body-can-be-none
Ignore that body can be None in validators
2 parents ecf76f0 + 76ba939 commit b7a6336

File tree

6 files changed

+59
-25
lines changed

6 files changed

+59
-25
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ Changelog
44
Next
55
----
66

7+
- Support passing data as strings.
8+
79
2024.07.02.1
810
------------
911

src/mock_vws/_query_validators/content_length_validators.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def validate_content_length_header_not_too_large(
5454
"""
5555
given_content_length = request_headers["Content-Length"]
5656

57-
body_length = len(request_body if request_body else b"")
57+
body_length = len(request_body)
5858
given_content_length_value = int(given_content_length)
5959
# We skip coverage here as running a test to cover this is very slow.
6060
if given_content_length_value > body_length: # pragma: no cover
@@ -81,7 +81,7 @@ def validate_content_length_header_not_too_small(
8181
"""
8282
given_content_length = request_headers["Content-Length"]
8383

84-
body_length = len(request_body if request_body else b"")
84+
body_length = len(request_body)
8585
given_content_length_value = int(given_content_length)
8686

8787
if given_content_length_value < body_length:

src/mock_vws/_requests_mock_server/mock_web_query_api.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,20 @@ def decorator(method: Callable[..., str]) -> Callable[..., str]:
6969
return decorator
7070

7171

72+
def _body_bytes(request: Request) -> bytes:
73+
"""
74+
Return the body of a request as bytes.
75+
"""
76+
if request.body is None:
77+
return b""
78+
79+
if isinstance(request.body, str):
80+
return request.body.encode(encoding="utf-8")
81+
82+
assert isinstance(request.body, bytes)
83+
return request.body
84+
85+
7286
class MockVuforiaWebQueryAPI:
7387
"""
7488
A fake implementation of the Vuforia Web Query API.
@@ -103,7 +117,7 @@ def query(self, request: Request, context: Context) -> str:
103117
run_query_validators(
104118
request_path=request.path,
105119
request_headers=request.headers,
106-
request_body=request.body,
120+
request_body=_body_bytes(request=request),
107121
request_method=request.method,
108122
databases=self._target_manager.databases,
109123
)
@@ -114,7 +128,7 @@ def query(self, request: Request, context: Context) -> str:
114128

115129
response_text = get_query_match_response_text(
116130
request_headers=request.headers,
117-
request_body=request.body,
131+
request_body=_body_bytes(request=request),
118132
request_method=request.method,
119133
request_path=request.path,
120134
databases=self._target_manager.databases,

src/mock_vws/_requests_mock_server/mock_web_services_api.py

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,20 @@ def decorator(method: Callable[..., str]) -> Callable[..., str]:
8181
return decorator
8282

8383

84+
def _body_bytes(request: Request) -> bytes:
85+
"""
86+
Return the body of a request as bytes.
87+
"""
88+
if request.body is None:
89+
return b""
90+
91+
if isinstance(request.body, str):
92+
return request.body.encode(encoding="utf-8")
93+
94+
assert isinstance(request.body, bytes)
95+
return request.body
96+
97+
8498
class MockVuforiaWebServicesAPI:
8599
"""
86100
A fake implementation of the Vuforia Web Services API.
@@ -129,7 +143,7 @@ def add_target(self, request: Request, context: Context) -> str:
129143
try:
130144
run_services_validators(
131145
request_headers=request.headers,
132-
request_body=request.body,
146+
request_body=_body_bytes(request=request),
133147
request_method=request.method,
134148
request_path=request.path,
135149
databases=self._target_manager.databases,
@@ -141,7 +155,7 @@ def add_target(self, request: Request, context: Context) -> str:
141155

142156
database = get_database_matching_server_keys(
143157
request_headers=request.headers,
144-
request_body=request.body,
158+
request_body=_body_bytes(request=request),
145159
request_method=request.method,
146160
request_path=request.path,
147161
databases=self._target_manager.databases,
@@ -206,7 +220,7 @@ def delete_target(self, request: Request, context: Context) -> str:
206220
try:
207221
run_services_validators(
208222
request_headers=request.headers,
209-
request_body=request.body,
223+
request_body=_body_bytes(request=request),
210224
request_method=request.method,
211225
request_path=request.path,
212226
databases=self._target_manager.databases,
@@ -219,7 +233,7 @@ def delete_target(self, request: Request, context: Context) -> str:
219233
body: dict[str, str] = {}
220234
database = get_database_matching_server_keys(
221235
request_headers=request.headers,
222-
request_body=request.body,
236+
request_body=_body_bytes(request=request),
223237
request_method=request.method,
224238
request_path=request.path,
225239
databases=self._target_manager.databases,
@@ -273,7 +287,7 @@ def database_summary(self, request: Request, context: Context) -> str:
273287
try:
274288
run_services_validators(
275289
request_headers=request.headers,
276-
request_body=request.body,
290+
request_body=_body_bytes(request=request),
277291
request_method=request.method,
278292
request_path=request.path,
279293
databases=self._target_manager.databases,
@@ -287,7 +301,7 @@ def database_summary(self, request: Request, context: Context) -> str:
287301

288302
database = get_database_matching_server_keys(
289303
request_headers=request.headers,
290-
request_body=request.body,
304+
request_body=_body_bytes(request=request),
291305
request_method=request.method,
292306
request_path=request.path,
293307
databases=self._target_manager.databases,
@@ -339,7 +353,7 @@ def target_list(self, request: Request, context: Context) -> str:
339353
try:
340354
run_services_validators(
341355
request_headers=request.headers,
342-
request_body=request.body,
356+
request_body=_body_bytes(request=request),
343357
request_method=request.method,
344358
request_path=request.path,
345359
databases=self._target_manager.databases,
@@ -351,7 +365,7 @@ def target_list(self, request: Request, context: Context) -> str:
351365

352366
database = get_database_matching_server_keys(
353367
request_headers=request.headers,
354-
request_body=request.body,
368+
request_body=_body_bytes(request=request),
355369
request_method=request.method,
356370
request_path=request.path,
357371
databases=self._target_manager.databases,
@@ -399,7 +413,7 @@ def get_target(self, request: Request, context: Context) -> str:
399413
try:
400414
run_services_validators(
401415
request_headers=request.headers,
402-
request_body=request.body,
416+
request_body=_body_bytes(request=request),
403417
request_method=request.method,
404418
request_path=request.path,
405419
databases=self._target_manager.databases,
@@ -411,7 +425,7 @@ def get_target(self, request: Request, context: Context) -> str:
411425

412426
database = get_database_matching_server_keys(
413427
request_headers=request.headers,
414-
request_body=request.body,
428+
request_body=_body_bytes(request=request),
415429
request_method=request.method,
416430
request_path=request.path,
417431
databases=self._target_manager.databases,
@@ -467,7 +481,7 @@ def get_duplicates(self, request: Request, context: Context) -> str:
467481
try:
468482
run_services_validators(
469483
request_headers=request.headers,
470-
request_body=request.body,
484+
request_body=_body_bytes(request=request),
471485
request_method=request.method,
472486
request_path=request.path,
473487
databases=self._target_manager.databases,
@@ -479,7 +493,7 @@ def get_duplicates(self, request: Request, context: Context) -> str:
479493

480494
database = get_database_matching_server_keys(
481495
request_headers=request.headers,
482-
request_body=request.body,
496+
request_body=_body_bytes(request=request),
483497
request_method=request.method,
484498
request_path=request.path,
485499
databases=self._target_manager.databases,
@@ -541,7 +555,7 @@ def update_target(self, request: Request, context: Context) -> str:
541555
try:
542556
run_services_validators(
543557
request_headers=request.headers,
544-
request_body=request.body,
558+
request_body=_body_bytes(request=request),
545559
request_method=request.method,
546560
request_path=request.path,
547561
databases=self._target_manager.databases,
@@ -553,7 +567,7 @@ def update_target(self, request: Request, context: Context) -> str:
553567

554568
database = get_database_matching_server_keys(
555569
request_headers=request.headers,
556-
request_body=request.body,
570+
request_body=_body_bytes(request=request),
557571
request_method=request.method,
558572
request_path=request.path,
559573
databases=self._target_manager.databases,
@@ -650,7 +664,7 @@ def target_summary(self, request: Request, context: Context) -> str:
650664
try:
651665
run_services_validators(
652666
request_headers=request.headers,
653-
request_body=request.body,
667+
request_body=_body_bytes(request=request),
654668
request_method=request.method,
655669
request_path=request.path,
656670
databases=self._target_manager.databases,
@@ -662,7 +676,7 @@ def target_summary(self, request: Request, context: Context) -> str:
662676

663677
database = get_database_matching_server_keys(
664678
request_headers=request.headers,
665-
request_body=request.body,
679+
request_body=_body_bytes(request=request),
666680
request_method=request.method,
667681
request_path=request.path,
668682
databases=self._target_manager.databases,

src/mock_vws/_services_validators/content_length_validators.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def validate_content_length_header_is_int(
2929
ContentLengthHeaderNotIntError: The content length header is not an
3030
integer
3131
"""
32-
body_length = len(request_body if request_body else b"")
32+
body_length = len(request_body)
3333
given_content_length = request_headers.get("Content-Length", body_length)
3434

3535
try:
@@ -55,7 +55,7 @@ def validate_content_length_header_not_too_large(
5555
ContentLengthHeaderTooLargeError: The given content length header says
5656
that the content length is greater than the body length.
5757
"""
58-
body_length = len(request_body if request_body else b"")
58+
body_length = len(request_body)
5959
given_content_length = request_headers.get("Content-Length", body_length)
6060
given_content_length_value = int(given_content_length)
6161
# We skip coverage here as running a test to cover this is very slow.
@@ -80,7 +80,7 @@ def validate_content_length_header_not_too_small(
8080
AuthenticationFailureError: The given content length header says that
8181
the content length is smaller than the body length.
8282
"""
83-
body_length = len(request_body if request_body else b"")
83+
body_length = len(request_body)
8484
given_content_length = request_headers.get("Content-Length", body_length)
8585
given_content_length_value = int(given_content_length)
8686

tests/mock_vws/fixtures/prepared_requests.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ def delete_target(
113113
date = rfc_1123_date()
114114
request_path = f"/targets/{target_id}"
115115
method = HTTPMethod.DELETE
116-
content = b""
116+
# This could be b"" or None, but we want to exercise handling
117+
# all three of those types.
118+
content = ""
117119

118120
access_key = vuforia_database.server_access_key
119121
secret_key = vuforia_database.server_secret_key
@@ -158,7 +160,9 @@ def database_summary(vuforia_database: VuforiaDatabase) -> Endpoint:
158160
request_path = "/summary"
159161
method = HTTPMethod.GET
160162

161-
content = b""
163+
# This could be b"" or "", but we want to exercise handling
164+
# all three of those types.
165+
content = None
162166

163167
access_key = vuforia_database.server_access_key
164168
secret_key = vuforia_database.server_secret_key

0 commit comments

Comments
 (0)