def test_authors_application_json_delete_without_token(inspire_app):
    record = create_record("aut")
    record_control_number = record["control_number"]

    expected_status_code = 401
    with inspire_app.test_client() as client:
        response = client.delete("/authors/{}".format(record_control_number))
    response_status_code = response.status_code

    assert expected_status_code == response_status_code
示例#2
0
def test_close_expired_jobs_with_notify(mock_send_job_deadline_reminder,
                                        inspire_app, cli):
    expired_record = create_record("job",
                                   data={
                                       "status": "open",
                                       "deadline_date": "2019-11-01"
                                   })
    not_expired_record = create_record("job",
                                       data={
                                           "status": "open",
                                           "deadline_date": "2020-11-01"
                                       })
    result = cli.invoke(["jobs", "close_expired_jobs", "--notify"])

    expired_record = JobsRecord.get_record_by_pid_value(
        expired_record["control_number"])

    mock_send_job_deadline_reminder.assert_called_once()
    mock_send_job_deadline_reminder.assert_called_with(dict(expired_record))
def test_get_record_and_schema_requires_cataloger_logged_in(inspire_app):
    user = create_user()
    conference = create_record("con")

    with inspire_app.test_client() as client:
        login_user_via_session(client, email=user.email)
        response = client.get(
            f"api/editor/conferences/{conference['control_number']}")

    assert response.status_code == 403
示例#4
0
def test_literature_references_with_invalid_size(inspire_app):
    record = create_record("lit", data=faker.record("lit"))
    headers = {"Accept": "application/json"}
    with inspire_app.test_client() as client:
        response = client.get(
            f"/literature/{record['control_number']}/references?size=0",
            headers=headers)
    response_status_code = response.status_code
    expected_status_code = 400
    assert expected_status_code == response_status_code
示例#5
0
def test_regression_index_literature_record_with_related_records(
        inspire_app, datadir):
    data = json.loads((datadir / "1503270.json").read_text())
    record = create_record("lit", data=data)

    response = es_search("records-hep")

    result = response["hits"]["hits"][0]["_source"]

    assert data["related_records"] == result["related_records"]
示例#6
0
def test_hard_delete_literature_clears_entries_in_conference_literature_table(
    inspire_app, ):
    conference = create_record("con")
    conference_control_number = conference["control_number"]
    ref = f"http://localhost:8000/api/conferences/{conference_control_number}"

    rec_data = {
        "publication_info": [{
            "conference_record": {
                "$ref": ref
            }
        }],
        "document_type": ["conference paper"],
    }
    rec = create_record("lit", rec_data)

    rec.hard_delete()

    assert len(conference.model.conference_documents) == 0
示例#7
0
def test_minter_bai_respects_feature_flag(inspire_app, override_config):
    with override_config(FEATURE_FLAG_ENABLE_BAI_PROVIDER=False):
        record = create_record("aut")

    expected_pids_len = 0

    result_pids_len = PersistentIdentifier.query.filter_by(
        object_uuid=record.id, pid_type="bai").count()

    assert result_pids_len == expected_pids_len
示例#8
0
def test_literature_get_records_by_pids_returns_correct_record(inspire_app):
    record1 = create_record("lit")
    record1_control_number = record1["control_number"]
    record2 = create_record("lit")
    record2_control_number = record2["control_number"]
    expected_control_numbers = [record1_control_number, record2_control_number]
    result = LiteratureSearch().get_records_by_pids([("lit",
                                                      record1_control_number)])
    assert len(result) == 1
    assert (json.loads(
        result[0]._ui_display)["control_number"] == record1["control_number"])

    result = LiteratureSearch().get_records_by_pids([
        ("lit", record1_control_number), ("lit", record2_control_number)
    ])

    assert len(result) == len(expected_control_numbers)
    for rec in result:
        assert rec.to_dict()["control_number"] in expected_control_numbers
