Ejemplo n.º 1
0
def test_backend_remove_patient(gpx4_patients, database):
    """ Test adding 2 test patients and then removing them using label or ID """

    # test conversion to format required for the database:
    test_mme_patients = [ mme_patient(json_patient=patient) for patient in gpx4_patients]

    # make sure 2 json patient are correctly parsed
    assert len(test_mme_patients) == 2

    # insert the 2 patients into the database
    inserted_ids = [ backend_add_patient(mongo_db=database, patient=mme_patient, match_external=False) for mme_patient in test_mme_patients ]
    assert len(inserted_ids) == 2

    # make sure that inserted patients contain computed phenotypes from Monarch
    a_patient = database['patients'].find_one()
    assert a_patient

    # test removing a patient by ID:
    remove_query = {'_id' : 'P0001058'}
    deleted = delete_by_query(remove_query, database, 'patients')
    db_patients = database['patients'].find()
    assert db_patients.count() == 1

    # test removing a patient by label:
    remove_query = {'label' : '350_2-test'}
    deleted = delete_by_query(remove_query, database, 'patients')
    db_patients = database['patients'].find()
    assert db_patients.count() == 0
Ejemplo n.º 2
0
def add():
    """Add patient to database"""

    formatted_patient = controllers.check_request(current_app.db, request)
    if isinstance(formatted_patient, int): # some error must have occurred during validation
        return controllers.bad_request(formatted_patient)

    match_external = False
    if controllers.get_nodes(database=current_app.db):
        match_external = True

    # else import patient to database
    modified, inserted, matching_obj= backend_add_patient(mongo_db=current_app.db, patient=formatted_patient,
        match_external=match_external)
    message = {}

    if modified:
        message['message'] = 'Patient was successfully updated.'
    elif inserted:
        message['message'] = 'Patient was successfully inserted into database.'
    else:
        message['message'] = 'Database content is unchanged.'

    # if patient is matching any other patient on other nodes
    # and match notifications are on
    if current_app.config.get('MAIL_SERVER') and matching_obj and len(matching_obj.get('results')):
        # send an email to patient's contact:
        notify_match_external(match_obj=matching_obj, admin_email=current_app.config.get('MAIL_USERNAME'),
            mail=current_app.mail, notify_complete=current_app.config.get('NOTIFY_COMPLETE'))

    resp = jsonify(message)
    resp.status_code = 200
    return resp
Ejemplo n.º 3
0
def test_external_matching(database, test_node, gpx4_patients, monkeypatch):
    """Testing the function that trigger patient matching across connected nodes"""

    patient = gpx4_patients[0]

    # insert test node object in database
    database['nodes'].insert_one(test_node)

    # insert patient object in database
    inserted_ids = backend_add_patient(mongo_db=database,
                                       patient=patient,
                                       match_external=False)
    assert inserted_ids

    class MockResponse(object):
        def __init__(self):
            self.status_code = 200

        def json(self):
            resp = {
                "disclaimer": "This is a test disclaimer",
                "results": gpx4_patients
            }
            return resp

    def mock_response(*args, **kwargs):
        return MockResponse()

    monkeypatch.setattr(requests, 'request', mock_response)

    ext_m_result = external_matcher(database, patient, test_node['_id'])
    assert isinstance(ext_m_result, dict)
    assert ext_m_result['data']['patient']['id'] == patient['id']
    assert ext_m_result['has_matches'] == True
    assert ext_m_result['match_type'] == 'external'
def test_delete_patient(mock_app, database, gpx4_patients, test_client,
                        match_objs):
    """Test deleting a patient from database by sending a DELETE request"""

    # load 2 patients from demo data in mock database
    assert len(gpx4_patients) == 2
    inserted_ids = []
    for pat in gpx4_patients:
        # convert patient in mme patient type (convert also gene to ensembl)
        mme_pat = mme_patient(pat, True)
        inserted_ids.append(backend_add_patient(database, mme_pat))

    assert len(inserted_ids) == 2

    # 50 cases present on patients collection
    delete_id = "P0001058"

    # try to delete patient without auth token:
    response = mock_app.test_client().delete("".join(
        ["patient/delete/", delete_id]))
    assert response.status_code == 401

    # Add a valid client node
    ok_token = test_client["auth_token"]
    add_node(mongo_db=mock_app.db, obj=test_client, is_client=True)

    # Send delete request providing a valid token but a non valid id
    response = mock_app.test_client().delete("".join(
        ["patient/delete/", "not_a_valid_ID"]),
                                             headers=auth_headers(ok_token))
    assert response.status_code == 200
    data = json.loads(response.data)
    # but server returns error
    assert (
        data["message"] ==
        "ERROR. Could not delete a patient with ID not_a_valid_ID from database"
    )

    assert database["matches"].find_one() is None  # no matches in database
    # insert into database some mock matching objects
    database["matches"].insert_many(match_objs)

    # patient "delete_id" should have two associated matches in database
    results = database["matches"].find({"data.patient.id": delete_id})
    assert len(list(results)) == 2

    # Send valid patient ID and valid token
    response = mock_app.test_client().delete("".join(
        ["patient/delete/", delete_id]),
                                             headers=auth_headers(ok_token))
    assert response.status_code == 200

    # make sure that the patient was removed from database
    results = database["patients"].find()
    assert len(list(results)) == 1

    # make sure that patient matches are also gone
    results = database["matches"].find()
    assert len(list(results)) == 1
