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('users:reset_password')) assert response.status_code == 200 def test_reset_password(self): response = self.client.post(reverse('users:reset_password'), {'email': self.email}) assert response.status_code == 302 assert response.url == reverse('users:reset_password_email_sent') def test_reset_password_not_existing_user(self): response = self.client.post(reverse('users:reset_password'), {'email': 'vanpiro@noesiten.com'}) assert response.status_code == 302 assert response.url == reverse('users: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('users: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('users: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('users: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('users: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('users:reset_password_confirm', kwargs={'uidb64': uidb64, 'token': token}), {'token': form_token, 'new_password1': new_password, 'new_password2': new_password}, ) assert response.status_code == 200