|
20 | 20 | from mock_vws._constants import TargetStatuses |
21 | 21 | from tests.mock_vws.utils import ( |
22 | 22 | add_target_to_vws, |
| 23 | + delete_target, |
23 | 24 | get_vws_target, |
24 | 25 | update_target, |
25 | 26 | wait_for_target_processed, |
@@ -1057,7 +1058,7 @@ def test_invalid( |
1057 | 1058 | @pytest.mark.usefixtures('verify_mock_vuforia') |
1058 | 1059 | class TestActiveFlag: |
1059 | 1060 | """ |
1060 | | - Tests for active targets. |
| 1061 | + Tests for active versus inactive targets. |
1061 | 1062 | """ |
1062 | 1063 |
|
1063 | 1064 | def test_inactive( |
@@ -1337,3 +1338,168 @@ def test_updated_target( |
1337 | 1338 | ) |
1338 | 1339 | assert_query_success(response=response) |
1339 | 1340 | assert response.json()['results'] == [] |
| 1341 | + |
| 1342 | + |
| 1343 | +@pytest.mark.usefixtures('verify_mock_vuforia') |
| 1344 | +class TestDeleted: |
| 1345 | + """ |
| 1346 | + Tests for matching deleted targets. |
| 1347 | + """ |
| 1348 | + |
| 1349 | + def test_deleted( |
| 1350 | + self, |
| 1351 | + high_quality_image: io.BytesIO, |
| 1352 | + vuforia_database_keys: VuforiaDatabaseKeys, |
| 1353 | + ) -> None: |
| 1354 | + """ |
| 1355 | + Within approximately 7 seconds of deleting a target, querying for its |
| 1356 | + image results in an ``INTERNAL_SERVER_ERROR``. |
| 1357 | + """ |
| 1358 | + image_content = high_quality_image.getvalue() |
| 1359 | + image_data_encoded = base64.b64encode(image_content).decode('ascii') |
| 1360 | + add_target_data = { |
| 1361 | + 'name': 'example_name', |
| 1362 | + 'width': 1, |
| 1363 | + 'image': image_data_encoded, |
| 1364 | + } |
| 1365 | + response = add_target_to_vws( |
| 1366 | + vuforia_database_keys=vuforia_database_keys, |
| 1367 | + data=add_target_data, |
| 1368 | + ) |
| 1369 | + |
| 1370 | + target_id = response.json()['target_id'] |
| 1371 | + |
| 1372 | + wait_for_target_processed( |
| 1373 | + target_id=target_id, |
| 1374 | + vuforia_database_keys=vuforia_database_keys, |
| 1375 | + ) |
| 1376 | + |
| 1377 | + delete_target( |
| 1378 | + vuforia_database_keys=vuforia_database_keys, |
| 1379 | + target_id=target_id, |
| 1380 | + ) |
| 1381 | + |
| 1382 | + body = {'image': ('image.jpeg', image_content, 'image/jpeg')} |
| 1383 | + |
| 1384 | + response = query( |
| 1385 | + vuforia_database_keys=vuforia_database_keys, |
| 1386 | + body=body, |
| 1387 | + ) |
| 1388 | + |
| 1389 | + # The response text for a 500 response is not consistent. |
| 1390 | + # Therefore we only test for consistent features. |
| 1391 | + assert 'Error 500 Server Error' in response.text |
| 1392 | + assert 'HTTP ERROR 500' in response.text |
| 1393 | + assert 'Problem accessing /v1/query' in response.text |
| 1394 | + |
| 1395 | + assert_vwq_failure( |
| 1396 | + response=response, |
| 1397 | + content_type='text/html; charset=ISO-8859-1', |
| 1398 | + status_code=codes.INTERNAL_SERVER_ERROR, |
| 1399 | + ) |
| 1400 | + |
| 1401 | + def test_deleted_and_wait( |
| 1402 | + self, |
| 1403 | + high_quality_image: io.BytesIO, |
| 1404 | + vuforia_database_keys: VuforiaDatabaseKeys, |
| 1405 | + ) -> None: |
| 1406 | + """ |
| 1407 | + After waiting approximately 7 seconds (we wait more to be safer), a |
| 1408 | + deleted target is not found when its image is queried for. |
| 1409 | + """ |
| 1410 | + image_content = high_quality_image.getvalue() |
| 1411 | + image_data_encoded = base64.b64encode(image_content).decode('ascii') |
| 1412 | + add_target_data = { |
| 1413 | + 'name': 'example_name', |
| 1414 | + 'width': 1, |
| 1415 | + 'image': image_data_encoded, |
| 1416 | + } |
| 1417 | + response = add_target_to_vws( |
| 1418 | + vuforia_database_keys=vuforia_database_keys, |
| 1419 | + data=add_target_data, |
| 1420 | + ) |
| 1421 | + |
| 1422 | + target_id = response.json()['target_id'] |
| 1423 | + |
| 1424 | + wait_for_target_processed( |
| 1425 | + target_id=target_id, |
| 1426 | + vuforia_database_keys=vuforia_database_keys, |
| 1427 | + ) |
| 1428 | + |
| 1429 | + response = delete_target( |
| 1430 | + vuforia_database_keys=vuforia_database_keys, |
| 1431 | + target_id=target_id, |
| 1432 | + ) |
| 1433 | + |
| 1434 | + body = {'image': ('image.jpeg', image_content, 'image/jpeg')} |
| 1435 | + |
| 1436 | + # In practice, we have seen a delay of up to 30 seconds between |
| 1437 | + # deleting a target and having no 500 errors. |
| 1438 | + # |
| 1439 | + # We wait up to 60 seconds to be safe. |
| 1440 | + total_waited = 0 |
| 1441 | + while True: |
| 1442 | + response = query( |
| 1443 | + vuforia_database_keys=vuforia_database_keys, |
| 1444 | + body=body, |
| 1445 | + ) |
| 1446 | + |
| 1447 | + try: |
| 1448 | + assert_query_success(response=response) |
| 1449 | + except AssertionError: |
| 1450 | + # The response text for a 500 response is not consistent. |
| 1451 | + # Therefore we only test for consistent features. |
| 1452 | + assert 'Error 500 Server Error' in response.text |
| 1453 | + assert 'HTTP ERROR 500' in response.text |
| 1454 | + assert 'Problem accessing /v1/query' in response.text |
| 1455 | + time.sleep(2) |
| 1456 | + total_waited += 2 |
| 1457 | + else: |
| 1458 | + assert response.json()['results'] == [] |
| 1459 | + break |
| 1460 | + |
| 1461 | + assert total_waited < 60 |
| 1462 | + |
| 1463 | + def test_deleted_inactive( |
| 1464 | + self, |
| 1465 | + high_quality_image: io.BytesIO, |
| 1466 | + vuforia_database_keys: VuforiaDatabaseKeys, |
| 1467 | + ) -> None: |
| 1468 | + """ |
| 1469 | + No error is returned when querying for an image of recently deleted, |
| 1470 | + inactive target. |
| 1471 | + """ |
| 1472 | + image_content = high_quality_image.getvalue() |
| 1473 | + image_data_encoded = base64.b64encode(image_content).decode('ascii') |
| 1474 | + add_target_data = { |
| 1475 | + 'name': 'example_name', |
| 1476 | + 'width': 1, |
| 1477 | + 'image': image_data_encoded, |
| 1478 | + 'active_flag': False, |
| 1479 | + } |
| 1480 | + response = add_target_to_vws( |
| 1481 | + vuforia_database_keys=vuforia_database_keys, |
| 1482 | + data=add_target_data, |
| 1483 | + ) |
| 1484 | + |
| 1485 | + target_id = response.json()['target_id'] |
| 1486 | + |
| 1487 | + wait_for_target_processed( |
| 1488 | + target_id=target_id, |
| 1489 | + vuforia_database_keys=vuforia_database_keys, |
| 1490 | + ) |
| 1491 | + |
| 1492 | + delete_target( |
| 1493 | + vuforia_database_keys=vuforia_database_keys, |
| 1494 | + target_id=target_id, |
| 1495 | + ) |
| 1496 | + |
| 1497 | + body = {'image': ('image.jpeg', image_content, 'image/jpeg')} |
| 1498 | + |
| 1499 | + response = query( |
| 1500 | + vuforia_database_keys=vuforia_database_keys, |
| 1501 | + body=body, |
| 1502 | + ) |
| 1503 | + |
| 1504 | + assert_query_success(response=response) |
| 1505 | + assert response.json()['results'] == [] |
0 commit comments