示例#9
0
def test_jobs_application_json_get(inspire_app):
    record = create_record("job")
    record_control_number = record["control_number"]

    expected_status_code = 200
    with inspire_app.test_client() as client:
        response = client.get(f"/jobs/{record_control_number}")
    response_status_code = response.status_code

    assert expected_status_code == response_status_code
示例#10
0
def test_authors_search_contains_acquisition_source_for_curator(inspire_app):
    user = create_user(role=Roles.cataloger.value)
    headers = {"Accept": "application/json"}

    data = {
        "$schema": "https://inspire/schemas/records/authors.json",
        "_collections": ["Authors"],
        "_private_notes": [{"value": "A private note"}],
        "acquisition_source": {"orcid": "0000-0000-0000-0000", "email": "*****@*****.**"},
        "name": {"value": "Urhan, Harun"},
        "deleted": False,
    }

    create_record("aut", data=data)
    with inspire_app.test_client() as client:
        login_user_via_session(client, email=user.email)
        response = client.get("/authors", headers=headers)
    assert response.status_code == 200
    assert "acquisition_source" in response.json["hits"]["hits"][0]["metadata"]
示例#11
0
def test_jobs_facets(inspire_app, datadir):
    data = orjson.loads((datadir / "1735925.json").read_text())
    create_record("job", data=data)

    expected_aggregations = orjson.loads(
        (datadir / "es_aggregations_for_1735925.json").read_text()
    )
    with inspire_app.test_client() as client:
        response = client.get("/jobs/facets")
    response_data = response.json

    response_status_code = response.status_code
    response_aggregations = response_data["aggregations"]

    expected_status_code = 200

    assert expected_status_code == response_status_code
    assert expected_aggregations == response_aggregations
    assert len(response_data["hits"]["hits"]) == 0
示例#12
0
def test_authors_detail_links(inspire_app):
    expected_status_code = 200
    record = create_record("aut")
    expected_links = {
        "json": f"http://localhost:5000/authors/{record['control_number']}?format=json"
    }
    with inspire_app.test_client() as client:
        response = client.get(f"/authors/{record['control_number']}")
    assert response.status_code == expected_status_code
    assert response.json["links"] == expected_links
示例#13
0
def test_institutions_application_json_put_without_auth(inspire_app):
    record = create_record("ins")
    record_control_number = record["control_number"]

    expected_status_code = 401
    with inspire_app.test_client() as client:
        response = client.put(f"/institutions/{record_control_number}")
    response_status_code = response.status_code

    assert expected_status_code == response_status_code
def test_seminars_detail_submitter_can_edit(inspire_app):
    with inspire_app.test_client() as client:
        headers = {"Accept": "application/vnd+inspire.record.ui+json"}

        user = create_user(email="*****@*****.**", orcid="0000-0002-6665-4934")
        create_record(
            "sem",
            data={
                "acquisition_source": {
                    "email": "*****@*****.**",
                    "orcid": "0000-0002-6665-4934",
                }
            },
        )
        create_record(
            "sem",
            data={
                "acquisition_source": {
                    "email": "*****@*****.**",
                    "orcid": "0000-0002-6665-1234",
                }
            },
        )

        login_user_via_session(client, email=user.email)

        response = client.get("/seminars", headers=headers)

        hits = response.json["hits"]["hits"]

        own_job_metadata = next(
            hit["metadata"]
            for hit in hits
            if hit["metadata"]["acquisition_source"]["email"] == user.email
        )
        another_job_metadata = next(
            hit["metadata"]
            for hit in hits
            if hit["metadata"]["acquisition_source"]["email"] != user.email
        )

        assert not another_job_metadata["can_edit"]
        assert own_job_metadata["can_edit"]
