def test__get_spine_parameters__with_pmi__valid_except_pmi_postcode(
        client, faker, mock_convert_postcode):
    u = login(client, faker)
    dth = DemographicsTestHelper(faker=faker, user=u)
    dr = dth.get_demographics_request__spine_lookup()
    drd = dr.data[0]

    error_message = 'ABCDEFG'

    mock_convert_postcode.side_effect = [
        (None, drd.postcode),
        (error_message, ''),
    ]

    actual = get_spine_parameters(drd)

    mock_convert_postcode.call_count == 2

    assert parse_date(actual.dob) == parse_date(drd.dob)
    assert actual.family_name == drd.family_name
    assert actual.gender == convert_gender(drd.gender)[1]
    assert actual.given_name == drd.given_name
    assert actual.nhs_number == drd.nhs_number
    assert actual.postcode == drd.postcode

    assert len(actual.warnings) == 1
    assert actual.warnings[0].scope == 'pmi_postcode'
    assert actual.warnings[0].message == error_message

    _remove_files(dr)
def test__get_spine_parameters__no_pmi__valid_except_names(
        client, faker, mock_convert_name):
    u = login(client, faker)
    dth = DemographicsTestHelper(faker=faker,
                                 user=u,
                                 find_pre_pmi_details=False)
    dr = dth.get_demographics_request__spine_lookup()
    drd = dr.data[0]

    error_message = 'ABCDEFG'

    mock_convert_name.return_value = (error_message, '')

    actual = get_spine_parameters(drd)

    mock_convert_name.call_count = 2

    assert parse_date(actual.dob) == parse_date(drd.dob)
    assert actual.family_name == None
    assert actual.gender == convert_gender(drd.gender)[1]
    assert actual.given_name == None
    assert actual.nhs_number == drd.nhs_number
    assert actual.postcode == drd.postcode

    assert len(actual.warnings) == 2
    assert actual.warnings[0].scope == 'family_name'
    assert actual.warnings[0].message == error_message
    assert actual.warnings[1].scope == 'given_name'
    assert actual.warnings[1].message == error_message

    _remove_files(dr)
Beispiel #3
0
def test__extract_data__missing_columns(client, faker, column_headings, extension, mock_schedule_lookup_tasks, mock_log_exception):
    u = login(client, faker)
    dth = DemographicsTestHelper(faker=faker, user=u, extension=extension, column_headings=column_headings)
    dr = dth.get_demographics_request__data_extraction()

    extract_data(dr.id)

    actual = DemographicsRequest.query.get(dr.id)

    mock_schedule_lookup_tasks.assert_called_once_with(dr.id)
    mock_log_exception.assert_not_called()

    assert len(actual.data) == 1
    assert actual.data_extracted == True
    assert actual.data_extracted_datetime is not None

    for e, a in zip(dth.get_input_details(), actual.data):
        assert e.get('uhl_system_number', '') == a.uhl_system_number
        assert e.get('nhs_number', '') == a.nhs_number
        assert e.get('family_name', '') == a.family_name
        assert e.get('given_name', '') == a.given_name
        assert e.get('gender', '') == a.gender
        assert parse_date(e.get('date_of_birth', '')) == parse_date(a.dob)
        assert e.get('postcode', '') == a.postcode

    _remove_files(dr)
Beispiel #4
0
def test__extract_data__normal(client, faker, extension, row_count, mock_schedule_lookup_tasks, mock_log_exception):
    u = login(client, faker)
    dth = DemographicsTestHelper(faker=faker, user=u, row_count=row_count, extension=extension)
    dr = dth.get_demographics_request__data_extraction()

    extract_data(dr.id)

    actual = DemographicsRequest.query.get(dr.id)

    mock_schedule_lookup_tasks.assert_called_once_with(dr.id)
    mock_log_exception.assert_not_called()

    assert len(actual.data) == row_count
    assert actual.data_extracted == True
    assert actual.data_extracted_datetime is not None

    for e, a in zip(dth._person_details, actual.data):
        assert e['uhl_system_number'] == a.uhl_system_number
        assert e['nhs_number'] == a.nhs_number
        assert e['family_name'] == a.family_name
        assert e['given_name'] == a.given_name
        assert e['gender'] == a.gender
        assert parse_date(e['date_of_birth']) == parse_date(a.dob)
        assert e['postcode'] == a.postcode
    
    _remove_files(dr)
def _assert_actual_equals_expected(actual, expected):
    assert actual.participant_import_definition_id in expected
    assert actual.ecrf_participant_identifier in expected[
        actual.participant_import_definition_id]

    e_ecrf = expected[actual.participant_import_definition_id][
        actual.ecrf_participant_identifier]['ecrf']
    e_ids = expected[actual.participant_import_definition_id][
        actual.ecrf_participant_identifier]['identifiers']

    assert actual is not None
    assert actual.ecrf_participant_identifier == e_ecrf[
        'ecrf_participant_identifier']
    assert parse_date(actual.recruitment_date) == e_ecrf['recruitment_date']
    assert actual.first_name == e_ecrf['first_name']
    assert actual.last_name == e_ecrf['last_name']
    assert actual.sex == e_ecrf['sex']
    assert actual.postcode == e_ecrf['postcode']
    assert parse_date(actual.birth_date) == e_ecrf['birth_date']
    assert actual.complete_or_expected == e_ecrf['complete_or_expected']
    assert actual.withdrawal_date == e_ecrf['withdrawal_date']
    assert actual.withdrawn_from_study == e_ecrf['withdrawn_from_study']
    assert actual.post_withdrawal_keep_samples == e_ecrf[
        'post_withdrawal_keep_samples']
    assert actual.post_withdrawal_keep_data == e_ecrf[
        'post_withdrawal_keep_data']
    assert actual.brc_opt_out == e_ecrf['brc_opt_out']
    assert actual.excluded_from_analysis == e_ecrf['excluded_from_analysis']
    assert actual.excluded_from_study == e_ecrf['excluded_from_study']
    assert actual.ecrf_timestamp == e_ecrf['ecrf_timestamp']

    assert len(actual.identifier_source.identifiers) == len(e_ids)

    for i in actual.identifier_source.identifiers:
        assert e_ids[i.participant_identifier_type.name] == i.identifier
