Skip to content

Commit ef96290

Browse files
committed
Move query helper to utils
1 parent 9b954ed commit ef96290

File tree

3 files changed

+139
-53
lines changed

3 files changed

+139
-53
lines changed

tests/mock_vws/test_query.py

Lines changed: 3 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
import calendar
99
import io
1010
import time
11-
from typing import Any, Dict, Union
11+
from typing import Dict, Union
1212
from urllib.parse import urljoin
1313

1414
import pytest
1515
import requests
16-
from requests import Response, codes
16+
from requests import codes
1717
from requests_mock import POST
1818
from urllib3.filepost import encode_multipart_formdata
1919

@@ -22,6 +22,7 @@
2222
add_target_to_vws,
2323
delete_target,
2424
get_vws_target,
25+
query,
2526
update_target,
2627
wait_for_target_processed,
2728
)
@@ -38,55 +39,6 @@
3839
VWQ_HOST = 'https://cloudreco.vuforia.com'
3940

4041

41-
def query(
42-
vuforia_database_keys: VuforiaDatabaseKeys,
43-
body: Dict[str, Any],
44-
) -> Response:
45-
"""
46-
Make a request to the endpoint to make an image recognition query.
47-
48-
Args:
49-
vuforia_database_keys: The credentials to use to connect to
50-
Vuforia.
51-
body: The request body to send in ``multipart/formdata`` format.
52-
53-
Returns:
54-
The response returned by the API.
55-
"""
56-
date = rfc_1123_date()
57-
request_path = '/v1/query'
58-
content, content_type_header = encode_multipart_formdata(body)
59-
method = POST
60-
61-
access_key = vuforia_database_keys.client_access_key
62-
secret_key = vuforia_database_keys.client_secret_key
63-
authorization_string = authorization_header(
64-
access_key=access_key,
65-
secret_key=secret_key,
66-
method=method,
67-
content=content,
68-
# Note that this is not the actual Content-Type header value sent.
69-
content_type='multipart/form-data',
70-
date=date,
71-
request_path=request_path,
72-
)
73-
74-
headers = {
75-
'Authorization': authorization_string,
76-
'Date': date,
77-
'Content-Type': content_type_header,
78-
}
79-
80-
response = requests.request(
81-
method=method,
82-
url=urljoin(base=VWQ_HOST, url=request_path),
83-
headers=headers,
84-
data=content,
85-
)
86-
87-
return response
88-
89-
9042
@pytest.mark.usefixtures('verify_mock_vuforia')
9143
class TestContentType:
9244
"""

tests/mock_vws/test_usage.py

Lines changed: 84 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io
88
import socket
99
import string
10+
import time
1011
import uuid
1112

1213
import pytest
@@ -22,8 +23,10 @@
2223
VuforiaDatabaseKeys,
2324
add_target_to_vws,
2425
database_summary,
26+
delete_target,
2527
get_vws_target,
2628
rfc_1123_date,
29+
wait_for_target_processed,
2730
)
2831

2932

@@ -428,5 +431,84 @@ class TestCustomQueryRecognizesDeletionSeconds:
428431
until it is not recognized by the query endpoint.
429432
"""
430433