示例#15
0
def test_citations_query_result(inspire_app):
    record_control_number = 12345
    # create self_citation
    record_cited = create_record(
        "lit",
        data={"control_number": record_control_number},
        literature_citations=[record_control_number],
    )
    # create correct citation
    record_citing = create_record("lit",
                                  literature_citations=[record_control_number])

    with inspire_app.test_client() as client:
        response = client.get(
            f"api/literature/{record_control_number}/citations")

    assert response.json["metadata"]["citation_count"] == 1
    citation = response.json["metadata"]["citations"][0]
    assert citation["control_number"] == record_citing["control_number"]
def test_format_conference_paper(inspire_app, datadir):
    data = orjson.loads((datadir / "524480.json").read_text())
    record = create_record("lit", data=data)
    data_conference = orjson.loads((datadir / "972464.json").read_text())
    record_conference = create_record_factory(
        "con", data=data_conference, with_indexing=True
    )
    with inspire_app.test_client() as client:
        response = client.get("/literature/524480")
    assert response.status_code == 200
    inproceedings = orjson.loads(response.data)

    expected = xml_parse(
        """
    <work:work xmlns:common="http://www.orcid.org/ns/common" xmlns:work="http://www.orcid.org/ns/work">
        <work:title>
            <common:title>CMB anisotropies: A Decadal survey</common:title>
        </work:title>
        <work:journal-title>4th RESCEU International Symposium on Birth and Evolution of the Universe</work:journal-title>
        <work:type>conference-paper</work:type>
        <common:external-ids>
            <common:external-id>
              <common:external-id-type>other-id</common:external-id-type>
              <common:external-id-value>524480</common:external-id-value>
              <common:external-id-url>http://inspirehep.net/record/524480</common:external-id-url>
              <common:external-id-relationship>self</common:external-id-relationship>
            </common:external-id>
            <common:external-id>
                <common:external-id-type>arxiv</common:external-id-type>
                <common:external-id-value>astro-ph/0002520</common:external-id-value>
                <common:external-id-url>http://arxiv.org/abs/astro-ph/0002520</common:external-id-url>
                <common:external-id-relationship>self</common:external-id-relationship>
            </common:external-id>
        </common:external-ids>
        <work:url>http://inspirehep.net/record/524480</work:url>
        <work:contributors>
            <work:contributor>
                <work:credit-name>Hu, Wayne</work:credit-name>
                <work:contributor-attributes>
                    <work:contributor-sequence>first</work:contributor-sequence>
                    <work:contributor-role>author</work:contributor-role>
                </work:contributor-attributes>
            </work:contributor>
        </work:contributors>
    </work:work>
    """
    )
    result = OrcidConverter(
        inproceedings["metadata"], url_pattern="http://inspirehep.net/record/{recid}"
    ).get_xml()
    assert valid_against_schema(result)
    assert xml_compare(expected, result)
    assert _OrcidHasher(mock.Mock())._hash_xml_element(expected) == _OrcidHasher(
        mock.Mock()
    )._hash_xml_element(result)
示例#17
0
def test_indexer_creates_proper_fulltext_links_in_ui_display_files_enabled(
        inspire_app, s3):
    create_s3_bucket("1")
    create_s3_bucket("f")
    expected_fulltext_links = ["arXiv", "KEK scanned document", "fulltext"]

    data = {
        "external_system_identifiers": [
            {
                "schema": "OSTI",
                "value": "7224300"
            },
            {
                "schema": "ADS",
                "value": "1994PhRvD..50.4491S"
            },
            {
                "schema": "KEKSCAN",
                "value": "94-07-219"
            },
            {
                "schema": "SPIRES",
                "value": "SPIRES-2926342"
            },
        ],
        "arxiv_eprints": [{
            "categories": ["hep-ph"],
            "value": "hep-ph/9404247"
        }],
        "documents": [
            {
                "source": "arxiv",
                "fulltext": True,
                "hidden": True,
                "key": "arXiv:nucl-th_9310030.pdf",
                "url": "https://arxiv.org/pdf/1910.11662.pdf",
            },
            {
                "source":
                "arxiv",
                "key":
                "arXiv:nucl-th_9310031.pdf",
                "url":
                "http://inspirehep.net/record/863300/files/fermilab-pub-10-255-e.pdf",
            },
        ],
    }
    record = create_record("lit", data=data)
    response = es_search("records-hep")

    result = response["hits"]["hits"][0]["_source"]
    result_ui_display = json.loads(result.pop("_ui_display"))
    for link in result_ui_display["fulltext_links"]:
        assert link["value"]
        assert link["description"] in expected_fulltext_links
