def test_copy_handles_generation(self): source_resource = resource_reference.UnknownResource( storage_url.storage_url_from_string('gs://b/o')) destination_metadata = self.messages.Object(name='o2', bucket='b') destination_resource = resource_reference.UnknownResource( storage_url.storage_url_from_string('gs://b/o2')) request = self.messages.StorageObjectsCopyRequest( sourceBucket=source_resource.storage_url.bucket_name, sourceObject=source_resource.storage_url.object_name, destinationBucket=destination_resource.storage_url.bucket_name, destinationObject=destination_resource.storage_url.object_name, ifSourceGenerationMatch=1) self.apitools_client.objects.Copy.Expect(request, response=destination_metadata) request_config = gcs_api.GcsRequestConfig( precondition_generation_match=1) observed_resource = self.gcs_client.copy_object( source_resource, destination_resource, request_config=request_config) expected_resource = gcs_api._object_resource_from_metadata( destination_metadata) self.assertEqual(observed_resource, expected_resource)
def test_patch_object_metadata_invalid_fields_scope(self): patched_object = self.messages.Object() object_resource = gcs_api._object_resource_from_metadata( patched_object) with self.assertRaises(ValueError): self.gcs_client.patch_object_metadata( TEST_BUCKET, TEST_OBJECT, object_resource, fields_scope='football field')
def _list_objects_side_effect(self, *unused_args, **kwargs): """Mock the list_objects API method sourcing data from TEST_OBJECT_NAMES. Args: **kwargs (dict): Contains arguments dict for list_objects. Yields: resource_reference.Resource instances consisting of list of ObjectResource and/or PrefixResource instanes filtered based on the request prefix and request delimiter. """ objects = [] prefixes = set([]) request_prefix = kwargs['prefix'] or '' request_delimiter = kwargs['delimiter'] filtered_object_suffixes = [ object_name[len(request_prefix):] for object_name in TEST_OBJECT_NAMES if object_name.startswith(request_prefix) ] for object_suffix in filtered_object_suffixes: if request_delimiter: name, _, suffix = object_suffix.partition(request_delimiter) if not suffix: # Leaf object. objects.append( self.messages.Object(name=request_prefix + object_suffix, bucket=TEST_BUCKET_NAME)) else: prefixes.add('%s%s%s' % (request_prefix, name, request_delimiter)) else: objects.append( self.messages.Object(name=request_prefix + object_suffix, bucket=TEST_BUCKET_NAME)) prefixes = sorted(list(prefixes)) objects = self.messages.Objects(items=objects, prefixes=prefixes) for o in objects.items: yield gcs_api._object_resource_from_metadata(o) for prefix_string in objects.prefixes: yield resource_reference.PrefixResource( storage_url_object=storage_url.CloudUrl( scheme=cloud_api.DEFAULT_PROVIDER, bucket_name=kwargs['bucket_name'], object_name=prefix_string), prefix=prefix_string)
def test_patch_object_metadata_api_error(self): patched_object = self.messages.Object() request = self.messages.StorageObjectsPatchRequest( bucket=TEST_BUCKET, object=TEST_OBJECT, objectResource=patched_object, projection=self.default_projection) self.apitools_client.objects.Patch.Expect( request, exception=apitools_exceptions.HttpError(None, None, None)) object_resource = gcs_api._object_resource_from_metadata( patched_object) with self.assertRaises(cloud_errors.GcsApiError): self.gcs_client.patch_object_metadata(TEST_BUCKET, TEST_OBJECT, object_resource)
def test_patch_object_metadata(self): patched_object = self.messages.Object() request = self.messages.StorageObjectsPatchRequest( bucket=TEST_BUCKET, object=TEST_OBJECT, objectResource=patched_object, projection=self.default_projection) self.apitools_client.objects.Patch.Expect(request, response=patched_object) expected_resource = gcs_api._object_resource_from_metadata( patched_object) observed_resource = self.gcs_client.patch_object_metadata( TEST_BUCKET, TEST_OBJECT, expected_resource) self.assertEqual(observed_resource, expected_resource)
def test_patch_object_metadata_populates_missing_metadata(self): return_metadata = self.messages.Object(name='o', bucket='b') request = self.messages.StorageObjectsPatchRequest( bucket=TEST_BUCKET, object=TEST_OBJECT, objectResource=return_metadata, projection=self.default_projection) self.apitools_client.objects.Patch.Expect(request, response=return_metadata) expected_resource = gcs_api._object_resource_from_metadata( return_metadata) patch_resource = test_resources.from_url_string('gs://b/o') observed_resource = self.gcs_client.patch_object_metadata( TEST_BUCKET, TEST_OBJECT, patch_resource) self.assertEqual(observed_resource, expected_resource)
def test_patch_object_metadata_generation(self): patched_object = self.messages.Object() request = self.messages.StorageObjectsPatchRequest( bucket=TEST_BUCKET, object=TEST_OBJECT, objectResource=patched_object, generation=1, projection=self.default_projection) self.apitools_client.objects.Patch.Expect(request, response=patched_object) object_resource = gcs_api._object_resource_from_metadata( patched_object) self.gcs_client.patch_object_metadata(TEST_BUCKET, TEST_OBJECT, object_resource, generation='1')
def test_get_object_metadata(self): metadata_object = self.messages.Object(name=TEST_OBJECT, bucket=TEST_BUCKET) request = self.messages.StorageObjectsGetRequest( bucket=TEST_BUCKET, object=TEST_OBJECT, projection=self.default_projection) self.apitools_client.objects.Get.Expect(request, response=metadata_object) object_reference = self.gcs_client.get_object_metadata( TEST_BUCKET, TEST_OBJECT) expected_object_reference = gcs_api._object_resource_from_metadata( metadata_object) self.assertEqual(object_reference.metadata, expected_object_reference.metadata) self.assertEqual(object_reference.storage_url, expected_object_reference.storage_url)
def test_copies_objects(self): source_resource = resource_reference.UnknownResource( storage_url.storage_url_from_string('gs://b/o')) destination_metadata = self.messages.Object(name='o2', bucket='b') destination_resource = resource_reference.UnknownResource( storage_url.storage_url_from_string('gs://b/o2')) request = self.messages.StorageObjectsCopyRequest( sourceBucket=source_resource.storage_url.bucket_name, sourceObject=source_resource.storage_url.object_name, destinationBucket=destination_resource.storage_url.bucket_name, destinationObject=destination_resource.storage_url.object_name) self.apitools_client.objects.Copy.Expect(request, response=destination_metadata) observed_resource = self.gcs_client.copy_object( source_resource, destination_resource) expected_resource = gcs_api._object_resource_from_metadata( destination_metadata) self.assertEqual(observed_resource, expected_resource)
def test_patch_object_metadata_valid_fields_scope(self, fields_scope, projection): patched_object = self.messages.Object() object_resource = gcs_api._object_resource_from_metadata( patched_object) request = self.messages.StorageObjectsPatchRequest( bucket=TEST_BUCKET, object=TEST_OBJECT, objectResource=patched_object, projection=getattr( self.messages.StorageObjectsPatchRequest. ProjectionValueValuesEnum, projection)) with mock.patch.object(self.apitools_client.objects, 'Patch') as mock_patch: self.gcs_client.patch_object_metadata(TEST_BUCKET, TEST_OBJECT, object_resource, fields_scope=fields_scope) mock_patch.assert_called_once_with(request)
def test_patch_object_metadata_precondition_generation_match(self): patched_object = self.messages.Object() precondition_generation_match = 1 request = self.messages.StorageObjectsPatchRequest( bucket=TEST_BUCKET, object=TEST_OBJECT, objectResource=patched_object, ifGenerationMatch=precondition_generation_match, projection=self.default_projection) self.apitools_client.objects.Patch.Expect(request, response=patched_object) object_resource = gcs_api._object_resource_from_metadata( patched_object) self.gcs_client.patch_object_metadata( TEST_BUCKET, TEST_OBJECT, object_resource, request_config=gcs_api.GcsRequestConfig( precondition_generation_match=precondition_generation_match))
def test_uploads_object_with_object_resource(self): upload_metadata = self.messages.Object(name='o', bucket='b') request = self.messages.StorageObjectsInsertRequest( bucket=upload_metadata.bucket, object=upload_metadata) self.apitools_client.objects.Insert.Expect(request, response=upload_metadata) upload_stream = mock.mock_open() upload_resource = resource_reference.FileObjectResource( storage_url.storage_url_from_string('gs://b/o')) expected_resource = gcs_api._object_resource_from_metadata( upload_metadata) with mock.patch.object(apitools_transfer, 'Upload') as mock_upload: observed_resource = self.gcs_client.upload_object( upload_stream, upload_resource) self.assertEqual(observed_resource, expected_resource) mock_upload.assert_called_once_with( upload_stream, gcs_api.DEFAULT_CONTENT_TYPE, total_size=None, auto_transfer=True, num_retries=gcs_api.DEFAULT_NUM_RETRIES, gzip_encoded=False)
def test_patch_object_metadata_predefined_acl_string(self): patched_object = self.messages.Object() predefined_acl_string = 'authenticatedRead' predefined_acl = getattr( self.messages.StorageObjectsPatchRequest. PredefinedAclValueValuesEnum, predefined_acl_string) request = self.messages.StorageObjectsPatchRequest( bucket=TEST_BUCKET, object=TEST_OBJECT, objectResource=patched_object, predefinedAcl=predefined_acl, projection=self.default_projection) self.apitools_client.objects.Patch.Expect( request, response=self.messages.Object()) request_config = gcs_api.GcsRequestConfig( predefined_acl_string=predefined_acl_string) object_resource = gcs_api._object_resource_from_metadata( patched_object) self.gcs_client.patch_object_metadata(TEST_BUCKET, TEST_OBJECT, object_resource, request_config=request_config)