Esempio n. 1
0
 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)
Esempio n. 2
0
    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())
Esempio n. 3
0
    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)
Esempio n. 4
0
  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)
    )