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))
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)
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)
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
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
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)
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