Esempio n. 1
0
def test_microsecond_truncation():
    """Microseconds should be rounded in FHIR output"""
    sample = datetime.utcnow()
    sample = sample.replace(tzinfo=pytz.utc)

    if sample.microsecond == 0:
        sample = sample.replace(microsecond=1234567890)
    assert sample.isoformat() != FHIR_datetime.as_fhir(sample)

    expected = sample.replace(microsecond=0)
    assert expected.isoformat() == FHIR_datetime.as_fhir(sample)
Esempio n. 2
0
def test_microsecond_truncation():
    """Microseconds should be rounded in FHIR output"""
    sample = datetime.utcnow()
    sample = sample.replace(tzinfo=pytz.utc)

    if sample.microsecond == 0:
        sample = sample.replace(microsecond=1234567890)
    assert sample.isoformat() != FHIR_datetime.as_fhir(sample)

    expected = sample.replace(microsecond=0)
    assert expected.isoformat() == FHIR_datetime.as_fhir(sample)
 def test_get_user_documents(self):
     """tests get the list of user documents for a user"""
     now = datetime.utcnow()
     ud1 = UserDocument(
         document_type="TestFile", uploaded_at=now,
         filename="test_file_1.txt", filetype="txt", uuid="012345")
     ud2 = UserDocument(
         document_type="AlternateTestFile", uploaded_at=now,
         filename="test_file_2.txt", filetype="txt", uuid="098765")
     self.test_user.documents.append(ud1)
     self.test_user.documents.append(ud2)
     with SessionScope(db):
         db.session.commit()
     self.test_user = db.session.merge(self.test_user)
     self.login()
     response = self.client.get(
         '/api/user/{}/user_documents'.format(TEST_USER_ID))
     assert response.status_code == 200
     assert len(response.json['user_documents']) == 2
     # tests document_type filter
     response = self.client.get(
         '/api/user/{}/user_documents?document_type=TestFile'.format(
             TEST_USER_ID))
     assert response.status_code == 200
     assert len(response.json['user_documents']) == 1
     assert (response.json['user_documents'][0]['uploaded_at']
             == FHIR_datetime.as_fhir(now))
 def test_get_user_documents(self):
     """tests get the list of user documents for a user"""
     now = datetime.utcnow()
     ud1 = UserDocument(document_type="TestFile",
                        uploaded_at=now,
                        filename="test_file_1.txt",
                        filetype="txt",
                        uuid="012345")
     ud2 = UserDocument(document_type="AlternateTestFile",
                        uploaded_at=now,
                        filename="test_file_2.txt",
                        filetype="txt",
                        uuid="098765")
     self.test_user.documents.append(ud1)
     self.test_user.documents.append(ud2)
     with SessionScope(db):
         db.session.commit()
     self.test_user = db.session.merge(self.test_user)
     self.login()
     rv = self.client.get(
         '/api/user/{}/user_documents'.format(TEST_USER_ID))
     self.assert200(rv)
     self.assertEqual(len(rv.json['user_documents']), 2)
     # tests document_type filter
     rv = self.client.get(
         '/api/user/{}/user_documents?document_type=TestFile'.format(
             TEST_USER_ID))
     self.assert200(rv)
     self.assertEqual(len(rv.json['user_documents']), 1)
     self.assertEqual(rv.json['user_documents'][0]['uploaded_at'],
                      FHIR_datetime.as_fhir(now))
Esempio n. 5
0
def test_tz_aware_output():
    """FHIR_datetime.as_fhir() should always be tz aware (UTC)"""
    unaware = datetime(2016, 7, 15, 9, 20, 37, 0)

    # generate fhir - expect UTC tz info at end
    isostring = FHIR_datetime.as_fhir(unaware)
    assert isostring[-6:] == '+00:00'