431-
def test_default(self):
432-
pass
434+
def _time_to_recognize_deletion(
435+
self,
436+
high_quality_image: io.BytesIO,
437+
vuforia_database_keys: VuforiaDatabaseKeys,
438+
) -> datetime.timedelta:
439+
"""
440+
XXX
441+
"""
442+
image_content = high_quality_image.getvalue()
443+
image_data_encoded = base64.b64encode(image_content).decode('ascii')
444+
add_target_data = {
445+
'name': 'example_name',
446+
'width': 1,
447+
'image': image_data_encoded,
448+
}
449+
response = add_target_to_vws(
450+
vuforia_database_keys=vuforia_database_keys,
451+
data=add_target_data,
452+
)
453+
454+
target_id = response.json()['target_id']
455+
456+
wait_for_target_processed(
457+
target_id=target_id,
458+
vuforia_database_keys=vuforia_database_keys,
459+
)
460+
461+
response = delete_target(
462+
vuforia_database_keys=vuforia_database_keys,
463+
target_id=target_id,
464+
)
465+
466+
time_after_delete = datetime.datetime.now()
467+
468+
body = {'image': ('image.jpeg', image_content, 'image/jpeg')}
469+
470+
while True:
471+
response = query(
472+
vuforia_database_keys=vuforia_database_keys,
473+
body=body,
474+
)
475+
476+
try:
477+
assert_query_success(response=response)
478+
except AssertionError:
479+
# The response text for a 500 response is not consistent.
480+
# Therefore we only test for consistent features.
481+
assert 'Error 500 Server Error' in response.text
482+
assert 'HTTP ERROR 500' in response.text
483+
assert 'Problem accessing /v1/query' in response.text
484+
time.sleep(0.05)
485+
continue
486+
487+
assert response.json()['results'] == []
488+
return datetime.datetime.now() - time_after_delete
489+
490+
def test_default(
491+
self,
492+
high_quality_image: io.BytesIO,
493+
vuforia_database_keys: VuforiaDatabaseKeys,
494+
) -> None:
495+
"""
496+
XXX
497+
"""
498+
with MockVWS(
499+
base_vwq_url='https://vuforia.vwq.example.com',
500+
real_http=False,
501+
client_access_key=vuforia_database_keys.client_access_key.decode(),
502+
client_secret_key=vuforia_database_keys.client_secret_key.decode(),
503+
server_access_key=vuforia_database_keys.server_access_key.decode(),
504+
server_secret_key=vuforia_database_keys.server_secret_key.decode(),
505+
) as mock:
506+
time_to_recognize_deletion = self._time_to_recognize_deletion(
507+
high_quality_image=high_quality_image,
508+
vuforia_database_keys=vuforia_database_keys,
509+
)
510+
511+
import pdb
512+
pdb.set_trace()
513+
expected == 3
514+
assert abs(expected - 1) == 3

tests/mock_vws/utils/__init__.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import timeout_decorator
1212
from requests import Response
1313
from requests_mock import DELETE, GET, POST, PUT
14+
from urllib3.filepost import encode_multipart_formdata
1415

1516
from mock_vws._constants import ResultCodes, TargetStatuses
1617
from tests.mock_vws.utils.authorization import (
@@ -366,3 +367,54 @@ def target_summary(
366367
)
367368

368369
return response
370+
371+
372+
def query(
373+
vuforia_database_keys: VuforiaDatabaseKeys,
374+
body: Dict[str, Any],
375+
) -> Response:
376+
"""
377+
Make a request to the endpoint to make an image recognition query.
378+
379+
Args:
380+
vuforia_database_keys: The credentials to use to connect to
381+
Vuforia.
382+
body: The request body to send in ``multipart/formdata`` format.
383+
384+
Returns:
385+
The response returned by the API.
386+
"""
387+
date = rfc_1123_date()
388+
request_path = '/v1/query'
389+
content, content_type_header = encode_multipart_formdata(body)
390+
method = POST
391+
392+
access_key = vuforia_database_keys.client_access_key
393+
secret_key = vuforia_database_keys.client_secret_key
394+
authorization_string = authorization_header(
395+
access_key=access_key,
396+
secret_key=secret_key,
397+
method=method,
398+
content=content,
399+
# Note that this is not the actual Content-Type header value sent.
400+
content_type='multipart/form-data',
401+
date=date,
402+
request_path=request_path,
403+
)
404+
405+
headers = {
406+
'Authorization': authorization_string,
407+
'Date': date,
408+
'Content-Type': content_type_header,
409+
}
410+
411+
412+
vwq_host = 'https://cloudreco.vuforia.com'
413+
response = requests.request(
414+
method=method,
415+
url=urljoin(base=vwq_host, url=request_path),
416+
headers=headers,
417+
data=content,
418+
)
419+
420+
return response

0 commit comments

Comments
 (0)