def test_force_fresh_session_param_not_received( self, mock_get_identity_provider): """ Test that the force_fresh_session decorator redirects authenticated users with the appropriate provider config depending on the IdPs configuration. """ mock_get_identity_provider.return_value.configure_mock( provider_id=self.provider_id, ) view_function = mock_view_function() course_id = 'course-v1:edX+DemoX+Demo_Course' url_path = reverse( 'enterprise_course_run_enrollment_page', args=[self.customer.uuid, course_id], ) query = 'foo=bar' # Adding query parameter here to verify # the redirect URL is getting escaped properly. url = '{path}?{query}'.format(path=url_path, query=query) request = self._prepare_request(url, UserFactory(is_active=True)) response = force_fresh_session(view_function)( request, enterprise_uuid=self.customer.uuid, course_id=course_id) # Assert that redirect status code 302 is returned assert response.status_code == 302 # Assert the redirect URL query string is intact. redirect_url_query = parse_qs(urlparse(response.url).query) assert urlparse(unquote( redirect_url_query['redirect_url'][0])).query == query
def test_enterprise_login_required(self): """ Test that the enterprise login decorator calls the view function. Test that the decorator `enterprise_login_required` calls the view function when: 1. `enterprise_uuid` is provided and corresponding enterprise customer exists in database. 2. User making the request is authenticated. """ view_function = mock_view_function() course_id = 'course-v1:edX+DemoX+Demo_Course' enterprise_launch_url = reverse( 'enterprise_course_run_enrollment_page', args=[self.customer.uuid, course_id], ) request = self._prepare_request(enterprise_launch_url, UserFactory(is_active=True)) enterprise_login_required(view_function)( request, enterprise_uuid=self.customer.uuid, course_id=course_id) # Assert that view function was called. assert view_function.called
def test_enterprise_login_required_redirects_for_anonymous_users_with_querystring( self): """ Test that the decorator `enterprise_login_required` returns Http Redirect for anonymous users while keeping the format of query parameters unchanged. """ view_function = mock_view_function() course_id = 'course-v1:edX+DemoX+Demo_Course' course_enrollment_url = reverse( 'enterprise_course_run_enrollment_page', args=[self.customer.uuid, course_id], ) querystring = 'catalog=dummy-catalog-uuid' course_enrollment_url = '{course_enrollment_url}?{querystring}'.format( course_enrollment_url=course_enrollment_url, querystring=querystring) request = self._prepare_request(course_enrollment_url, AnonymousUser()) response = enterprise_login_required(view_function)( request, enterprise_uuid=self.customer.uuid, course_id=course_id) # Assert that redirect status code 302 is returned when an anonymous # user tries to access enterprise course enrollment page. assert response.status_code == 302 # Now verify that the query parameters in the querystring of next url # are unchanged next_url = parse_qs(urlparse(response.url).query)['next'][0] next_url_querystring = unquote(urlparse(next_url).query) assert 'new_enterprise_login=yes' in next_url_querystring assert 'tpa_hint' in next_url_querystring assert querystring in next_url_querystring
def manage_learners(self, request, obj): # pylint: disable=unused-argument """ Object tool handler method - redirects to "Manage Learners" view """ # url names coming from get_urls are prefixed with 'admin' namespace manage_learners_url = reverse("admin:" + UrlNames.MANAGE_LEARNERS, args=(obj.uuid, )) return HttpResponseRedirect(manage_learners_url)
def get_course_track_selection_url(enterprise_customer, course_id): """ Given an EnterpriseCustomer and a course ID, craft a URL that links to the track selection page for that course. Args: enterprise_customer (EnterpriseCustomer): The EnterpriseCustomer that a URL needs to be built for course_id (str): The string identifier of the course in question """ netloc = enterprise_customer.site.domain scheme = COURSE_URL_SCHEME path = reverse('course_modes_choose', args=[course_id]) return urlunparse((scheme, netloc, path, None, None, None))
def test_enterprise_login_required_raises_404(self, kwargs): """ Test that the decorator `enterprise_login_required` raises `Http404` error when called with invalid or missing arguments. """ view_function = mock_view_function() enterprise_launch_url = reverse( 'enterprise_course_run_enrollment_page', args=[self.customer.uuid, 'course-v1:edX+DemoX+Demo_Course'], ) request = self._prepare_request(enterprise_launch_url, UserFactory(is_active=True)) with raises(Http404): enterprise_login_required(view_function)(request, **kwargs)
def setUp(self): """ Test set up - installs common dependencies. """ super(TestEnterpriseCustomerManageLearnersView, self).setUp() self.user = UserFactory(is_staff=True, is_active=True) self.user.set_password("QWERTY") self.user.save() self.enterprise_customer = EnterpriseCustomerFactory() self.default_context = { "has_permission": True, "opts": self.enterprise_customer._meta, "user": self.user } self.view_url = reverse( "admin:" + enterprise_admin.utils.UrlNames.MANAGE_LEARNERS, args=(self.enterprise_customer.uuid, )) self.client = Client() self.context_parameters = EnterpriseCustomerManageLearnersView.ContextParameters
def test_force_fresh_session_anonymous_user(self): """ Test that the force_fresh_session decorator calls the decorated view the request is made by an unauthenticated user. """ view_function = mock_view_function() course_id = 'course-v1:edX+DemoX+Demo_Course' enterprise_launch_url = reverse( 'enterprise_course_run_enrollment_page', args=[self.customer.uuid, course_id], ) request = self._prepare_request(enterprise_launch_url, AnonymousUser()) force_fresh_session(view_function)(request, enterprise_uuid=self.customer.uuid, course_id=course_id) # Assert that view function was called and the session flag was set. assert view_function.called
def test_force_fresh_session_param_received(self): """ Test that the force_fresh_session decorator calls the view function if the session is fresh. """ view_function = mock_view_function() course_id = 'course-v1:edX+DemoX+Demo_Course' enterprise_launch_url = reverse( 'enterprise_course_run_enrollment_page', args=[self.customer.uuid, course_id], ) enterprise_launch_url += '?new_enterprise_login=yes' request = self._prepare_request(enterprise_launch_url, UserFactory(is_active=True)) force_fresh_session(view_function)(request, enterprise_uuid=self.customer.uuid, course_id=course_id) # Assert that view function was called. assert view_function.called
def test_force_fresh_session_no_sso_provider(self, mock_get_idp): # pylint: disable=unused-argument """ Test that the force_fresh_session decorator calls the view function when no sso provider is configured. """ mock_get_idp.return_value = None view_function = mock_view_function() course_id = 'course-v1:edX+DemoX+Demo_Course' enterprise_launch_url = reverse( 'enterprise_course_run_enrollment_page', args=[self.customer.uuid, course_id], ) request = self._prepare_request(enterprise_launch_url, UserFactory(is_active=True)) force_fresh_session(view_function)(request, enterprise_uuid=self.customer.uuid, course_id=course_id) # Assert that view function was called. assert view_function.called
def test_enterprise_login_required_redirects_for_anonymous_users(self): """ Test that the decorator `enterprise_login_required` returns Http Redirect for anonymous users. """ view_function = mock_view_function() course_id = 'course-v1:edX+DemoX+Demo_Course' enterprise_launch_url = reverse( 'enterprise_course_run_enrollment_page', args=[self.customer.uuid, course_id], ) request = self._prepare_request(enterprise_launch_url, AnonymousUser()) response = enterprise_login_required(view_function)( request, enterprise_uuid=self.customer.uuid, course_id=course_id) # Assert that redirect status code 302 is returned when an anonymous # user tries to access enterprise course enrollment page. assert response.status_code == 302 assert 'new_enterprise_login%3Dyes' in response.url assert 'tpa_hint' in response.url