def test_match_hgnc_symbol_patient(mock_app, gpx4_patients, test_client,
                                   database):
    """Testing matching patient with gene symbl against patientMatcher database (internal matching)"""

    # add an authorized client to database
    ok_token = test_client["auth_token"]
    add_node(mongo_db=mock_app.db, obj=test_client, is_client=True)

    query_patient = {"patient": gpx4_patients[0]}
    assert query_patient["patient"]["genomicFeatures"][0]["gene"][
        "id"] == "GPX4"

    # load 2 test patient in mock database
    assert len(gpx4_patients) == 2
    inserted_ids = []
    for pat in gpx4_patients:
        # convert patient in mme patient type (convert also gene to ensembl)
        mme_pat = mme_patient(pat, True)
        inserted_ids.append(backend_add_patient(database, mme_pat))

    assert len(inserted_ids) == 2

    # test the API response validator with non valid patient data:
    malformed_match_results = {"results": "fakey_results"}
    assert validate_response(malformed_match_results) == 422

    # make sure that there are no patient matches in the 'matches collection'
    assert database["matches"].find_one() is None

    # send a POST request to match patient with patients in database
    response = mock_app.test_client().post("/match",
                                           data=json.dumps(query_patient),
                                           headers=auth_headers(ok_token))
    assert response.status_code == 200  # POST request should be successful
    data = json.loads(response.data)
    # data should contain results and the max number of results is as defined in the config file
    assert len(data["results"]) == 2
    assert type(data["results"]) == list  # which is a list
    assert "patient" in data["results"][0]  # of patients
    assert "score" in data["results"][0]  # with matching scores
    assert "contact" in data["results"][0][
        "patient"]  # contact info should be available as well

    # make sure that there are match object is created in db for this internal matching
    match = database["matches"].find_one()
    for res in match["results"]:
        for pat in res["patients"]:
            assert pat["patient"][
                "contact"]  # each result should have a contact person
            assert pat["score"]["patient"] > 0
Ejemplo n.º 6
0
def test_match_entrez_patient(mock_app, test_client, gpx4_patients, database):
    """Test matching patient with ensembl gene against patientMatcher database (internal matching)"""

    # add an authorized client to database
    ok_token = test_client['auth_token']
    add_node(mongo_db=mock_app.db, obj=test_client, is_client=True)

    query_patient = gpx4_patients[0]
    query_patient = {'patient': gpx4_patients[0]}
    for feat in query_patient['patient']['genomicFeatures']:
        feat['gene']['id'] == "2879"  # entrez id for GPX4

    # load 2 test patient in mock database
    assert len(gpx4_patients) == 2
    inserted_ids = []
    for pat in gpx4_patients:
        # convert patient in mme patient type (convert also gene to ensembl)
        mme_pat = mme_patient(pat, True)
        inserted_ids.append(backend_add_patient(database, mme_pat))

    assert len(inserted_ids) == 2

    # make sure that there are no patient matches in the 'matches collection'
    assert database['matches'].find().count() == 0

    # send a POST request to match patient with patients in database
    response = mock_app.test_client().post('/match',
                                           data=json.dumps(query_patient),
                                           headers=auth_headers(ok_token))
    assert response.status_code == 200  # POST request should be successful
    data = json.loads(response.data)
    # data should contain results and the max number of results is as defined in the config file
    assert len(data['results']) == 2
    assert type(data['results']) == list  # which is a list
    assert 'patient' in data['results'][0]  # of patients
    assert 'score' in data['results'][0]  # with matching scores
    assert 'contact' in data['results'][0][
        'patient']  # contact info should be available as well

    # make sure that a match object is created in db for this internal matching
    match = database['matches'].find_one()
    for res in match['results']:
        for pat in res['patients']:
            assert pat['patient'][
                'contact']  # each result should have a contact person
            assert pat['score']['patient'] > 0
    # and query patient should have hgnc gene symbol saved as non-standard _geneName field
    assert match['data']['patient']['genomicFeatures'][0]['gene'][
        '_geneName'] == 'GPX4'