def test_get_after_withdrawal_fails(self): self.insert_codes() p = Participant(participantId=1, biobankId=2) self.participant_dao.insert(p) self._setup_questionnaire() qr = QuestionnaireResponse(questionnaireResponseId=1, questionnaireId=1, questionnaireVersion=1, participantId=1, resource=QUESTIONNAIRE_RESPONSE_RESOURCE) qr.answers.extend(self._names_and_email_answers()) self.questionnaire_response_dao.insert(qr) p.withdrawalStatus = WithdrawalStatus.NO_USE self.participant_dao.update(p) with self.assertRaises(Forbidden): self.questionnaire_response_dao.get(qr.questionnaireResponseId)
def test_update_withdraw(self): p = Participant() time = datetime.datetime(2016, 1, 1) with random_ids([1, 2]): with FakeClock(time): self.dao.insert(p) p.version = 1 p.withdrawalStatus = WithdrawalStatus.NO_USE time2 = datetime.datetime(2016, 1, 2) with FakeClock(time2): self.dao.update(p) p2 = self.dao.get(1) expected_participant = self._participant_with_defaults( participantId=1, version=2, biobankId=2, lastModified=time2, signUpTime=time, withdrawalStatus=WithdrawalStatus.NO_USE, withdrawalTime=time2) self.assertEquals(expected_participant.asdict(), p2.asdict()) p.version = 2 p.providerLink = make_primary_provider_link_for_name('PITT') p.withdrawalTime = None time3 = datetime.datetime(2016, 1, 3) with FakeClock(time3): self.dao.update(p) # Withdrawal time should get copied over. p2 = self.dao.get(1) expected_participant = self._participant_with_defaults( participantId=1, version=3, biobankId=2, lastModified=time3, signUpTime=time, withdrawalStatus=WithdrawalStatus.NO_USE, withdrawalTime=time2, hpoId=PITT_HPO_ID, providerLink=p2.providerLink) self.assertEquals(expected_participant.asdict(), p2.asdict())
def test_update_withdrawn_status_fails(self): p = Participant(withdrawalStatus=WithdrawalStatus.NO_USE) time = datetime.datetime(2016, 1, 1) with random_ids([1, 2]): with FakeClock(time): self.dao.insert(p) expected_participant = self._participant_with_defaults( participantId=1, version=1, biobankId=2, lastModified=time, signUpTime=time, withdrawalStatus=WithdrawalStatus.NO_USE) self.assertEquals(expected_participant.asdict(), p.asdict()) p2 = self.dao.get(1) self.assertEquals(p.asdict(), p2.asdict()) p.version = 1 p.withdrawalStatus = WithdrawalStatus.NOT_WITHDRAWN with self.assertRaises(Forbidden): self.dao.update(p)
def _create_data(self): HPODao().insert(HPO(hpoId=AZ_HPO_ID + 1, name='AZ_TUCSON_2')) HPODao().insert(HPO(hpoId=PITT_HPO_ID + 4, name='TEST')) SqlTestBase.setup_codes( ANSWER_FIELD_TO_QUESTION_CODE.values() + [EHR_CONSENT_QUESTION_CODE], code_type=CodeType.QUESTION) SqlTestBase.setup_codes( FIELD_TO_QUESTIONNAIRE_MODULE_CODE.values(), code_type=CodeType.MODULE) # Import codes for white and female, but not male or black. SqlTestBase.setup_codes( [ RACE_WHITE_CODE, CONSENT_PERMISSION_YES_CODE, RACE_NONE_OF_THESE_CODE, PMI_PREFER_NOT_TO_ANSWER_CODE, CONSENT_PERMISSION_NO_CODE, 'female', 'PIIState_VA' ], code_type=CodeType.ANSWER) participant_dao = ParticipantDao() questionnaire_id = self.create_questionnaire('questionnaire3.json') questionnaire_id_2 = self.create_questionnaire('questionnaire4.json') questionnaire_id_3 = self.create_questionnaire( 'all_consents_questionnaire.json') with FakeClock(TIME): participant = self._participant_with_defaults( participantId=1, version=2, biobankId=2, providerLink=make_primary_provider_link_for_name('PITT')) participant_dao.insert(participant) self.send_consent('P1', email='*****@*****.**') # Participant 2 starts out unpaired; later gets paired automatically when their physical # measurements come in. participant2 = Participant(participantId=2, biobankId=3) participant_dao.insert(participant2) self.send_consent('P2', email='*****@*****.**') # Test HPO affiliation; this test participant is ignored. participant3 = Participant( participantId=3, biobankId=4, providerLink=make_primary_provider_link_for_name('TEST')) participant_dao.insert(participant3) self.send_consent('P3', email='*****@*****.**') # example.com e-mail; this test participant is ignored, too. participant4 = Participant( participantId=4, biobankId=5, providerLink=make_primary_provider_link_for_name('PITT')) participant_dao.insert(participant4) self.send_consent('P4', email='*****@*****.**') participant5 = Participant( participantId=5, biobankId=6, providerLink=make_primary_provider_link_for_name('PITT')) participant_dao.insert(participant5) self.send_consent('P5', email='*****@*****.**') # A withdrawn participant should be excluded from metrics. participant6 = Participant( participantId=6, biobankId=7, providerLink=make_primary_provider_link_for_name('PITT') ) participant_dao.insert(participant6) self.send_consent('P6', email='*****@*****.**') participant6.withdrawalStatus=WithdrawalStatus.NO_USE participant_dao.update(participant6) self.send_post('Participant/P2/PhysicalMeasurements', load_measurement_json(2)) self.send_post('Participant/P2/BiobankOrder', load_biobank_order_json(2)) self.submit_questionnaire_response('P1', questionnaire_id, RACE_WHITE_CODE, 'female', None, datetime.date(1980, 1, 2)) self.submit_questionnaire_response( 'P2', questionnaire_id, PMI_PREFER_NOT_TO_ANSWER_CODE, 'male', None, datetime.date(1920, 1, 3)) self.submit_questionnaire_response('P2', questionnaire_id_2, None, None, 'PIIState_VA', None) self.submit_questionnaire_response('P5', questionnaire_id, None, None, None, datetime.date(1970, 1, 2)) self.submit_consent_questionnaire_response('P1', questionnaire_id_3, CONSENT_PERMISSION_NO_CODE) self.submit_consent_questionnaire_response('P2', questionnaire_id_3, CONSENT_PERMISSION_YES_CODE) sample_dao = BiobankStoredSampleDao() sample_dao.insert( BiobankStoredSample( biobankStoredSampleId='abc', biobankId=2, biobankOrderIdentifier='KIT', test='test', confirmed=TIME)) sample_dao.insert( BiobankStoredSample( biobankStoredSampleId='def', biobankId=3, biobankOrderIdentifier='KIT', test='1SAL', confirmed=TIME)) # Required to update the HPO linkage (and test filtering for P3). sample_dao.insert( BiobankStoredSample( biobankStoredSampleId='xyz', biobankId=4, biobankOrderIdentifier='KIT', test='1SAL', confirmed=TIME))
def _create_data(self): HPODao().insert(HPO(hpoId=PITT_HPO_ID + 1, name='AZ_TUCSON_2')) HPODao().insert(HPO(hpoId=PITT_HPO_ID + 4, name='TEST')) SqlTestBase.setup_codes(ANSWER_FIELD_TO_QUESTION_CODE.values() + [EHR_CONSENT_QUESTION_CODE], code_type=CodeType.QUESTION) SqlTestBase.setup_codes(FIELD_TO_QUESTIONNAIRE_MODULE_CODE.values(), code_type=CodeType.MODULE) # Import codes for white and female, but not male or black. SqlTestBase.setup_codes([ RACE_WHITE_CODE, CONSENT_PERMISSION_YES_CODE, RACE_NONE_OF_THESE_CODE, PMI_PREFER_NOT_TO_ANSWER_CODE, CONSENT_PERMISSION_NO_CODE, 'female', 'PIIState_VA', PMI_SKIP_CODE ], code_type=CodeType.ANSWER) participant_dao = ParticipantDao() questionnaire_id = self.create_questionnaire('questionnaire3.json') questionnaire_id_2 = self.create_questionnaire('questionnaire4.json') questionnaire_id_3 = self.create_questionnaire( 'all_consents_questionnaire.json') pl_tucson = make_primary_provider_link_for_name('AZ_TUCSON') pl_test = make_primary_provider_link_for_name('TEST') pl_pitt = make_primary_provider_link_for_name('PITT') with FakeClock(TIME): participant = Participant(participantId=1, biobankId=2, providerLink=pl_tucson) participant_dao.insert(participant) self.send_consent('P1', email='*****@*****.**') # Participant 2 starts out unpaired; later gets paired automatically when their physical # measurements come in. participant2 = Participant(participantId=2, biobankId=3) participant_dao.insert(participant2) self.send_consent('P2', email='*****@*****.**') # Test HPO affiliation; this test participant is ignored. participant3 = Participant(participantId=3, biobankId=4, providerLink=pl_test) participant_dao.insert(participant3) self.send_consent('P3', email='*****@*****.**') # example.com e-mail; this test participant is ignored, too. participant4 = Participant(participantId=4, biobankId=5, providerLink=pl_pitt) participant_dao.insert(participant4) self.send_consent('P4', email='*****@*****.**') participant5 = Participant(participantId=5, biobankId=6, providerLink=pl_tucson) participant_dao.insert(participant5) self.send_consent('P5', email='*****@*****.**') participant6 = Participant(participantId=6, biobankId=7, providerLink=pl_tucson) participant_dao.insert(participant6) self.send_consent('P6', email='*****@*****.**') # Participant that starts at PITT but winds up in TEST; should be ignored. participant7 = Participant(participantId=7, biobankId=8, providerLink=pl_pitt) participant_dao.insert(participant7) self.send_consent('P7', email='*****@*****.**') # Participant that re-pairs and then withdraws; should be ignored. participant8 = Participant(participantId=8, biobankId=9, providerLink=pl_pitt) participant_dao.insert(participant8) self.send_consent('P8', email='*****@*****.**') # Participant that has cancelled biobank order should not have order in metrics. participant9 = Participant(participantId=9, biobankId=10, providerLink=pl_pitt) participant_dao.insert(participant9) self.send_consent('P9', email='*****@*****.**') with FakeClock(TIME_2): # FIXME: The test passes, but the following "update" doesn't actually make much sense. The # providerlink is not changed but the HPO ID actually is (at this point in time # `participant.hpoId` evaluates to 4, which is the value given in `unit_test_util.AZ_HPO_ID`). # The original intent of the test is not clear. # This update to participant has no effect, as the HPO ID didn't change. participant = self._participant_with_defaults( participantId=1, version=1, biobankId=2, hpoId=3, # <<<< Had to add hpoId here, default is UNSET_HPO_ID providerLink=pl_tucson) participant_dao.update(participant) participant8.providerLink = pl_tucson participant_dao.update(participant8) self.submit_questionnaire_response('P1', questionnaire_id, race_code=RACE_WHITE_CODE, gender_code='male', state=PMI_SKIP_CODE, date_of_birth=datetime.date( 1980, 1, 2)) self.submit_questionnaire_response( 'P2', questionnaire_id, race_code=RACE_NONE_OF_THESE_CODE, gender_code=None, state=None, date_of_birth=None) self.submit_questionnaire_response('P5', questionnaire_id, race_code=PMI_SKIP_CODE, gender_code=PMI_SKIP_CODE, state=None, date_of_birth=None) self.submit_questionnaire_response('P6', questionnaire_id, race_code=PMI_SKIP_CODE, gender_code=PMI_SKIP_CODE, state=None, date_of_birth=None) self.submit_questionnaire_response('P9', questionnaire_id, race_code=PMI_SKIP_CODE, gender_code=PMI_SKIP_CODE, state=None, date_of_birth=None) with FakeClock(TIME_3): t3 = TIME_3.strftime(TIME_FORMAT) # Re-pair the original participant participant.version = 2 participant.providerLink = pl_pitt participant_dao.update(participant) participant7.providerLink = pl_test participant_dao.update(participant7) participant8.withdrawalStatus = WithdrawalStatus.NO_USE participant8.withdrawalReason = WithdrawalReason.TEST participant8.withdrawalReasonJustification = 'test account' participant_dao.update(participant8) self.send_post('Participant/P2/PhysicalMeasurements', load_measurement_json(2, t3)) self.send_post('Participant/P2/BiobankOrder', load_biobank_order_json(2)) self.submit_questionnaire_response('P1', questionnaire_id, race_code='black', gender_code='female', state=None, date_of_birth=datetime.date( 1980, 1, 3)) self.submit_questionnaire_response( 'P2', questionnaire_id, race_code=None, gender_code=PMI_PREFER_NOT_TO_ANSWER_CODE, state=None, date_of_birth=None) self.submit_questionnaire_response('P2', questionnaire_id_2, race_code=None, gender_code=None, state='PIIState_VA', date_of_birth=None) self.submit_questionnaire_response('P6', questionnaire_id_2, race_code=None, gender_code=None, state='PIIState_VA', date_of_birth=None) self.submit_consent_questionnaire_response( 'P1', questionnaire_id_3, CONSENT_PERMISSION_NO_CODE) self.submit_consent_questionnaire_response( 'P2', questionnaire_id_3, CONSENT_PERMISSION_YES_CODE) self.submit_consent_questionnaire_response( 'P6', questionnaire_id_3, CONSENT_PERMISSION_YES_CODE) path = 'Participant/P9/BiobankOrder' new_order = self.send_post(path, load_biobank_order_json(9)) path = path + '/' + new_order['id'] self.send_get(path) self.send_patch(path, request_data=cancel_biobank_order(), headers={'If-Match': 'W/"1"'}) sample_dao = BiobankStoredSampleDao() sample_dao.insert( BiobankStoredSample(biobankStoredSampleId='abc', biobankId=2, biobankOrderIdentifier='KIT', test='test', confirmed=TIME_2)) sample_dao.insert( BiobankStoredSample(biobankStoredSampleId='def', biobankId=3, biobankOrderIdentifier='KIT', test='1SAL', confirmed=TIME_2)) sample_dao.insert( BiobankStoredSample(biobankStoredSampleId='xyz', biobankId=4, biobankOrderIdentifier='KIT', test='1SAL', confirmed=TIME_2)) # participant 6 withdrawl shouldn't be in csv's. participant6.withdrawalStatus = WithdrawalStatus.NO_USE participant_dao.update(participant6)
def setUp(self, **kwargs): super(MetricsEhrMultiEndpointTest, self).setUp(**kwargs) # # insert some test data # for date in iter_dates( datetime.date(2017, 12, 30), datetime.date(2018, 2, 1) ): calendar_day = Calendar(day=date) CalendarDao().insert(calendar_day) # noinspection PyArgumentList participant_1 = Participant(participantId=1, biobankId=1) summary_1 = self._make_participant( participant_1, 'Alice', 'Aardvark', self.hpo_foo, self.org_foo_a, time_int=datetime.datetime(2018, 1, 2), time_mem=datetime.datetime(2018, 1, 3), time_study=datetime.datetime(2018, 1, 3), time_fp=datetime.datetime(2018, 1, 4) ) self._update_ehr( summary_1, update_time=datetime.datetime(2018, 1, 5) ) # noinspection PyArgumentList participant_2 = Participant(participantId=2, biobankId=2) summary_2 = self._make_participant( participant_2, 'Bo', 'Badger', self.hpo_bar, self.org_bar_a, time_int=datetime.datetime(2018, 1, 3), time_mem=datetime.datetime(2018, 1, 4), time_study=datetime.datetime(2018, 1, 4), time_fp=datetime.datetime(2018, 1, 5) ) self._update_ehr( summary_2, update_time=datetime.datetime(2018, 1, 6) ) # noinspection PyArgumentList participant_3 = Participant(participantId=3, biobankId=3) self._make_participant( participant_3, 'Cheryl', 'Caterpillar', self.hpo_bar, self.org_bar_a, time_int=datetime.datetime(2018, 1, 3), time_mem=datetime.datetime(2018, 1, 4), time_study=datetime.datetime(2018, 1, 4), time_fp=datetime.datetime(2018, 1, 5) ) participant_3.withdrawalStatus = WithdrawalStatus.NO_USE self.dao.update(participant_3) # noinspection PyArgumentList participant_4 = Participant(participantId=4, biobankId=4) self._make_participant( participant_4, 'Dan', 'Donkey', self.hpo_bar, self.org_bar_a, time_int=datetime.datetime(2018, 1, 3), time_mem=datetime.datetime(2018, 1, 4), time_study=datetime.datetime(2018, 1, 4), time_fp=datetime.datetime(2018, 1, 5) ) participant_4.isGhostId = True self.dao.update(participant_4) # noinspection PyArgumentList participant_5 = Participant(participantId=5, biobankId=5) self._make_participant( participant_5, 'Elia', 'Elephant', self.hpo_bar, self.org_bar_a, time_int=datetime.datetime(2018, 1, 3), time_mem=datetime.datetime(2018, 1, 4), time_study=datetime.datetime(2018, 1, 4), time_fp=datetime.datetime(2018, 1, 5) ) # noinspection PyArgumentList participant_6 = Participant(participantId=6, biobankId=6) self._make_participant( participant_6, 'Elia', 'Elephant', self.hpo_bar, self.org_bar_a, time_int=datetime.datetime(2018, 1, 3), time_mem=datetime.datetime(2018, 1, 4), time_fp=datetime.datetime(2018, 1, 5) )