class TestRegistrationCompletionView(TestCase): """The RegistrationCompletionView allows a user to verify their email, change their password, and update their email after creating an account through the miniregistration process.""" def setUp(self): self.user = UserFactory() def test_login_required(self): """Only registered users may see the registration completion page.""" response = http_get_response( reverse('accounts-complete-registration'), views.RegistrationCompletionView.as_view()) eq_(response.status_code, 302, 'Logged out users should be redirected.') ok_( reverse('acct-login') in response.url, 'Logged out users should be redirected to the login view.') def test_get_and_verify(self): """Getting the view with a verification key should verify the user's email.""" key = self.user.profile.generate_confirmation_key() response = http_get_response( reverse('accounts-complete-registration') + '?key=' + key, views.RegistrationCompletionView.as_view(), user=self.user) self.user.profile.refresh_from_db() eq_(response.status_code, 200, 'The view should respond 200 OK') ok_(self.user.profile.email_confirmed, 'The user\'s email address should be confirmed.') def test_update_username_password(self): """The user should be able to update their username and password after logging in.""" username = '******' password = '******' form = RegistrationCompletionForm( self.user, { 'username': username, 'new_password1': password, 'new_password2': password }) ok_(form.is_valid(), 'The forms should validate.') http_post_response( reverse('accounts-complete-registration'), views.RegistrationCompletionView.as_view(), data=form.data, user=self.user, ) self.user.refresh_from_db() eq_(self.user.username, username, 'The username should be updated.') ok_(self.user.check_password(password), 'The password should be updated.')
class TestAccountFunctional(TestCase): """Functional tests for account""" def setUp(self): self.user = UserFactory() def test_public_views(self): """Test public views while not logged in""" response = http_get_response(reverse('acct-login'), login) eq_(response.status_code, 200) # account overview page response = http_get_response(reverse('accounts'), views.AccountsView.as_view()) eq_(response.status_code, 302) # profile page request_factory = RequestFactory() request = request_factory.get(self.user.profile.get_absolute_url()) request = mock_middleware(request) request.user = AnonymousUser() response = views.ProfileView.as_view()(request, username=self.user.username) eq_(response.status_code, 200) def test_unallowed_views(self): """Private URLs should redirect logged-out users to the log in page""" # my profile get, post = http_get_post( reverse('acct-my-profile'), login_required(views.ProfileView.as_view()), {}, ) eq_(get.status_code, 302, 'My profile link reponds with 302 to logged out user.') eq_(post.status_code, 302, 'POST to my profile link responds with 302.') # settings get, post = http_get_post(reverse('acct-settings'), views.ProfileSettings.as_view(), {}) eq_(get.status_code, 302, 'GET /profile responds with 302 to logged out user.') eq_(post.status_code, 302, 'POST /settings reponds with 302 to logged out user.') @patch('stripe.Customer.retrieve') def test_auth_views(self, mock_stripe): """Test private views while logged in""" # pylint: disable=unused-argument response = http_get_response(reverse('acct-my-profile'), views.ProfileView.as_view(), self.user) eq_(response.status_code, 302, 'Logged in user may view their own profile.') response = http_get_response( reverse('acct-settings'), views.ProfileSettings.as_view(), self.user, ) eq_(response.status_code, 200, 'Logged in user may view their own settings.') @patch('stripe.Customer.retrieve') def test_settings_view(self, mock_stripe): """Test the account settings view""" # pylint: disable=unused-argument profile = self.user.profile profile_data = {'action': 'profile', 'twitter': 'allanlasser'} email_data = {'action': 'email', 'email_pref': 'hourly'} settings_url = reverse('acct-settings') http_post_response(settings_url, views.ProfileSettings.as_view(), profile_data, self.user) http_post_response(settings_url, views.ProfileSettings.as_view(), email_data, self.user) self.user.refresh_from_db() profile.refresh_from_db() all_data = {} all_data.update(profile_data) all_data.update(email_data) all_data.pop('action') for key, val in all_data.iteritems(): eq_(val, getattr(profile, key))
class TestAccountFunctional(TestCase): """Functional tests for account""" def setUp(self): self.user = UserFactory() def test_public_views(self): """Test public views while not logged in""" # give the user a composer so they have a public profile FOIAComposerFactory(user=self.user, status="submitted") # account overview page response = http_get_response(reverse("accounts"), views.AccountsView.as_view()) eq_(response.status_code, 302) # profile page request_factory = RequestFactory() request = request_factory.get(self.user.profile.get_absolute_url()) request = mock_middleware(request) request.user = AnonymousUser() response = views.ProfileView.as_view()(request, username=self.user.username) eq_(response.status_code, 200) @raises(Http404) def test_private_profile(self): """Test public views while not logged in""" # account overview page response = http_get_response(reverse("accounts"), views.AccountsView.as_view()) eq_(response.status_code, 302) # profile page request_factory = RequestFactory() request = request_factory.get(self.user.profile.get_absolute_url()) request = mock_middleware(request) request.user = AnonymousUser() response = views.ProfileView.as_view()(request, username=self.user.username) def test_unallowed_views(self): """Private URLs should redirect logged-out users to the log in page""" # my profile get, post = http_get_post(reverse("acct-my-profile"), login_required(views.ProfileView.as_view()), {}) eq_(get.status_code, 302, "My profile link reponds with 302 to logged out user.") eq_(post.status_code, 302, "POST to my profile link responds with 302.") # settings get, post = http_get_post(reverse("acct-settings"), views.ProfileSettings.as_view(), {}) eq_(get.status_code, 302, "GET /profile responds with 302 to logged out user.") eq_(post.status_code, 302, "POST /settings reponds with 302 to logged out user.") @patch("stripe.Customer.retrieve") def test_auth_views(self, mock_stripe): """Test private views while logged in""" # pylint: disable=unused-argument response = http_get_response(reverse("acct-my-profile"), views.ProfileView.as_view(), self.user) eq_(response.status_code, 302, "Logged in user may view their own profile.") response = http_get_response(reverse("acct-settings"), views.ProfileSettings.as_view(), self.user) eq_(response.status_code, 200, "Logged in user may view their own settings.") @patch("stripe.Customer.retrieve") def test_settings_view(self, mock_stripe): """Test the account settings view""" # pylint: disable=unused-argument profile = self.user.profile org_data = {"action": "org", "org_share": True} email_data = {"action": "email", "email_pref": "hourly"} settings_url = reverse("acct-settings") http_post_response(settings_url, views.ProfileSettings.as_view(), org_data, self.user) http_post_response(settings_url, views.ProfileSettings.as_view(), email_data, self.user) self.user.refresh_from_db() profile.refresh_from_db() all_data = {} all_data.update(org_data) all_data.update(email_data) all_data.pop("action") for key, val in all_data.items(): eq_(val, getattr(profile, key))