diff --git a/modules/weko-schema-ui/tests/conftest.py b/modules/weko-schema-ui/tests/conftest.py index 1770466a77..827e4885a8 100644 --- a/modules/weko-schema-ui/tests/conftest.py +++ b/modules/weko-schema-ui/tests/conftest.py @@ -312,6 +312,109 @@ def base_app(instance_path): return app_ +@pytest.fixture() +def base_app2(instance_path): + app_ = Flask( + "testapp", + instance_path=instance_path, + static_folder=join(instance_path, "static"), + ) + app_.url_map.converters["pid"] = PIDConverter + WEKO_INDEX_TREE_REST_ENDPOINTS = copy.deepcopy(_WEKO_INDEX_TREE_REST_ENDPOINTS) + WEKO_INDEX_TREE_REST_ENDPOINTS["tid"]["index_route"] = "/tree/index/" + WEKO_DEPOSIT_REST_ENDPOINTS = copy.deepcopy(DEPOSIT_REST_ENDPOINTS) + WEKO_DEPOSIT_REST_ENDPOINTS["depid"]["rdc_route"] = "/deposits/redirect/<{0}:pid_value>".format(_PID) + WEKO_DEPOSIT_REST_ENDPOINTS["depid"]["pub_route"] = "/deposits/publish/<{0}:pid_value>".format(_PID) + app_.config.update( + SECRET_KEY="SECRET_KEY", + SERVER_NAME="test_server", + TESTING=True, + SQLALCHEMY_DATABASE_URI=os.getenv('SQLALCHEMY_DATABASE_URI', + 'postgresql+psycopg2://invenio:dbpass123@postgresql:5432/wekotest'), + CACHE_REDIS_URL=os.environ.get("CACHE_REDIS_URL", "redis://redis:6379/0"), + CACHE_TYPE="redis", + CACHE_REDIS_DB=0, + CACHE_REDIS_HOST="redis", + REDIS_PORT="6379", + WEKO_SCHEMA_CACHE_PREFIX="cache_{schema_name}", + RECORDS_UI_ENDPOINTS=RECORDS_UI_ENDPOINTS, + RECORDS_UI_EXPORT_FORMATS=RECORDS_UI_EXPORT_FORMATS, + WEKO_RECORDS_UI_CITES_REST_ENDPOINTS=WEKO_RECORDS_UI_CITES_REST_ENDPOINTS, + WEKO_PERMISSION_ROLE_USER=[ + "System Administrator", + "Repository Administrator", + "Contributor", + "General", + "Community Administrator", + ], + WEKO_PERMISSION_SUPER_ROLE_USER=[ + "System Administrator", + "Repository Administrator", + ], + THEME_SITEURL = 'https://localhost', + WEKO_SCHEMA_REST_XSD_LOCATION_FOLDER="{0}/data/xsd/", + BASE_EDIT_TEMPLATE="weko_theme/edit.html", + WEKO_SCHEMA_UI_ADMIN_LIST="weko_schema_ui/admin/list.html", + WEKO_SCHEMA_UI_ADMIN_UPLOAD="weko_schema_ui/admin/upload.html", + INDEXER_DEFAULT_INDEX="{}-weko-item-v1.0.0".format("test"), + SEARCH_UI_SEARCH_INDEX="{}-weko-item-v1.0.0".format("test"), + INDEXER_DEFAULT_DOCTYPE="item-v1.0.0", + INDEXER_DEFAULT_DOC_TYPE="item-v1.0.0", + INDEXER_FILE_DOC_TYPE="content", + SEARCH_ELASTIC_HOSTS="elasticsearch", + SEARCH_INDEX_PREFIX="test-", + WEKO_BUCKET_QUOTA_SIZE=50 * 1024 * 1024 * 1024, + WEKO_MAX_FILE_SIZE=50 * 1024 * 1024 * 1024, + INDEX_IMG="indextree/36466818-image.jpg", + WEKO_SEARCH_MAX_RESULT=WEKO_SEARCH_MAX_RESULT, + WEKO_DEPOSIT_REST_ENDPOINTS=WEKO_DEPOSIT_REST_ENDPOINTS, + WEKO_INDEX_TREE_UPATED=True, + WEKO_INDEX_TREE_REST_ENDPOINTS=WEKO_INDEX_TREE_REST_ENDPOINTS, + I18N_LANGUAGES=[("ja", "Japanese"), ("en", "English")], + WEKO_SCHEMA_JPCOAR_V1_SCHEMA_NAME=WEKO_SCHEMA_JPCOAR_V1_SCHEMA_NAME, + WEKO_SCHEMA_DDI_SCHEMA_NAME=WEKO_SCHEMA_DDI_SCHEMA_NAME, + OAISERVER_XSL_URL=None, + RESOURCE_TYPE_URI=RESOURCE_TYPE_URI, + WEKO_SCHEMA_JPCOAR_V1_NAMEIDSCHEME_REPLACE=None, + WEKO_SCHEMA_JPCOAR_V2_NAMEIDSCHEME_REPLACE=None, + ) + InvenioAccounts(app_) + InvenioAssets(app_) + InvenioAccess(app_) + InvenioAdmin(app_) + InvenioDB(app_) + InvenioCache(app_) + InvenioOAuth2Server(app_) + InvenioPIDStore(app_) + InvenioPIDRelations(app_) + InvenioSearch(app_) + InvenioOAIServer(app_) + InvenioSearchUI(app_) + InvenioDeposit(app_) + InvenioFilesREST(app_) + InvenioIndexer(app_) + InvenioRecords(app_) + InvenioRecordsUI(app_) + InvenioRecordsREST(app_) + Babel(app_) + Menu(app_) + WekoRecords(app_) + WekoItemsUI(app_) + WekoRecordsUI(app_) + WekoAdmin(app_) + WekoSearchUI(app_) + WekoIndexTree(app_) + WekoIndexTreeREST(app_) + WekoLoggingUserActivity(app_) + WekoSchemaUI(app_) + WekoDeposit(app_) + WekoDepositREST(app_) + app_.register_blueprint(weko_records_ui_blueprint) + app_.register_blueprint(invenio_files_rest_blueprint) + app_.register_blueprint(invenio_oaiserver_blueprint) + current_assets = LocalProxy(lambda: app_.extensions["invenio-assets"]) + current_assets.collect.collect() + return app_ @pytest.yield_fixture() def app(base_app): @@ -2283,3 +2386,295 @@ def make_record(db, indexer, i, filepath, filename, mimetype): "mimetype": mimetype, "obj": obj, } + +@pytest.fixture() +def record_jpcoar_v1(): + record = [ + { + "metadata": { + "item_type_id": 1, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789", "nameIdentifierScheme": "ORCID"}, + {"nameIdentifier": "123456", "nameIdentifierScheme": "e-Rad_Researcher"} + ] + } + ], + "jpcoar_v1_mapping": { + "creatornames": { + "@value": "creatornames.creatorname", + "@attributes": { + "xml:lang": "creatornames.lang" + } + } + } + } + } + }, + { + "metadata": { + "item_type_id": 2, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ] + } + ], + "jpcoar_v1_mapping": { + "creatornames": { + "@value": "creatornames.creatorname", + "@attributes": { + "xml:lang": "creatornames.lang" + } + } + } + } + } + }, + { + "metadata": { + "item_type_id": 3, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": {"nameIdentifier": "123456", "nameIdentifierScheme": "e-Rad_Researcher"} + } + ], + "jpcoar_v1_mapping": { + "creatornames": { + "@value": "creatornames.creatorname", + "@attributes": { + "xml:lang": "creatornames.lang" + } + } + } + } + } + }, + { + "metadata": { + "item_type_id": 4, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789"}, + {"nameIdentifier": "123456"} + ] + } + ], + "jpcoar_v1_mapping": { + "creatornames": { + "@value": "creatornames.creatorname", + "@attributes": { + "xml:lang": "creatornames.lang" + } + } + } + } + } + }, + { + "metadata": { + "item_type_id": 5, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789", "nameIdentifierScheme": "ORCID"}, + {"nameIdentifier": "123456", "nameIdentifierScheme": "e-Rad_Researcher"} + ] + } + ] + } + } + }, + { + "metadata": { + "item_type_id": 6, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789", "nameIdentifierScheme": "ORCID"} + ] + } + ], + "jpcoar_v1_mapping": { + "creatornames": { + "@value": "creatornames.creatorname", + "@attributes": { + "xml:lang": "creatornames.lang" + } + } + } + } + } + } + ] + return record + +@pytest.fixture() +def record_jpcoar_v2(): + record = [ + { + "metadata": { + "item_type_id": 1, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789", "nameIdentifierScheme": "ORCID"}, + {"nameIdentifier": "123456", "nameIdentifierScheme": "e-Rad"} + ] + } + ], + "jpcoar_mapping": { + "creatornames": { + "@value": "creatornames.creatorname", + "@attributes": { + "xml:lang": "creatornames.lang" + } + } + } + } + } + }, + { + "metadata": { + "item_type_id": 2, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ] + } + ], + "jpcoar_mapping": { + "creatornames": { + "@value": "creatornames.creatorname", + "@attributes": { + "xml:lang": "creatornames.lang" + } + } + } + } + } + }, + { + "metadata": { + "item_type_id": 3, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": {"nameIdentifier": "123456", "nameIdentifierScheme": "e-Rad_Researcher"} + } + ], + "jpcoar_mapping": { + "creatornames": { + "@value": "creatornames.creatorname", + "@attributes": { + "xml:lang": "creatornames.lang" + } + } + } + } + } + }, + { + "metadata": { + "item_type_id": 4, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789"}, + {"nameIdentifier": "123456"} + ] + } + ], + "jpcoar_mapping": { + "creatornames": { + "@value": "creatornames.creatorname", + "@attributes": { + "xml:lang": "creatornames.lang" + } + } + } + } + } + }, + { + "metadata": { + "item_type_id": 5, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789", "nameIdentifierScheme": "ORCID"}, + {"nameIdentifier": "123456", "nameIdentifierScheme": "e-Rad_Researcher"} + ] + } + ] + } + } + }, + { + "metadata": { + "item_type_id": 6, + "creator": { + "attribute_value_mlt": [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789", "nameIdentifierScheme": "ORCID"} + ] + } + ], + "jpcoar_mapping": { + "creatornames": { + "@value": "creatornames.creatorname", + "@attributes": { + "xml:lang": "creatornames.lang" + } + } + } + } + } + } + ] + return record \ No newline at end of file diff --git a/modules/weko-schema-ui/tests/test_schema.py b/modules/weko-schema-ui/tests/test_schema.py index 2707f7e2b3..91051f289b 100644 --- a/modules/weko-schema-ui/tests/test_schema.py +++ b/modules/weko-schema-ui/tests/test_schema.py @@ -353,6 +353,204 @@ def test_get_mapping_data_ddi(self,db_oaischema): obj = json.load(f,object_pairs_hook=OrderedDict) assert _schema_obj == obj assert _item_type_id == None + + # .tox/c1/bin/pytest -s --cov=weko_schema_ui tests/test_schema.py::TestSchemaTree::test_replace_nameIdentifierScheme_for_jpcoar_v1 -vv --cov-branch --cov-report=term --basetemp=/code/modules/weko-schema-ui/.tox/c1/tmp + def test_replace_nameIdentifierScheme_for_jpcoar_v1(self, db_oaischema, record_jpcoar_v1): + record = record_jpcoar_v1[0] + instance = SchemaTree(record=record, schema_name="jpcoar_v1_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [{ + "creatornames": [ + { + "creatorname": "Taro Yamada" + } + ], + "nameIdentifiers": [ + { + "nameIdentifier": "0000-0001-2345-6789", + "nameIdentifierScheme": "ORCID" + }, + { + "nameIdentifier": "123456", + "nameIdentifierScheme": "e-Rad" + } + ] + }] + + record = record_jpcoar_v1[1] + instance = SchemaTree(record=record, schema_name="jpcoar_v1_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [{ + "creatornames": [ + { + "creatorname": "Taro Yamada" + } + ] + }] + + record = record_jpcoar_v1[2] + instance = SchemaTree(record=record, schema_name="jpcoar_v1_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": {"nameIdentifier": "123456", "nameIdentifierScheme": "e-Rad_Researcher"} + } + ] + + record = record_jpcoar_v1[3] + instance = SchemaTree(record=record, schema_name="jpcoar_v1_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789"}, + {"nameIdentifier": "123456"} + ] + } + ] + + record = record_jpcoar_v1[5] + instance = SchemaTree(record=record, schema_name="jpcoar_v1_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789", "nameIdentifierScheme": "ORCID"} + ] + } + ] + + # .tox/c1/bin/pytest -s --cov=weko_schema_ui tests/test_schema.py::TestSchemaTree::test_replace_nameIdentifierScheme_for_jpcoar_v2 -vv --cov-branch --cov-report=term --basetemp=/code/modules/weko-schema-ui/.tox/c1/tmp + def test_replace_nameIdentifierScheme_for_jpcoar_v2(self, db_oaischema, record_jpcoar_v2): + record = record_jpcoar_v2[0] + instance = SchemaTree(record=record, schema_name="jpcoar_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [{ + "creatornames": [ + { + "creatorname": "Taro Yamada" + } + ], + "nameIdentifiers": [ + { + "nameIdentifier": "0000-0001-2345-6789", + "nameIdentifierScheme": "ORCID" + }, + { + "nameIdentifier": "123456", + "nameIdentifierScheme": "e-Rad_Researcher" + } + ] + }] + + record = record_jpcoar_v2[1] + instance = SchemaTree(record=record, schema_name="jpcoar_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [{ + "creatornames": [ + { + "creatorname": "Taro Yamada" + } + ] + }] + + record = record_jpcoar_v2[2] + instance = SchemaTree(record=record, schema_name="jpcoar_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": {"nameIdentifier": "123456", "nameIdentifierScheme": "e-Rad_Researcher"} + } + ] + + record = record_jpcoar_v2[3] + instance = SchemaTree(record=record, schema_name="jpcoar_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789"}, + {"nameIdentifier": "123456"} + ] + } + ] + + record = record_jpcoar_v2[5] + instance = SchemaTree(record=record, schema_name="jpcoar_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [ + { + "creatornames": [ + {"creatorname": "Taro Yamada"} + ], + "nameIdentifiers": [ + {"nameIdentifier": "0000-0001-2345-6789", "nameIdentifierScheme": "ORCID"} + ] + } + ] + + # .tox/c1/bin/pytest -s --cov=weko_schema_ui tests/test_schema.py::TestSchemaTree::test__get_value_list_not_exists_config -vv --cov-branch --cov-report=term --basetemp=/code/modules/weko-schema-ui/.tox/c1/tmp + def test__get_value_list_not_exists_config(db_oaischema, db_itemtype, record_jpcoar_v1, record_jpcoar_v2, base_app2): + with base_app2.app_context(): + base_app2.config.pop("WEKO_SCHEMA_JPCOAR_V1_NAMEIDSCHEME_REPLACE", None) + base_app2.config.pop("WEKO_SCHEMA_JPCOAR_V2_NAMEIDSCHEME_REPLACE", None) + with pytest.raises(KeyError): + record = record_jpcoar_v1[0] + instance = SchemaTree(record=record, schema_name="jpcoar_v1_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [{ + "creatornames": [ + { + "creatorname": "Taro Yamada" + } + ], + "nameIdentifiers": [ + { + "nameIdentifier": "0000-0001-2345-6789", + "nameIdentifierScheme": "ORCID" + }, + { + "nameIdentifier": "123456", + "nameIdentifierScheme": "e-Rad_Researcher" + } + ] + }] + + record = record_jpcoar_v2[0] + instance = SchemaTree(record=record, schema_name="jpcoar_mapping") + instance._SchemaTree__get_value_list() + assert record['metadata']['creator']['attribute_value_mlt'] == [{ + "creatornames": [ + { + "creatorname": "Taro Yamada" + } + ], + "nameIdentifiers": [ + { + "nameIdentifier": "0000-0001-2345-6789", + "nameIdentifierScheme": "ORCID" + }, + { + "nameIdentifier": "123456", + "nameIdentifierScheme": "e-Rad" + } + ] + }] # .tox/c1/bin/pytest --cov=weko_schema_ui tests/test_schema.py::TestSchemaTree::test_function_issue36502 -vv --cov-branch --cov-report=term --basetemp=/code/modules/weko-schema-ui/.tox/c1/tmp def test_function_issue36502(self, db_oaischema, db_itemtype): diff --git a/modules/weko-schema-ui/weko_schema_ui/schema.py b/modules/weko-schema-ui/weko_schema_ui/schema.py index 3b94afbf3d..c4c3f00326 100644 --- a/modules/weko-schema-ui/weko_schema_ui/schema.py +++ b/modules/weko-schema-ui/weko_schema_ui/schema.py @@ -980,7 +980,7 @@ def replace_resource_type_for_jpcoar_v2(atr_vm_item): 'RESOURCE_TYPE_URI'][new_type] def replace_nameIdentifierScheme_for_jpcoar_v1(atr_vm_item): - if 'nameIdentifiers' in atr_vm_item and isinstance(atr_vm_item['nameIdentifiers'], dict): + if 'nameIdentifiers' in atr_vm_item and isinstance(atr_vm_item['nameIdentifiers'], list): for idx,val in enumerate(atr_vm_item['nameIdentifiers']): if 'nameIdentifierScheme' in val and val['nameIdentifierScheme'] in current_app.config['WEKO_SCHEMA_JPCOAR_V1_NAMEIDSCHEME_REPLACE']: new_type = current_app.config[ @@ -988,12 +988,12 @@ def replace_nameIdentifierScheme_for_jpcoar_v1(atr_vm_item): val['nameIdentifierScheme'] = new_type def replace_nameIdentifierScheme_for_jpcoar_v2(atr_vm_item): - if 'nameIdentifiers' in atr_vm_item and isinstance(atr_vm_item['nameIdentifiers'], dict): + if 'nameIdentifiers' in atr_vm_item and isinstance(atr_vm_item['nameIdentifiers'], list): for idx,val in enumerate(atr_vm_item['nameIdentifiers']): - if 'nameIdentifier' in val and val['nameIdentifier'] in current_app.config['WEKO_SCHEMA_JPCOAR_V2_NAMEIDSCHEME_REPLACE']: + if 'nameIdentifierScheme' in val and val['nameIdentifierScheme'] in current_app.config['WEKO_SCHEMA_JPCOAR_V2_NAMEIDSCHEME_REPLACE']: new_type = current_app.config[ - 'WEKO_SCHEMA_JPCOAR_V2_NAMEIDSCHEME_REPLACE'][val['nameIdentifier']] - val['nameIdentifier'] = new_type + 'WEKO_SCHEMA_JPCOAR_V2_NAMEIDSCHEME_REPLACE'][val['nameIdentifierScheme']] + val['nameIdentifierScheme'] = new_type