|
7 | 7 | import io |
8 | 8 | import socket |
9 | 9 | import string |
| 10 | +import time |
10 | 11 | import uuid |
11 | 12 |
|
12 | 13 | import pytest |
|
22 | 23 | VuforiaDatabaseKeys, |
23 | 24 | add_target_to_vws, |
24 | 25 | database_summary, |
| 26 | + delete_target, |
25 | 27 | get_vws_target, |
| 28 | + query, |
26 | 29 | rfc_1123_date, |
| 30 | + wait_for_target_processed, |
27 | 31 | ) |
| 32 | +from tests.mock_vws.utils.assertions import assert_query_success |
28 | 33 |
|
29 | 34 |
|
30 | 35 | def request_unmocked_address() -> None: |
@@ -420,3 +425,119 @@ def test_custom_base_vwq_url(self) -> None: |
420 | 425 |
|
421 | 426 | requests.post(url='https://vuforia.vwq.example.com/v1/query') |
422 | 427 | requests.get('https://vws.vuforia.com/summary') |
| 428 | + |
| 429 | + |
| 430 | +class TestCustomQueryRecognizesDeletionSeconds: |
| 431 | + """ |
| 432 | + Tests for setting the amount of time after a target has been deleted |
| 433 | + until it is not recognized by the query endpoint. |
| 434 | + """ |
| 435 | + |
| 436 | + def _recognize_deletion_seconds( |
| 437 | + self, |
| 438 | + high_quality_image: io.BytesIO, |
| 439 | + vuforia_database_keys: VuforiaDatabaseKeys, |
| 440 | + ) -> float: |
| 441 | + """ |
| 442 | + XXX |
| 443 | + """ |
| 444 | + image_content = high_quality_image.getvalue() |
| 445 | + image_data_encoded = base64.b64encode(image_content).decode('ascii') |
| 446 | + add_target_data = { |
| 447 | + 'name': 'example_name', |
| 448 | + 'width': 1, |
| 449 | + 'image': image_data_encoded, |
| 450 | + } |
| 451 | + response = add_target_to_vws( |
| 452 | + vuforia_database_keys=vuforia_database_keys, |
| 453 | + data=add_target_data, |
| 454 | + ) |
| 455 | + |
| 456 | + target_id = response.json()['target_id'] |
| 457 | + |
| 458 | + wait_for_target_processed( |
| 459 | + target_id=target_id, |
| 460 | + vuforia_database_keys=vuforia_database_keys, |
| 461 | + ) |
| 462 | + |
| 463 | + response = delete_target( |
| 464 | + vuforia_database_keys=vuforia_database_keys, |
| 465 | + target_id=target_id, |
| 466 | + ) |
| 467 | + |
| 468 | + time_after_delete = datetime.datetime.now() |
| 469 | + |
| 470 | + body = {'image': ('image.jpeg', image_content, 'image/jpeg')} |
| 471 | + |
| 472 | + while True: |
| 473 | + response = query( |
| 474 | + vuforia_database_keys=vuforia_database_keys, |
| 475 | + body=body, |
| 476 | + ) |
| 477 | + |
| 478 | + try: |
| 479 | + assert_query_success(response=response) |
| 480 | + except AssertionError: |
| 481 | + # The response text for a 500 response is not consistent. |
| 482 | + # Therefore we only test for consistent features. |
| 483 | + assert 'Error 500 Server Error' in response.text |
| 484 | + assert 'HTTP ERROR 500' in response.text |
| 485 | + assert 'Problem accessing /v1/query' in response.text |
| 486 | + time.sleep(0.05) |
| 487 | + continue |
| 488 | + |
| 489 | + assert response.json()['results'] == [] |
| 490 | + time_difference = datetime.datetime.now() - time_after_delete |
| 491 | + return time_difference.total_seconds() |
| 492 | + |
| 493 | + def test_default( |
| 494 | + self, |
| 495 | + high_quality_image: io.BytesIO, |
| 496 | + vuforia_database_keys: VuforiaDatabaseKeys, |
| 497 | + ) -> None: |
| 498 | + """ |
| 499 | + By default it takes three seconds for the Query API on the mock to |
| 500 | + recognize that a target has been deleted. |
| 501 | +
|
| 502 | + The real Query API takes between seven and thirty seconds. |
| 503 | + See ``test_query`` for more information. |
| 504 | + """ |
| 505 | + with MockVWS( |
| 506 | + client_access_key=vuforia_database_keys.client_access_key.decode(), |
| 507 | + client_secret_key=vuforia_database_keys.client_secret_key.decode(), |
| 508 | + server_access_key=vuforia_database_keys.server_access_key.decode(), |
| 509 | + server_secret_key=vuforia_database_keys.server_secret_key.decode(), |
| 510 | + ): |
| 511 | + recognize_deletion_seconds = self._recognize_deletion_seconds( |
| 512 | + high_quality_image=high_quality_image, |
| 513 | + vuforia_database_keys=vuforia_database_keys, |
| 514 | + ) |
| 515 | + |
| 516 | + expected = 3 |
| 517 | + assert abs(expected - recognize_deletion_seconds) < 0.2 |
| 518 | + |
| 519 | + def test_custom( |
| 520 | + self, |
| 521 | + high_quality_image: io.BytesIO, |
| 522 | + vuforia_database_keys: VuforiaDatabaseKeys, |
| 523 | + ) -> None: |
| 524 | + """ |
| 525 | + It is possible to use set a custom amount of time that it takes for the |
| 526 | + Query API on the mock to recognize that a target has been deleted. |
| 527 | + """ |
| 528 | + # We choose a low time for a quick test. |
| 529 | + query_recognizes_deletion = 0.1 |
| 530 | + with MockVWS( |
| 531 | + client_access_key=vuforia_database_keys.client_access_key.decode(), |
| 532 | + client_secret_key=vuforia_database_keys.client_secret_key.decode(), |
| 533 | + server_access_key=vuforia_database_keys.server_access_key.decode(), |
| 534 | + server_secret_key=vuforia_database_keys.server_secret_key.decode(), |
| 535 | + query_recognizes_deletion_seconds=query_recognizes_deletion, |
| 536 | + ): |
| 537 | + recognize_deletion_seconds = self._recognize_deletion_seconds( |
| 538 | + high_quality_image=high_quality_image, |
| 539 | + vuforia_database_keys=vuforia_database_keys, |
| 540 | + ) |
| 541 | + |
| 542 | + expected = query_recognizes_deletion |
| 543 | + assert abs(expected - recognize_deletion_seconds) < 0.2 |
0 commit comments