Skip to content

Commit 88926f8

Browse files
Merge pull request #654 from adamtheturtle/test-request-usage
Test request usage field
2 parents 551a918 + 0ef66fb commit 88926f8

File tree

2 files changed

+122
-8
lines changed

2 files changed

+122
-8
lines changed

src/mock_vws/_mock_web_services_api.py

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import random
1212
import statistics
1313
import uuid
14-
from typing import Callable, Dict, List, Optional, Set, Tuple, Union
14+
from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union
1515

1616
import pytz
1717
import wrapt
@@ -49,6 +49,29 @@
4949
)
5050

5151

52+
@wrapt.decorator
53+
def update_request_count(
54+
wrapped: Callable[..., str],
55+
instance: Any,
56+
args: Tuple[_RequestObjectProxy, _Context],
57+
kwargs: Dict,
58+
) -> str:
59+
"""
60+
Add to the request count.
61+
62+
Args:
63+
wrapped: An endpoint function for `requests_mock`.
64+
instance: The class that the endpoint function is in.
65+
args: The arguments given to the endpoint function.
66+
kwargs: The keyword arguments given to the endpoint function.
67+
68+
Returns:
69+
The result of calling the endpoint.
70+
"""
71+
instance.request_count += 1
72+
return wrapped(*args, **kwargs)
73+
74+
5275
@wrapt.decorator
5376
def parse_target_id(
5477
wrapped: Callable[..., str],
@@ -151,8 +174,6 @@ def decorator(method: Callable[..., str]) -> Callable[..., str]:
151174
validate_not_invalid_json,
152175
validate_date,
153176
validate_date_header_given,
154-
validate_auth_header_exists,
155-
set_content_length_header,
156177
]
157178
else:
158179
decorators = [
@@ -176,11 +197,15 @@ def decorator(method: Callable[..., str]) -> Callable[..., str]:
176197
validate_date,
177198
validate_date_header_given,
178199
validate_not_invalid_json,
179-
validate_auth_header_exists,
180-
set_content_length_header,
181200
]
182201

183-
for decorator in decorators:
202+
common_decorators = [
203+
validate_auth_header_exists,
204+
set_content_length_header,
205+
update_request_count,
206+
]
207+
208+
for decorator in decorators + common_decorators:
184209
method = decorator(method)
185210

186211
return method
@@ -368,6 +393,7 @@ def __init__( # pylint: disable=too-many-arguments
368393
self.state = state
369394

370395
self._processing_time_seconds = processing_time_seconds
396+
self.request_count = 0
371397

372398
@route(
373399
path_pattern='/targets',
@@ -516,7 +542,7 @@ def database_summary(
516542
'processing_images': processing_images,
517543
'reco_threshold': 1000,
518544
'request_quota': 100000,
519-
'request_usage': '',
545+
'request_usage': self.request_count,
520546
}
521547
return json_dump(body)
522548

tests/mock_vws/test_database_summary.py

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
add_target_to_vws,
1818
database_summary,
1919
delete_target,
20+
query,
2021
wait_for_target_processed,
2122
)
2223
from tests.mock_vws.utils.assertions import assert_vws_response
@@ -362,7 +363,7 @@ def test_processing_images(
362363
@pytest.mark.usefixtures('verify_mock_vuforia')
363364
class TestQuotas:
364365
"""
365-
Tests for the mock of the database summary endpoint at `GET /summary`.
366+
Tests for quotas and thresholds.
366367
"""
367368

368369
def test_quotas(self, vuforia_database_keys: VuforiaDatabaseKeys) -> None:
@@ -379,6 +380,93 @@ def test_quotas(self, vuforia_database_keys: VuforiaDatabaseKeys) -> None:
379380
assert response.json()['reco_threshold'] == 1000
380381

381382

383+
@pytest.mark.usefixtures('verify_mock_vuforia')
384+
class TestRequestUsage:
385+
"""
386+
Tests for the ``request_usage`` field.
387+
"""
388+
389+
def test_target_request(
390+
self,
391+
vuforia_database_keys: VuforiaDatabaseKeys,
392+
) -> None:
393+
"""
394+
The ``request_usage`` count increases with each request to the target
395+
API.
396+
"""
397+
response = database_summary(
398+
vuforia_database_keys=vuforia_database_keys,
399+
)
400+
401+
original_request_usage = response.json()['request_usage']
402+
403+
response = database_summary(
404+
vuforia_database_keys=vuforia_database_keys,
405+
)
406+
407+
new_request_usage = response.json()['request_usage']
408+
assert new_request_usage == original_request_usage + 1
409+
410+
def test_bad_target_request(
411+
self,
412+
vuforia_database_keys: VuforiaDatabaseKeys,
413+
) -> None:
414+
"""
415+
The ``request_usage`` count increases with each request to the target
416+
API, even if it is a bad request.
417+
"""
418+
response = database_summary(
419+
vuforia_database_keys=vuforia_database_keys,
420+
)
421+
422+
original_request_usage = response.json()['request_usage']
423+
424+
response = add_target_to_vws(
425+
vuforia_database_keys=vuforia_database_keys,
426+
# Missing data.
427+
data={},
428+
)
429+
430+
assert response.status_code == codes.BAD_REQUEST
431+
432+
response = database_summary(
433+
vuforia_database_keys=vuforia_database_keys,
434+
)
435+
new_request_usage = response.json()['request_usage']
436+
assert new_request_usage == original_request_usage + 2
437+
438+
def test_query_request(
439+
self,
440+
vuforia_database_keys: VuforiaDatabaseKeys,
441+
high_quality_image: io.BytesIO,
442+
) -> None:
443+
"""
444+
The ``request_usage`` count does not increase with each query.
445+
"""
446+
response = database_summary(
447+
vuforia_database_keys=vuforia_database_keys,
448+
)
449+
450+
original_request_usage = response.json()['request_usage']
451+
452+
image_content = high_quality_image.getvalue()
453+
body = {'image': ('image.jpeg', image_content, 'image/jpeg')}
454+
query_resp = query(
455+
vuforia_database_keys=vuforia_database_keys,
456+
body=body,
457+
)
458+
459+
assert query_resp.status_code == codes.OK
460+
461+
response = database_summary(
462+
vuforia_database_keys=vuforia_database_keys,
463+
)
464+
new_request_usage = response.json()['request_usage']
465+
# The request usage goes up for the database summary request, not the
466+
# query.
467+
assert new_request_usage == original_request_usage + 1
468+
469+
382470
@pytest.mark.usefixtures('verify_mock_vuforia_inactive')
383471
class TestInactiveProject:
384472
"""

0 commit comments

Comments
 (0)