def _setup_hpos(self, org_dao=None): hpo_dao = HPODao() hpo_dao.insert( HPO(hpoId=UNSET_HPO_ID, name='UNSET', displayName='Unset', organizationType=OrganizationType.UNSET)) hpo_dao.insert( HPO(hpoId=PITT_HPO_ID, name='PITT', displayName='Pittsburgh', organizationType=OrganizationType.HPO)) hpo_dao.insert( HPO(hpoId=AZ_HPO_ID, name='AZ_TUCSON', displayName='Arizona', organizationType=OrganizationType.HPO)) self.hpo_id = PITT_HPO_ID org_dao = OrganizationDao() org_dao.insert( Organization(organizationId=AZ_ORG_ID, externalId='AZ_TUCSON_BANNER_HEALTH', displayName='Banner Health', hpoId=AZ_HPO_ID)) created_org = org_dao.insert( Organization(organizationId=PITT_ORG_ID, externalId='PITT_BANNER_HEALTH', displayName='PITT display Banner Health', hpoId=PITT_HPO_ID)) self.organization_id = created_org.organizationId site_dao = SiteDao() created_site = site_dao.insert( Site(siteName='Monroeville Urgent Care Center', googleGroup='hpo-site-monroeville', mayolinkClientNumber=7035769, organizationId=PITT_ORG_ID, hpoId=PITT_HPO_ID)) self.site_id = created_site.siteId site_dao.insert( Site(siteName='Phoenix Urgent Care Center', googleGroup='hpo-site-bannerphoenix', mayolinkClientNumber=7035770, organizationId=PITT_ORG_ID, hpoId=PITT_HPO_ID)) site_dao.insert( Site(siteName='Phoenix clinic', googleGroup='hpo-site-clinic-phoenix', mayolinkClientNumber=7035770, organizationId=AZ_ORG_ID, hpoId=AZ_HPO_ID))
def _setup_unset_enrollment_site(self): site_dao = SiteDao() organization_dao = OrganizationDao() org_2 = organization_dao.insert( Organization(externalId='ORG_2', displayName='Organization 2', hpoId=PITT_HPO_ID)) site_dao.insert( Site(siteName='not enrolling site', googleGroup='not_enrolling_dot_com', organizationId=org_2.organizationId, enrollingStatus=EnrollingStatus.UNSET, siteStatus=SiteStatus.INACTIVE))
class SiteDaoTest(SqlTestBase): def setUp(self): super(SiteDaoTest, self).setUp() self.site_dao = SiteDao() def test_get_no_sites(self): self.assertIsNone(self.site_dao.get(9999)) self.assertIsNone( self.site_dao.get_by_google_group('*****@*****.**')) def test_insert(self): site = Site(siteName='site', googleGroup='*****@*****.**', consortiumName='consortium', mayolinkClientNumber=12345, hpoId=PITT_HPO_ID) created_site = self.site_dao.insert(site) new_site = self.site_dao.get(created_site.siteId) site.siteId = created_site.siteId self.assertEquals(site.asdict(), new_site.asdict()) self.assertEquals( site.asdict(), self.site_dao.get_by_google_group( '*****@*****.**').asdict()) def test_update(self): site = Site(siteName='site', googleGroup='*****@*****.**', consortiumName='consortium', mayolinkClientNumber=12345, hpoId=PITT_HPO_ID) created_site = self.site_dao.insert(site) new_site = Site(siteId=created_site.siteId, siteName='site2', googleGroup='*****@*****.**', consortiumName='consortium2', mayolinkClientNumber=123456, hpoId=UNSET_HPO_ID) self.site_dao.update(new_site) fetched_site = self.site_dao.get(created_site.siteId) self.assertEquals(new_site.asdict(), fetched_site.asdict()) self.assertEquals( new_site.asdict(), self.site_dao.get_by_google_group( '*****@*****.**').asdict()) self.assertIsNone( self.site_dao.get_by_google_group('*****@*****.**'))
def _setup_data(self): organization_dao = OrganizationDao() site_dao = SiteDao() org_1 = organization_dao.insert( Organization(externalId='ORG_1', displayName='Organization 1', hpoId=PITT_HPO_ID, resourceId='o123456')) organization_dao.insert( Organization(externalId='AARDVARK_ORG', displayName='Aardvarks Rock', hpoId=PITT_HPO_ID, resourceId='o123457')) site_dao.insert( Site(siteName='Site 1', googleGroup='hpo-site-1', mayolinkClientNumber=123456, organizationId=org_1.organizationId, siteStatus=SiteStatus.ACTIVE, enrollingStatus=EnrollingStatus.ACTIVE, launchDate=datetime.datetime(2016, 1, 1), notes='notes', latitude=12.1, longitude=13.1, directions='directions', physicalLocationName='locationName', address1='address1', address2='address2', city='Austin', state='TX', zipCode='78751', phoneNumber='555-555-5555', adminEmails='[email protected], [email protected]', link='http://www.example.com')) site_dao.insert( Site(siteName='Zebras Rock', googleGroup='aaaaaaa', organizationId=org_1.organizationId, enrollingStatus=EnrollingStatus.INACTIVE, siteStatus=SiteStatus.INACTIVE))
def _setup_hpos(self): hpo_dao = HPODao() hpo_dao.insert(HPO(hpoId=UNSET_HPO_ID, name='UNSET')) hpo_dao.insert( HPO(hpoId=PITT_HPO_ID, name='PITT', organizationType=OrganizationType.HPO)) self.hpo_id = PITT_HPO_ID site_dao = SiteDao() created_site = site_dao.insert( Site(siteName='Monroeville Urgent Care Center', googleGroup='hpo-site-monroeville', consortiumName='Pittsburgh', mayolinkClientNumber=7035769, hpoId=PITT_HPO_ID)) self.site_id = created_site.siteId site_dao.insert( Site(siteName='Phoenix Urgent Care Center', googleGroup='hpo-site-bannerphoenix', consortiumName='Pittsburgh', mayolinkClientNumber=7035770, hpoId=PITT_HPO_ID))
class SyncConsentFilesTest(CloudStorageSqlTestBase, NdbTestBase): """Tests behavior of sync_consent_files """ def setUp(self, **kwargs): super(SyncConsentFilesTest, self).setUp(use_mysql=True, **kwargs) NdbTestBase.doSetUp(self) TestBase.setup_fake(self) self.org_dao = OrganizationDao() self.site_dao = SiteDao() self.participant_dao = ParticipantDao() self.summary_dao = ParticipantSummaryDao() def tearDown(self): super(SyncConsentFilesTest, self).tearDown() def _create_org(self, id_): org = Organization(organizationId=id_, externalId=id_, displayName=id_, hpoId=UNSET_HPO_ID) self.org_dao.insert(org) return org def _create_site(self, id_, google_group): site = Site(siteId=id_, siteName=id_, googleGroup=google_group) self.site_dao.insert(site) return site def _create_participant(self, id_, org_id, site_id, consents=False, ghost=None, email=None, null_email=False): participant = Participant(participantId=id_, biobankId=id_, organizationId=org_id, siteId=site_id, isGhostId=ghost) self.participant_dao.insert(participant) summary = self.participant_summary(participant) if consents: summary.consentForElectronicHealthRecords = 1 summary.consentForStudyEnrollment = 1 if email: summary.email = email if null_email: summary.email = None self.summary_dao.insert(summary) return participant def test_iter_participants_data(self): """should list consenting participants """ org1 = self._create_org(1) org2 = self._create_org(2) site1 = self._create_site(1001, 'group1') site2 = self._create_site(1002, 'group2') self._create_participant(1, org1.organizationId, site1.siteId, consents=True, null_email=True) self._create_participant(2, org2.organizationId, site2.siteId) self._create_participant(3, org1.organizationId, None, consents=True, ghost=False) self._create_participant(4, org1.organizationId, None, consents=True, ghost=True) self._create_participant(5, org1.organizationId, None, consents=True, email='*****@*****.**') participant_data_list = list( sync_consent_files._iter_participants_data()) participant_ids = [d.participant_id for d in participant_data_list] self.assertEqual(len(participant_ids), 2, "finds correct number of results") self.assertEqual(participant_ids, [1, 3], "finds valid participants") self.assertEqual(participant_data_list[0].google_group, 'group1', "Includes google group") self.assertEqual(participant_data_list[1].google_group, None, "allows None for google group") @mock.patch('cloudstorage.listbucket') @mock.patch('cloudstorage.copy2') def test_cloudstorage_copy_objects_api_calls(self, mock_copy2, mock_listbucket): """Makes the proper google cloudstorage API calls """ mock_listbucket.return_value = [ cloudstorage.common.GCSFileStat('/fake_bucket1/prefix1/foo', 0, 'x', 0), cloudstorage.common.GCSFileStat('/fake_bucket1/prefix1/bar', 0, 'x', 0), ] # with trailing slashes sync_consent_files.cloudstorage_copy_objects('/fake_bucket1/prefix1/', '/fake_bucket2/prefix2/') mock_copy2.assert_has_calls([ mock.call('/fake_bucket1/prefix1/foo', '/fake_bucket2/prefix2/foo'), mock.call('/fake_bucket1/prefix1/bar', '/fake_bucket2/prefix2/bar'), ]) # without trailing slashes sync_consent_files.cloudstorage_copy_objects('/fake_bucket1/prefix1', '/fake_bucket2/prefix2') mock_copy2.assert_has_calls([ mock.call('/fake_bucket1/prefix1/foo', '/fake_bucket2/prefix2/foo'), mock.call('/fake_bucket1/prefix1/bar', '/fake_bucket2/prefix2/bar'), ]) @staticmethod def _write_cloud_object(cloud_filename, contents_str): with cloudstorage.cloudstorage_api.open(cloud_filename, mode='w') as cloud_file: cloud_file.write(contents_str.encode('utf-8')) def test_cloudstorage_copy_objects_actual(self): self._write_cloud_object('/fake_bucket1/prefix/x1/foo.txt', 'foo') self._write_cloud_object('/fake_bucket1/prefix/x1/bar.txt', 'bar') self._write_cloud_object('/fake_bucket1/prefix/x1/y1/foo.txt', 'foo') with cloudstorage.cloudstorage_api.open( '/fake_bucket1/prefix/x1/foo.txt', mode='r') as f: self.assertEqual(f.read(), 'foo', 'Wrote to cloud storage') sync_consent_files.cloudstorage_copy_objects( '/fake_bucket1/prefix/x1/', '/fake_bucket2/prefix/z/x1/') self.assertEqual([ file_stat.filename for file_stat in cloudstorage.cloudstorage_api.listbucket( '/fake_bucket2/prefix/z/x1/') ], [ '/fake_bucket2/prefix/z/x1/bar.txt', '/fake_bucket2/prefix/z/x1/foo.txt', '/fake_bucket2/prefix/z/x1/y1/foo.txt', ], "copied all objects") with cloudstorage.cloudstorage_api.open( '/fake_bucket2/prefix/z/x1/foo.txt', mode='r') as f: self.assertEqual(f.read(), 'foo', 'copied contents') @mock.patch('cloudstorage.copy2') def test_cloudstorage_copy_objects_only_new_and_changed(self, copy2): self._write_cloud_object('/fake_bucket1/prefix/x1/foo.txt', 'foo') self._write_cloud_object('/fake_bucket1/prefix/x1/bar.txt', 'bar') self._write_cloud_object('/fake_bucket2/prefix/z/x1/foo.txt', 'foo') self._write_cloud_object('/fake_bucket2/prefix/z/x1/bar.txt', 'baz') sync_consent_files.cloudstorage_copy_objects( '/fake_bucket1/prefix/x1/', '/fake_bucket2/prefix/z/x1/') copy2.assert_called_once_with('/fake_bucket1/prefix/x1/bar.txt', '/fake_bucket2/prefix/z/x1/bar.txt')
class SiteDaoTest(SqlTestBase): def setUp(self): super(SiteDaoTest, self).setUp() self.site_dao = SiteDao() self.participant_dao = ParticipantDao() self.ps_dao = ParticipantSummaryDao() self.ps_history = ParticipantHistoryDao() def test_get_no_sites(self): self.assertIsNone(self.site_dao.get(9999)) self.assertIsNone( self.site_dao.get_by_google_group('*****@*****.**')) def test_insert(self): site = Site(siteName='site', googleGroup='*****@*****.**', mayolinkClientNumber=12345, hpoId=PITT_HPO_ID) created_site = self.site_dao.insert(site) new_site = self.site_dao.get(created_site.siteId) site.siteId = created_site.siteId self.assertEquals(site.asdict(), new_site.asdict()) self.assertEquals( site.asdict(), self.site_dao.get_by_google_group( '*****@*****.**').asdict()) def test_update(self): site = Site(siteName='site', googleGroup='*****@*****.**', mayolinkClientNumber=12345, hpoId=PITT_HPO_ID) created_site = self.site_dao.insert(site) new_site = Site(siteId=created_site.siteId, siteName='site2', googleGroup='*****@*****.**', mayolinkClientNumber=123456, hpoId=UNSET_HPO_ID) self.site_dao.update(new_site) fetched_site = self.site_dao.get(created_site.siteId) self.assertEquals(new_site.asdict(), fetched_site.asdict()) self.assertEquals( new_site.asdict(), self.site_dao.get_by_google_group( '*****@*****.**').asdict()) self.assertIsNone( self.site_dao.get_by_google_group('*****@*****.**')) def test_participant_pairing_updates_on_change(self): TIME = datetime.datetime(2018, 1, 1) TIME2 = datetime.datetime(2018, 1, 2) provider_link = '[{"organization": {"reference": "Organization/AZ_TUCSON"}, "primary": true}]' site = Site(siteName='site', googleGroup='*****@*****.**', mayolinkClientNumber=12345, hpoId=PITT_HPO_ID, organizationId=PITT_ORG_ID) created_site = self.site_dao.insert(site) with FakeClock(TIME): p = Participant(participantId=1, biobankId=2, siteId=created_site.siteId) self.participant_dao.insert(p) fetch_p = self.participant_dao.get(p.participantId) updated_p = self.participant_dao.get(fetch_p.participantId) p_summary = self.ps_dao.insert(self.participant_summary(updated_p)) with FakeClock(TIME2): update_site_parent = Site(siteId=created_site.siteId, siteName='site2', googleGroup='*****@*****.**', mayolinkClientNumber=123456, hpoId=AZ_HPO_ID, organizationId=AZ_ORG_ID) self.site_dao.update(update_site_parent) updated_p = self.participant_dao.get(fetch_p.participantId) ps = self.ps_dao.get(p_summary.participantId) ph = self.ps_history.get([updated_p.participantId, 1]) self.assertEquals(update_site_parent.hpoId, updated_p.hpoId) self.assertEquals(update_site_parent.organizationId, updated_p.organizationId) self.assertEquals(ps.organizationId, update_site_parent.organizationId) self.assertEquals(ps.hpoId, update_site_parent.hpoId) self.assertEquals(ps.organizationId, update_site_parent.organizationId) self.assertEquals(ph.organizationId, update_site_parent.organizationId) self.assertEquals(updated_p.providerLink, provider_link) self.assertEquals(ps.lastModified, TIME2)