예제 #1
0
def test_returns_empty_if_no_reference_or_record_field(get_records_mock):
    schema = ReferenceItemSchemaV1()
    dump = {}
    expected = {}

    record = LiteratureRecord(dump)
    result = schema.dumps(record).data

    assert expected == orjson.loads(result)
예제 #2
0
def test_revert_to_revision(inspire_app, clean_celery_session,
                            record_with_two_revisions):
    user = create_user(role=Roles.cataloger.value)
    record = LiteratureRecord.get_record_by_pid_value(111)

    assert record["titles"][0]["title"] == "record rev1"
    with inspire_app.test_client() as client:
        login_user_via_session(client, email=user.email)
        response = client.put(
            "/api/editor/literature/111/revisions/revert",
            content_type="application/json",
            data=orjson.dumps({"revision_id": 0}),
        )
    assert response.status_code == 200

    record = LiteratureRecord.get_record_by_pid_value(111)

    assert record["titles"][0]["title"] == "record rev0"
예제 #3
0
def test_forces_collaborations_to_be_object_if_reference_not_linked(
        get_records_mock):
    schema = ReferenceItemSchemaV1()
    dump = {"reference": {"collaborations": ["CMS", "LHCb"]}}
    expected = {"collaborations": [{"value": "CMS"}, {"value": "LHCb"}]}

    record = LiteratureRecord(dump)
    result = schema.dumps(record).data
    assert expected == json.loads(result)
예제 #4
0
def test_returns_non_empty_fields_if_some_fields_missing(get_records_mock):
    schema = ReferenceItemSchemaV1()
    dump = {"reference": {"label": "123", "control_number": 123}}
    expected = {"label": "123", "control_number": 123}

    record = LiteratureRecord(dump)
    result = schema.dumps(record).data

    assert expected == orjson.loads(result)
예제 #5
0
def test_update_record_update_citation_table(base_app, db, es):
    data = faker.record("lit")
    record = LiteratureRecord.create(data)

    data2 = faker.record("lit")
    record2 = LiteratureRecord.create(data2)

    # Cannot use model.citations and model.references
    # when updating record which is not commited,
    # as they will return data from before the update
    assert len(RecordCitations.query.all()) == 0

    data = faker.record(
        "lit", data=record, literature_citations=[record2["control_number"]]
    )
    record.update(data)

    assert len(RecordCitations.query.all()) == 1
예제 #6
0
def test_literature_citation_count_property(base_app, db, es):
    data = faker.record("lit")
    record = InspireRecord.create(data)

    data2 = faker.record("lit", literature_citations=[record["control_number"]])
    record2 = LiteratureRecord.create(data2)

    assert record.citation_count == 1
    assert record2.citation_count == 0
def test_returns_none_as_name_if_empty_present(get_records_mock):
    schema = AcceleratorExperimentSchemaV1()
    dump = {}
    expected = {"name": None}

    record = LiteratureRecord(dump)
    result = schema.dumps(record).data

    assert expected == json.loads(result)
예제 #8
0
def test_create_record_from_db_depending_on_its_pid_type(base_app, db, es):
    data = faker.record("lit")
    record = InspireRecord.create(data)
    assert type(record) == LiteratureRecord
    assert record.pid_type == "lit"

    record = LiteratureRecord.create(data)
    assert type(record) == LiteratureRecord
    assert record.pid_type == "lit"
예제 #9
0
def test_get_enhanced_es_data_do_not_change_original_record(inspire_app, datadir):
    data = orjson.loads((datadir / "788797.json").read_text())

    original_data = deepcopy(data)

    record = LiteratureRecord.create(data=data)
    record.get_enhanced_es_data()

    assert sorted(record) == sorted(original_data)
예제 #10
0
def test_migrate_and_insert_record_blacklisted_pid(inspire_app,
                                                   override_config):
    raw_record = (b"<record>"
                  b'  <controlfield tag="001">12345</controlfield>'
                  b'  <datafield tag="980" ind1=" " ind2=" ">'
                  b'    <subfield code="a">HEP</subfield>'
                  b"  </datafield>"
                  b"</record>")

    with override_config(MIGRATION_PID_TYPE_BLACKLIST=["lit"]):
        migrate_and_insert_record(raw_record)

        with pytest.raises(PIDDoesNotExistError):
            LiteratureRecord.get_record_by_pid_value("12345")

        prod_record = LegacyRecordsMirror.query.filter(
            LegacyRecordsMirror.recid == 12345).one()
        assert prod_record.valid is False
