def define_viewset(self, design_name, design_doc, datastore_name=None, keepviews=False): """ Create or update a design document (i.e. a set of views). If design exists, only updates if view definitions are different to prevent rebuild of indexes. """ ds, datastore_name = self._get_datastore(datastore_name) doc_name = self._get_design_name(design_name) try: ds[doc_name] = dict(views=design_doc) #except ResourceConflict: except Exception: # View exists old_design = ds[doc_name] if not keepviews: try: try: del ds[doc_name] except ResourceNotFound: pass ds[doc_name] = dict(views=design_doc) except Exception as ex: # In case this gets executed concurrently and 2 processes perform the same creates log.warn("Error defining datastore %s view %s (concurrent create?): %s", datastore_name, doc_name, str(ex)) else: ddiff = DictDiffer(old_design.get("views", {}), design_doc) if ddiff.changed(): old_design["views"] = design_doc ds.save(old_design)
def test_dict_merge(self): # dict_merge(base, upd, inplace=False): org_dict = { "a": "str_a", "d": { "d-x": 1, "d-y": None, "d-d": { "d-d-1": 1, "d-d-2": 2 } } } base_dict = copy.deepcopy(org_dict) dd = DictDiffer(base_dict, org_dict) self.assertTrue(len(base_dict), 2) self.assertTrue(len(dd.unchanged()), len(base_dict)) # Case 1: Add new value delta_dict = {"c": "NEW_C"} mod_dict = dict_merge(base_dict, delta_dict) dd = DictDiffer(base_dict, org_dict) self.assertTrue(len(base_dict), 2) self.assertTrue(len(dd.unchanged()), len(base_dict)) dd = DictDiffer(mod_dict, org_dict) self.assertTrue(len(mod_dict), 3) self.assertTrue(len(dd.unchanged()), len(org_dict)) self.assertTrue(dd.added(), 1) # Case 2: Change simple type value delta_dict = {"a": 5} base_dict = copy.deepcopy(org_dict) mod_dict = dict_merge(base_dict, delta_dict) dd = DictDiffer(mod_dict, org_dict) self.assertTrue(len(mod_dict), len(org_dict)) self.assertTrue(len(dd.unchanged()), len(org_dict) - 1) self.assertTrue(len(dd.changed()), 1) self.assertTrue(mod_dict['a'], 5) # Case 3: Add new value on lower level delta_dict = {"d": {"new": "NEW_ENTRY"}} base_dict = copy.deepcopy(org_dict) mod_dict = dict_merge(base_dict, delta_dict) dd = DictDiffer(mod_dict, org_dict) self.assertTrue(len(mod_dict), len(org_dict)) self.assertTrue(len(mod_dict['d']), len(org_dict['d']) + 1) self.assertTrue(mod_dict['d']['new'], "NEW_ENTRY") dd = DictDiffer(mod_dict['d'], org_dict['d']) self.assertTrue(len(dd.unchanged()), len(org_dict['d'])) self.assertTrue(dd.added(), 1)
def define_views(self, design, viewdef, datastore_name=None): """ Create or update a design document (set of views). If design exists, only updates if view definitions are different to prevent rebuild of indexes. """ ds, datastore_name = self._get_datastore(datastore_name) doc_name = self._get_design_name(design) try: ds[doc_name] = dict(views=viewdef) except ResourceConflict: # View exists old_design = ds[doc_name] ddiff = DictDiffer(old_design.get("views", {}), viewdef) if ddiff.changed(): old_design["views"] = viewdef ds.save(old_design)
def test_dict_merge(self): # dict_merge(base, upd, inplace=False): org_dict = {"a":"str_a", "d": {"d-x": 1, "d-y": None, "d-d": {"d-d-1": 1, "d-d-2": 2}}} base_dict = copy.deepcopy(org_dict) dd = DictDiffer(base_dict, org_dict) self.assertTrue(len(base_dict), 2) self.assertTrue(len(dd.unchanged()), len(base_dict)) # Case 1: Add new value delta_dict = {"c" : "NEW_C"} mod_dict = dict_merge(base_dict, delta_dict) dd = DictDiffer(base_dict, org_dict) self.assertTrue(len(base_dict), 2) self.assertTrue(len(dd.unchanged()), len(base_dict)) dd = DictDiffer(mod_dict, org_dict) self.assertTrue(len(mod_dict), 3) self.assertTrue(len(dd.unchanged()), len(org_dict)) self.assertTrue(dd.added(), 1) # Case 2: Change simple type value delta_dict = {"a" : 5} base_dict = copy.deepcopy(org_dict) mod_dict = dict_merge(base_dict, delta_dict) dd = DictDiffer(mod_dict, org_dict) self.assertTrue(len(mod_dict), len(org_dict)) self.assertTrue(len(dd.unchanged()), len(org_dict)-1) self.assertTrue(len(dd.changed()), 1) self.assertTrue(mod_dict['a'], 5) # Case 3: Add new value on lower level delta_dict = {"d": {"new":"NEW_ENTRY"}} base_dict = copy.deepcopy(org_dict) mod_dict = dict_merge(base_dict, delta_dict) dd = DictDiffer(mod_dict, org_dict) self.assertTrue(len(mod_dict), len(org_dict)) self.assertTrue(len(mod_dict['d']), len(org_dict['d']) + 1) self.assertTrue(mod_dict['d']['new'], "NEW_ENTRY") dd = DictDiffer(mod_dict['d'], org_dict['d']) self.assertTrue(len(dd.unchanged()), len(org_dict['d'])) self.assertTrue(dd.added(), 1)
def test_anonymous_resource_registry_operations_through_gateway(self): """ This test ensures that requests make through the service gateway through messaging to the Resource Registry and back; including the support of unicode characters. """ response = self.test_app.get( "/ion-service/resource_registry/find_resources?name=" + convert_unicode(DATA_PRODUCT_NAME) + "&id_only=True&user_id=123abc456" ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response_data = response.json["data"][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 0) data_product_id = self.create_data_product_resource() data_product_read_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "read", "params": {"object_id": data_product_id}, } } response = self.test_app.post( "/ion-service/resource_registry/read", {"payload": simplejson.dumps(data_product_read_request)} ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) data_product_obj = convert_unicode(response.json["data"][GATEWAY_RESPONSE]) # Verify the the name and description fields containing unicode characters match all the way through couch and the messaging self.assertEqual(data_product_obj["name"], convert_unicode(DATA_PRODUCT_NAME)) self.assertEqual(data_product_obj["description"], convert_unicode(DATA_PRODUCT_DESCRIPTION)) updated_description_text = data_product_obj["description"] + "---Updated!!" # modify some fields in the data for testing update data_product_obj["description"] = updated_description_text data_product_update_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "update", "params": {"object": data_product_obj}, } } response = self.test_app.post( "/ion-service/resource_registry/update", {"payload": simplejson.dumps(data_product_update_request)} ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response = self.test_app.post( "/ion-service/resource_registry/read", {"payload": simplejson.dumps(data_product_read_request)} ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) updated_data_product_obj = convert_unicode(response.json["data"][GATEWAY_RESPONSE]) self.assertEqual(updated_data_product_obj["description"], updated_description_text) differ = DictDiffer(updated_data_product_obj, data_product_obj) self.assertEqual( len(differ.changed()), 2 ) # Only the _rev and ts_updated fields should be different after an update response = self.test_app.get( "/ion-service/resource_registry/find_resources?name=" + convert_unicode(DATA_PRODUCT_NAME) + "&id_only=True" ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response_data = response.json["data"][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 1) response = self.delete_data_product_resource(data_product_id) self.assertIsNone(response.json["data"][GATEWAY_RESPONSE]) response = self.test_app.post( "/ion-service/resource_registry/read", {"payload": simplejson.dumps(data_product_read_request)} ) self.check_response_headers(response) self.assertIn(GATEWAY_ERROR, response.json["data"]) self.assertIn("does not exist", response.json["data"][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) response = self.test_app.get( "/ion-service/resource_registry/find_resources?name=" + convert_unicode(DATA_PRODUCT_NAME) + "&id_only=True" ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response_data = response.json["data"][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 0) response = self.delete_data_product_resource(data_product_id) self.assertIn(GATEWAY_ERROR, response.json["data"]) self.assertIn("does not exist", response.json["data"][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) self.assertIsNotNone(response.json["data"][GATEWAY_ERROR][GATEWAY_ERROR_TRACE]) # Now try creating a policy object which has an internal object of a different type policy_id = self.create_policy_resource() policy_read_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "read", "params": {"object_id": policy_id}, } } response = self.test_app.post( "/ion-service/resource_registry/read", {"payload": simplejson.dumps(policy_read_request)} ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) policy_obj = convert_unicode(response.json["data"][GATEWAY_RESPONSE]) # Verify the the name and description fields containing unicode characters match all the way through couch and the messaging self.assertEqual(policy_obj["name"], convert_unicode(POLICY_NAME)) self.assertEqual(policy_obj["description"], convert_unicode(POLICY_DESCRIPTION)) self.assertEqual(policy_obj["policy_type"]["policy_rule"], convert_unicode(POLICY_RULE)) updated_policy_rule = policy_obj["policy_type"]["policy_rule"] + "---Updated!!" # modify some fields in the data for testing update policy_obj["policy_type"]["policy_rule"] = updated_policy_rule policy_update_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "update", "params": {"object": policy_obj}, } } response = self.test_app.post( "/ion-service/resource_registry/update", {"payload": simplejson.dumps(policy_update_request)} ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response = self.test_app.post( "/ion-service/resource_registry/read", {"payload": simplejson.dumps(policy_read_request)} ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) updated_policy_obj = convert_unicode(response.json["data"][GATEWAY_RESPONSE]) self.assertEqual(updated_policy_obj["policy_type"]["policy_rule"], updated_policy_rule) # Now testing the generic get_resource_extension with optional user_id parameter response = self.test_app.get("/ion-service/resource_registry/find_resources?name=ionsystem") self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response_data = response.json["data"][GATEWAY_RESPONSE] actor_id = response_data[0][0]["_id"] response = self.test_app.get( "/ion-service/resource_registry/get_resource_extension?resource_id=" + actor_id + "&resource_extension=TestExtendedInformationResource" ) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response_data = response.json["data"][GATEWAY_RESPONSE] self.assertEqual(convert_unicode(response_data["user_id"]), "") response = self.test_app.get( "/ion-service/resource_registry/get_resource_extension?resource_id=" + actor_id + "&resource_extension=TestExtendedInformationResource&user_id=123abc456" ) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response_data = response.json["data"][GATEWAY_RESPONSE] self.assertEqual(convert_unicode(response_data["user_id"]), "123abc456")
def test_resource_registry_operations_through_gateway(self): response = self.test_app.get('/ion-service/resource_registry/find_resources?name=TestDataProduct&id_only=True') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data),2 ) self.assertEqual(len(response_data[0]), 0 ) data_product_id = self.create_data_product_resource() data_product_read_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "read", "params": { "object_id": data_product_id } } } response = self.test_app.post('/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request) }) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) data_product_obj = convert_unicode(response.json['data'][GATEWAY_RESPONSE]) #modify some fields in the data for testing update data_product_obj['description'] = 'An updated description for test data' data_product_obj['contact']['postalcode'] = '12345' data_product_update_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "update", "params": { "object": data_product_obj } } } response = self.test_app.post('/ion-service/resource_registry/update', {'payload': simplejson.dumps(data_product_update_request) }) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response = self.test_app.post('/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request) }) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) updated_data_product_obj = convert_unicode(response.json['data'][GATEWAY_RESPONSE]) self.assertEqual(updated_data_product_obj['description'], 'An updated description for test data', ) self.assertEqual(updated_data_product_obj['contact']['postalcode'], '12345') differ = DictDiffer(updated_data_product_obj, data_product_obj) self.assertEqual(len(differ.changed()), 2) # Only the _rev and ts_updated fields should be different after an update response = self.test_app.get('/ion-service/resource_registry/find_resources?name=TestDataProduct&id_only=True') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data),2 ) self.assertEqual(len(response_data[0]), 1 ) response = self.delete_data_product_resource(data_product_id) self.assertIsNone(response.json['data'][GATEWAY_RESPONSE]) response = self.test_app.post('/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request) }) self.check_response_headers(response) self.assertIn(GATEWAY_ERROR, response.json['data']) self.assertIn('does not exist', response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) response = self.test_app.get('/ion-service/resource_registry/find_resources?name=TestDataProduct&id_only=True') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data),2 ) self.assertEqual(len(response_data[0]), 0 ) response = self.delete_data_product_resource(data_product_id) self.assertIn(GATEWAY_ERROR, response.json['data']) self.assertIn('does not exist', response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) self.assertIsNotNone(response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_TRACE])
def test_anonymous_resource_registry_operations_through_gateway(self): """ This test ensures that requests make through the service gateway through messaging to the Resource Registry and back; including the support of unicode characters. @return: """ response = self.test_app.get( '/ion-service/resource_registry/find_resources?name=' + convert_unicode(DATA_PRODUCT_NAME) + '&id_only=True') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 0) data_product_id = self.create_data_product_resource() data_product_read_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "read", "params": { "object_id": data_product_id } } } response = self.test_app.post( '/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request)}) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) data_product_obj = convert_unicode( response.json['data'][GATEWAY_RESPONSE]) #Verify the the name and description fields containing unicode characters match all the way through couch and the messaging self.assertEqual(data_product_obj['name'], convert_unicode(DATA_PRODUCT_NAME)) self.assertEqual(data_product_obj['description'], convert_unicode(DATA_PRODUCT_DESCRIPTION)) updated_description_text = data_product_obj[ 'description'] + '---Updated!!' #modify some fields in the data for testing update data_product_obj['description'] = updated_description_text data_product_update_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "update", "params": { "object": data_product_obj } } } response = self.test_app.post( '/ion-service/resource_registry/update', {'payload': simplejson.dumps(data_product_update_request)}) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response = self.test_app.post( '/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request)}) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) updated_data_product_obj = convert_unicode( response.json['data'][GATEWAY_RESPONSE]) self.assertEqual(updated_data_product_obj['description'], updated_description_text) differ = DictDiffer(updated_data_product_obj, data_product_obj) self.assertEqual( len(differ.changed()), 2 ) # Only the _rev and ts_updated fields should be different after an update response = self.test_app.get( '/ion-service/resource_registry/find_resources?name=' + convert_unicode(DATA_PRODUCT_NAME) + '&id_only=True') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 1) response = self.delete_data_product_resource(data_product_id) self.assertIsNone(response.json['data'][GATEWAY_RESPONSE]) response = self.test_app.post( '/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request)}) self.check_response_headers(response) self.assertIn(GATEWAY_ERROR, response.json['data']) self.assertIn( 'does not exist', response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) response = self.test_app.get( '/ion-service/resource_registry/find_resources?name=' + convert_unicode(DATA_PRODUCT_NAME) + '&id_only=True') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 0) response = self.delete_data_product_resource(data_product_id) self.assertIn(GATEWAY_ERROR, response.json['data']) self.assertIn( 'does not exist', response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) self.assertIsNotNone( response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_TRACE])
def test_anonymous_resource_registry_operations_through_gateway(self): """ This test ensures that requests make through the service gateway through messaging to the Resource Registry and back; including the support of unicode characters. @return: """ response = self.test_app.get('/ion-service/resource_registry/find_resources?name=' + convert_unicode(DATA_PRODUCT_NAME) + '&id_only=True&user_id=123abc456') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data),2 ) self.assertEqual(len(response_data[0]), 0 ) data_product_id = self.create_data_product_resource() data_product_read_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "read", "params": { "object_id": data_product_id } } } response = self.test_app.post('/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request) }) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) data_product_obj = convert_unicode(response.json['data'][GATEWAY_RESPONSE]) #Verify the the name and description fields containing unicode characters match all the way through couch and the messaging self.assertEqual(data_product_obj['name'], convert_unicode(DATA_PRODUCT_NAME)) self.assertEqual(data_product_obj['description'], convert_unicode(DATA_PRODUCT_DESCRIPTION)) updated_description_text = data_product_obj['description'] + '---Updated!!' #modify some fields in the data for testing update data_product_obj['description'] = updated_description_text data_product_update_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "update", "params": { "object": data_product_obj } } } response = self.test_app.post('/ion-service/resource_registry/update', {'payload': simplejson.dumps(data_product_update_request) }) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response = self.test_app.post('/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request) }) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) updated_data_product_obj = convert_unicode(response.json['data'][GATEWAY_RESPONSE]) self.assertEqual(updated_data_product_obj['description'], updated_description_text ) differ = DictDiffer(updated_data_product_obj, data_product_obj) self.assertEqual(len(differ.changed()), 2) # Only the _rev and ts_updated fields should be different after an update response = self.test_app.get('/ion-service/resource_registry/find_resources?name=' + convert_unicode(DATA_PRODUCT_NAME) + '&id_only=True') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data),2 ) self.assertEqual(len(response_data[0]), 1 ) response = self.delete_data_product_resource(data_product_id) self.assertIsNone(response.json['data'][GATEWAY_RESPONSE]) response = self.test_app.post('/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request) }) self.check_response_headers(response) self.assertIn(GATEWAY_ERROR, response.json['data']) self.assertIn('does not exist', response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) response = self.test_app.get('/ion-service/resource_registry/find_resources?name=' + convert_unicode(DATA_PRODUCT_NAME) + '&id_only=True') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data),2 ) self.assertEqual(len(response_data[0]), 0 ) response = self.delete_data_product_resource(data_product_id) self.assertIn(GATEWAY_ERROR, response.json['data']) self.assertIn('does not exist', response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) self.assertIsNotNone(response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_TRACE]) #Now testing the generic get_resource_extension with optional user_id parameter response = self.test_app.get('/ion-service/resource_registry/find_resources?name=ionsystem') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] actor_id = response_data[0][0]['_id'] response = self.test_app.get('/ion-service/resource_registry/get_resource_extension?resource_id=' + actor_id + '&resource_extension=TestExtendedInformationResource') self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(convert_unicode(response_data['user_id']), '') response = self.test_app.get('/ion-service/resource_registry/get_resource_extension?resource_id=' + actor_id + '&resource_extension=TestExtendedInformationResource&user_id=123abc456') self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(convert_unicode(response_data['user_id']), '123abc456')
def test_anonymous_resource_registry_operations_through_gateway(self): """ This test ensures that requests make through the service gateway through messaging to the Resource Registry and back; including the support of unicode characters. @return: """ response = self.test_app.get( '/ion-service/resource_registry/find_resources?name=' + convert_unicode(DATA_PRODUCT_NAME) + '&id_only=True&user_id=123abc456') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 0) data_product_id = self.create_data_product_resource() data_product_read_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "read", "params": { "object_id": data_product_id } } } response = self.test_app.post( '/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request)}) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) data_product_obj = convert_unicode( response.json['data'][GATEWAY_RESPONSE]) #Verify the the name and description fields containing unicode characters match all the way through couch and the messaging self.assertEqual(data_product_obj['name'], convert_unicode(DATA_PRODUCT_NAME)) self.assertEqual(data_product_obj['description'], convert_unicode(DATA_PRODUCT_DESCRIPTION)) updated_description_text = data_product_obj[ 'description'] + '---Updated!!' #modify some fields in the data for testing update data_product_obj['description'] = updated_description_text data_product_update_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "update", "params": { "object": data_product_obj } } } response = self.test_app.post( '/ion-service/resource_registry/update', {'payload': simplejson.dumps(data_product_update_request)}) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response = self.test_app.post( '/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request)}) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) updated_data_product_obj = convert_unicode( response.json['data'][GATEWAY_RESPONSE]) self.assertEqual(updated_data_product_obj['description'], updated_description_text) differ = DictDiffer(updated_data_product_obj, data_product_obj) self.assertEqual( len(differ.changed()), 2 ) # Only the _rev and ts_updated fields should be different after an update response = self.test_app.get( '/ion-service/resource_registry/find_resources?name=' + convert_unicode(DATA_PRODUCT_NAME) + '&id_only=True') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 1) response = self.delete_data_product_resource(data_product_id) self.assertIsNone(response.json['data'][GATEWAY_RESPONSE]) response = self.test_app.post( '/ion-service/resource_registry/read', {'payload': simplejson.dumps(data_product_read_request)}) self.check_response_headers(response) self.assertIn(GATEWAY_ERROR, response.json['data']) self.assertIn( 'does not exist', response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) response = self.test_app.get( '/ion-service/resource_registry/find_resources?name=' + convert_unicode(DATA_PRODUCT_NAME) + '&id_only=True') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 0) response = self.delete_data_product_resource(data_product_id) self.assertIn(GATEWAY_ERROR, response.json['data']) self.assertIn( 'does not exist', response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) self.assertIsNotNone( response.json['data'][GATEWAY_ERROR][GATEWAY_ERROR_TRACE]) #Now try creating a policy object which has an internal object of a different type policy_id = self.create_policy_resource() policy_read_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "read", "params": { "object_id": policy_id } } } response = self.test_app.post( '/ion-service/resource_registry/read', {'payload': simplejson.dumps(policy_read_request)}) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) policy_obj = convert_unicode(response.json['data'][GATEWAY_RESPONSE]) #Verify the the name and description fields containing unicode characters match all the way through couch and the messaging self.assertEqual(policy_obj['name'], convert_unicode(POLICY_NAME)) self.assertEqual(policy_obj['description'], convert_unicode(POLICY_DESCRIPTION)) self.assertEqual(policy_obj['policy_type']['policy_rule'], convert_unicode(POLICY_RULE)) updated_policy_rule = policy_obj['policy_type'][ 'policy_rule'] + '---Updated!!' #modify some fields in the data for testing update policy_obj['policy_type']['policy_rule'] = updated_policy_rule policy_update_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "update", "params": { "object": policy_obj } } } response = self.test_app.post( '/ion-service/resource_registry/update', {'payload': simplejson.dumps(policy_update_request)}) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response = self.test_app.post( '/ion-service/resource_registry/read', {'payload': simplejson.dumps(policy_read_request)}) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) updated_policy_obj = convert_unicode( response.json['data'][GATEWAY_RESPONSE]) self.assertEqual(updated_policy_obj['policy_type']['policy_rule'], updated_policy_rule) #Now testing the generic get_resource_extension with optional user_id parameter response = self.test_app.get( '/ion-service/resource_registry/find_resources?name=ionsystem') self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] actor_id = response_data[0][0]['_id'] response = self.test_app.get( '/ion-service/resource_registry/get_resource_extension?resource_id=' + actor_id + '&resource_extension=TestExtendedInformationResource') self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(convert_unicode(response_data['user_id']), '') response = self.test_app.get( '/ion-service/resource_registry/get_resource_extension?resource_id=' + actor_id + '&resource_extension=TestExtendedInformationResource&user_id=123abc456' ) self.assertIn(GATEWAY_RESPONSE, response.json['data']) response_data = response.json['data'][GATEWAY_RESPONSE] self.assertEqual(convert_unicode(response_data['user_id']), '123abc456')
def test_anonymous_resource_registry_operations_through_gateway(self): """ This test ensures that requests make through the service gateway through messaging to the Resource Registry and back; including the support of unicode characters. @return: """ response = self.test_app.get( "/ion-service/resource_registry/find_resources?name=" + convert_unicode(DATA_PRODUCT_NAME) + "&id_only=True" ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response_data = response.json["data"][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 0) data_product_id = self.create_data_product_resource() data_product_read_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "read", "params": {"object_id": data_product_id}, } } response = self.test_app.post( "/ion-service/resource_registry/read", {"payload": simplejson.dumps(data_product_read_request)} ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) data_product_obj = convert_unicode(response.json["data"][GATEWAY_RESPONSE]) # Verify the the name and description fields containing unicode characters match all the way through couch and the messaging self.assertEqual(data_product_obj["name"], convert_unicode(DATA_PRODUCT_NAME)) self.assertEqual(data_product_obj["description"], convert_unicode(DATA_PRODUCT_DESCRIPTION)) updated_description_text = data_product_obj["description"] + "---Updated!!" # modify some fields in the data for testing update data_product_obj["description"] = updated_description_text data_product_update_request = { "serviceRequest": { "serviceName": "resource_registry", "serviceOp": "update", "params": {"object": data_product_obj}, } } response = self.test_app.post( "/ion-service/resource_registry/update", {"payload": simplejson.dumps(data_product_update_request)} ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response = self.test_app.post( "/ion-service/resource_registry/read", {"payload": simplejson.dumps(data_product_read_request)} ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) updated_data_product_obj = convert_unicode(response.json["data"][GATEWAY_RESPONSE]) self.assertEqual(updated_data_product_obj["description"], updated_description_text) differ = DictDiffer(updated_data_product_obj, data_product_obj) self.assertEqual( len(differ.changed()), 2 ) # Only the _rev and ts_updated fields should be different after an update response = self.test_app.get( "/ion-service/resource_registry/find_resources?name=" + convert_unicode(DATA_PRODUCT_NAME) + "&id_only=True" ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response_data = response.json["data"][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 1) response = self.delete_data_product_resource(data_product_id) self.assertIsNone(response.json["data"][GATEWAY_RESPONSE]) response = self.test_app.post( "/ion-service/resource_registry/read", {"payload": simplejson.dumps(data_product_read_request)} ) self.check_response_headers(response) self.assertIn(GATEWAY_ERROR, response.json["data"]) self.assertIn("does not exist", response.json["data"][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) response = self.test_app.get( "/ion-service/resource_registry/find_resources?name=" + convert_unicode(DATA_PRODUCT_NAME) + "&id_only=True" ) self.check_response_headers(response) self.assertIn(GATEWAY_RESPONSE, response.json["data"]) response_data = response.json["data"][GATEWAY_RESPONSE] self.assertEqual(len(response_data), 2) self.assertEqual(len(response_data[0]), 0) response = self.delete_data_product_resource(data_product_id) self.assertIn(GATEWAY_ERROR, response.json["data"]) self.assertIn("does not exist", response.json["data"][GATEWAY_ERROR][GATEWAY_ERROR_MESSAGE]) self.assertIsNotNone(response.json["data"][GATEWAY_ERROR][GATEWAY_ERROR_TRACE])