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.""" # pylint: disable=no-self-use 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, 'Login page should be publicly visible.') # account overview page response = http_get_response(reverse('accounts'), views.AccountsView.as_view()) eq_(response.status_code, 200, 'Top level accounts page should be publicly visible.') # profile page request_factory = RequestFactory() request = request_factory.get(self.user.profile.get_absolute_url()) request = mock_middleware(request) request.user = AnonymousUser() response = views.profile(request, self.user.username) eq_(response.status_code, 200, 'User profiles should be publicly visible.') def test_unallowed_views(self): """Private URLs should redirect logged-out users to the log in page""" # pylint:disable=no-self-use # my profile get, post = http_get_post(reverse('acct-my-profile'), views.profile, {}) 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.profile_settings, {}) 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.') def test_auth_views(self): """Test private views while logged in""" response = http_get_response(reverse('acct-my-profile'), views.profile, self.user) eq_(response.status_code, 302, 'Logged in user may view their own profile.') response = http_get_response(reverse('acct-settings'), views.profile_settings, self.user) eq_(response.status_code, 200, 'Logged in user may view their own settings.') def test_settings_view(self): """Test the account settings view""" profile = self.user.profile profile_data = { 'action': 'profile', 'first_name': 'Allan', 'last_name': 'Lasser', 'twitter': 'allanlasser' } email_data = { 'action': 'email', 'email': '*****@*****.**', 'email_pref': 'hourly' } settings_url = reverse('acct-settings') http_post_response(settings_url, views.profile_settings, profile_data, self.user) http_post_response(settings_url, views.profile_settings, 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(): if key in ['first_name', 'last_name', 'email']: eq_(val, getattr(self.user, key)) else: eq_(val, getattr(profile, key))