예제 #11
0
def test_get_modified_references_returns_all_references_when_earliest_date_changed(
        inspire_app, celery_app_with_context, celery_session_worker):
    cited_data = {
        "$schema": "http://localhost:5000/schemas/records/hep.json",
        "titles": [{
            "title": "Test a valid record"
        }],
        "document_type": ["article"],
        "_collections": ["Literature"],
    }
    cited_record = LiteratureRecord.create(cited_data)

    citing_data = {
        "$schema":
        "http://localhost:5000/schemas/records/hep.json",
        "titles": [{
            "title": "My Title"
        }],
        "document_type": ["article"],
        "_collections": ["Literature"],
        "preprint_date":
        "2019-06-28",
        "references": [{
            "record": {
                "$ref":
                f"http://localhost:5000/api/literature/{cited_record['control_number']}"
            }
        }],
    }

    citing_record = LiteratureRecord.create(citing_data)
    db.session.commit()

    assert citing_record.get_modified_references() == [cited_record.id]

    data_update = {
        "preprint_date": "2018-06-28",
        "control_number": citing_record["control_number"],
    }
    citing_data.update(data_update)
    citing_record.update(citing_data)
    db.session.commit()

    assert citing_record.get_modified_references() == [cited_record.id]
예제 #12
0
def test_cds_sync_continues_when_some_records_fails(inspire_app_for_cds_sync):
    expected_1203988_external_system_identifiers = [{
        "value": "1273173",
        "schema": "CDS"
    }]
    expected_1314109_external_system_identifiers = [{
        "value": "1742265",
        "schema": "CDS"
    }]
    expected_1314110_external_system_identifiers = [{
        "value": "2003162",
        "schema": "CDS"
    }]
    LiteratureRecord.create(
        faker.record("lit", data={"control_number": 1203988}))
    LiteratureRecord.create(
        faker.record(
            "lit",
            data={
                "control_number":
                1314109,
                "external_system_identifiers": [{
                    "schema": "CDS",
                    "value": "1742265"
                }],
            },
        ))
    LiteratureRecord.create(
        faker.record("lit", data={"control_number": 1314110}))

    db.session.commit()

    sync_identifiers("2020-07-01")

    runs = CDSRun.query.all()
    assert len(runs) == 1
    assert runs[0].status == CDSRunStatus.FINISHED
    assert runs[0].message == ""

    assert (LiteratureRecord.get_record_by_pid_value(
        "1203988")["external_system_identifiers"] ==
            expected_1203988_external_system_identifiers)

    assert (LiteratureRecord.get_record_by_pid_value(
        "1314109")["external_system_identifiers"] ==
            expected_1314109_external_system_identifiers)
    assert (LiteratureRecord.get_record_by_pid_value(
        "1314110")["external_system_identifiers"] ==
            expected_1314110_external_system_identifiers)