Esempio n. 6
0
def test_tz_aware_output():
    """FHIR_datetime.as_fhir() should always be tz aware (UTC)"""
    unaware = datetime(2016, 7, 15, 9, 20, 37, 0)

    # generate fhir - expect UTC tz info at end
    isostring = FHIR_datetime.as_fhir(unaware)
    assert isostring[-6:] == '+00:00'
    def test_rp_alteration(self):
        # orgs with old rp should migrate to multiple w/ updated retired
        from portal.system_uri import SHORTCUT_ALIAS, TRUENTH_CR_NAME
        from portal.models.identifier import Identifier

        rp1 = ResearchProtocol(name='initial')
        rp2 = ResearchProtocol(name='replacement')
        org = Organization(name='testy')
        org.research_protocols.append(rp1)
        with SessionScope(db):
            db.session.add(rp2)
            db.session.add(org)
            db.session.commit()
        mp = ModelPersistence(Organization,
                              lookup_field='id',
                              sequence_name='organizations_id_seq',
                              target_dir=self.tmpdir)
        mp.export()

        # Add second rp, mark old as retired
        with open(os.path.join(self.tmpdir, 'Organization.json'),
                  'r') as pfile:
            data = json.load(pfile)

        now = datetime.utcnow().replace(microsecond=0)
        updated = {
            'url':
            ResearchProtocolExtension.extension_url,
            'research_protocols': [{
                "name": 'replacement'
            }, {
                "name": 'initial',
                "retired_as_of": FHIR_datetime.as_fhir(now)
            }]
        }
        for i, entry in enumerate(data['entry']):
            if entry['name'] != 'testy':
                continue
            extensions = entry['extension']
            keepers = [
                ext for ext in extensions
                if ext['url'] != ResearchProtocolExtension.extension_url
            ]
            keepers.append(updated)
            data['entry'][i]['extension'] = keepers

        with open(os.path.join(self.tmpdir, 'Organization.json'),
                  'w') as pfile:
            pfile.write(json.dumps(data))

        mp.import_(keep_unmentioned=False)
        org = Organization.query.filter(Organization.name == 'testy').one()
        assert len(org.research_protocols) == 2

        # Make sure retired_as_of was set properly on old
        rp1, rp2 = map(db.session.merge, (rp1, rp2))
        expected = [(rp2, None), (rp1, now)]
        results = [(rp, retired) for rp, retired in org.rps_w_retired()]
        assert results == expected
    def test_submit_assessment_for_qb(self):
        swagger_spec = swagger(self.app)
        data = swagger_spec['definitions']['QuestionnaireResponse']['example']

        rp = ResearchProtocol(name='proto')
        with SessionScope(db):
            db.session.add(rp)
            db.session.commit()
        rp = db.session.merge(rp)
        rp_id = rp.id

        qn = self.add_questionnaire(name='epic26')
        org = Organization(name="testorg")
        org.research_protocols.append(rp)
        with SessionScope(db):
            db.session.add(qn)
            db.session.add(org)
            db.session.commit()

        qn, org = map(db.session.merge, (qn, org))
        qb = QuestionnaireBank(
            name='Test Questionnaire Bank',
            classification='baseline',
            research_protocol_id=rp_id,
            start='{"days": 0}',
            overdue='{"days": 7}',
            expired='{"days": 90}')
        qbq = QuestionnaireBankQuestionnaire(questionnaire=qn, rank=0)
        qb.questionnaires.append(qbq)

        test_user = get_user(TEST_USER_ID)
        test_user.organizations.append(org)
        authored = FHIR_datetime.parse(data['authored'])
        audit = Audit(user_id=TEST_USER_ID, subject_id=TEST_USER_ID)
        uc = UserConsent(
            user_id=TEST_USER_ID, organization=org,
            audit=audit, agreement_url='http://no.com',
            acceptance_date=authored)

        with SessionScope(db):
            db.session.add(qb)
            db.session.add(test_user)
            db.session.add(audit)
            db.session.add(uc)
            db.session.commit()

        self.promote_user(role_name=ROLE.PATIENT.value)
        self.login()
        response = self.client.post(
            '/api/patient/{}/assessment'.format(TEST_USER_ID), json=data)
        assert response.status_code == 200
        test_user = get_user(TEST_USER_ID)
        qb = db.session.merge(qb)
        assert test_user.questionnaire_responses.count() == 1
        assert (
            test_user.questionnaire_responses[0].questionnaire_bank_id
            == qb.id)
