Ejemplo n.º 1
0
 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}')
Ejemplo n.º 2
0
 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=['*****@*****.**', '*****@*****.**']
     )
Ejemplo n.º 3
0
 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()
Ejemplo n.º 4
0
    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()
Ejemplo n.º 5
0
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'
        )
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
 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)
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
 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']
Ejemplo n.º 11
0
 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
     )
Ejemplo n.º 12
0
 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=['*****@*****.**', '*****@*****.**'])
Ejemplo n.º 13
0
 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,
     )