示例#18
0
def test_literature_references_pagination(inspire_app):
    record1 = create_record("lit", data=faker.record("lit"))
    record2 = create_record("lit", data=faker.record("lit"))
    record3 = create_record("lit", data=faker.record("lit"))
    record4 = create_record("lit", data=faker.record("lit"))

    data = faker.record(
        "lit",
        literature_citations=[
            record1["control_number"],
            record2["control_number"],
            record3["control_number"],
            record4["control_number"],
        ],
    )
    record_with_references = create_record("lit", data=data)
    headers = {"Accept": "application/json"}
    with inspire_app.test_client() as client:
        response = client.get(
            f"/literature/{record_with_references['control_number']}/references?page=2&size=2",
            headers=headers,
        )
    response_status_code = response.status_code
    response_data = json.loads(response.data)
    response_data_metadata = response_data["metadata"]
    expected_result = {
        "references": [
            {
                "control_number": record3["control_number"],
                "titles": record3["titles"]
            },
            {
                "control_number": record4["control_number"],
                "titles": record4["titles"]
            },
        ],
        "references_count":
        4,
    }
    expected_status_code = 200
    assert expected_status_code == response_status_code
    assert expected_result == response_data_metadata
示例#19
0
def test_link_signatures_to_author(inspire_app):
    data_1 = {
        "authors": [
            {"full_name": "Doe, John", "uuid": "94fc2b0a-dc17-42c2-bae3-ca0024079e51"}
        ]
    }
    record_1 = create_record("lit", data=data_1)
    data_2 = {
        "authors": [
            {"full_name": "Walker, Sam", "uuid": "94fc2b0a-dc17-42c2-bae3-ca0024079e52"}
        ]
    }
    record_2 = create_record("lit", data=data_2)
    signatures_data = [
        {
            "publication_id": record_1["control_number"],
            "signature_uuid": "94fc2b0a-dc17-42c2-bae3-ca0024079e51",
        },
        {
            "publication_id": record_2["control_number"],
            "signature_uuid": "94fc2b0a-dc17-42c2-bae3-ca0024079e52",
        },
    ]
    signatures = link_signatures_to_author(signatures_data, 123)
    expected_signatures = [
        {
            "full_name": "Doe, John",
            "uuid": "94fc2b0a-dc17-42c2-bae3-ca0024079e51",
            "signature_block": "Dj",
            "record": {"$ref": "http://localhost:5000/api/authors/123"},
        },
        {
            "full_name": "Walker, Sam",
            "uuid": "94fc2b0a-dc17-42c2-bae3-ca0024079e52",
            "signature_block": "WALCARs",
            "record": {"$ref": "http://localhost:5000/api/authors/123"},
        },
    ]
    expected_ref = "http://localhost:5000/api/authors/123"
    assert expected_signatures == signatures
    assert expected_ref == record_1["authors"][0]["record"]["$ref"]
    assert expected_ref == record_2["authors"][0]["record"]["$ref"]