예제 #13
0
def test_migrate_record_from_specified_date_only(inspire_app):
    raw_record_1 = (
        b"<record>"
        b'  <controlfield tag="001">666</controlfield>'
        b'  <datafield tag="245" ind1=" " ind2=" ">'
        b'    <subfield code="a">On the validity of INSPIRE records</subfield>'
        b"  </datafield>"
        b'  <datafield tag="980" ind1=" " ind2=" ">'
        b'    <subfield code="a">HEP</subfield>'
        b"  </datafield>"
        b"</record>"
    )

    raw_record_2 = (
        b"<record>"
        b'  <controlfield tag="001">667</controlfield>'
        b'  <datafield tag="245" ind1=" " ind2=" ">'
        b'    <subfield code="a">On the validity of INSPIRE records</subfield>'
        b"  </datafield>"
        b'  <datafield tag="980" ind1=" " ind2=" ">'
        b'    <subfield code="a">HEP</subfield>'
        b"  </datafield>"
        b"</record>"
    )

    prod_record_1 = LegacyRecordsMirror.from_marcxml(raw_record_1)
    prod_record_1.last_updated = datetime.datetime(2010, 1, 1)
    db.session.merge(prod_record_1)

    prod_record_2 = LegacyRecordsMirror.from_marcxml(raw_record_2)
    prod_record_1.last_updated = datetime.datetime(2020, 1, 1)
    db.session.merge(prod_record_2)

    migrate_from_mirror(date_from="2015-01-01")

    rec_1 = LegacyRecordsMirror.query.filter_by(recid=666).one()
    rec_2 = LegacyRecordsMirror.query.filter_by(recid=667).one()
    # Only record 2 should be valid as rec_1 migration should not run.
    assert rec_1.valid is None
    assert rec_2.valid is True

    with pytest.raises(PIDDoesNotExistError):
        LiteratureRecord.get_record_by_pid_value("666")
    assert LiteratureRecord.get_record_by_pid_value("667")
예제 #14
0
def test_migrate_record_from_miror_steals_pids_from_deleted_records(inspire_app):
    raw_record = (
        b"<record>"
        b'  <controlfield tag="001">98765</controlfield>'
        b'  <datafield tag="024" ind1="7" ind2=" ">'
        b'    <subfield code="9">DOI</subfield>'
        b'    <subfield code="a">10.1000/a_doi</subfield>'
        b"  </datafield>"
        b'  <datafield tag="245" ind1=" " ind2=" ">'
        b'    <subfield code="a">A record to be merged</subfield>'
        b"  </datafield>"
        b'  <datafield tag="980" ind1=" " ind2=" ">'
        b'    <subfield code="a">HEP</subfield>'
        b"  </datafield>"
        b"</record>"
    )
    migrate_and_insert_record(raw_record)
    record = LiteratureRecord.get_record_by_pid_value("98765")
    assert PersistentIdentifier.get("doi", "10.1000/a_doi").object_uuid == record.id

    raw_record = (
        b"<record>"
        b'  <controlfield tag="001">31415</controlfield>'
        b'  <datafield tag="024" ind1="7" ind2=" ">'
        b'    <subfield code="9">DOI</subfield>'
        b'    <subfield code="a">10.1000/a_doi</subfield>'
        b"  </datafield>"
        b'  <datafield tag="245" ind1=" " ind2=" ">'
        b'    <subfield code="a">A record that was merged</subfield>'
        b"  </datafield>"
        b'  <datafield tag="980" ind1=" " ind2=" ">'
        b'    <subfield code="a">HEP</subfield>'
        b"  </datafield>"
        b'  <datafield tag="981" ind1=" " ind2=" ">'
        b'    <subfield code="a">98765</subfield>'
        b"  </datafield>"
        b"</record>"
    )
    migrate_and_insert_record(raw_record)
    assert LiteratureRecord.get_record_by_pid_value("98765")
    merged_record = LiteratureRecord.get_record_by_pid_value("31415")
    assert (
        PersistentIdentifier.get("doi", "10.1000/a_doi").object_uuid == merged_record.id
    )
예제 #15
0
def test_conference_paper_get_updated_reference_conference_when_document_type_changes_to_other_conf_related(
        inspire_app, clean_celery_session):
    conference_1 = ConferencesRecord.create(faker.record("con"))
    conference_1_control_number = conference_1["control_number"]
    ref_1 = f"http://localhost:8000/api/conferences/{conference_1_control_number}"

    expected_result = [conference_1.id]

    data = {
        "publication_info": [{
            "conference_record": {
                "$ref": ref_1
            }
        }],
        "document_type": ["conference paper"],
    }

    record = LiteratureRecord.create(faker.record("lit", data))
    record_control_number = record["control_number"]
    db.session.commit()

    expected_versions_len = 1
    results = record.model.versions.all()
    result_latest_version = results[-1].json

    assert expected_versions_len == len(results)
    assert result_latest_version == record

    data = copy.deepcopy(dict(record))
    data["document_type"] = ["proceedings"]
    record.update(data)
    db.session.commit()

    record = LiteratureRecord.get_record_by_pid_value(record_control_number)

    assert expected_result == sorted(
        record.get_newest_linked_conferences_uuid())

    expected_versions_len = 2
    results = record.model.versions.all()
    result_latest_version = results[-1].json

    assert expected_versions_len == len(results)
    assert result_latest_version == record