Esempio n. 9
0
    def test_submit_assessment_for_qb(self):
        swagger_spec = swagger(self.app)
        data = swagger_spec['definitions']['QuestionnaireResponse']['example']

        rp = ResearchProtocol(name='proto')
        with SessionScope(db):
            db.session.add(rp)
            db.session.commit()
        rp = db.session.merge(rp)
        rp_id = rp.id

        qn = self.add_questionnaire(name='epic26')
        org = Organization(name="testorg")
        org.research_protocols.append(rp)
        with SessionScope(db):
            db.session.add(qn)
            db.session.add(org)
            db.session.commit()

        qn, org = map(db.session.merge, (qn, org))
        qb = QuestionnaireBank(name='Test Questionnaire Bank',
                               classification='baseline',
                               research_protocol_id=rp_id,
                               start='{"days": 0}',
                               overdue='{"days": 7}',
                               expired='{"days": 90}')
        qbq = QuestionnaireBankQuestionnaire(questionnaire=qn, rank=0)
        qb.questionnaires.append(qbq)

        test_user = get_user(TEST_USER_ID)
        test_user.organizations.append(org)
        authored = FHIR_datetime.parse(data['authored'])
        audit = Audit(user_id=TEST_USER_ID, subject_id=TEST_USER_ID)
        uc = UserConsent(user_id=TEST_USER_ID,
                         organization=org,
                         audit=audit,
                         agreement_url='http://no.com',
                         acceptance_date=authored)

        with SessionScope(db):
            db.session.add(qb)
            db.session.add(test_user)
            db.session.add(audit)
            db.session.add(uc)
            db.session.commit()

        self.promote_user(role_name=ROLE.PATIENT.value)
        self.login()
        response = self.client.post(
            '/api/patient/{}/assessment'.format(TEST_USER_ID), json=data)
        assert response.status_code == 200
        test_user = get_user(TEST_USER_ID)
        qb = db.session.merge(qb)
        assert test_user.questionnaire_responses.count() == 1
        assert (test_user.questionnaire_responses[0].questionnaire_bank_id ==
                qb.id)
Esempio n. 10
0
def test_tz_aware_conversion():
    eastern = pytz.timezone('US/Eastern')
    aware = datetime(2016, 7, 15, 9, 20, 37, 0, eastern)
    parsed = FHIR_datetime.parse(aware.strftime("%Y-%m-%dT%H:%M:%S%z"))
    # FHIR_datetime converts to UTC and strips the tzinfo
    # for safe comparisons with other tz unaware strings
    assert parsed.tzinfo is None
    # Add it back in to confirm values match
    parsed = parsed.replace(tzinfo=pytz.utc)
    assert aware == parsed