Beispiel #6
0
def test__spine_lookup__nhs_number(client, faker, mock_get_spine_parameters,
                                   mock_get_demographics_from_nhs_number,
                                   mock_get_demographics_from_search,
                                   warning_count):
    u = login(client, faker)
    dth = DemographicsTestHelper(faker=faker, user=u)
    dr = dth.get_demographics_request__spine_lookup()
    drd = dr.data[0]

    params = SpineParameters()
    params.nhs_number = drd.nhs_number
    params.dob = drd.dob
    params.family_name = drd.family_name
    params.given_name = drd.given_name
    params.gender = drd.gender
    params.postcode = drd.postcode

    for i in range(warning_count):
        params.add_warning(
            scope=f'scope {i}',
            message=f'message {i}',
        )

    mock_get_spine_parameters.return_value = params
    mock_get_demographics_from_nhs_number.return_value = spine_response_full

    spine_lookup(drd)

    mock_get_demographics_from_nhs_number.assert_called_once_with(
        nhs_number=params.nhs_number,
        dob=params.dob,
    )
    mock_get_demographics_from_search.assert_not_called()

    assert drd.response is not None
    assert drd.response.nhs_number == spine_response_full.nhs_number
    assert drd.response.title == spine_response_full.title
    assert drd.response.forename == spine_response_full.forename
    assert drd.response.middlenames == spine_response_full.middlenames
    assert drd.response.lastname == spine_response_full.lastname
    assert drd.response.sex == spine_response_full.sex
    assert drd.response.postcode == spine_response_full.postcode
    assert drd.response.address == spine_response_full.address
    assert parse_date(drd.response.date_of_birth) == parse_date(
        spine_response_full.date_of_birth)
    assert parse_date(drd.response.date_of_death) == parse_date(
        spine_response_full.date_of_death)
    assert drd.response.is_deceased == spine_response_full.is_deceased
    assert drd.response.current_gp_practice_code == spine_response_full.current_gp_practice_code

    assert len(drd.messages) == warning_count

    for i, w in enumerate(drd.messages):
        assert w.type == 'warning'
        assert w.source == 'validation'
        assert w.scope == f'scope {i}'
        assert w.message == f'message {i}'

    _remove_files(dr)
def test__import_participants__date_field__valid_date(client, faker,
                                                      column_name, field_name):
    pid = _get_participant_import_definition(
        **{f'{field_name}_column_name': column_name}, )

    record = {**DEFAULT_RECORD, column_name: '01-Jan-2010'}

    _run_import_test(
        record=record,
        expected=_define_result(pid,
                                fields={field_name:
                                        parse_date('01-Jan-2010')}),
    )
Beispiel #8
0
def test__produce_demographics_result(client, faker, mock_email, row_count, extension):
    u = login(client, faker)
    dth = DemographicsTestHelper(faker=faker, user=u, row_count=row_count, extension=extension, include_data_errors=True)
    dr = dth.get_demographics_request__create_results()

    produce_demographics_result(dr.id)

    mock_email.assert_called_once()

    actual = DemographicsRequest.query.get(dr.id)

    assert actual.result_created_datetime is not None
    assert dr.result_created
    assert os.path.isfile(dr.result_filepath)

    for row, expected in zip(dr.iter_result_rows(), dth._person_details):
        assert row['spine_title'] == expected['title']
        assert row['spine_forename'] == expected['given_name']
        assert row['spine_middlenames'] == expected['middle_name']
        assert row['spine_lastname'] == expected['family_name']
        assert row['spine_postcode'] == expected['postcode']
        assert row['spine_address'] == expected['address']
        assert parse_date(row['spine_date_of_birth']) == parse_date(expected["date_of_birth"])
        assert parse_date(row['spine_date_of_death']) == parse_date(expected["date_of_death"])
        assert (row['spine_is_deceased'] == 'True') == expected['is_deceased']
        assert row['spine_current_gp_practice_code'] == expected['current_gp_practice_code']
        assert row['spine_message'] or '' == expected['expected_message']

        assert row['pmi_nhs_number'] == expected['nhs_number']
        assert row['pmi_uhl_system_number'] == expected['uhl_system_number']
        assert row['pmi_family_name'] == expected['family_name']
        assert row['pmi_given_name'] == expected['given_name']
        assert row['pmi_gender'] == expected['gender']
        assert parse_date(row['pmi_dob']) == parse_date(expected['date_of_birth'])
        assert parse_date(row['pmi_date_of_death']) == parse_date(expected["date_of_death"])
        assert row['pmi_postcode'] == expected['postcode']

    _remove_files(dr)
Beispiel #9
0
def test__parse_date(client, value, is_error, expected):
    if is_error:
        with pytest.raises(ValueError):
            parse_date(value)
    else:
        assert parse_date(value).strftime("%Y%m%d") == expected