예제 #16
0
def test_lit_records_with_citations_updates(app, celery_app_with_context,
                                            celery_session_worker,
                                            retry_until_matched):
    data = faker.record("lit")
    rec = LiteratureRecord.create(data)
    db.session.commit()

    steps = [
        {
            "step": es.indices.refresh,
            "args": ["records-hep"]
        },
        {
            "step": LiteratureSearch.get_record_data_from_es,
            "args": [rec],
            "expected_result": {
                "expected_key": "citation_count",
                "expected_result": 0
            },
        },
    ]
    retry_until_matched(steps)

    citations = [rec["control_number"]]
    data_2 = faker.record("lit", literature_citations=citations)
    LiteratureRecord.create(data_2)
    db.session.commit()

    steps = [
        {
            "step": es.indices.refresh,
            "args": ["records-hep"]
        },
        {
            "step": LiteratureSearch.get_record_data_from_es,
            "args": [rec],
            "expected_result": {
                "expected_key": "citation_count",
                "expected_result": 1
            },
        },
    ]
    retry_until_matched(steps)
예제 #17
0
def test_feature_flag_for_redirection_disables_redirection_when_turned_off(
        inspire_app, override_config):
    with override_config(FEATURE_FLAG_ENABLE_REDIRECTION_OF_PIDS=False):
        record_1 = create_record("lit")

        create_record("lit", data={"deleted_records": [record_1["self"]]})
        record_1_from_db = LiteratureRecord.get_record_by_pid_value(
            record_1["control_number"])

    assert record_1_from_db.id == record_1.id
def test_returns_legacy_name_as_name(get_records_mock):
    schema = AcceleratorExperimentSchemaV1()
    dump = {"legacy_name": "Test"}

    record = LiteratureRecord(dump)

    expected = {"name": "Test"}
    result = schema.dumps(record).data

    assert expected == orjson.loads(result)
예제 #19
0
def test_migrate_from_mirror_doesnt_index_deleted_records(inspire_app):
    record_fixture_path = pkg_resources.resource_filename(
        __name__, os.path.join("fixtures", "dummy.xml"))
    record_fixture_path_deleted = pkg_resources.resource_filename(
        __name__, os.path.join("fixtures", "deleted_record.xml"))
    migrate_from_file(record_fixture_path)
    migrate_from_file(record_fixture_path_deleted)
    current_search.flush_and_refresh("records-hep")

    expected_record_lit_es_len = 1

    record_lit_uuid = LiteratureRecord.get_uuid_from_pid_value(12345)
    with pytest.raises(PIDDoesNotExistError):
        LiteratureRecord.get_uuid_from_pid_value(1234)
    record_lit_es = LiteratureSearch().get_record(
        str(record_lit_uuid)).execute().hits
    record_lit_es_len = len(record_lit_es)

    assert expected_record_lit_es_len == record_lit_es_len
예제 #20
0
def test_hal_push_retry_on_stale_data_error(inspire_app):
    data = faker.record("lit", with_control_number=True)
    record = LiteratureRecord.create(data)
    db.session.commit()

    record["authors"] = [{"full_name": "Test Author"}]
    record.update(dict(record))
    db.session.commit()

    with pytest.raises(StaleDataError):
        hal_push(record["control_number"], 3)
