from django.contrib.auth import get_user_model from django.contrib.auth.tokens import default_token_generator from django.shortcuts import reverse from django.test import TransactionTestCase from django.utils.encoding import force_bytes from django.utils.http import urlsafe_base64_encode User = get_user_model() class TestResetPassword(TransactionTestCase): def setUp(self) -> None: self.password = "theonering" self.email = "sauron@mordor.middleearth" self.first_name = "Sauron" self.last_name = "The Lord of the Rings" self.user = User.objects.create_user( username=self.email, password=self.password, first_name=self.first_name, last_name=self.last_name, ) def test_get_reset_password_page(self): response = self.client.get(reverse("web:reset_password")) assert response.status_code == 200 def test_reset_password(self): response = self.client.post( reverse("web:reset_password"), { "email": self.email, }, ) assert response.status_code == 302 assert response.url == reverse("web:reset_password_email_sent") def test_reset_password_not_existing_user(self): response = self.client.post( reverse("web:reset_password"), { "email": "vanpiro@noesiten.com", }, ) assert response.status_code == 302 assert response.url == reverse("web:reset_password_email_sent") def test_reset_password_confirm_get(self): token = default_token_generator.make_token(self.user) uidb64 = urlsafe_base64_encode(force_bytes(self.user.pk)) response = self.client.get( reverse( "web:reset_password_confirm", kwargs={"uidb64": uidb64, "token": token} ), ) assert response.status_code == 200 def test_reset_password_confirm(self): token = default_token_generator.make_token(self.user) form_token = default_token_generator.make_token(self.user) uidb64 = urlsafe_base64_encode(force_bytes(self.user.pk)) new_password = "89733wy29" response = self.client.post( reverse( "web:reset_password_confirm", kwargs={"uidb64": uidb64, "token": token} ), { "token": form_token, "new_password1": new_password, "new_password2": new_password, }, ) assert response.status_code == 302 assert response.url == reverse("web:login") self.user.refresh_from_db() assert self.user.check_password(new_password) def test_reset_password_confirm_distinct_password(self): token = default_token_generator.make_token(self.user) form_token = default_token_generator.make_token(self.user) uidb64 = urlsafe_base64_encode(force_bytes(self.user.pk)) new_password = "89733wy29" response = self.client.post( reverse( "web:reset_password_confirm", kwargs={"uidb64": uidb64, "token": token} ), { "token": form_token, "new_password1": new_password, "new_password2": "otherpassw13", }, ) assert response.status_code == 200 def test_reset_password_confirm_invalid_token(self): token = default_token_generator.make_token(self.user) form_token = "invalid token" uidb64 = urlsafe_base64_encode(force_bytes(self.user.pk)) new_password = "89733wy29" response = self.client.post( reverse( "web:reset_password_confirm", kwargs={"uidb64": uidb64, "token": token} ), { "token": form_token, "new_password1": new_password, "new_password2": new_password, }, ) assert response.status_code == 200