示例#20
0
def test_record_links_when_correct_type_is_not_first_document_type_conference(
    inspire_app, ):
    conference = create_record("con")
    conference_control_number = conference["control_number"]
    ref = f"http://localhost:8000/api/conferences/{conference_control_number}"
    conf_paper_data = {
        "publication_info": [{
            "conference_record": {
                "$ref": ref
            }
        }],
        "document_type": ["article", "conference paper"],
    }

    proceedings_data = {
        "publication_info": [{
            "conference_record": {
                "$ref": ref
            }
        }],
        "document_type": ["book", "proceedings", "thesis"],
    }

    rec_without_correct_type_data = {
        "publication_info": [{
            "conference_record": {
                "$ref": ref
            }
        }],
        "document_type": ["book", "thesis", "article"],
    }
    conf_paper_record = create_record("lit", conf_paper_data)
    proceedings_record = create_record("lit", proceedings_data)
    rec_without_correct_type = create_record("lit",
                                             rec_without_correct_type_data)

    documents = conference.model.conference_documents
    conf_docs_uuids = [document.literature_uuid for document in documents]
    assert len(documents) == 2
    assert proceedings_record.id in conf_docs_uuids
    assert conf_paper_record.id in conf_docs_uuids
    assert rec_without_correct_type.id not in conf_docs_uuids
示例#21
0
def test_literature_hidden_collection_as_logged_in_user_not_cataloger(
        inspire_app):
    expected_status_code = 403
    rec = create_record("lit", data={"_collections": ["D0 Internal Notes"]})

    user = create_user()

    with inspire_app.test_client() as client:
        login_user_via_session(client, email=user.email)
        response = client.get(f"/literature/{rec['control_number']}")
    assert response.status_code == expected_status_code
示例#22
0
def test_redirects_claims_to_author_page(inspire_app):
    author_data = {
        "control_number": 333,
        "ids": [{
            "schema": "INSPIRE BAI",
            "value": "G.Aad.1"
        }],
    }
    create_record("aut", data=author_data)

    with inspire_app.test_client() as client:
        response = client.get("/author/claim/G.Aad.1")

        response_status_code = response.status_code
        response_location_header = response.headers.get("Location")

        expected_status_code = 302
        expected_redirect_url = "http://localhost:5000/authors/333"
        assert expected_status_code == response_status_code
        assert response_location_header == expected_redirect_url
示例#23
0
def test_literature_application_json_put_without_token(inspire_app):
    record = create_record("lit")
    record_control_number = record["control_number"]
    headers = {"If-Match": '"0"'}
    expected_status_code = 401
    with inspire_app.test_client() as client:
        response = client.put("/literature/{}".format(record_control_number),
                              headers=headers)
    response_status_code = response.status_code

    assert expected_status_code == response_status_code
示例#24
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
def test_proceedings_query_after_hard_delete(inspire_app):
    conference = create_record("con")
    conference_control_number = conference["control_number"]
    ref = f"http://localhost:8000/api/conferences/{conference_control_number}"

    rec_data = {
        "publication_info": [{"conference_record": {"$ref": ref}}],
        "document_type": ["proceedings"],
    }
    rec1 = create_record("lit", rec_data)

    expected_proceedings_count = 1
    expected_proceedings = [dict(rec1)]
    assert expected_proceedings_count == len(conference.proceedings)
    assert expected_proceedings == conference.proceedings

    rec1.hard_delete()

    expected_proceedings_count = 0
    assert expected_proceedings_count == len(conference.proceedings)
示例#26
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]
示例#27
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
示例#28
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
示例#29
0
def test_indexer_deletes_record_from_es(inspire_app):
    record = create_record("sem")

    record["deleted"] = True
    record.index(delay=False)
    current_search.flush_and_refresh("records-seminars")

    expected_records_count = 0

    record_lit_es = SeminarsSearch().get_record(str(record.id)).execute().hits
    assert expected_records_count == len(record_lit_es)
def test_bibtext_do_not_add_bibtex_citation(inspire_app, datadir):
    data = orjson.loads(
        (datadir / "test_orcid_converter_TestBibtexCitation.json").read_text()
    )
    record = create_record("lit", data=data)
    converter = OrcidConverter(
        record=record, url_pattern="http://inspirehep.net/record/{recid}"
    )
    xml_root = converter.get_xml()
    top_level_tags = [etree.QName(node).localname for node in xml_root.getchildren()]
    assert "citation" not in top_level_tags