Esempio n. 11
0
def test_tz_aware_conversion():
    eastern = pytz.timezone('US/Eastern')
    aware = datetime(2016, 7, 15, 9, 20, 37, 0, eastern)
    parsed = FHIR_datetime.parse(aware.strftime("%Y-%m-%dT%H:%M:%S%z"))
    # FHIR_datetime converts to UTC and strips the tzinfo
    # for safe comparisons with other tz unaware strings
    assert parsed.tzinfo is None
    # Add it back in to confirm values match
    parsed = parsed.replace(tzinfo=pytz.utc)
    assert aware == parsed
    def test_rp_alteration(self):
        # orgs with old rp should migrate to multiple w/ updated retired
        from portal.system_uri import SHORTCUT_ALIAS, TRUENTH_CR_NAME
        from portal.models.identifier import Identifier

        rp1 = ResearchProtocol(name='initial')
        rp2 = ResearchProtocol(name='replacement')
        org = Organization(name='testy')
        org.research_protocols.append(rp1)
        with SessionScope(db):
            db.session.add(rp2)
            db.session.add(org)
            db.session.commit()
        mp = ModelPersistence(
            Organization, lookup_field='id',
            sequence_name='organizations_id_seq',
            target_dir=self.tmpdir)
        mp.export()

        # Add second rp, mark old as retired
        with open(
                os.path.join(self.tmpdir, 'Organization.json'), 'r') as pfile:
            data = json.load(pfile)

        now = datetime.utcnow().replace(microsecond=0)
        updated = {
            'url': ResearchProtocolExtension.extension_url,
            'research_protocols': [
                {"name": 'replacement'},
                {"name": 'initial', "retired_as_of": FHIR_datetime.as_fhir(
                    now)}]}
        for i, entry in enumerate(data['entry']):
            if entry['name'] != 'testy':
                continue
            extensions = entry['extension']
            keepers = [
                ext for ext in extensions
                if ext['url'] != ResearchProtocolExtension.extension_url]
            keepers.append(updated)
            data['entry'][i]['extension'] = keepers

        with open(
                os.path.join(self.tmpdir, 'Organization.json'), 'w') as pfile:
            pfile.write(json.dumps(data))

        mp.import_(keep_unmentioned=False)
        org = Organization.query.filter(Organization.name == 'testy').one()
        assert len(org.research_protocols) == 2

        # Make sure retired_as_of was set properly on old
        rp1, rp2 = map(db.session.merge, (rp1, rp2))
        expected = [(rp2, None), (rp1, now)]
        results = [(rp, retired) for rp, retired in org.rps_w_retired()]
        assert results == expected
Esempio n. 13
0
 def test_deceased(self):
     self.promote_user(role_name=ROLE.PATIENT.value)
     self.login()
     now = FHIR_datetime.as_fhir(datetime.utcnow())
     data = {'deceasedDateTime': now}
     response = self.client.post(
         '/api/patient/{}/deceased'.format(TEST_USER_ID),
         content_type='application/json',
         data=json.dumps(data))
     assert response.status_code == 200
     user = User.query.get(TEST_USER_ID)
     assert user.deceased
Esempio n. 14
0
 def test_deceased(self):
     self.promote_user(role_name=ROLE.PATIENT.value)
     self.login()
     now = FHIR_datetime.as_fhir(datetime.utcnow())
     data = {'deceasedDateTime': now}
     response = self.client.post(
         '/api/patient/{}/deceased'.format(TEST_USER_ID),
         content_type='application/json',
         data=json.dumps(data))
     assert response.status_code == 200
     user = User.query.get(TEST_USER_ID)
     assert user.deceased
Esempio n. 15
0
    def test_post_user_future_consent_date(self):
        """Shouldn't allow future consent date"""
        self.shallow_org_tree()
        org1 = Organization.query.filter(Organization.id > 0).first()
        acceptance_date = datetime.utcnow() + relativedelta(days=1)
        data = {'organization_id': org1.id,
                'agreement_url': self.url,
                'acceptance_date': FHIR_datetime.as_fhir(acceptance_date)}

        self.login()
        response = self.client.post(
            '/api/user/{}/consent'.format(TEST_USER_ID),
            json=data,
        )
        assert response.status_code == 400
 def test_int_date(self):
     # integer value shouldn't generate parser error
     acceptance_date = 1394413200000
     with pytest.raises(BadRequest) as e:
         dt = FHIR_datetime.parse(acceptance_date, 'acceptance date')
     assert 'acceptance date' in str(e)
Esempio n. 17
0
def test_tz_unaware_conversion():
    unaware = datetime(2016, 7, 15, 9, 20, 37, 0)
    parsed = FHIR_datetime.parse(unaware.strftime("%Y-%m-%dT%H:%M:%S"))
    assert unaware == parsed
Esempio n. 18
0
 def test_int_date(self):
     # integer value shouldn't generate parser error
     acceptance_date = 1394413200000
     with pytest.raises(BadRequest) as e:
         dt = FHIR_datetime.parse(acceptance_date, 'acceptance date')
     assert 'acceptance date' in str(e)
Esempio n. 19
0
def test_tz_unaware_conversion():
    unaware = datetime(2016, 7, 15, 9, 20, 37, 0)
    parsed = FHIR_datetime.parse(unaware.strftime("%Y-%m-%dT%H:%M:%S"))
    assert unaware == parsed