def _delete_all_targets(database_keys: VuforiaDatabase) -> None: """ Delete all targets. Args: database_keys: The credentials to the Vuforia target database to delete all targets in. """ vws_client = VWS( server_access_key=database_keys.server_access_key, server_secret_key=database_keys.server_secret_key, ) targets = vws_client.list_targets() for target in targets: vws_client.wait_for_target_processed(target_id=target) # Even deleted targets can be matched by a query for a few seconds so # we change the target to inactive before deleting it. try: vws_client.update_target(target_id=target, active_flag=False) except TargetStatusNotSuccess: pass vws_client.wait_for_target_processed(target_id=target) vws_client.delete_target(target_id=target)
def test_active_flag( self, vws_client: VWS, image_file_success_state_low_rating: io.BytesIO, initial_active_flag: bool, desired_active_flag: bool, ) -> None: """ Setting the active flag to a Boolean value changes it. """ target_id = vws_client.add_target( name=uuid.uuid4().hex, width=1, image=image_file_success_state_low_rating, active_flag=initial_active_flag, application_metadata=None, ) vws_client.wait_for_target_processed(target_id=target_id) vws_client.update_target( target_id=target_id, active_flag=desired_active_flag, ) target_details = vws_client.get_target_record(target_id=target_id) assert target_details.target_record.active_flag == desired_active_flag
def test_update_target( self, vws_client: VWS, high_quality_image: io.BytesIO, different_high_quality_image: io.BytesIO, cloud_reco_client: CloudRecoService, ) -> None: """ It is possible to update a target. """ old_name = uuid.uuid4().hex old_width = random.uniform(a=0.01, b=50) target_id = vws_client.add_target( name=old_name, width=old_width, image=high_quality_image, active_flag=True, application_metadata=None, ) vws_client.wait_for_target_processed(target_id=target_id) [matching_target] = cloud_reco_client.query(image=high_quality_image) assert matching_target.target_id == target_id query_target_data = matching_target.target_data assert query_target_data is not None query_metadata = query_target_data.application_metadata assert query_metadata is None new_name = uuid.uuid4().hex new_width = random.uniform(a=0.01, b=50) new_application_metadata = base64.b64encode(b'a').decode('ascii') vws_client.update_target( target_id=target_id, name=new_name, width=new_width, active_flag=True, image=different_high_quality_image, application_metadata=new_application_metadata, ) vws_client.wait_for_target_processed(target_id=target_id) [ matching_target, ] = cloud_reco_client.query(image=different_high_quality_image) assert matching_target.target_id == target_id query_target_data = matching_target.target_data assert query_target_data is not None query_metadata = query_target_data.application_metadata assert query_metadata == new_application_metadata vws_client.update_target( target_id=target_id, active_flag=False, ) target_details = vws_client.get_target_record(target_id=target_id) assert target_details.target_record.name == new_name assert target_details.target_record.width == new_width assert not target_details.target_record.active_flag
def test_inactive_project( self, inactive_vws_client: VWS, ) -> None: """ If the project is inactive, a FORBIDDEN response is returned. """ with pytest.raises(ProjectInactive): inactive_vws_client.update_target(target_id=uuid.uuid4().hex)
def test_width_valid(self, vws_client: VWS, target_id: str) -> None: """ Positive numbers are valid widths. """ vws_client.wait_for_target_processed(target_id=target_id) width = 0.01 vws_client.update_target(target_id=target_id, width=width) target_details = vws_client.get_target_record(target_id=target_id) assert target_details.target_record.width == width
def test_corrupted( self, vws_client: VWS, corrupted_image_file: io.BytesIO, target_id: str, ) -> None: """ No error is returned when the given image is corrupted. """ vws_client.wait_for_target_processed(target_id=target_id) vws_client.update_target( target_id=target_id, image=corrupted_image_file, )
def test_base64_encoded( self, target_id: str, metadata: bytes, vws_client: VWS, ) -> None: """ A base64 encoded string is valid application metadata. """ metadata_encoded = base64.b64encode(metadata).decode('ascii') vws_client.wait_for_target_processed(target_id=target_id) vws_client.update_target( target_id=target_id, application_metadata=metadata_encoded, )
def test_name_valid( self, name: str, target_id: str, vws_client: VWS, ) -> None: """ A target's name must be a string of length 0 < N < 65. We test characters out of range in another test as that gives a different error. """ vws_client.wait_for_target_processed(target_id=target_id) vws_client.update_target(target_id=target_id, name=name) target_details = vws_client.get_target_record(target_id=target_id) assert target_details.target_record.name == name
def test_bad_image_format_or_color_space( self, bad_image_file: io.BytesIO, target_id: str, vws_client: VWS, ) -> None: """ A `BAD_IMAGE` response is returned if an image which is not a JPEG or PNG file is given, or if the given image is not in the greyscale or RGB color space. """ vws_client.wait_for_target_processed(target_id=target_id) with pytest.raises(BadImage) as exc: vws_client.update_target(target_id=target_id, image=bad_image_file) status_code = exc.value.response.status_code assert status_code == HTTPStatus.UNPROCESSABLE_ENTITY
def test_no_fields_given( self, vws_client: VWS, high_quality_image: io.BytesIO, ) -> None: """ It is possible to give no update fields. """ target_id = vws_client.add_target( name='x', width=1, image=high_quality_image, active_flag=True, application_metadata=None, ) vws_client.wait_for_target_processed(target_id=target_id) vws_client.update_target(target_id=target_id)
def update_target( server_access_key: str, server_secret_key: str, target_id: str, image_file_path: Path | None, base_vws_url: str, name: str | None = None, application_metadata: str | None = None, active_flag_choice: ActiveFlagChoice | None = None, width: float | None = None, ) -> None: """ Update a target. \b See https://library.vuforia.com/articles/Solution/How-To-Use-the-Vuforia-Web-Services-API#How-To-Update-a-Target """ vws_client = VWS( server_access_key=server_access_key, server_secret_key=server_secret_key, base_vws_url=base_vws_url, ) if image_file_path is None: image = None else: image_bytes = image_file_path.read_bytes() image = io.BytesIO(image_bytes) active_flag = { ActiveFlagChoice.TRUE: True, ActiveFlagChoice.FALSE: False, None: None, }[active_flag_choice] vws_client.update_target( name=name, target_id=target_id, image=image, application_metadata=application_metadata, active_flag=active_flag, width=width, )
def test_target_status_not_success( vws_client: VWS, high_quality_image: io.BytesIO, ) -> None: """ A ``TargetStatusNotSuccess`` exception is raised when updating a target which has a status which is not "Success". """ target_id = vws_client.add_target( name='x', width=1, image=high_quality_image, active_flag=True, application_metadata=None, ) with pytest.raises(TargetStatusNotSuccess) as exc: vws_client.update_target(target_id=target_id) assert exc.value.response.status_code == HTTPStatus.FORBIDDEN assert exc.value.target_id == target_id