예제 #21
0
def test_assign_from_an_author_to_another_that_is_not_stub(inspire_app):
    cataloger = create_user(role="cataloger")
    from_author = create_record("aut")
    to_author = create_record("aut", data={"stub": False})
    literature = create_record(
        "lit",
        data={
            "authors": [
                {
                    "full_name": "Urhan, Ahmet",
                    "record": {
                        "$ref": "http://localhost:5000/api/authors/17200"
                    },
                },
                {
                    "full_name": "Urhan, Harun",
                    "record": {
                        "$ref":
                        f"http://localhost:5000/api/authors/{from_author['control_number']}"
                    },
                },
            ]
        },
    )

    with inspire_app.test_client() as client:
        login_user_via_session(client, email=cataloger.email)
        response = client.post(
            "/assign/author",
            data=orjson.dumps({
                "literature_recids": [literature["control_number"]],
                "from_author_recid":
                from_author["control_number"],
                "to_author_recid":
                to_author["control_number"],
            }),
            content_type="application/json",
        )
    response_status_code = response.status_code

    assert response_status_code == 200

    literature_after = LiteratureRecord.get_record_by_pid_value(
        literature["control_number"])
    literature_author = literature_after["authors"][1]
    assert literature_author["record"] == {
        "$ref":
        f"http://localhost:5000/api/authors/{to_author['control_number']}"
    }
    assert literature_author["curated_relation"]

    to_author_after = AuthorsRecord.get_record_by_pid_value(
        to_author["control_number"])
    assert not to_author_after["stub"]
예제 #22
0
def test_get_all_ids_by_update_date(inspire_app):
    record = create_record("lit")
    record2 = create_record("lit")
    uuids = list(LiteratureRecord.get_recids_by_updated_datetime())

    assert len(uuids) == 2
    assert str(record.id) in uuids
    assert str(record2.id) in uuids

    uuids = list(InspireRecord.get_recids_by_updated_datetime())
    assert len(uuids) == 0

    new_date = datetime.strptime("2021-07-01", "%Y-%m-%d")
    uuids = list(
        LiteratureRecord.get_recids_by_updated_datetime(before=new_date))
    assert len(uuids) == 0

    uuids = list(
        LiteratureRecord.get_recids_by_updated_datetime(after=new_date))
    assert len(uuids) == 2
예제 #23
0
def test_create_or_update_when_redirection_enabled_updates_original_record(
        inspire_app):
    rec_to_delete = create_record("lit")
    rec_which_deletes = create_record(
        "lit", data={"deleted_records": [rec_to_delete["self"]]})

    expected_title = {"title": "New title"}

    data = dict(
        LiteratureRecord.get_record_by_pid_value(
            rec_to_delete["control_number"], original_record=True))
    data["titles"][0] = expected_title
    InspireRecord.create_or_update(data)

    deleted_rec = LiteratureRecord.get_record_by_pid_value(
        rec_to_delete["control_number"], original_record=True)
    new_rec = LiteratureRecord.get_record_by_pid_value(
        rec_which_deletes["control_number"])
    assert deleted_rec["titles"][0] == expected_title
    assert new_rec["titles"][0] == rec_which_deletes["titles"][0]
예제 #24
0
def test_redirect_wrong_new_pid_status(inspire_app):
    record_1 = create_record("lit")

    record_2 = create_record("lit")
    record_2_pid = record_2.control_number_pid
    record_2_pid.status = PIDStatus.DELETED

    record_2_data = dict(record_2)
    record_2_data["deleted_records"] = [record_1["self"]]

    with pytest.raises(WrongRedirectionPidStatus):
        record_2.update(record_2_data)

    record_1_from_db = LiteratureRecord.get_record_by_pid_value(
        record_1["control_number"])
    record_2_from_db = LiteratureRecord.get_record_by_pid_value(
        record_2["control_number"])

    assert record_1_from_db.id == record_1.id
    assert record_2_from_db.id == record_2.id
예제 #25
0
def test_redirect_and_delete_record_from_deleted_records_field(inspire_app):
    record_to_delete = create_record("lit")
    record = create_record("lit")
    data = dict(record)
    data["deleted_records"] = [record_to_delete["self"]]
    record.update(data)

    deleted_records = record["deleted_records"]

    assert len(deleted_records) == 1

    old_pid = record_to_delete.control_number_pid
    assert old_pid.is_redirected()
    record_redirected = LiteratureRecord.get_record_by_pid_value(
        record_to_delete.control_number)
    assert record_redirected.id == record.id

    original_record = LiteratureRecord.get_record(record_to_delete.id,
                                                  with_deleted=True)
    assert original_record["deleted"] is True
