def delete_dhis2_oauth2_client(self): get_basic_requests( DOMAIN, self.base_url, self.username, self.password, logger=noop_logger, ).delete(f'/api/oAuth2Clients/{self.client_uid}')
def test_notify_error_address_list(self): connection_settings_url = absolute_reverse( ConnectionSettingsListView.urlname, args=[DOMAIN]) req = get_basic_requests( DOMAIN, BASE_URL, USERNAME, PASSWORD, notify_addresses=['*****@*****.**', '*****@*****.**'] ) req.notify_error('foo') self.mail_mock.delay.assert_called_with( 'MOTECH Error', ( 'foo\r\n' '\r\n' 'Project space: test-domain\r\n' 'Remote API base URL: http://dhis2.example.org/2.3.4/\r\n' '\r\n' '*Why am I getting this email?*\r\n' 'This address is configured in CommCare HQ as a notification ' 'address for integration errors.\r\n' '\r\n' '*How do I unsubscribe?*\r\n' 'Open Connection Settings in CommCare HQ ' f'({connection_settings_url}) and remove your email address ' 'from the "Addresses to send notifications" field for remote ' 'connections. If necessary, please provide an alternate ' 'address.' ), from_email=settings.DEFAULT_FROM_EMAIL, recipient_list=['*****@*****.**', '*****@*****.**'] )
def test_notify_error_no_address(self): """ notify_error() should not try to send mail without addresses """ req = get_basic_requests(DOMAIN, BASE_URL, USERNAME, PASSWORD) req.notify_error('foo') self.mail_mock.delay.assert_not_called()
def setUp(self): self.requests = get_basic_requests( TEST_DOMAIN, TEST_API_URL, TEST_API_USERNAME, TEST_API_PASSWORD, ) content = {'status': 'Created'} self.content_json = json.dumps(content) self.request_method = 'POST' self.request_headers = { 'Content-type': 'application/json', 'Accept': 'application/json' } self.status_code = 201 self.error_message = '' self.uri = 'person/' self.json_data = {'name': 'Alice'} self.data = json.dumps(self.json_data) self.response_mock = Mock() self.response_mock.status_code = self.status_code self.response_mock.content = self.content_json self.response_mock.json.return_value = content self.request_patcher = patch.object(requests.Session, 'request') self.request_mock = self.request_patcher.start() self.request_mock.return_value = self.response_mock self.create_patcher = patch.object(RequestLog.objects, 'create') self.create_mock = self.create_patcher.start()
def import_patients_with_importer(importer_json): importer = OpenmrsImporter.wrap(importer_json) password = b64_aes_decrypt(importer.password) requests = get_basic_requests( importer.domain, importer.server_url, importer.username, password, notify_addresses=importer.notify_addresses, ) if importer.location_type_name: try: location_type = LocationType.objects.get(domain=importer.domain, name=importer.location_type_name) except LocationType.DoesNotExist: requests.notify_error( f'No organization level named "{importer.location_type_name}" ' f'found in project space "{importer.domain}".' ) return if importer.location_id: location = SQLLocation.objects.filter(domain=importer.domain).get(importer.location_id) locations = location.get_descendants.filter(location_type=location_type) else: locations = SQLLocation.objects.filter(domain=importer.domain, location_type=location_type) for location in locations: # Assign cases to the first user in the location, not to the location itself owner = get_one_commcare_user_at_location(importer.domain, location.location_id) if not owner: requests.notify_error( f'Project space "{importer.domain}" at location ' f'"{location.name}" has no user to own cases imported ' f'from OpenMRS Importer "{importer}"' ) continue # The same report is fetched for each location. WE DO THIS # ASSUMING THAT THE LOCATION IS USED IN THE REPORT # PARAMETERS. If not, OpenMRS will return THE SAME PATIENTS # multiple times and they will be assigned to a different # user each time. try: import_patients_of_owner(requests, importer, importer.domain, owner.user_id, location) except ConfigurationError as err: requests.notify_error(str(err)) elif importer.owner_id: if not is_valid_owner(importer.owner_id): requests.notify_error( f'Error importing patients for project space "{importer.domain}" ' f'from OpenMRS Importer "{importer}": owner_id "{importer.owner_id}" ' 'is invalid.' ) return try: import_patients_of_owner(requests, importer, importer.domain, importer.owner_id) except ConfigurationError as err: requests.notify_error(str(err)) else: requests.notify_error( f'Error importing patients for project space "{importer.domain}" from ' f'OpenMRS Importer "{importer}": Unable to determine the owner of ' 'imported cases without either owner_id or location_type_name' )
def test_bad_url(self): payload = {'ham': ['spam', 'spam', 'spam']} req = get_basic_requests(DOMAIN, 'http://10.11.12.13/', USERNAME, PASSWORD, logger=noop_logger) with self.assertRaises(PossibleSSRFAttempt): req.post('/api/dataValueSets', json=payload)
def test_unknown_url(self): payload = {'ham': ['spam', 'spam', 'spam']} req = get_basic_requests(DOMAIN, 'http://not-a-valid-host.com', USERNAME, PASSWORD, logger=noop_logger) with self.assertRaises(CannotResolveHost): req.post('/api/dataValueSets', json=payload)
def test_without_session(self): """ Calling without a context manager should use multiple sessions """ req = get_basic_requests( DOMAIN, BASE_URL, USERNAME, PASSWORD, logger=noop_logger ) req.get('me') req.get('me') req.get('me') self.assertEqual(self.close_mock.call_count, 3)
def test_with_session(self): """ A context manager should use a single session """ with get_basic_requests( DOMAIN, BASE_URL, USERNAME, PASSWORD, logger=noop_logger ) as req: req.get('me') req.get('me') req.get('me') self.assertEqual(self.close_mock.call_count, 1)
def add_dhis2_oauth2_client(self, client_name, client_id, client_secret): json_data = { "name": client_name, "cid": client_id, "secret": client_secret, "grantTypes": ["password", "refresh_token"] } resp = get_basic_requests( DOMAIN, self.base_url, self.username, self.password, logger=noop_logger, ).post('/api/oAuth2Clients', json=json_data, raise_for_status=True) return resp.json()['response']['uid']
def test_verify_ssl(self): req = get_basic_requests( DOMAIN, BASE_URL, USERNAME, PASSWORD, verify=False, logger=noop_logger, ) req.get('/api/me') self.request_mock.assert_called_with( 'GET', 'http://dhis2.example.org/2.3.4/api/me', allow_redirects=True, headers={'Accept': 'application/json'}, timeout=REQUEST_TIMEOUT, verify=False )
def test_notify_error_address_list(self): req = get_basic_requests( DOMAIN, BASE_URL, USERNAME, PASSWORD, notify_addresses=['*****@*****.**', '*****@*****.**']) req.notify_error('foo') self.mail_mock.delay.assert_called_with( 'MOTECH Error', ('foo\r\n' 'Project space: test-domain\r\n' 'Remote API base URL: http://dhis2.example.org/2.3.4/'), from_email=settings.DEFAULT_FROM_EMAIL, recipient_list=['*****@*****.**', '*****@*****.**'])
def test_send_payload(self): payload = {'ham': ['spam', 'spam', 'spam']} req = get_basic_requests( DOMAIN, BASE_URL, USERNAME, PASSWORD, logger=noop_logger ) req.post('/api/dataValueSets', json=payload) self.request_mock.assert_called_with( 'POST', 'http://dhis2.example.org/2.3.4/api/dataValueSets', data=None, json=payload, headers={'Content-type': 'application/json', 'Accept': 'application/json'}, timeout=REQUEST_TIMEOUT, )