def test_manager_add_no_name(tests_manager, schemaspace_location): metadata_name = "valid_metadata_instance" metadata = Metadata.from_dict(METADATA_TEST_SCHEMASPACE_ID, {**valid_metadata_json}) instance = tests_manager.create(None, metadata) assert instance is not None assert instance.name == metadata_name assert instance.pre_property == instance.metadata.get("required_test") assert instance.post_property == instance.display_name # Ensure file was created using store_manager instance_list = tests_manager.metadata_store.fetch_instances(metadata_name) assert len(instance_list) == 1 instance = Metadata.from_dict(METADATA_TEST_SCHEMASPACE, instance_list[0]) metadata_location = _compose_instance_location(tests_manager.metadata_store, schemaspace_location, metadata_name) assert instance.resource == metadata_location assert instance.pre_property == instance.metadata.get("required_test") # This will be None because the hooks don't get called when fetched directly from the store assert instance.post_property is None # And finally, remove it. tests_manager.remove(metadata_name) # Verify removal using metadata_store with pytest.raises(MetadataNotFoundError): tests_manager.metadata_store.fetch_instances(metadata_name)
async def put(self, schemaspace, resource): schemaspace = url_unescape(schemaspace) resource = url_unescape(resource) parent = self.settings.get("elyra") try: payload = self.get_json_body() # Get the current resource to ensure its pre-existence metadata_manager = MetadataManager(schemaspace=schemaspace, parent=parent) metadata_manager.get(resource) # Check if name is in the payload and varies from resource, if so, raise 400 if "name" in payload and payload["name"] != resource: raise NotImplementedError( f"The attempt to rename instance '{resource}' to '{payload['name']}' is not supported." ) instance = Metadata.from_dict(schemaspace, {**payload}) self.log.debug( f"MetadataHandler: Updating metadata instance '{resource}' in schemaspace '{schemaspace}'..." ) metadata = metadata_manager.update(resource, instance) except (ValidationError, ValueError, NotImplementedError) as err: raise web.HTTPError(400, str(err)) from err except MetadataNotFoundError as err: raise web.HTTPError(404, str(err)) from err except Exception as err: raise web.HTTPError(500, repr(err)) from err self.set_status(200) self.set_header("Content-Type", "application/json") self.finish(metadata.to_dict(trim=True))
def test_manager_default_value(tests_hierarchy_manager, schemaspace_location): # Create some metadata, then attempt to update it with a known schema violation # and ensure the previous copy still exists... # Create a user instance... metadata = Metadata.from_dict(METADATA_TEST_SCHEMASPACE, {**byo_metadata_json}) metadata.display_name = "user1" instance = tests_hierarchy_manager.create("default_value", metadata) assert instance.metadata["number_default_test"] == 42 # Ensure default value was applied when not present instance2 = tests_hierarchy_manager.get("default_value") instance2.metadata["number_default_test"] = 37 tests_hierarchy_manager.update("default_value", instance2) instance3 = tests_hierarchy_manager.get("default_value") assert instance3.metadata["number_default_test"] == 37 # Now remove the updated value and ensure it comes back with the default instance3.metadata.pop("number_default_test") assert "number_default_test" not in instance3.metadata tests_hierarchy_manager.update("default_value", instance3) instance4 = tests_hierarchy_manager.get("default_value") assert instance4.metadata["number_default_test"] == 42
def test_manager_update(tests_hierarchy_manager, schemaspace_location): # Create some metadata, then attempt to update it with a known schema violation # and ensure the previous copy still exists... # Create a user instance... metadata = Metadata.from_dict(METADATA_TEST_SCHEMASPACE_ID, {**byo_metadata_json}) metadata.display_name = "user1" instance = tests_hierarchy_manager.create("update", metadata) assert instance is not None assert instance.resource.startswith(str(schemaspace_location)) assert instance.pre_property == instance.metadata["required_test"] assert instance.post_property == instance.display_name # Now update the user instance - add a field - and ensure that the original renamed file is not present. instance2 = tests_hierarchy_manager.get("update") instance2.display_name = "user2" instance2.metadata["number_range_test"] = 7 instance = tests_hierarchy_manager.update("update", instance2) assert instance.pre_property == instance.metadata["required_test"] assert instance.post_property == instance2.display_name _ensure_single_instance(tests_hierarchy_manager, schemaspace_location, "update.json") instance2 = tests_hierarchy_manager.get("update") assert instance2.display_name == "user2" assert instance2.metadata["number_range_test"] == 7
def test_manager_add_display_name(tests_manager, schemaspace_location): metadata_display_name = '1 teste "rápido"' metadata_name = "a_1_teste_rpido" metadata = Metadata(**valid_display_name_json) instance = tests_manager.create(None, metadata) assert instance is not None assert instance.name == metadata_name assert instance.display_name == metadata_display_name # Ensure file was created using store_manager instance_list = tests_manager.metadata_store.fetch_instances(metadata_name) assert len(instance_list) == 1 instance = Metadata.from_dict(METADATA_TEST_SCHEMASPACE, instance_list[0]) metadata_location = _compose_instance_location(tests_manager.metadata_store, schemaspace_location, metadata_name) assert instance.resource == metadata_location assert instance.display_name == metadata_display_name # And finally, remove it. tests_manager.remove(metadata_name) # Verify removal using metadata_store with pytest.raises(MetadataNotFoundError): tests_manager.metadata_store.fetch_instances(metadata_name)
def _validate_body(self, schemaspace: str): """Validates the body issued for creates.""" body = self.get_json_body() # Ensure schema_name and metadata fields exist. required_fields = ["schema_name", "metadata"] for field in required_fields: if field not in body: raise SyntaxError(f"Insufficient information - '{field}' is missing from request body.") # Ensure there is at least one of name or a display_name one_of_fields = ["name", "display_name"] if set(body).isdisjoint(one_of_fields): raise SyntaxError( f"Insufficient information - request body requires one of the following: {one_of_fields}." ) instance = Metadata.from_dict(schemaspace, {**body}) return instance
def test_manager_complex_string_schema(tests_manager, schemaspace_location, complex_string, valid): metadata_name = "valid_metadata_instance" metadata_dict = {**valid_metadata_json} metadata_dict["metadata"]["string_complex_test"] = complex_string metadata = Metadata.from_dict(METADATA_TEST_SCHEMASPACE_ID, metadata_dict) if not valid: with pytest.raises(ValidationError): tests_manager.create(metadata_name, metadata) else: instance = tests_manager.create(metadata_name, metadata) assert instance.metadata.get("string_complex_test") == complex_string # And finally, remove it. tests_manager.remove(metadata_name) # Verify removal using metadata_store with pytest.raises(MetadataNotFoundError): tests_manager.metadata_store.fetch_instances(metadata_name)
def test_manager_add_short_name(tests_manager, schemaspace_location): # Found that single character names were failing validation metadata_name = "a" metadata = Metadata(**valid_metadata_json) instance = tests_manager.create(metadata_name, metadata) assert instance is not None assert instance.name == metadata_name # Ensure file was created using store_manager instance_list = tests_manager.metadata_store.fetch_instances(metadata_name) assert len(instance_list) == 1 instance = Metadata.from_dict(METADATA_TEST_SCHEMASPACE_ID, instance_list[0]) metadata_location = _compose_instance_location(tests_manager.metadata_store, schemaspace_location, metadata_name) assert instance.resource == metadata_location # And finally, remove it. tests_manager.remove(metadata_name) # Verify removal using metadata_store with pytest.raises(MetadataNotFoundError): tests_manager.metadata_store.fetch_instances(metadata_name)