def test_fetch_enterprise_learner_entitlements(self): """ Verify that method "fetch_enterprise_learner_data" returns a proper response for the enterprise learner. """ # API should be hit only twice in this test case, # once by `fetch_enterprise_learner_data` and once by `fetch_enterprise_learner_entitlements`. expected_number_of_requests = 3 self.mock_access_token_response() self.mock_enterprise_learner_api() enterprise_learners = enterprise_api.fetch_enterprise_learner_data( self.request.site, self.learner) enterprise_learner_id = enterprise_learners['results'][0]['id'] self.mock_enterprise_learner_entitlements_api(enterprise_learner_id) enterprise_api.fetch_enterprise_learner_entitlements( self.request.site, enterprise_learner_id) # Verify the API was hit just two times, once by `fetch_enterprise_learner_data` # and once by `fetch_enterprise_learner_entitlements` self._assert_num_requests(expected_number_of_requests) # Now fetch the enterprise learner entitlements again and verify that there was # no actual call to Enterprise API, as the data will be taken from # the cache enterprise_api.fetch_enterprise_learner_entitlements( self.request.site, enterprise_learner_id) self._assert_num_requests(expected_number_of_requests)
def get_course_entitlements_for_learner(site, user, course_id): """ Get entitlements for the provided learner against the provided course id if the provided learner is affiliated with an enterprise. Arguments: course_id (str): The course ID. site: (django.contrib.sites.Site) site instance user: (django.contrib.auth.User) django auth user Returns: (list): List of entitlement ids, where entitlement id is actually a voucher id. """ try: enterprise_learner_data = enterprise_api.fetch_enterprise_learner_data(site, user)['results'] except (ConnectionError, SlumberBaseException, Timeout, KeyError, TypeError): logger.exception( 'Failed to retrieve enterprise info for the learner [%s]', user.username ) return None if not enterprise_learner_data: logger.info('Learner with username [%s] in not affiliated with any enterprise', user.username) return None try: enterprise_catalog_id = enterprise_learner_data[0]['enterprise_customer']['catalog'] learner_id = enterprise_learner_data[0]['id'] except KeyError: logger.exception('Invalid structure for enterprise learner API response for the learner [%s]', user.username) return None # Before returning entitlements verify that the provided course exists in # the enterprise course catalog if not is_course_in_enterprise_catalog(site, course_id, enterprise_catalog_id): return None try: entitlements = enterprise_api.fetch_enterprise_learner_entitlements(site, learner_id) except (ConnectionError, SlumberBaseException, Timeout): logger.exception( 'Failed to retrieve entitlements for enterprise learner [%s].', learner_id ) return None try: # Currently, we are returning only those entitlements that # do not require any further action on part of enterprise learner entitlements = [item['entitlement_id'] for item in entitlements['entitlements'] if not item['requires_consent']] except KeyError: logger.exception( 'Invalid structure for enterprise learner entitlements API response for enterprise learner [%s].', learner_id, ) return None return entitlements