class AssetsDeleteEndpointTestCase(StacBaseTestCase): @mock_s3_asset_file def setUp(self): # pylint: disable=invalid-name self.factory = Factory() self.collection = self.factory.create_collection_sample().model self.item = self.factory.create_item_sample( collection=self.collection).model self.asset = self.factory.create_asset_sample(item=self.item).model self.client = Client() client_login(self.client) self.maxDiff = None # pylint: disable=invalid-name def test_asset_endpoint_delete_asset(self): collection_name = self.collection.name item_name = self.item.name asset_name = self.asset.name path = f'/{STAC_BASE_V}/collections/{collection_name}/items/{item_name}/assets/{asset_name}' response = self.client.delete(path) self.assertStatusCode(200, response) # Check that is has really been deleted response = self.client.get(path) self.assertStatusCode(404, response) # Check that it is really not to be found in DB self.assertFalse(Asset.objects.filter(name=self.asset.name).exists(), msg="Deleted asset still found in DB") def test_asset_endpoint_delete_asset_invalid_name(self): collection_name = self.collection.name item_name = self.item.name path = (f"/{STAC_BASE_V}/collections/{collection_name}" f"/items/{item_name}/assets/non-existent-asset") response = self.client.delete(path) self.assertStatusCode(404, response)
def setUp(self): # pylint: disable=invalid-name self.factory = Factory() self.collection = self.factory.create_collection_sample().model self.item = self.factory.create_item_sample( collection=self.collection).model self.asset = self.factory.create_asset_sample(item=self.item).model self.client = Client()
def setUp(self): # pylint: disable=invalid-name self.client = Client() client_login(self.client) self.factory = Factory() self.collection = self.factory.create_collection_sample(db_create=True) self.item = self.factory.create_item_sample(self.collection.model, db_create=True) self.maxDiff = None # pylint: disable=invalid-name
def setUp(self): self.client = Client() client_login(self.client) self.factory = Factory() self.collection = self.factory.create_collection_sample().model self.items = self.factory.create_item_samples( ['item-switzerland-west'], self.collection, db_create=True)
def setUp(self): self.factory = Factory() self.collection = self.factory.create_collection_sample( db_create=True).model self.item = self.factory.create_item_sample(collection=self.collection, db_create=True).model self.asset = self.factory.create_asset_sample(item=self.item, db_create=True)
def setUp(self): self.factory = Factory() self.collection = self.factory.create_collection_sample().model self.item = self.factory.create_item_sample( collection=self.collection, name='base-bbox', geometry=GEOSGeometry( 'SRID=4326;POLYGON ((0 0, 0 45, 45 45, 45 0, 0 0))')).model
def setUp(self): # pylint: disable=invalid-name self.client = Client() self.factory = Factory() self.collection = self.factory.create_collection_sample().model self.item = self.factory.create_item_sample( collection=self.collection).model self.asset_1 = self.factory.create_asset_sample(item=self.item, db_create=True) self.maxDiff = None # pylint: disable=invalid-name
def setUp(self): self.username = '******' self.password = '******' get_user_model().objects.create_superuser(self.username, password=self.password) self.factory = Factory() self.collection_sample = self.factory.create_collection_sample( sample='collection-2', db_create=True) self.item_sample = self.factory.create_item_sample( self.collection_sample.model, sample='item-2', db_create=True)
def setUp(self): # pylint: disable=invalid-name self.client = Client() client_login(self.client) self.factory = Factory() self.collection = self.factory.create_collection_sample().model self.item = self.factory.create_item_sample( collection=self.collection).model self.asset = self.factory.create_asset_sample( item=self.item, sample='asset-no-file').model self.maxDiff = None # pylint: disable=invalid-name
class AssetsWriteEndpointAssetFileTestCase(StacBaseTestCase): @mock_s3_asset_file def setUp(self): # pylint: disable=invalid-name self.factory = Factory() self.collection = self.factory.create_collection_sample().model self.item = self.factory.create_item_sample( collection=self.collection).model self.client = Client() client_login(self.client) self.maxDiff = None # pylint: disable=invalid-name
class AssetRaceConditionTest(StacBaseTransactionTestCase): def setUp(self): self.username = '******' self.password = '******' get_user_model().objects.create_superuser(self.username, password=self.password) self.factory = Factory() self.collection_sample = self.factory.create_collection_sample( sample='collection-2', db_create=True) self.item_sample = self.factory.create_item_sample( self.collection_sample.model, sample='item-2', db_create=True) def test_asset_upsert_race_condition(self): workers = 5 status_201 = 0 asset_sample = self.factory.create_asset_sample( self.item_sample.model, sample='asset-no-checksum', ) def asset_atomic_upsert_test(worker): # This method run on separate thread therefore it requires to create a new client and # to login it for each call. client = Client() client.login(username=self.username, password=self.password) return client.put(reverse('asset-detail', args=[ self.collection_sample['name'], self.item_sample['name'], asset_sample['name'] ]), data=asset_sample.get_json('put'), content_type='application/json') # We call the PUT asset several times in parallel with the same data to make sure # that we don't have any race condition. responses, errors = self.run_parallel(workers, asset_atomic_upsert_test) for worker, response in responses: if response.status_code == 201: status_201 += 1 self.assertIn( response.status_code, [200, 201], msg= f'Unexpected response status code {response.status_code} for worker {worker}' ) self.check_stac_asset(asset_sample.json, response.json(), self.collection_sample['name'], self.item_sample['name'], ignore=['item']) self.assertEqual(status_201, 1, msg="Not only one upsert did a create !")
class AssetsEndpointUnauthorizedTestCase(StacBaseTestCase): @mock_s3_asset_file def setUp(self): # pylint: disable=invalid-name self.factory = Factory() self.collection = self.factory.create_collection_sample().model self.item = self.factory.create_item_sample( collection=self.collection).model self.asset = self.factory.create_asset_sample(item=self.item).model self.client = Client() def test_unauthorized_asset_post_put_patch_delete(self): collection_name = self.collection.name item_name = self.item.name asset_name = self.asset.name new_asset = self.factory.create_asset_sample(item=self.item).json updated_asset = self.factory.create_asset_sample( item=self.item, name=asset_name, sample='asset-1-updated').get_json('post') # make sure POST fails for anonymous user: path = f'/{STAC_BASE_V}/collections/{collection_name}/items/{item_name}/assets' response = self.client.post(path, data=new_asset, content_type="application/json") self.assertStatusCode(401, response, msg="Unauthorized post was permitted.") # make sure PUT fails for anonymous user: path = f'/{STAC_BASE_V}/collections/{collection_name}/items/{item_name}/assets/{asset_name}' response = self.client.put(path, data=updated_asset, content_type="application/json") self.assertStatusCode(401, response, msg="Unauthorized put was permitted.") # make sure PATCH fails for anonymous user: path = f'/{STAC_BASE_V}/collections/{collection_name}/items/{item_name}/assets/{asset_name}' response = self.client.patch(path, data=updated_asset, content_type="application/json") self.assertStatusCode(401, response, msg="Unauthorized patch was permitted.") # make sure DELETE fails for anonymous user: path = f'/{STAC_BASE_V}/collections/{collection_name}/items/{item_name}/assets/{asset_name}' response = self.client.delete(path) self.assertStatusCode(401, response, msg="Unauthorized del was permitted.")
def setUp(self): self.data_factory = Factory() self.collection_created = utc_aware(datetime.now()) self.collection = self.data_factory.create_collection_sample( db_create=True) self.item = self.data_factory.create_item_sample( collection=self.collection.model, db_create=True) self.asset = self.data_factory.create_asset_sample( item=self.item.model, db_create=True) self.collection.model.refresh_from_db() self.maxDiff = None # pylint: disable=invalid-name
def setUpTestData(cls): cls.factory = Factory() cls.collection = cls.factory.create_collection_sample().model cls.item_1 = cls.factory.create_item_sample( cls.collection, name='item-1', properties_datetime=fromisoformat('2019-01-01T00:00:00Z'), db_create=True, ) cls.now = utc_aware(datetime.utcnow()) cls.yesterday = cls.now - timedelta(days=1) cls.item_now = cls.factory.create_item_sample( cls.collection, name='item-now', properties_datetime=cls.now, db_create=True, ) cls.item_yesterday = cls.factory.create_item_sample( cls.collection, name='item-yesterday', properties_datetime=cls.yesterday, db_create=True)
def setUpTestData(cls): cls.factory = Factory() cls.collection = cls.factory.create_collection_sample().model cls.item = cls.factory.create_item_sample( collection=cls.collection).model cls.asset_1 = cls.factory.create_asset_sample(item=cls.item).model cls.asset_2 = cls.factory.create_asset_sample(item=cls.item).model
def setUp(self): self.factory = Factory() self.collection = self.factory.create_collection_sample( name='collection-1', db_create=True, ) self.item = self.factory.create_item_sample( collection=self.collection.model, name='item-1', db_create=True, ) self.asset = self.factory.create_asset_sample( item=self.item.model, name='asset-1.tiff', db_create=True, )
class AssetsUpdateEndpointAssetFileTestCase(StacBaseTestCase): @mock_s3_asset_file def setUp(self): # pylint: disable=invalid-name self.factory = Factory() self.collection = self.factory.create_collection_sample(db_create=True) self.item = self.factory.create_item_sample( collection=self.collection.model, db_create=True) self.asset = self.factory.create_asset_sample(item=self.item.model, db_create=True) self.client = Client() client_login(self.client) self.maxDiff = None # pylint: disable=invalid-name def test_asset_endpoint_patch_put_href(self): collection_name = self.collection['name'] item_name = self.item['name'] asset_name = self.asset['name'] asset_sample = self.asset.copy() put_payload = asset_sample.get_json('put') put_payload['href'] = 'https://testserver/non-existing-asset' patch_payload = {'href': 'https://testserver/non-existing-asset'} path = f'/{STAC_BASE_V}/collections/{collection_name}/items/{item_name}/assets/{asset_name}' response = self.client.patch(path, data=patch_payload, content_type="application/json") self.assertStatusCode(400, response) description = response.json()['description'] self.assertIn('href', description, msg=f'Unexpected field error {description}') self.assertEqual("Found read-only property in payload", description['href'][0], msg="Unexpected error message") response = self.client.put(path, data=put_payload, content_type="application/json") self.assertStatusCode(400, response) description = response.json()['description'] self.assertIn('href', description, msg=f'Unexpected field error {description}') self.assertEqual("Found read-only property in payload", description['href'][0], msg="Unexpected error message")
def setUpTestData(cls): cls.data_factory = Factory() cls.collection = cls.data_factory.create_collection_sample( db_create=True) cls.item = cls.data_factory.create_item_sample( collection=cls.collection.model, db_create=True) cls.asset = cls.data_factory.create_asset_sample(item=cls.item.model, db_create=True)
def setUpTestData(cls): # pylint: disable=invalid-name cls.data_factory = Factory() cls.collection = cls.data_factory.create_collection_sample( db_create=True) cls.item = cls.data_factory.create_item_sample( collection=cls.collection.model, db_create=True) cls.asset = cls.data_factory.create_asset_sample(item=cls.item.model, db_create=True)
def setUp(self): self.factory = Factory() self.password = '******' self.username = '******' self.admin_user = get_user_model().objects.create_superuser( self.username, '*****@*****.**', self.password) self.client = Client() self.collection = None self.item = None
class CollectionsDeleteEndpointTestCase(StacBaseTestCase): def setUp(self): # pylint: disable=invalid-name self.client = Client() client_login(self.client) self.factory = Factory() self.collection = self.factory.create_collection_sample(db_create=True) self.item = self.factory.create_item_sample(self.collection.model, db_create=True) self.maxDiff = None # pylint: disable=invalid-name def test_authorized_collection_delete(self): path = reverse('collection-detail', args=[self.collection["name"]]) response = self.client.delete(path) self.assertStatusCode(400, response) self.assertEqual( response.json()['description'], ['Deleting Collection with items not allowed'] ) # delete first the item item_path = reverse('item-detail', args=[self.collection["name"], self.item['name']]) response = self.client.delete(item_path) self.assertStatusCode(200, response) # try the collection delete again response = self.client.delete(path) self.assertStatusCode(200, response) # Check that the object doesn't exists anymore self.assertFalse( CollectionLink.objects.filter(collection__name=self.collection["name"]).exists(), msg="Deleted collection link still in DB" ) self.assertFalse( Provider.objects.filter(collection__name=self.collection["name"]).exists(), msg="Deleted provider still in DB" ) self.assertFalse( Collection.objects.filter(name=self.collection["name"]).exists(), msg="Deleted collection still in DB" )
class OneItemSpatialTestCase(StacBaseTestCase): def setUp(self): self.client = Client() client_login(self.client) self.factory = Factory() self.collection = self.factory.create_collection_sample().model self.items = self.factory.create_item_samples( ['item-switzerland-west'], self.collection, db_create=True) def test_single_item(self): collection_name = self.collection.name item_name = self.items[0].model.name response_item = self.client.get( f"/{STAC_BASE_V}/collections/{collection_name}/items/{item_name}") response_item_json = response_item.json() response_collection = self.client.get( f"/{STAC_BASE_V}/collections/{collection_name}") response_collection_json = response_collection.json() bbox_collection = response_collection_json['extent']['spatial'][ 'bbox'][0] bbox_items = response_item_json['bbox'] self.assertEqual(bbox_items, bbox_collection) def test_no_items(self): collection_name = self.collection.name item_name = self.items[0].model.name # delete the item path = f'/{STAC_BASE_V}/collections/{self.collection.name}/items/{item_name}' response = self.client.delete(path) self.assertStatusCode(200, response) response_collection = self.client.get( f"/{STAC_BASE_V}/collections/{collection_name}") response_collection_json = response_collection.json() bbox_collection = response_collection_json['extent']['spatial'][ 'bbox'][0] self.assertEqual(bbox_collection, [])
def test_validate_asset_href_path(self): factory = Factory() collection = factory.create_collection_sample( name='collection-test').model item = factory.create_item_sample(collection=collection, name='item-test').model validate_asset_href_path(item, 'asset-test', 'collection-test/item-test/asset-test') with self.settings(AWS_S3_CUSTOM_DOMAIN='new-domain'): validate_asset_href_path(item, 'asset-test', 'collection-test/item-test/asset-test') with self.settings(AWS_S3_CUSTOM_DOMAIN='new-domain/with-prefix/'): validate_asset_href_path( item, 'asset-test', 'with-prefix/collection-test/item-test/asset-test') with self.settings(AWS_S3_CUSTOM_DOMAIN='//new-domain/with-prefix'): validate_asset_href_path( item, 'asset-test', 'with-prefix/collection-test/item-test/asset-test') with self.settings(AWS_S3_CUSTOM_DOMAIN='//new domain/with-prefix'): validate_asset_href_path( item, 'asset-test', 'with-prefix/collection-test/item-test/asset-test') with self.assertRaises( serializers.ValidationError, msg= "Invalid Asset href path did not raises serializers.ValidationError" ): validate_asset_href_path(item, 'asset-test', 'asset-test') validate_asset_href_path(item, 'asset-test', 'item-test/asset-test') validate_asset_href_path(item, 'asset-test', 'collection-test/item-test/asset-test') validate_asset_href_path( item, 'asset-test', '/service-stac-local/collection-test/item-test/asset-test')
class AssetsUnimplementedEndpointTestCase(StacBaseTestCase): @mock_s3_asset_file def setUp(self): # pylint: disable=invalid-name self.factory = Factory() self.collection = self.factory.create_collection_sample().model self.item = self.factory.create_item_sample( collection=self.collection).model self.client = Client() client_login(self.client) self.maxDiff = None # pylint: disable=invalid-name def test_asset_unimplemented_post(self): collection_name = self.collection.name item_name = self.item.name asset = self.factory.create_asset_sample(item=self.item, required_only=True) response = self.client.post( f'/{STAC_BASE_V}/collections/{collection_name}/items/{item_name}/assets', data=asset.get_json('post'), content_type="application/json") self.assertStatusCode(405, response)
def setUpTestData(cls): cls.factory = Factory() cls.collection = cls.factory.create_collection_sample().model cls.items = cls.factory.create_item_samples( [ 'item-switzerland', 'item-switzerland-west', 'item-switzerland-east', 'item-switzerland-north', 'item-switzerland-south', 'item-paris' ], cls.collection, db_create=True, )
def setUpTestData(cls): cls.factory = Factory() cls.collection = cls.factory.create_collection_sample( name='collection-1', db_create=True, ) cls.item = cls.factory.create_item_sample( collection=cls.collection.model, name='item-1', db_create=True, ) cls.asset = cls.factory.create_asset_sample( item=cls.item.model, db_create=True, )
def setUpTestData(cls): cls.factory = Factory() cls.collection = cls.factory.create_collection_sample().model cls.items = cls.factory.create_item_samples( [ 'item-1', 'item-2', 'item-switzerland', 'item-switzerland-west', 'item-switzerland-east', 'item-switzerland-north', 'item-switzerland-south', 'item-paris' ], cls.collection, db_create=True, ) cls.now = utc_aware(datetime.utcnow()) cls.yesterday = cls.now - timedelta(days=1)
class CollectionsUnImplementedEndpointTestCase(StacBaseTestCase): def setUp(self): # pylint: disable=invalid-name self.client = Client() client_login(self.client) self.factory = Factory() self.collection = self.factory.create_collection_sample() self.maxDiff = None # pylint: disable=invalid-name def test_collections_post_unimplemented(self): response = self.client.post( f"/{STAC_BASE_V}/collections", data=self.collection.get_json('post'), content_type='application/json' ) self.assertStatusCode(405, response)
def setUpTestData(cls): cls.title_for_query = 'Item for pagination test' cls.factory = Factory() cls.collection = cls.factory.create_collection_sample().model cls.items = cls.factory.create_item_samples( [ 'item-1', 'item-2', 'item-switzerland', 'item-switzerland-west', 'item-switzerland-east', 'item-switzerland-north', 'item-switzerland-south', 'item-paris' ], cls.collection, properties_title=[ 'My item', cls.title_for_query, None, 'My item', 'My item', cls.title_for_query, 'My item', cls.title_for_query ], db_create=True, )
def setUpTestData(cls): cls.data_factory = Factory()