from datetime import date from django.contrib.auth import authenticate from django.contrib.auth.models import User from django.contrib.auth.tokens import PasswordResetTokenGenerator from django.contrib.auth.views import ( PasswordChangeDoneView, PasswordChangeView, PasswordResetCompleteView, PasswordResetDoneView, PasswordResetView, ) from django.test import RequestFactory, TestCase, override_settings from django.urls import reverse from django.utils.http import urlsafe_base64_encode from .client import PasswordResetConfirmClient from .models import CustomUser @override_settings(ROOT_URLCONF="auth_tests.urls") class AuthTemplateTests(TestCase): request_factory = RequestFactory() @classmethod def setUpTestData(cls): user = User.objects.create_user("jsmith", "jsmith@example.com", "pass") user = authenticate(username=user.username, password="pass") request = cls.request_factory.get("/somepath/") request.user = user cls.user, cls.request = user, request def test_password_reset_view(self): response = PasswordResetView.as_view(success_url="dummy/")(self.request) self.assertContains( response, "Password reset | Django site admin" ) self.assertContains(response, "

Password reset

") def test_password_reset_done_view(self): response = PasswordResetDoneView.as_view()(self.request) self.assertContains( response, "Password reset sent | Django site admin" ) self.assertContains(response, "

Password reset sent

") def test_password_reset_confirm_view_invalid_token(self): # PasswordResetConfirmView invalid token client = PasswordResetConfirmClient() url = reverse( "password_reset_confirm", kwargs={"uidb64": "Bad", "token": "Bad-Token"} ) response = client.get(url) self.assertContains( response, "Password reset unsuccessful | Django site admin" ) self.assertContains(response, "

Password reset unsuccessful

") def test_password_reset_confirm_view_valid_token(self): # PasswordResetConfirmView valid token client = PasswordResetConfirmClient() default_token_generator = PasswordResetTokenGenerator() token = default_token_generator.make_token(self.user) uidb64 = urlsafe_base64_encode(str(self.user.pk).encode()) url = reverse( "password_reset_confirm", kwargs={"uidb64": uidb64, "token": token} ) response = client.get(url) self.assertContains( response, "Enter new password | Django site admin" ) self.assertContains(response, "

Enter new password

") # The username is added to the password reset confirmation form to help # browser's password managers. self.assertContains( response, '', ) @override_settings(AUTH_USER_MODEL="auth_tests.CustomUser") def test_password_reset_confirm_view_custom_username_hint(self): custom_user = CustomUser.custom_objects.create_user( email="joe@example.com", date_of_birth=date(1986, 11, 11), first_name="Joe", ) client = PasswordResetConfirmClient() default_token_generator = PasswordResetTokenGenerator() token = default_token_generator.make_token(custom_user) uidb64 = urlsafe_base64_encode(str(custom_user.pk).encode()) url = reverse( "password_reset_confirm", kwargs={"uidb64": uidb64, "token": token} ) response = client.get(url) self.assertContains( response, "Enter new password | Django site admin", ) self.assertContains(response, "

Enter new password

") # The username field is added to the password reset confirmation form # to help browser's password managers. self.assertContains( response, '', ) def test_password_reset_complete_view(self): response = PasswordResetCompleteView.as_view()(self.request) self.assertContains( response, "Password reset complete | Django site admin" ) self.assertContains(response, "

Password reset complete

") def test_password_reset_change_view(self): response = PasswordChangeView.as_view(success_url="dummy/")(self.request) self.assertContains( response, "Password change | Django site admin" ) self.assertContains(response, "

Password change

") def test_password_change_done_view(self): response = PasswordChangeDoneView.as_view()(self.request) self.assertContains( response, "Password change successful | Django site admin" ) self.assertContains(response, "

Password change successful

")