예제 #26
0
def test_lit_record_removed_from_es_when_deleted(inspire_app, clean_celery_session):
    data = faker.record("lit")
    rec = LiteratureRecord.create(data)
    db.session.commit()

    assert_record_in_es(rec["control_number"])

    rec.delete()
    db.session.commit()

    assert_record_not_in_es(rec["control_number"])
예제 #27
0
def test_experiment_literature_table_is_not_updated_when_feature_flag_is_disabled(
        update_function_mock, inspire_app):
    institution = create_record("exp")
    institution_control_number = institution["control_number"]
    ref = f"http://localhost:8000/api/experiments/{institution_control_number}"

    data = {
        "accelerator_experiments": [{
            "legacy_name": "LIGO",
            "record": {
                "$ref": ref
            }
        }]
    }
    record_data = faker.record("lit", data)
    LiteratureRecord.create(record_data, disable_relations_update=True)
    update_function_mock.assert_not_called()

    LiteratureRecord.create(record_data, disable_relations_update=False)
    update_function_mock.assert_called()
예제 #28
0
def test_add_and_remove_figs_and_docs_when_files_flag_disabled(
    fsopen_mock, base_app, db, init_files_db, disable_files
):
    expected_doc_filename = "document_file"
    expected_fig_filename = "figure_file"

    files = {
        "documents": [
            {
                "url": "http://document_url.cern.ch/file.pdf",
                "filename": "file_name.pdf",
                "key": expected_doc_filename,
            }
        ],
        "figures": [
            {"url": "http://figure_url.cern.ch/file.png", "key": expected_fig_filename}
        ],
    }

    data = faker.record("lit")
    record = LiteratureRecord.create(data)

    record.add_files(**files)
    # added 2 records, should be 0
    assert len(record.files.keys) == 0

    with pytest.raises(KeyError):
        record["_files"]

    assert "documents" in record
    assert "figures" in record

    assert len(record["documents"]) == 1
    assert len(record["figures"]) == 1

    assert record["documents"][0]["key"] == expected_doc_filename
    assert record["figures"][0]["key"] == expected_fig_filename

    record.set_files(documents=files["documents"])
    # when set only documents, figures should be removed

    with pytest.raises(KeyError):
        record["_files"]

    assert "documents" in record
    assert "figures" not in record

    assert len(record.files.keys) == 0

    assert len(record["documents"]) == 1
    with pytest.raises(KeyError):
        record["figures"]

    assert record["documents"][0]["key"] == expected_doc_filename
예제 #29
0
def test_lit_record_appear_in_es_when_created(inspire_app, clean_celery_session):
    data = faker.record("lit")
    record = LiteratureRecord.create(data)
    db.session.commit()

    def assert_record():
        current_search.flush_and_refresh("records-hep")
        record_from_es = LiteratureSearch().get_record_data_from_es(record)
        assert record_from_es["_ui_display"]

    retry_until_pass(assert_record)
예제 #30
0
def test_get_modified_references_returns_no_references_when_non_impacting_metadata_changed(
        app, clear_environment):
    cited_data = {
        "$schema": "http://localhost:5000/schemas/records/hep.json",
        "titles": [{
            "title": "Test a valid record"
        }],
        "document_type": ["article"],
        "_collections": ["Literature"],
    }
    cited_record = LiteratureRecord.create(cited_data)

    citing_data = {
        "$schema":
        "http://localhost:5000/schemas/records/hep.json",
        "titles": [{
            "title": "My title"
        }],
        "document_type": ["article"],
        "_collections": ["Literature"],
        "preprint_date":
        "2019-06-28",
        "references": [{
            "record": {
                "$ref":
                f"http://localhost:5000/api/literature/{cited_record['control_number']}"
            }
        }],
    }

    citing_record = LiteratureRecord.create(citing_data)
    db.session.commit()

    assert citing_record.get_modified_references() == [cited_record.id]

    data_update = {"titles": [{"title": "updated title"}]}
    citing_data.update(data_update)
    citing_record.update(citing_data)
    db.session.commit()

    assert citing_record.get_modified_references() == []