1. from datetime import date
    
  2. 
    
  3. from django.contrib.auth import authenticate
    
  4. from django.contrib.auth.models import User
    
  5. from django.contrib.auth.tokens import PasswordResetTokenGenerator
    
  6. from django.contrib.auth.views import (
    
  7.     PasswordChangeDoneView,
    
  8.     PasswordChangeView,
    
  9.     PasswordResetCompleteView,
    
  10.     PasswordResetDoneView,
    
  11.     PasswordResetView,
    
  12. )
    
  13. from django.test import RequestFactory, TestCase, override_settings
    
  14. from django.urls import reverse
    
  15. from django.utils.http import urlsafe_base64_encode
    
  16. 
    
  17. from .client import PasswordResetConfirmClient
    
  18. from .models import CustomUser
    
  19. 
    
  20. 
    
  21. @override_settings(ROOT_URLCONF="auth_tests.urls")
    
  22. class AuthTemplateTests(TestCase):
    
  23.     request_factory = RequestFactory()
    
  24. 
    
  25.     @classmethod
    
  26.     def setUpTestData(cls):
    
  27.         user = User.objects.create_user("jsmith", "[email protected]", "pass")
    
  28.         user = authenticate(username=user.username, password="pass")
    
  29.         request = cls.request_factory.get("/somepath/")
    
  30.         request.user = user
    
  31.         cls.user, cls.request = user, request
    
  32. 
    
  33.     def test_password_reset_view(self):
    
  34.         response = PasswordResetView.as_view(success_url="dummy/")(self.request)
    
  35.         self.assertContains(
    
  36.             response, "<title>Password reset | Django site admin</title>"
    
  37.         )
    
  38.         self.assertContains(response, "<h1>Password reset</h1>")
    
  39. 
    
  40.     def test_password_reset_done_view(self):
    
  41.         response = PasswordResetDoneView.as_view()(self.request)
    
  42.         self.assertContains(
    
  43.             response, "<title>Password reset sent | Django site admin</title>"
    
  44.         )
    
  45.         self.assertContains(response, "<h1>Password reset sent</h1>")
    
  46. 
    
  47.     def test_password_reset_confirm_view_invalid_token(self):
    
  48.         # PasswordResetConfirmView invalid token
    
  49.         client = PasswordResetConfirmClient()
    
  50.         url = reverse(
    
  51.             "password_reset_confirm", kwargs={"uidb64": "Bad", "token": "Bad-Token"}
    
  52.         )
    
  53.         response = client.get(url)
    
  54.         self.assertContains(
    
  55.             response, "<title>Password reset unsuccessful | Django site admin</title>"
    
  56.         )
    
  57.         self.assertContains(response, "<h1>Password reset unsuccessful</h1>")
    
  58. 
    
  59.     def test_password_reset_confirm_view_valid_token(self):
    
  60.         # PasswordResetConfirmView valid token
    
  61.         client = PasswordResetConfirmClient()
    
  62.         default_token_generator = PasswordResetTokenGenerator()
    
  63.         token = default_token_generator.make_token(self.user)
    
  64.         uidb64 = urlsafe_base64_encode(str(self.user.pk).encode())
    
  65.         url = reverse(
    
  66.             "password_reset_confirm", kwargs={"uidb64": uidb64, "token": token}
    
  67.         )
    
  68.         response = client.get(url)
    
  69.         self.assertContains(
    
  70.             response, "<title>Enter new password | Django site admin</title>"
    
  71.         )
    
  72.         self.assertContains(response, "<h1>Enter new password</h1>")
    
  73.         # The username is added to the password reset confirmation form to help
    
  74.         # browser's password managers.
    
  75.         self.assertContains(
    
  76.             response,
    
  77.             '<input class="hidden" autocomplete="username" value="jsmith">',
    
  78.         )
    
  79. 
    
  80.     @override_settings(AUTH_USER_MODEL="auth_tests.CustomUser")
    
  81.     def test_password_reset_confirm_view_custom_username_hint(self):
    
  82.         custom_user = CustomUser.custom_objects.create_user(
    
  83.             email="[email protected]",
    
  84.             date_of_birth=date(1986, 11, 11),
    
  85.             first_name="Joe",
    
  86.         )
    
  87.         client = PasswordResetConfirmClient()
    
  88.         default_token_generator = PasswordResetTokenGenerator()
    
  89.         token = default_token_generator.make_token(custom_user)
    
  90.         uidb64 = urlsafe_base64_encode(str(custom_user.pk).encode())
    
  91.         url = reverse(
    
  92.             "password_reset_confirm", kwargs={"uidb64": uidb64, "token": token}
    
  93.         )
    
  94.         response = client.get(url)
    
  95.         self.assertContains(
    
  96.             response,
    
  97.             "<title>Enter new password | Django site admin</title>",
    
  98.         )
    
  99.         self.assertContains(response, "<h1>Enter new password</h1>")
    
  100.         # The username field is added to the password reset confirmation form
    
  101.         # to help browser's password managers.
    
  102.         self.assertContains(
    
  103.             response,
    
  104.             '<input class="hidden" autocomplete="username" value="[email protected]">',
    
  105.         )
    
  106. 
    
  107.     def test_password_reset_complete_view(self):
    
  108.         response = PasswordResetCompleteView.as_view()(self.request)
    
  109.         self.assertContains(
    
  110.             response, "<title>Password reset complete | Django site admin</title>"
    
  111.         )
    
  112.         self.assertContains(response, "<h1>Password reset complete</h1>")
    
  113. 
    
  114.     def test_password_reset_change_view(self):
    
  115.         response = PasswordChangeView.as_view(success_url="dummy/")(self.request)
    
  116.         self.assertContains(
    
  117.             response, "<title>Password change | Django site admin</title>"
    
  118.         )
    
  119.         self.assertContains(response, "<h1>Password change</h1>")
    
  120. 
    
  121.     def test_password_change_done_view(self):
    
  122.         response = PasswordChangeDoneView.as_view()(self.request)
    
  123.         self.assertContains(
    
  124.             response, "<title>Password change successful | Django site admin</title>"
    
  125.         )
    
  126.         self.assertContains(response, "<h1>Password change successful</h1>")