-
-
Save vitorfs/c9657d39d28c2a0cfb0933e715bfc9cf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.contrib.auth.tokens import default_token_generator | |
from django.utils.encoding import force_bytes | |
from django.utils.http import urlsafe_base64_encode | |
from django.contrib.auth import views as auth_views | |
from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm | |
from django.contrib.auth.models import User | |
from django.core import mail | |
from django.core.urlresolvers import reverse | |
from django.urls import resolve | |
from django.test import TestCase | |
class PasswordResetTests(TestCase): | |
def setUp(self): | |
url = reverse('password_reset') | |
self.response = self.client.get(url) | |
def test_status_code(self): | |
self.assertEquals(self.response.status_code, 200) | |
def test_view_function(self): | |
view = resolve('/reset/') | |
self.assertEquals(view.func.view_class, auth_views.PasswordResetView) | |
def test_csrf(self): | |
self.assertContains(self.response, 'csrfmiddlewaretoken') | |
def test_contains_form(self): | |
form = self.response.context.get('form') | |
self.assertIsInstance(form, PasswordResetForm) | |
def test_form_inputs(self): | |
''' | |
The view must contain two inputs: csrf and email | |
''' | |
self.assertContains(self.response, '<input', 2) | |
self.assertContains(self.response, 'type="email"', 1) | |
class SuccessfulPasswordResetTests(TestCase): | |
def setUp(self): | |
email = 'john@doe.com' | |
User.objects.create_user(username='john', email=email, password='123abcdef') | |
url = reverse('password_reset') | |
self.response = self.client.post(url, {'email': email}) | |
def test_redirection(self): | |
''' | |
A valid form submission should redirect the user to `password_reset_done` view | |
''' | |
url = reverse('password_reset_done') | |
self.assertRedirects(self.response, url) | |
def test_send_password_reset_email(self): | |
self.assertEqual(1, len(mail.outbox)) | |
class InvalidPasswordResetTests(TestCase): | |
def setUp(self): | |
url = reverse('password_reset') | |
self.response = self.client.post(url, {'email': 'donotexist@email.com'}) | |
def test_redirection(self): | |
''' | |
Even invalid emails in the database should | |
redirect the user to `password_reset_done` view | |
''' | |
url = reverse('password_reset_done') | |
self.assertRedirects(self.response, url) | |
def test_no_reset_email_sent(self): | |
self.assertEqual(0, len(mail.outbox)) | |
class PasswordResetDoneTests(TestCase): | |
def setUp(self): | |
url = reverse('password_reset_done') | |
self.response = self.client.get(url) | |
def test_status_code(self): | |
self.assertEquals(self.response.status_code, 200) | |
def test_view_function(self): | |
view = resolve('/reset/done/') | |
self.assertEquals(view.func.view_class, auth_views.PasswordResetDoneView) | |
class PasswordResetConfirmTests(TestCase): | |
def setUp(self): | |
user = User.objects.create_user(username='john', email='john@doe.com', password='123abcdef') | |
''' | |
create a valid password reset token | |
based on how django creates the token internally: | |
https://github.com/django/django/blob/1.11.5/django/contrib/auth/forms.py#L280 | |
''' | |
self.uid = urlsafe_base64_encode(force_bytes(user.pk)).decode() | |
self.token = default_token_generator.make_token(user) | |
url = reverse('password_reset_confirm', kwargs={'uidb64': self.uid, 'token': self.token}) | |
self.response = self.client.get(url, follow=True) | |
def test_status_code(self): | |
self.assertEquals(self.response.status_code, 200) | |
def test_view_function(self): | |
view = resolve('/reset/{uidb64}/{token}/'.format(uidb64=self.uid, token=self.token)) | |
self.assertEquals(view.func.view_class, auth_views.PasswordResetConfirmView) | |
def test_csrf(self): | |
self.assertContains(self.response, 'csrfmiddlewaretoken') | |
def test_contains_form(self): | |
form = self.response.context.get('form') | |
self.assertIsInstance(form, SetPasswordForm) | |
def test_form_inputs(self): | |
''' | |
The view must contain two inputs: csrf and two password fields | |
''' | |
self.assertContains(self.response, '<input', 3) | |
self.assertContains(self.response, 'type="password"', 2) | |
class InvalidPasswordResetConfirmTests(TestCase): | |
def setUp(self): | |
user = User.objects.create_user(username='john', email='john@doe.com', password='123abcdef') | |
uid = urlsafe_base64_encode(force_bytes(user.pk)).decode() | |
token = default_token_generator.make_token(user) | |
''' | |
invalidate the token by changing the password | |
''' | |
user.set_password('abcdef123') | |
user.save() | |
url = reverse('password_reset_confirm', kwargs={'uidb64': uid, 'token': token}) | |
self.response = self.client.get(url) | |
def test_status_code(self): | |
self.assertEquals(self.response.status_code, 200) | |
def test_html(self): | |
password_reset_url = reverse('password_reset') | |
self.assertContains(self.response, 'invalid password reset link') | |
self.assertContains(self.response, 'href="{0}"'.format(password_reset_url)) | |
class PasswordResetCompleteTests(TestCase): | |
def setUp(self): | |
url = reverse('password_reset_complete') | |
self.response = self.client.get(url) | |
def test_status_code(self): | |
self.assertEquals(self.response.status_code, 200) | |
def test_view_function(self): | |
view = resolve('/reset/complete/') | |
self.assertEquals(view.func.view_class, auth_views.PasswordResetCompleteView) |
all the test are working correctly but i am getting two errors
FAIL: test_board_topics_view_contains_navigation_links (next.test.test_views.BoardTopicsTests)
Traceback (most recent call last):
File "C:\Users\T-chris\myproject\myproject\next\test\test_views.py", line 42, in test_board_topics_view_contains_navigation_links
self.assertContains(response, 'href="{0}"'.format(homepage_url))
File "C:\Users\T-chris\Envs\final\lib\site-packages\django\test\testcases.py", line 445, in assertContains
text_repr, real_count, msg_prefix = self._assert_contains(
File "C:\Users\T-chris\Envs\final\lib\site-packages\django\test\testcases.py", line 415, in _assert_contains
self.assertEqual(
AssertionError: 404 != 200 : Couldn't retrieve content: Response code was 404 (expected 200)
Ran 46 tests in 7.312s
FAILED (failures=2, errors=2)
Destroying test database for alias 'default'...
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Been following but now have 4 errors
AssertionError: None is not instance of SetPasswordForm —>“test_contains_form” (PasswordResetConfirmTests)
AssertionError: False is not True: Couldn’t find ‘href=/reset/‘ in response —> “test_html” (InvalidPasswordResetConfirmTests)
AssertionError: False is not True: Couldn’t find ‘csrfmiddlewaretoken’ in response —> “test_csrf” (PasswordResetConfirmTests)
AssertionError: 0 != 3 : Found 0 instances of ‘input’ in response —> “test_form_inputs” (PasswordResetConfirmTests)
HELP
Other tests work 💯
And there’s no error only 4 fails.