From fc8ee54ce23efb31d705d28d62898e9b9b59de57 Mon Sep 17 00:00:00 2001 From: John Chilton Date: Tue, 27 May 2014 08:20:39 -0500 Subject: [PATCH] Bugfix: Explicitly enforce implicit collection unique element identifier constraint. Think this is responsible for bug when collections API does not create as many collections as requested. --- lib/galaxy/dataset_collections/util.py | 8 ++++++++ test/api/test_dataset_collections.py | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/galaxy/dataset_collections/util.py b/lib/galaxy/dataset_collections/util.py index 484c681d388..534e4749d17 100644 --- a/lib/galaxy/dataset_collections/util.py +++ b/lib/galaxy/dataset_collections/util.py @@ -10,6 +10,7 @@ ERROR_MESSAGE_NO_NESTED_IDENTIFIERS = "Dataset source new_collection requires ne ERROR_MESSAGE_NO_NAME = "Cannot load invalid dataset identifier - missing name - %s" ERROR_MESSAGE_NO_COLLECTION_TYPE = "No collection_type define for nested collection %s." ERROR_MESSAGE_INVALID_PARAMETER_FOUND = "Found invalid parameter %s in element identifier description %s." +ERROR_MESSAGE_DUPLICATED_IDENTIFIER_FOUND = "Found duplicated element idenfier name %s." def api_payload_to_create_params( payload ): @@ -36,6 +37,7 @@ def validate_input_element_identifiers( element_identifiers ): and verify the structure is valid. """ log.debug( "Validating %d element identifiers for collection creation." % len( element_identifiers ) ) + identifier_names = set() for element_identifier in element_identifiers: if "__object__" in element_identifier: message = ERROR_MESSAGE_INVALID_PARAMETER_FOUND % ( "__model_object__", element_identifier ) @@ -43,6 +45,12 @@ def validate_input_element_identifiers( element_identifiers ): if "name" not in element_identifier: message = ERROR_MESSAGE_NO_NAME % element_identifier raise exceptions.RequestParameterInvalidException( message ) + name = element_identifier[ "name" ] + if name in identifier_names: + message = ERROR_MESSAGE_DUPLICATED_IDENTIFIER_FOUND % name + raise exceptions.RequestParameterInvalidException( message ) + else: + identifier_names.add( name ) src = element_identifier.get( "src", "hda" ) if src not in [ "hda", "hdca", "ldda", "new_collection" ]: message = ERROR_MESSAGE_UNKNOWN_SRC % src diff --git a/test/api/test_dataset_collections.py b/test/api/test_dataset_collections.py index 800c892b92c..713622e4cc6 100644 --- a/test/api/test_dataset_collections.py +++ b/test/api/test_dataset_collections.py @@ -106,6 +106,19 @@ class DatasetCollectionApiTestCase( api.ApiTestCase ): create_response = self._post( "dataset_collections", payload ) self._assert_status_code_is( create_response, 403 ) + def test_enforces_unique_names( self ): + element_identifiers = self.dataset_collection_populator.list_identifiers( self.history_id ) + element_identifiers[ 2 ][ "name" ] = element_identifiers[ 0 ][ "name" ] + payload = dict( + instance_type="history", + history_id=self.history_id, + element_identifiers=json.dumps(element_identifiers), + collection_type="list", + ) + + create_response = self._post( "dataset_collections", payload ) + self._assert_status_code_is( create_response, 400 ) + def _check_create_response( self, create_response ): self._assert_status_code_is( create_response, 200 ) dataset_collection = create_response.json()