def test_workup_signing(self): ''' Verify that singing is possible for attendings, and not for others. ''' wu_url = "workup-sign" self.wu.diagnosis_categories.add(models.DiagnosisType.objects.first()) self.wu.save() # Fresh workups should be unsigned self.assertFalse(self.wu.signed()) # Providers with can_attend == False should not be able to sign for nonattesting_role in ["Preclinical", "Clinical", "Coordinator"]: log_in_provider(self.client, build_provider([nonattesting_role])) response = self.client.get(reverse(wu_url, args=(self.wu.id, ))) self.assertRedirects(response, reverse('workup', args=(self.wu.id, ))) self.assertFalse(models.Workup.objects.get(pk=self.wu.id).signed()) # Providers able to attend should be able to sign. log_in_provider(self.client, build_provider(["Attending"])) response = self.client.get(reverse(wu_url, args=(self.wu.id, ))) self.assertRedirects( response, reverse('workup', args=(self.wu.id, )), ) # the self.wu has been updated, so we have to hit the db again. self.assertTrue(models.Workup.objects.get(pk=self.wu.id).signed())
def test_workup_update(self): ''' Updating should be possible always for attendings, only without attestation for non-attendings. ''' # if the wu is unsigned, all can access update. for role in ["Preclinical", "Clinical", "Coordinator", "Attending"]: log_in_provider(self.client, build_provider([role])) response = self.client.get( reverse('workup-update', args=(self.wu.id, ))) self.assertEqual(response.status_code, 200) self.wu.sign(build_provider(["Attending"]).associated_user) self.wu.save() # nonattesting cannot access for role in ["Preclinical", "Clinical", "Coordinator"]: log_in_provider(self.client, build_provider([role])) response = self.client.get( reverse('workup-update', args=(self.wu.id, ))) self.assertRedirects(response, reverse('workup', args=(self.wu.id, ))) # attesting can log_in_provider(self.client, build_provider(["Attending"])) response = self.client.get( reverse('workup-update', args=(self.wu.id, ))) self.assertEqual(response.status_code, 200)
def test_core_patient_detail_collapseable(self): """Ensure that collapsable AI lists open and close with AIs inside """ build_provider(username='******', password='******', roles=["Attending"]) self.selenium.get('%s%s' % (self.live_server_url, '/')) self.submit_login('timmy', 'password') ai_prototype = { 'instruction': models.ActionInstruction.objects.first(), 'comments': "", 'author_type': models.ProviderType.objects.first(), 'patient': models.Patient.objects.first() } models.ActionItem.objects.create( due_date=now().today(), author=models.Provider.objects.first(), **ai_prototype) yesterday = now().date() - datetime.timedelta(days=1) models.ActionItem.objects.create( due_date=yesterday, author=models.Provider.objects.first(), **ai_prototype) self.selenium.get( '%s%s' % (self.live_server_url, reverse('core:patient-detail', args=(1, )))) WebDriverWait(self.selenium, 2).until( EC.presence_of_element_located((By.ID, 'toggle-collapse5'))) self.assertFalse( self.selenium.find_element_by_id( 'collapse5').find_element_by_xpath('./ul/li').is_displayed()) self.assertEqual( len( self.selenium.find_element_by_id( 'collapse5').find_elements_by_xpath('./ul/li')), 2) self.selenium.find_element_by_id('toggle-collapse5').click() WebDriverWait(self.selenium, 2).until( EC.presence_of_element_located( (By.XPATH, '//div[@class="panel-collapse collapse in"]'))) self.assertEqual( len( self.selenium.find_element_by_id( 'collapse5').find_elements_by_xpath('./ul/li')), 2) self.assertTrue( self.selenium.find_element_by_id( 'collapse5').find_element_by_xpath('./ul/li').is_displayed())
def test_core_view_rendering(self): ''' Test that core urls render correctly, as determined by the existance of a jumbotron at the top. ''' from . import urls from django.urls import NoReverseMatch # build a provider and log in. build_provider(username='******', password='******', roles=["Attending"]) self.selenium.get('%s%s' % (self.live_server_url, '/')) self.submit_login('timmy', 'password') for url in urls.urlpatterns: # except 'choose-clintype' and action item modifiers from test # since they're redirects. if url.name in [ 'choose-clintype', 'done-action-item', 'reset-action-item', 'document-detail', 'document-update', 'update-action-item' ]: # TODO: add test data for documents so document-detail and # document-update can be tested as well. continue # all the URLs have either one parameter or none. Try one # parameter first; if that fails, try with none. try: self.selenium.get( '%s%s' % (self.live_server_url, reverse(url.name, args=(1, )))) except NoReverseMatch: self.selenium.get('%s%s' % (self.live_server_url, reverse(url.name))) WebDriverWait(self.selenium, 10).until( EC.presence_of_element_located( (By.XPATH, '//div[@class="jumbotron"]'))) jumbotron_elements = self.selenium.find_elements_by_xpath( '//div[@class="jumbotron"]') self.assertNotEqual(len(jumbotron_elements), 0, msg=" ".join([ "Expected the URL ", url.name, " to have a jumbotron element." ]))
def setUp(self): models.ClinicDate.objects.create( clinic_type=models.ClinicType.objects.first(), clinic_date=now().date()) self.provider = build_provider() log_in_provider(self.client, self.provider) self.wu = models.Workup.objects.create( clinic_day=models.ClinicDate.objects.first(), chief_complaint="SOB", diagnosis="MI", HPI="A", PMH_PSH="B", meds="C", allergies="D", fam_hx="E", soc_hx="F", ros="", pe="", A_and_P="", author=models.Provider.objects.first(), author_type=ProviderType.objects.first(), patient=Patient.objects.first())
def setUp(self): log_in_provider(self.client, build_provider()) self.contact_method = ContactMethod.objects.create( name="Carrier Pidgeon") self.contact_result = ContactResult.objects.create( name="Reached on phone", patient_reached=True) self.pt = Patient.objects.create( first_name="Juggie", last_name="Brodeltein", middle_name="Bayer", phone='+49 178 236 5288', gender=Gender.objects.first(), address='Schulstrasse 9', city='Munich', state='BA', zip_code='63108', pcp_preferred_zip='63018', date_of_birth=datetime.date(1990, 1, 1), patient_comfortable_with_english=False, preferred_contact_method=self.contact_method, ) self.reftype = ReferralType.objects.create( name="Specialty", is_fqhc=False) self.refloc = ReferralLocation.objects.create( name='COH', address='Euclid Ave.') self.refloc.care_availiable.add(self.reftype) self.no_show_reason = NoShowReason.objects.create(name="Hella busy.")
def setUp(self): log_in_provider(self.client, build_provider()) self.pt = Patient.objects.create( first_name="Juggie", last_name="Brodeltein", middle_name="Bayer", phone='+49 178 236 5288', gender=Gender.objects.first(), address='Schulstrasse 9', city='Munich', state='BA', zip_code='63108', pcp_preferred_zip='63018', date_of_birth=datetime.date(1990, 1, 1), patient_comfortable_with_english=False, ) self.series_type = models.VaccineSeriesType.objects.create( name="Hepatitis A") self.series = models.VaccineSeries.objects.create( author=Provider.objects.first(), author_type=ProviderType.objects.first(), patient=self.pt, kind=self.series_type) self.vai = models.VaccineActionItem.objects.create( instruction=ActionInstruction.objects.create( instruction="Please call"), due_date=datetime.date.today(), comments="", author=Provider.objects.first(), author_type=ProviderType.objects.first(), patient=self.pt, vaccine=self.series)
def setUp(self): models.ClinicDate.objects.create( clinic_type=models.ClinicType.objects.first(), clinic_date=now().date()) # roles=["AP", "C", "PV", "CV"]) self.all_roles_provider = build_provider() self.wu = models.Workup.objects.create( clinic_day=models.ClinicDate.objects.first(), chief_complaint="SOB", diagnosis="MI", HPI="A", PMH_PSH="B", meds="C", allergies="D", fam_hx="E", author=Provider.objects.first(), soc_hx="F", ros="", pe="", A_and_P="", author_type=ProviderType.objects.filter( signs_charts=False).first(), patient=Patient.objects.first()) self.pn = models.ProgressNote.objects.create( title='Good', text='very good', author=Provider.objects.first(), author_type=ProviderType.objects.filter( signs_charts=False).first(), patient=Patient.objects.first())
def test_all_roles_provider_wu_signing(self): # roles=["AP", "C", "PV", "CV"], username=None, # password='******', email=None) all_roles_provider = build_provider() # test that if a provider tries to sign a chart with a provider # type they do not have, an error is thrown with self.assertRaises(ValueError): self.wu.sign(all_roles_provider.associated_user, active_role=ProviderType(long_name="Test Provider", short_name="TP", signs_charts=False, staff_view=False)) self.assertFalse(self.wu.signed()) with self.assertRaises( ValueError ): # test that with active_role=None, an error is thrown self.wu.sign(all_roles_provider.associated_user) self.assertFalse(self.wu.signed()) # test that provider given all roles can sign a chart if their active role allows for it self.wu.sign( all_roles_provider.associated_user, active_role=ProviderType.objects.filter(signs_charts=True).first()) self.assertTrue(self.wu.signed())
def test_one_role_provider_wu_signing( self ): # test that provider given one role will use that roll, and can only sign chart if ProviderType allows for it for role in [ "Preclinical", "Clinical", "Coordinator", "Attending" ]: # ProviderType is not Iterable, even though the QuerySet should be iterable? one_role_provider = build_provider(roles=[role]) if one_role_provider.clinical_roles.first().signs_charts: self.wu.sign(one_role_provider.associated_user) self.assertTrue(self.wu.signed()) else: # one_role_provider.signs_charts = False with self.assertRaises(ValueError): self.wu.sign(one_role_provider.associated_user) self.assertFalse(self.wu.signed()) with self.assertRaises( ValueError ): # test that a non-Attending provider cannot use the Attending role to sign a chart self.wu.sign(one_role_provider.associated_user, active_role=ProviderType.objects.filter( signs_charts=True).first()) self.assertFalse(self.wu.signed()) self.wu.signer = None # reset chart's signed status
def setUp(self): # build an attending and a clinical student self.attending = build_provider(roles=["Attending"], email='*****@*****.**') self.clinical_student = build_provider(roles=["Clinical"], email='*****@*****.**') log_in_provider(self.client, self.attending) self.wu_info = dict(chief_complaint="SOB", diagnosis="MI", HPI="A", PMH_PSH="B", meds="C", allergies="D", fam_hx="E", soc_hx="F", ros="", pe="", A_and_P="") # prepare a patient with an unsigned wu today, in addition to # what comes in in the fixture self.clinic_today = ClinicDate.objects.create( clinic_type=ClinicType.objects.first(), clinic_date=now().date()) self.pt2 = Patient.objects.create( first_name="Arthur", last_name="Miller", middle_name="", phone='+49 178 236 5288', gender=Gender.objects.first(), address='Schulstrasse 9', city='Munich', state='BA', zip_code='63108', pcp_preferred_zip='63018', date_of_birth=datetime.date(1994, 1, 22), patient_comfortable_with_english=False, preferred_contact_method=ContactMethod.objects.first(), ) self.wu2 = Workup.objects.create( clinic_day=self.clinic_today, author=self.clinical_student, author_type=self.clinical_student.clinical_roles.first(), patient=self.pt2, **self.wu_info)
def setUp(self): """ Provides the same context in all the tests """ log_in_provider(self.client, build_provider()) self.contact_method = ContactMethod.objects.create( name="Carrier Pidgeon") self.pt = Patient.objects.create( first_name="Juggie", last_name="Brodeltein", middle_name="Bayer", phone='+49 178 236 5288', gender=Gender.objects.first(), address='Schulstrasse 9', city='Munich', state='BA', zip_code='63108', pcp_preferred_zip='63018', date_of_birth=datetime.date(1990, 1, 1), patient_comfortable_with_english=False, preferred_contact_method=self.contact_method, ) reftype = ReferralType.objects.create( name="Specialty", is_fqhc=False) refloc = ReferralLocation.objects.create( name='COH', address='Euclid Ave.') refloc.care_availiable.add(reftype) self.referral = models.Referral.objects.create( comments="Needs his back checked", status=models.Referral.STATUS_PENDING, kind=reftype, author=Provider.objects.first(), author_type=ProviderType.objects.first(), patient=self.pt ) self.referral.location.add(refloc) self.followup_request = models.FollowupRequest.objects.create( referral=self.referral, contact_instructions="Call him", due_date=datetime.date(2018, 9, 1), author=Provider.objects.first(), author_type=ProviderType.objects.first(), patient=self.pt ) self.successful_res = ContactResult.objects.create( name="Got him", patient_reached=True) self.unsuccessful_res = ContactResult.objects.create( name="Disaster", patient_reached=False) # Need to update referral location self.referral_location = ReferralLocation.objects.create( name="Franklin's Back Adjustment", address="1435 Sillypants Drive") self.noapt_reason = NoAptReason.objects.create( name="better things to do") self.noshow_reason = NoShowReason.objects.create( name="Hella busy.")
def test_login(self): ''' Test the login sequence for one clinical role and mulitiple clinical roles. ''' build_provider(username='******', password='******') # any valid URL should redirect to login at this point. self.selenium.get('%s%s' % (self.live_server_url, '/')) self.submit_login('jrporter', 'password') # now we should have to choose a clinical role self.assertEqual( self.selenium.current_url, '%s%s%s' % (self.live_server_url, reverse('core:choose-clintype'), '?next=' + reverse('dashboard-dispatch'))) self.selenium.find_element_by_xpath( '//input[@value="Coordinator"]').click() self.selenium.find_element_by_xpath('//button[@type="submit"]').click() # import time # time.sleep(10) # self.selenium.get_screenshot_as_file('screencap.png') WebDriverWait(self.selenium, 10).until( EC.presence_of_element_located((By.ID, "id_pt_1_activept"))) self.assertEqual(self.selenium.current_url, '%s%s' % (self.live_server_url, reverse('home'))) self.selenium.get('%s%s' % (self.live_server_url, reverse('logout'))) # make a provider with only one role. build_provider(username='******', password='******', roles=["Attending"]) self.selenium.get('%s%s' % (self.live_server_url, '/')) self.submit_login('timmy', 'password') # now we should be redirected directly to home. self.assertEqual( self.selenium.current_url, '%s%s' % (self.live_server_url, reverse('dashboard-attending')))
def setUp(self): self.provider = log_in_provider( self.client, build_provider()) models.ClinicType.objects.create(name="Basic Care Clinic") models.ClinicDate.objects.create( clinic_type=models.ClinicType.objects.first(), clinic_date=now().date())
def setUp(self): log_in_provider(self.client, build_provider()) models.IncomeRange.objects.create(name="Default") models.EducationLevel.objects.create(name="Default") models.WorkStatus.objects.create(name="Default") models.ResourceAccess.objects.create(name="Default") models.ChronicCondition.objects.create(name="Default") models.TransportationOption.objects.create(name="Default")
def setUp(self): self.all_roles_provider = build_provider() self.apt = models.Appointment.objects.create( comment='test this stuff', clindate=now().date(), author=Provider.objects.first(), author_type=ProviderType.objects.filter( signs_charts=False).first(), patient=Patient.objects.first())
def setUp(self): log_in_provider(self.client, build_provider()) self.ai = ActionItem.objects.create( due_date=datetime.date(2020, 1, 1), author=Provider.objects.first(), instruction=ActionInstruction.objects.create( instruction="Follow up on labs"), comments="I hate tests", author_type=ProviderType.objects.all()[0], patient=Patient.objects.all()[0])
def test_workup_pdf(self): """Verify that pdf download with the correct name """ wu_url = "workup-pdf" self.wu.diagnosis_categories.add(models.DiagnosisType.objects.first()) self.wu.save() for nonstaff_role in ProviderType.objects.filter(staff_view=False): log_in_provider(self.client, build_provider([nonstaff_role])) response = self.client.get(reverse(wu_url, args=(self.wu.id, ))) self.assertRedirects(response, reverse('workup', args=(self.wu.id, ))) for staff_role in ProviderType.objects.filter(staff_view=True): log_in_provider(self.client, build_provider([staff_role.pk])) response = self.client.get(reverse(wu_url, args=(self.wu.id, ))) assert response.status_code == 200
def setUp(self): self.all_roles_provider = build_provider() for i in range(settings.OSLER_MAX_APPOINTMENTS): models.Appointment.objects.create( comment=str(i), clindate=now().date(), author=Provider.objects.first(), author_type=ProviderType.objects.filter( signs_charts=False).first(), patient=Patient.objects.first())
def test_non_signing_provider_wu_signing( self ): # test that provider with no roles that allow for signing the chart cannot sign chart all_roles_provider = build_provider() # self.assertEqual(len(ProviderType.objects.filter(signs_charts=False)), 3) with self.assertRaises(ValueError): self.wu.sign(all_roles_provider.associated_user, active_role=ProviderType.objects.filter( signs_charts=False).first()) self.assertFalse(self.wu.signed())
def setUp(self): self.all_roles_provider = build_provider() log_in_provider(self.client, self.all_roles_provider) self.apt = models.Appointment.objects.create( comment='test this stuff', clindate=now().date(), clintime=time(9, 0), appointment_type='PSYCH_NIGHT', author=Provider.objects.first(), author_type=ProviderType.objects.filter( signs_charts=False).first(), patient=Patient.objects.first())
def test_progressnote_signing(self): """Verify that singing is possible for attendings and not for others. """ sign_url = "progress-note-sign" pn = models.ProgressNote.objects.create( title='Depression', text='so sad does testing work???', patient=Patient.objects.first(), author=models.Provider.objects.first(), author_type=ProviderType.objects.first()) # Fresh notes should be unsigned self.assertFalse(pn.signed()) # Providers with can_attend == False should not be able to sign for nonattesting_role in ["Preclinical", "Clinical", "Coordinator"]: log_in_provider(self.client, build_provider([nonattesting_role])) response = self.client.get(reverse(sign_url, args=(pn.id, ))) self.assertRedirects( response, reverse('progress-note-detail', args=(pn.id, ))) self.assertFalse( models.ProgressNote.objects.get(pk=pn.id).signed()) # Providers able to attend should be able to sign. log_in_provider(self.client, build_provider(["Attending"])) response = self.client.get(reverse(sign_url, args=(pn.id, ))) self.assertRedirects( response, reverse('progress-note-detail', args=(pn.id, )), ) # the pn has been updated, so we have to hit the db again. self.assertTrue(models.ProgressNote.objects.get(pk=pn.id).signed())
def setUp(self): provider = build_provider() log_in_provider(self.client, provider) self.formdata = { 'title': 'Depression', 'text': 'so sad does testing work???', 'patient': Patient.objects.first(), 'author': provider, 'author_type': ProviderType.objects.first() } models.ClinicDate.objects.create( clinic_type=models.ClinicType.objects.first(), clinic_date=now().date())
def setUp(self): log_in_provider(self.client, build_provider()) self.pt = Patient.objects.create( first_name="Juggie", last_name="Brodeltein", middle_name="Bayer", phone='+49 178 236 5288', gender=Gender.objects.first(), address='Schulstrasse 9', city='Munich', state='BA', zip_code='63108', pcp_preferred_zip='63018', date_of_birth=datetime.date(1990, 1, 1), patient_comfortable_with_english=False, )
def test_workup_submit(self): """verify we can submit a valid workup as a signer and nonsigner""" for provider_type in ["Attending", "Clinical"]: provider = build_provider([provider_type]) log_in_provider(self.client, provider) pt_id = Patient.objects.first().pk wu_count = models.Workup.objects.all().count() wu_data = wu_dict(units=True) wu_data['diagnosis_categories'] = [ models.DiagnosisType.objects.first().pk ] wu_data['clinic_day'] = wu_data['clinic_day'].pk r = self.client.post(reverse('new-workup', args=(pt_id, )), data=wu_data) self.assertRedirects( r, reverse("core:patient-detail", args=(pt_id, ))) self.assertEqual(wu_count + 1, models.Workup.objects.all().count()) self.assertEqual(models.Workup.objects.last().signed(), provider.clinical_roles.first().signs_charts)
def setUp(self): self.provider = log_in_provider( self.client, build_provider())
def setUp(self): # build a provider and log in self.provider_password = '******' attending = build_provider(username='******', password=self.provider_password, roles=["Attending"]) coordinator = build_provider(username='******', password=self.provider_password, roles=["Coordinator"]) clinical = build_provider(username='******', password=self.provider_password, roles=["Clinical"]) preclinical = build_provider(username='******', password=self.provider_password, roles=["Preclinical"]) self.providers = { 'attending': attending, 'coordinator': coordinator, 'clinical': clinical, 'preclinical': preclinical } workup_models.ClinicType.objects.create(name="Basic Care Clinic") # various time references used in object creation tomorrow = now().date() + datetime.timedelta(days=1) yesterday = now().date() - datetime.timedelta(days=1) earlier_this_week = now().date() - datetime.timedelta(days=5) last_week = now().date() - datetime.timedelta(days=15) tomorrow_clindate = workup_models.ClinicDate.objects.create( clinic_type=workup_models.ClinicType.objects.first(), clinic_date=tomorrow) yesterday_clindate = workup_models.ClinicDate.objects.create( clinic_type=workup_models.ClinicType.objects.first(), clinic_date=yesterday) last_week_clindate = workup_models.ClinicDate.objects.create( clinic_type=workup_models.ClinicType.objects.first(), clinic_date=earlier_this_week) # log_in_provider(self.client, build_provider(["Attending"])) pt1 = models.Patient.objects.get(pk=1) pt1.toggle_active_status() pt1.save() self.pt1 = pt1 pt_prototype = { 'phone': '+49 178 236 5288', 'gender': models.Gender.objects.all()[1], 'address': 'Schulstrasse 9', 'city': 'Munich', 'state': 'BA', 'zip_code': '63108', 'pcp_preferred_zip': '63018', 'date_of_birth': datetime.date(1990, 1, 1), 'patient_comfortable_with_english': False, 'preferred_contact_method': models.ContactMethod.objects.first(), } self.pt2 = models.Patient.objects.create(first_name="Juggie", last_name="Brodeltein", middle_name="Bayer", **pt_prototype) self.pt3 = models.Patient.objects.create(first_name="Asdf", last_name="Lkjh", middle_name="Bayer", **pt_prototype) self.pt4 = models.Patient.objects.create(first_name="No", last_name="Action", middle_name="Item", **pt_prototype) self.pt5 = models.Patient.objects.create(first_name="No", last_name="Workup", middle_name="Patient", **pt_prototype) self.pt5.case_managers.add(coordinator) wu_prototype = { 'chief_complaint': "SOB", 'diagnosis': "MI", 'HPI': "", 'PMH_PSH': "", 'meds': "", 'allergies': "", 'fam_hx': "", 'soc_hx': "", 'ros': "", 'pe': "", 'A_and_P': "", 'author': self.providers['coordinator'], 'author_type': self.providers['coordinator'].clinical_roles.first(), } # Give self.pt2 a workup one day later. workup_models.Workup.objects.create(clinic_day=tomorrow_clindate, patient=self.pt2, **wu_prototype) # Give pt3 a workup one day ago. workup_models.Workup.objects.create(clinic_day=yesterday_clindate, patient=self.pt3, **wu_prototype) # Give pt1 a signed workup five days ago. workup_models.Workup.objects.create(clinic_day=last_week_clindate, patient=pt1, signer=self.providers['attending'], **wu_prototype) ai_prototype = { 'author': self.providers['coordinator'], 'author_type': self.providers['coordinator'].clinical_roles.first(), 'instruction': models.ActionInstruction.objects.first(), 'comments': "" } # make pt1 have and AI due tomorrow models.ActionItem.objects.create(due_date=tomorrow, patient=pt1, **ai_prototype) # make self.pt2 have an AI due yesterday models.ActionItem.objects.create(due_date=yesterday, patient=self.pt2, **ai_prototype) # make pt3 have an AI that during the test will be marked done models.ActionItem.objects.create(due_date=last_week, patient=self.pt3, **ai_prototype)