summaryrefslogtreecommitdiff
path: root/tests/auth_tests/test_forms.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auth_tests/test_forms.py')
-rw-r--r--tests/auth_tests/test_forms.py885
1 files changed, 505 insertions, 380 deletions
diff --git a/tests/auth_tests/test_forms.py b/tests/auth_tests/test_forms.py
index e208305fc6..1713d367c3 100644
--- a/tests/auth_tests/test_forms.py
+++ b/tests/auth_tests/test_forms.py
@@ -3,9 +3,15 @@ import re
from unittest import mock
from django.contrib.auth.forms import (
- AdminPasswordChangeForm, AuthenticationForm, PasswordChangeForm,
- PasswordResetForm, ReadOnlyPasswordHashField, ReadOnlyPasswordHashWidget,
- SetPasswordForm, UserChangeForm, UserCreationForm,
+ AdminPasswordChangeForm,
+ AuthenticationForm,
+ PasswordChangeForm,
+ PasswordResetForm,
+ ReadOnlyPasswordHashField,
+ ReadOnlyPasswordHashWidget,
+ SetPasswordForm,
+ UserChangeForm,
+ UserCreationForm,
)
from django.contrib.auth.models import User
from django.contrib.auth.signals import user_login_failed
@@ -21,7 +27,9 @@ from django.utils.text import capfirst
from django.utils.translation import gettext as _
from .models.custom_user import (
- CustomUser, CustomUserWithoutIsActiveField, ExtensionUser,
+ CustomUser,
+ CustomUserWithoutIsActiveField,
+ ExtensionUser,
)
from .models.with_custom_email_field import CustomEmailField
from .models.with_integer_username import IntegerUsernameUser
@@ -29,75 +37,84 @@ from .settings import AUTH_TEMPLATES
class TestDataMixin:
-
@classmethod
def setUpTestData(cls):
- cls.u1 = User.objects.create_user(username='testclient', password='password', email='testclient@example.com')
- cls.u2 = User.objects.create_user(username='inactive', password='password', is_active=False)
- cls.u3 = User.objects.create_user(username='staff', password='password')
- cls.u4 = User.objects.create(username='empty_password', password='')
- cls.u5 = User.objects.create(username='unmanageable_password', password='$')
- cls.u6 = User.objects.create(username='unknown_password', password='foo$bar')
+ cls.u1 = User.objects.create_user(
+ username="testclient", password="password", email="testclient@example.com"
+ )
+ cls.u2 = User.objects.create_user(
+ username="inactive", password="password", is_active=False
+ )
+ cls.u3 = User.objects.create_user(username="staff", password="password")
+ cls.u4 = User.objects.create(username="empty_password", password="")
+ cls.u5 = User.objects.create(username="unmanageable_password", password="$")
+ cls.u6 = User.objects.create(username="unknown_password", password="foo$bar")
class UserCreationFormTest(TestDataMixin, TestCase):
-
def test_user_already_exists(self):
data = {
- 'username': 'testclient',
- 'password1': 'test123',
- 'password2': 'test123',
+ "username": "testclient",
+ "password1": "test123",
+ "password2": "test123",
}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
- self.assertEqual(form["username"].errors,
- [str(User._meta.get_field('username').error_messages['unique'])])
+ self.assertEqual(
+ form["username"].errors,
+ [str(User._meta.get_field("username").error_messages["unique"])],
+ )
def test_invalid_data(self):
data = {
- 'username': 'jsmith!',
- 'password1': 'test123',
- 'password2': 'test123',
+ "username": "jsmith!",
+ "password1": "test123",
+ "password2": "test123",
}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
- validator = next(v for v in User._meta.get_field('username').validators if v.code == 'invalid')
+ validator = next(
+ v
+ for v in User._meta.get_field("username").validators
+ if v.code == "invalid"
+ )
self.assertEqual(form["username"].errors, [str(validator.message)])
def test_password_verification(self):
# The verification password is incorrect.
data = {
- 'username': 'jsmith',
- 'password1': 'test123',
- 'password2': 'test',
+ "username": "jsmith",
+ "password1": "test123",
+ "password2": "test",
}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
- self.assertEqual(form["password2"].errors,
- [str(form.error_messages['password_mismatch'])])
+ self.assertEqual(
+ form["password2"].errors, [str(form.error_messages["password_mismatch"])]
+ )
def test_both_passwords(self):
# One (or both) passwords weren't given
- data = {'username': 'jsmith'}
+ data = {"username": "jsmith"}
form = UserCreationForm(data)
- required_error = [str(Field.default_error_messages['required'])]
+ required_error = [str(Field.default_error_messages["required"])]
self.assertFalse(form.is_valid())
- self.assertEqual(form['password1'].errors, required_error)
- self.assertEqual(form['password2'].errors, required_error)
+ self.assertEqual(form["password1"].errors, required_error)
+ self.assertEqual(form["password2"].errors, required_error)
- data['password2'] = 'test123'
+ data["password2"] = "test123"
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
- self.assertEqual(form['password1'].errors, required_error)
- self.assertEqual(form['password2'].errors, [])
+ self.assertEqual(form["password1"].errors, required_error)
+ self.assertEqual(form["password2"].errors, [])
- @mock.patch('django.contrib.auth.password_validation.password_changed')
+ @mock.patch("django.contrib.auth.password_validation.password_changed")
def test_success(self, password_changed):
# The success case.
data = {
- 'username': 'jsmith@example.com',
- 'password1': 'test123',
- 'password2': 'test123',
+ "username": "jsmith@example.com",
+ "password1": "test123",
+ "password2": "test123",
}
form = UserCreationForm(data)
self.assertTrue(form.is_valid())
@@ -105,33 +122,33 @@ class UserCreationFormTest(TestDataMixin, TestCase):
self.assertEqual(password_changed.call_count, 0)
u = form.save()
self.assertEqual(password_changed.call_count, 1)
- self.assertEqual(repr(u), '<User: jsmith@example.com>')
+ self.assertEqual(repr(u), "<User: jsmith@example.com>")
def test_unicode_username(self):
data = {
- 'username': '宝',
- 'password1': 'test123',
- 'password2': 'test123',
+ "username": "宝",
+ "password1": "test123",
+ "password2": "test123",
}
form = UserCreationForm(data)
self.assertTrue(form.is_valid())
u = form.save()
- self.assertEqual(u.username, '宝')
+ self.assertEqual(u.username, "宝")
def test_normalize_username(self):
# The normalization happens in AbstractBaseUser.clean() and ModelForm
# validation calls Model.clean().
- ohm_username = 'testΩ' # U+2126 OHM SIGN
+ ohm_username = "testΩ" # U+2126 OHM SIGN
data = {
- 'username': ohm_username,
- 'password1': 'pwd2',
- 'password2': 'pwd2',
+ "username": ohm_username,
+ "password1": "pwd2",
+ "password2": "pwd2",
}
form = UserCreationForm(data)
self.assertTrue(form.is_valid())
user = form.save()
self.assertNotEqual(user.username, ohm_username)
- self.assertEqual(user.username, 'testΩ') # U+03A9 GREEK CAPITAL LETTER OMEGA
+ self.assertEqual(user.username, "testΩ") # U+03A9 GREEK CAPITAL LETTER OMEGA
def test_duplicate_normalized_unicode(self):
"""
@@ -139,53 +156,62 @@ class UserCreationFormTest(TestDataMixin, TestCase):
by their unicode code points only, Unicode NFKC normalization should
make appear them equal to Django.
"""
- omega_username = 'iamtheΩ' # U+03A9 GREEK CAPITAL LETTER OMEGA
- ohm_username = 'iamtheΩ' # U+2126 OHM SIGN
+ omega_username = "iamtheΩ" # U+03A9 GREEK CAPITAL LETTER OMEGA
+ ohm_username = "iamtheΩ" # U+2126 OHM SIGN
self.assertNotEqual(omega_username, ohm_username)
- User.objects.create_user(username=omega_username, password='pwd')
+ User.objects.create_user(username=omega_username, password="pwd")
data = {
- 'username': ohm_username,
- 'password1': 'pwd2',
- 'password2': 'pwd2',
+ "username": ohm_username,
+ "password1": "pwd2",
+ "password2": "pwd2",
}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(
- form.errors['username'], ["A user with that username already exists."]
+ form.errors["username"], ["A user with that username already exists."]
)
- @override_settings(AUTH_PASSWORD_VALIDATORS=[
- {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
- {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': {
- 'min_length': 12,
- }},
- ])
+ @override_settings(
+ AUTH_PASSWORD_VALIDATORS=[
+ {
+ "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator"
+ },
+ {
+ "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
+ "OPTIONS": {
+ "min_length": 12,
+ },
+ },
+ ]
+ )
def test_validates_password(self):
data = {
- 'username': 'testclient',
- 'password1': 'testclient',
- 'password2': 'testclient',
+ "username": "testclient",
+ "password1": "testclient",
+ "password2": "testclient",
}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
- self.assertEqual(len(form['password2'].errors), 2)
- self.assertIn('The password is too similar to the username.', form['password2'].errors)
+ self.assertEqual(len(form["password2"].errors), 2)
+ self.assertIn(
+ "The password is too similar to the username.", form["password2"].errors
+ )
self.assertIn(
- 'This password is too short. It must contain at least 12 characters.',
- form['password2'].errors
+ "This password is too short. It must contain at least 12 characters.",
+ form["password2"].errors,
)
def test_custom_form(self):
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = ExtensionUser
- fields = UserCreationForm.Meta.fields + ('date_of_birth',)
+ fields = UserCreationForm.Meta.fields + ("date_of_birth",)
data = {
- 'username': 'testclient',
- 'password1': 'testclient',
- 'password2': 'testclient',
- 'date_of_birth': '1988-02-24',
+ "username": "testclient",
+ "password1": "testclient",
+ "password2": "testclient",
+ "date_of_birth": "1988-02-24",
}
form = CustomUserCreationForm(data)
self.assertTrue(form.is_valid())
@@ -194,13 +220,13 @@ class UserCreationFormTest(TestDataMixin, TestCase):
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = CustomUser
- fields = ('email', 'date_of_birth')
+ fields = ("email", "date_of_birth")
data = {
- 'email': 'test@client222.com',
- 'password1': 'testclient',
- 'password2': 'testclient',
- 'date_of_birth': '1988-02-24',
+ "email": "test@client222.com",
+ "password1": "testclient",
+ "password2": "testclient",
+ "date_of_birth": "1988-02-24",
}
form = CustomUserCreationForm(data)
self.assertTrue(form.is_valid())
@@ -209,123 +235,144 @@ class UserCreationFormTest(TestDataMixin, TestCase):
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = CustomUserWithoutIsActiveField
- fields = ('email',) # without USERNAME_FIELD
+ fields = ("email",) # without USERNAME_FIELD
data = {
- 'email': 'testclient@example.com',
- 'password1': 'testclient',
- 'password2': 'testclient',
+ "email": "testclient@example.com",
+ "password1": "testclient",
+ "password2": "testclient",
}
form = CustomUserCreationForm(data)
self.assertTrue(form.is_valid())
def test_password_whitespace_not_stripped(self):
data = {
- 'username': 'testuser',
- 'password1': ' testpassword ',
- 'password2': ' testpassword ',
+ "username": "testuser",
+ "password1": " testpassword ",
+ "password2": " testpassword ",
}
form = UserCreationForm(data)
self.assertTrue(form.is_valid())
- self.assertEqual(form.cleaned_data['password1'], data['password1'])
- self.assertEqual(form.cleaned_data['password2'], data['password2'])
+ self.assertEqual(form.cleaned_data["password1"], data["password1"])
+ self.assertEqual(form.cleaned_data["password2"], data["password2"])
- @override_settings(AUTH_PASSWORD_VALIDATORS=[
- {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
- ])
+ @override_settings(
+ AUTH_PASSWORD_VALIDATORS=[
+ {
+ "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator"
+ },
+ ]
+ )
def test_password_help_text(self):
form = UserCreationForm()
self.assertEqual(
- form.fields['password1'].help_text,
- '<ul><li>Your password can’t be too similar to your other personal information.</li></ul>'
+ form.fields["password1"].help_text,
+ "<ul><li>Your password can’t be too similar to your other personal information.</li></ul>",
)
- @override_settings(AUTH_PASSWORD_VALIDATORS=[
- {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
- ])
+ @override_settings(
+ AUTH_PASSWORD_VALIDATORS=[
+ {
+ "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator"
+ },
+ ]
+ )
def test_user_create_form_validates_password_with_all_data(self):
"""UserCreationForm password validation uses all of the form's data."""
+
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = User
- fields = ('username', 'email', 'first_name', 'last_name')
- form = CustomUserCreationForm({
- 'username': 'testuser',
- 'password1': 'testpassword',
- 'password2': 'testpassword',
- 'first_name': 'testpassword',
- 'last_name': 'lastname',
- })
+ fields = ("username", "email", "first_name", "last_name")
+
+ form = CustomUserCreationForm(
+ {
+ "username": "testuser",
+ "password1": "testpassword",
+ "password2": "testpassword",
+ "first_name": "testpassword",
+ "last_name": "lastname",
+ }
+ )
self.assertFalse(form.is_valid())
self.assertEqual(
- form.errors['password2'],
- ['The password is too similar to the first name.'],
+ form.errors["password2"],
+ ["The password is too similar to the first name."],
)
def test_username_field_autocapitalize_none(self):
form = UserCreationForm()
- self.assertEqual(form.fields['username'].widget.attrs.get('autocapitalize'), 'none')
+ self.assertEqual(
+ form.fields["username"].widget.attrs.get("autocapitalize"), "none"
+ )
def test_html_autocomplete_attributes(self):
form = UserCreationForm()
tests = (
- ('username', 'username'),
- ('password1', 'new-password'),
- ('password2', 'new-password'),
+ ("username", "username"),
+ ("password1", "new-password"),
+ ("password2", "new-password"),
)
for field_name, autocomplete in tests:
with self.subTest(field_name=field_name, autocomplete=autocomplete):
- self.assertEqual(form.fields[field_name].widget.attrs['autocomplete'], autocomplete)
+ self.assertEqual(
+ form.fields[field_name].widget.attrs["autocomplete"], autocomplete
+ )
# To verify that the login form rejects inactive users, use an authentication
# backend that allows them.
-@override_settings(AUTHENTICATION_BACKENDS=['django.contrib.auth.backends.AllowAllUsersModelBackend'])
+@override_settings(
+ AUTHENTICATION_BACKENDS=["django.contrib.auth.backends.AllowAllUsersModelBackend"]
+)
class AuthenticationFormTest(TestDataMixin, TestCase):
-
def test_invalid_username(self):
# The user submits an invalid username.
data = {
- 'username': 'jsmith_does_not_exist',
- 'password': 'test123',
+ "username": "jsmith_does_not_exist",
+ "password": "test123",
}
form = AuthenticationForm(None, data)
self.assertFalse(form.is_valid())
self.assertEqual(
- form.non_field_errors(), [
- form.error_messages['invalid_login'] % {
- 'username': User._meta.get_field('username').verbose_name
- }
- ]
+ form.non_field_errors(),
+ [
+ form.error_messages["invalid_login"]
+ % {"username": User._meta.get_field("username").verbose_name}
+ ],
)
def test_inactive_user(self):
# The user is inactive.
data = {
- 'username': 'inactive',
- 'password': 'password',
+ "username": "inactive",
+ "password": "password",
}
form = AuthenticationForm(None, data)
self.assertFalse(form.is_valid())
- self.assertEqual(form.non_field_errors(), [str(form.error_messages['inactive'])])
+ self.assertEqual(
+ form.non_field_errors(), [str(form.error_messages["inactive"])]
+ )
# Use an authentication backend that rejects inactive users.
- @override_settings(AUTHENTICATION_BACKENDS=['django.contrib.auth.backends.ModelBackend'])
+ @override_settings(
+ AUTHENTICATION_BACKENDS=["django.contrib.auth.backends.ModelBackend"]
+ )
def test_inactive_user_incorrect_password(self):
"""An invalid login doesn't leak the inactive status of a user."""
data = {
- 'username': 'inactive',
- 'password': 'incorrect',
+ "username": "inactive",
+ "password": "incorrect",
}
form = AuthenticationForm(None, data)
self.assertFalse(form.is_valid())
self.assertEqual(
- form.non_field_errors(), [
- form.error_messages['invalid_login'] % {
- 'username': User._meta.get_field('username').verbose_name
- }
- ]
+ form.non_field_errors(),
+ [
+ form.error_messages["invalid_login"]
+ % {"username": User._meta.get_field("username").verbose_name}
+ ],
)
def test_login_failed(self):
@@ -337,33 +384,44 @@ class AuthenticationFormTest(TestDataMixin, TestCase):
user_login_failed.connect(signal_handler)
fake_request = object()
try:
- form = AuthenticationForm(fake_request, {
- 'username': 'testclient',
- 'password': 'incorrect',
- })
+ form = AuthenticationForm(
+ fake_request,
+ {
+ "username": "testclient",
+ "password": "incorrect",
+ },
+ )
self.assertFalse(form.is_valid())
- self.assertIs(signal_calls[0]['request'], fake_request)
+ self.assertIs(signal_calls[0]["request"], fake_request)
finally:
user_login_failed.disconnect(signal_handler)
def test_inactive_user_i18n(self):
- with self.settings(USE_I18N=True), translation.override('pt-br', deactivate=True):
+ with self.settings(USE_I18N=True), translation.override(
+ "pt-br", deactivate=True
+ ):
# The user is inactive.
data = {
- 'username': 'inactive',
- 'password': 'password',
+ "username": "inactive",
+ "password": "password",
}
form = AuthenticationForm(None, data)
self.assertFalse(form.is_valid())
- self.assertEqual(form.non_field_errors(), [str(form.error_messages['inactive'])])
+ self.assertEqual(
+ form.non_field_errors(), [str(form.error_messages["inactive"])]
+ )
# Use an authentication backend that allows inactive users.
- @override_settings(AUTHENTICATION_BACKENDS=['django.contrib.auth.backends.AllowAllUsersModelBackend'])
+ @override_settings(
+ AUTHENTICATION_BACKENDS=[
+ "django.contrib.auth.backends.AllowAllUsersModelBackend"
+ ]
+ )
def test_custom_login_allowed_policy(self):
# The user is inactive, but our custom form policy allows them to log in.
data = {
- 'username': 'inactive',
- 'password': 'password',
+ "username": "inactive",
+ "password": "password",
}
class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm):
@@ -383,11 +441,11 @@ class AuthenticationFormTest(TestDataMixin, TestCase):
form = PickyAuthenticationForm(None, data)
self.assertFalse(form.is_valid())
- self.assertEqual(form.non_field_errors(), ['This user is disallowed.'])
+ self.assertEqual(form.non_field_errors(), ["This user is disallowed."])
data = {
- 'username': 'testclient',
- 'password': 'password',
+ "username": "testclient",
+ "password": "password",
}
form = PickyAuthenticationForm(None, data)
self.assertFalse(form.is_valid())
@@ -396,102 +454,103 @@ class AuthenticationFormTest(TestDataMixin, TestCase):
def test_success(self):
# The success case
data = {
- 'username': 'testclient',
- 'password': 'password',
+ "username": "testclient",
+ "password": "password",
}
form = AuthenticationForm(None, data)
self.assertTrue(form.is_valid())
self.assertEqual(form.non_field_errors(), [])
def test_unicode_username(self):
- User.objects.create_user(username='Σαρα', password='pwd')
+ User.objects.create_user(username="Σαρα", password="pwd")
data = {
- 'username': 'Σαρα',
- 'password': 'pwd',
+ "username": "Σαρα",
+ "password": "pwd",
}
form = AuthenticationForm(None, data)
self.assertTrue(form.is_valid())
self.assertEqual(form.non_field_errors(), [])
- @override_settings(AUTH_USER_MODEL='auth_tests.CustomEmailField')
+ @override_settings(AUTH_USER_MODEL="auth_tests.CustomEmailField")
def test_username_field_max_length_matches_user_model(self):
- self.assertEqual(CustomEmailField._meta.get_field('username').max_length, 255)
+ self.assertEqual(CustomEmailField._meta.get_field("username").max_length, 255)
data = {
- 'username': 'u' * 255,
- 'password': 'pwd',
- 'email': 'test@example.com',
+ "username": "u" * 255,
+ "password": "pwd",
+ "email": "test@example.com",
}
CustomEmailField.objects.create_user(**data)
form = AuthenticationForm(None, data)
- self.assertEqual(form.fields['username'].max_length, 255)
- self.assertEqual(form.fields['username'].widget.attrs.get('maxlength'), 255)
+ self.assertEqual(form.fields["username"].max_length, 255)
+ self.assertEqual(form.fields["username"].widget.attrs.get("maxlength"), 255)
self.assertEqual(form.errors, {})
- @override_settings(AUTH_USER_MODEL='auth_tests.IntegerUsernameUser')
+ @override_settings(AUTH_USER_MODEL="auth_tests.IntegerUsernameUser")
def test_username_field_max_length_defaults_to_254(self):
- self.assertIsNone(IntegerUsernameUser._meta.get_field('username').max_length)
+ self.assertIsNone(IntegerUsernameUser._meta.get_field("username").max_length)
data = {
- 'username': '0123456',
- 'password': 'password',
+ "username": "0123456",
+ "password": "password",
}
IntegerUsernameUser.objects.create_user(**data)
form = AuthenticationForm(None, data)
- self.assertEqual(form.fields['username'].max_length, 254)
- self.assertEqual(form.fields['username'].widget.attrs.get('maxlength'), 254)
+ self.assertEqual(form.fields["username"].max_length, 254)
+ self.assertEqual(form.fields["username"].widget.attrs.get("maxlength"), 254)
self.assertEqual(form.errors, {})
def test_username_field_label(self):
-
class CustomAuthenticationForm(AuthenticationForm):
username = CharField(label="Name", max_length=75)
form = CustomAuthenticationForm()
- self.assertEqual(form['username'].label, "Name")
+ self.assertEqual(form["username"].label, "Name")
def test_username_field_label_not_set(self):
-
class CustomAuthenticationForm(AuthenticationForm):
username = CharField()
form = CustomAuthenticationForm()
username_field = User._meta.get_field(User.USERNAME_FIELD)
- self.assertEqual(form.fields['username'].label, capfirst(username_field.verbose_name))
+ self.assertEqual(
+ form.fields["username"].label, capfirst(username_field.verbose_name)
+ )
def test_username_field_autocapitalize_none(self):
form = AuthenticationForm()
- self.assertEqual(form.fields['username'].widget.attrs.get('autocapitalize'), 'none')
+ self.assertEqual(
+ form.fields["username"].widget.attrs.get("autocapitalize"), "none"
+ )
def test_username_field_label_empty_string(self):
-
class CustomAuthenticationForm(AuthenticationForm):
- username = CharField(label='')
+ username = CharField(label="")
form = CustomAuthenticationForm()
- self.assertEqual(form.fields['username'].label, "")
+ self.assertEqual(form.fields["username"].label, "")
def test_password_whitespace_not_stripped(self):
data = {
- 'username': 'testuser',
- 'password': ' pass ',
+ "username": "testuser",
+ "password": " pass ",
}
form = AuthenticationForm(None, data)
form.is_valid() # Not necessary to have valid credentails for the test.
- self.assertEqual(form.cleaned_data['password'], data['password'])
+ self.assertEqual(form.cleaned_data["password"], data["password"])
- @override_settings(AUTH_USER_MODEL='auth_tests.IntegerUsernameUser')
+ @override_settings(AUTH_USER_MODEL="auth_tests.IntegerUsernameUser")
def test_integer_username(self):
class CustomAuthenticationForm(AuthenticationForm):
username = IntegerField()
- user = IntegerUsernameUser.objects.create_user(username=0, password='pwd')
+ user = IntegerUsernameUser.objects.create_user(username=0, password="pwd")
data = {
- 'username': 0,
- 'password': 'pwd',
+ "username": 0,
+ "password": "pwd",
}
form = CustomAuthenticationForm(None, data)
self.assertTrue(form.is_valid())
- self.assertEqual(form.cleaned_data['username'], data['username'])
- self.assertEqual(form.cleaned_data['password'], data['password'])
+ self.assertEqual(form.cleaned_data["username"], data["username"])
+ self.assertEqual(form.cleaned_data["password"], data["password"])
self.assertEqual(form.errors, {})
self.assertEqual(form.user_cache, user)
@@ -500,45 +559,46 @@ class AuthenticationFormTest(TestDataMixin, TestCase):
self.assertIsInstance(error, ValidationError)
self.assertEqual(
error.message,
- 'Please enter a correct %(username)s and password. Note that both '
- 'fields may be case-sensitive.',
+ "Please enter a correct %(username)s and password. Note that both "
+ "fields may be case-sensitive.",
)
- self.assertEqual(error.code, 'invalid_login')
- self.assertEqual(error.params, {'username': 'username'})
+ self.assertEqual(error.code, "invalid_login")
+ self.assertEqual(error.params, {"username": "username"})
def test_html_autocomplete_attributes(self):
form = AuthenticationForm()
tests = (
- ('username', 'username'),
- ('password', 'current-password'),
+ ("username", "username"),
+ ("password", "current-password"),
)
for field_name, autocomplete in tests:
with self.subTest(field_name=field_name, autocomplete=autocomplete):
- self.assertEqual(form.fields[field_name].widget.attrs['autocomplete'], autocomplete)
+ self.assertEqual(
+ form.fields[field_name].widget.attrs["autocomplete"], autocomplete
+ )
class SetPasswordFormTest(TestDataMixin, TestCase):
-
def test_password_verification(self):
# The two new passwords do not match.
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
data = {
- 'new_password1': 'abc123',
- 'new_password2': 'abc',
+ "new_password1": "abc123",
+ "new_password2": "abc",
}
form = SetPasswordForm(user, data)
self.assertFalse(form.is_valid())
self.assertEqual(
form["new_password2"].errors,
- [str(form.error_messages['password_mismatch'])]
+ [str(form.error_messages["password_mismatch"])],
)
- @mock.patch('django.contrib.auth.password_validation.password_changed')
+ @mock.patch("django.contrib.auth.password_validation.password_changed")
def test_success(self, password_changed):
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
data = {
- 'new_password1': 'abc123',
- 'new_password2': 'abc123',
+ "new_password1": "abc123",
+ "new_password2": "abc123",
}
form = SetPasswordForm(user, data)
self.assertTrue(form.is_valid())
@@ -547,51 +607,67 @@ class SetPasswordFormTest(TestDataMixin, TestCase):
form.save()
self.assertEqual(password_changed.call_count, 1)
- @override_settings(AUTH_PASSWORD_VALIDATORS=[
- {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
- {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': {
- 'min_length': 12,
- }},
- ])
+ @override_settings(
+ AUTH_PASSWORD_VALIDATORS=[
+ {
+ "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator"
+ },
+ {
+ "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
+ "OPTIONS": {
+ "min_length": 12,
+ },
+ },
+ ]
+ )
def test_validates_password(self):
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
data = {
- 'new_password1': 'testclient',
- 'new_password2': 'testclient',
+ "new_password1": "testclient",
+ "new_password2": "testclient",
}
form = SetPasswordForm(user, data)
self.assertFalse(form.is_valid())
self.assertEqual(len(form["new_password2"].errors), 2)
- self.assertIn('The password is too similar to the username.', form["new_password2"].errors)
self.assertIn(
- 'This password is too short. It must contain at least 12 characters.',
- form["new_password2"].errors
+ "The password is too similar to the username.", form["new_password2"].errors
+ )
+ self.assertIn(
+ "This password is too short. It must contain at least 12 characters.",
+ form["new_password2"].errors,
)
def test_password_whitespace_not_stripped(self):
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
data = {
- 'new_password1': ' password ',
- 'new_password2': ' password ',
+ "new_password1": " password ",
+ "new_password2": " password ",
}
form = SetPasswordForm(user, data)
self.assertTrue(form.is_valid())
- self.assertEqual(form.cleaned_data['new_password1'], data['new_password1'])
- self.assertEqual(form.cleaned_data['new_password2'], data['new_password2'])
+ self.assertEqual(form.cleaned_data["new_password1"], data["new_password1"])
+ self.assertEqual(form.cleaned_data["new_password2"], data["new_password2"])
- @override_settings(AUTH_PASSWORD_VALIDATORS=[
- {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
- {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': {
- 'min_length': 12,
- }},
- ])
+ @override_settings(
+ AUTH_PASSWORD_VALIDATORS=[
+ {
+ "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator"
+ },
+ {
+ "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
+ "OPTIONS": {
+ "min_length": 12,
+ },
+ },
+ ]
+ )
def test_help_text_translation(self):
french_help_texts = [
- 'Votre mot de passe ne peut pas trop ressembler à vos autres informations personnelles.',
- 'Votre mot de passe doit contenir au minimum 12 caractères.',
+ "Votre mot de passe ne peut pas trop ressembler à vos autres informations personnelles.",
+ "Votre mot de passe doit contenir au minimum 12 caractères.",
]
form = SetPasswordForm(self.u1)
- with translation.override('fr'):
+ with translation.override("fr"):
html = form.as_p()
for french_text in french_help_texts:
self.assertIn(french_text, html)
@@ -599,47 +675,54 @@ class SetPasswordFormTest(TestDataMixin, TestCase):
def test_html_autocomplete_attributes(self):
form = SetPasswordForm(self.u1)
tests = (
- ('new_password1', 'new-password'),
- ('new_password2', 'new-password'),
+ ("new_password1", "new-password"),
+ ("new_password2", "new-password"),
)
for field_name, autocomplete in tests:
with self.subTest(field_name=field_name, autocomplete=autocomplete):
- self.assertEqual(form.fields[field_name].widget.attrs['autocomplete'], autocomplete)
+ self.assertEqual(
+ form.fields[field_name].widget.attrs["autocomplete"], autocomplete
+ )
class PasswordChangeFormTest(TestDataMixin, TestCase):
-
def test_incorrect_password(self):
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
data = {
- 'old_password': 'test',
- 'new_password1': 'abc123',
- 'new_password2': 'abc123',
+ "old_password": "test",
+ "new_password1": "abc123",
+ "new_password2": "abc123",
}
form = PasswordChangeForm(user, data)
self.assertFalse(form.is_valid())
- self.assertEqual(form["old_password"].errors, [str(form.error_messages['password_incorrect'])])
+ self.assertEqual(
+ form["old_password"].errors,
+ [str(form.error_messages["password_incorrect"])],
+ )
def test_password_verification(self):
# The two new passwords do not match.
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
data = {
- 'old_password': 'password',
- 'new_password1': 'abc123',
- 'new_password2': 'abc',
+ "old_password": "password",
+ "new_password1": "abc123",
+ "new_password2": "abc",
}
form = PasswordChangeForm(user, data)
self.assertFalse(form.is_valid())
- self.assertEqual(form["new_password2"].errors, [str(form.error_messages['password_mismatch'])])
+ self.assertEqual(
+ form["new_password2"].errors,
+ [str(form.error_messages["password_mismatch"])],
+ )
- @mock.patch('django.contrib.auth.password_validation.password_changed')
+ @mock.patch("django.contrib.auth.password_validation.password_changed")
def test_success(self, password_changed):
# The success case.
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
data = {
- 'old_password': 'password',
- 'new_password1': 'abc123',
- 'new_password2': 'abc123',
+ "old_password": "password",
+ "new_password1": "abc123",
+ "new_password2": "abc123",
}
form = PasswordChangeForm(user, data)
self.assertTrue(form.is_valid())
@@ -650,37 +733,45 @@ class PasswordChangeFormTest(TestDataMixin, TestCase):
def test_field_order(self):
# Regression test - check the order of fields:
- user = User.objects.get(username='testclient')
- self.assertEqual(list(PasswordChangeForm(user, {}).fields), ['old_password', 'new_password1', 'new_password2'])
+ user = User.objects.get(username="testclient")
+ self.assertEqual(
+ list(PasswordChangeForm(user, {}).fields),
+ ["old_password", "new_password1", "new_password2"],
+ )
def test_password_whitespace_not_stripped(self):
- user = User.objects.get(username='testclient')
- user.set_password(' oldpassword ')
+ user = User.objects.get(username="testclient")
+ user.set_password(" oldpassword ")
data = {
- 'old_password': ' oldpassword ',
- 'new_password1': ' pass ',
- 'new_password2': ' pass ',
+ "old_password": " oldpassword ",
+ "new_password1": " pass ",
+ "new_password2": " pass ",
}
form = PasswordChangeForm(user, data)
self.assertTrue(form.is_valid())
- self.assertEqual(form.cleaned_data['old_password'], data['old_password'])
- self.assertEqual(form.cleaned_data['new_password1'], data['new_password1'])
- self.assertEqual(form.cleaned_data['new_password2'], data['new_password2'])
+ self.assertEqual(form.cleaned_data["old_password"], data["old_password"])
+ self.assertEqual(form.cleaned_data["new_password1"], data["new_password1"])
+ self.assertEqual(form.cleaned_data["new_password2"], data["new_password2"])
def test_html_autocomplete_attributes(self):
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
form = PasswordChangeForm(user)
- self.assertEqual(form.fields['old_password'].widget.attrs['autocomplete'], 'current-password')
+ self.assertEqual(
+ form.fields["old_password"].widget.attrs["autocomplete"], "current-password"
+ )
class UserChangeFormTest(TestDataMixin, TestCase):
-
def test_username_validity(self):
- user = User.objects.get(username='testclient')
- data = {'username': 'not valid'}
+ user = User.objects.get(username="testclient")
+ data = {"username": "not valid"}
form = UserChangeForm(data, instance=user)
self.assertFalse(form.is_valid())
- validator = next(v for v in User._meta.get_field('username').validators if v.code == 'invalid')
+ validator = next(
+ v
+ for v in User._meta.get_field("username").validators
+ if v.code == "invalid"
+ )
self.assertEqual(form["username"].errors, [str(validator.message)])
def test_bug_14242(self):
@@ -690,40 +781,46 @@ class UserChangeFormTest(TestDataMixin, TestCase):
class MyUserForm(UserChangeForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
- self.fields['groups'].help_text = 'These groups give users different permissions'
+ self.fields[
+ "groups"
+ ].help_text = "These groups give users different permissions"
class Meta(UserChangeForm.Meta):
- fields = ('groups',)
+ fields = ("groups",)
# Just check we can create it
MyUserForm({})
def test_unusable_password(self):
- user = User.objects.get(username='empty_password')
+ user = User.objects.get(username="empty_password")
user.set_unusable_password()
user.save()
form = UserChangeForm(instance=user)
self.assertIn(_("No password set."), form.as_table())
def test_bug_17944_empty_password(self):
- user = User.objects.get(username='empty_password')
+ user = User.objects.get(username="empty_password")
form = UserChangeForm(instance=user)
self.assertIn(_("No password set."), form.as_table())
def test_bug_17944_unmanageable_password(self):
- user = User.objects.get(username='unmanageable_password')
+ user = User.objects.get(username="unmanageable_password")
form = UserChangeForm(instance=user)
- self.assertIn(_("Invalid password format or unknown hashing algorithm."), form.as_table())
+ self.assertIn(
+ _("Invalid password format or unknown hashing algorithm."), form.as_table()
+ )
def test_bug_17944_unknown_password_algorithm(self):
- user = User.objects.get(username='unknown_password')
+ user = User.objects.get(username="unknown_password")
form = UserChangeForm(instance=user)
- self.assertIn(_("Invalid password format or unknown hashing algorithm."), form.as_table())
+ self.assertIn(
+ _("Invalid password format or unknown hashing algorithm."), form.as_table()
+ )
def test_bug_19133(self):
"The change form does not return the password value"
# Use the form to construct the POST data
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
form_for_data = UserChangeForm(instance=user)
post_data = form_for_data.initial
@@ -731,38 +828,42 @@ class UserChangeFormTest(TestDataMixin, TestCase):
# posted here should be ignored; the form will be
# valid, and give back the 'initial' value for the
# password field.
- post_data['password'] = 'new password'
+ post_data["password"] = "new password"
form = UserChangeForm(instance=user, data=post_data)
self.assertTrue(form.is_valid())
# original hashed password contains $
- self.assertIn('$', form.cleaned_data['password'])
+ self.assertIn("$", form.cleaned_data["password"])
def test_bug_19349_bound_password_field(self):
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
form = UserChangeForm(data={}, instance=user)
# When rendering the bound password field,
# ReadOnlyPasswordHashWidget needs the initial
# value to render correctly
- self.assertEqual(form.initial['password'], form['password'].value())
+ self.assertEqual(form.initial["password"], form["password"].value())
def test_custom_form(self):
class CustomUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
model = ExtensionUser
- fields = ('username', 'password', 'date_of_birth',)
+ fields = (
+ "username",
+ "password",
+ "date_of_birth",
+ )
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
data = {
- 'username': 'testclient',
- 'password': 'testclient',
- 'date_of_birth': '1998-02-24',
+ "username": "testclient",
+ "password": "testclient",
+ "date_of_birth": "1998-02-24",
}
form = CustomUserChangeForm(data, instance=user)
self.assertTrue(form.is_valid())
form.save()
- self.assertEqual(form.cleaned_data['username'], 'testclient')
- self.assertEqual(form.cleaned_data['date_of_birth'], datetime.date(1998, 2, 24))
+ self.assertEqual(form.cleaned_data["username"], "testclient")
+ self.assertEqual(form.cleaned_data["date_of_birth"], datetime.date(1998, 2, 24))
def test_password_excluded(self):
class UserChangeFormWithoutPassword(UserChangeForm):
@@ -770,19 +871,20 @@ class UserChangeFormTest(TestDataMixin, TestCase):
class Meta:
model = User
- exclude = ['password']
+ exclude = ["password"]
form = UserChangeFormWithoutPassword()
- self.assertNotIn('password', form.fields)
+ self.assertNotIn("password", form.fields)
def test_username_field_autocapitalize_none(self):
form = UserChangeForm()
- self.assertEqual(form.fields['username'].widget.attrs.get('autocapitalize'), 'none')
+ self.assertEqual(
+ form.fields["username"].widget.attrs.get("autocapitalize"), "none"
+ )
@override_settings(TEMPLATES=AUTH_TEMPLATES)
class PasswordResetFormTest(TestDataMixin, TestCase):
-
@classmethod
def setUpClass(cls):
super().setUpClass()
@@ -794,48 +896,48 @@ class PasswordResetFormTest(TestDataMixin, TestCase):
"""
Create a user and return a tuple (user_object, username, email).
"""
- username = 'jsmith'
- email = 'jsmith@example.com'
- user = User.objects.create_user(username, email, 'test123')
+ username = "jsmith"
+ email = "jsmith@example.com"
+ user = User.objects.create_user(username, email, "test123")
return (user, username, email)
def test_invalid_email(self):
- data = {'email': 'not valid'}
+ data = {"email": "not valid"}
form = PasswordResetForm(data)
self.assertFalse(form.is_valid())
- self.assertEqual(form['email'].errors, [_('Enter a valid email address.')])
+ self.assertEqual(form["email"].errors, [_("Enter a valid email address.")])
def test_user_email_unicode_collision(self):
- User.objects.create_user('mike123', 'mike@example.org', 'test123')
- User.objects.create_user('mike456', 'mıke@example.org', 'test123')
- data = {'email': 'mıke@example.org'}
+ User.objects.create_user("mike123", "mike@example.org", "test123")
+ User.objects.create_user("mike456", "mıke@example.org", "test123")
+ data = {"email": "mıke@example.org"}
form = PasswordResetForm(data)
self.assertTrue(form.is_valid())
form.save()
self.assertEqual(len(mail.outbox), 1)
- self.assertEqual(mail.outbox[0].to, ['mıke@example.org'])
+ self.assertEqual(mail.outbox[0].to, ["mıke@example.org"])
def test_user_email_domain_unicode_collision(self):
- User.objects.create_user('mike123', 'mike@ixample.org', 'test123')
- User.objects.create_user('mike456', 'mike@ıxample.org', 'test123')
- data = {'email': 'mike@ıxample.org'}
+ User.objects.create_user("mike123", "mike@ixample.org", "test123")
+ User.objects.create_user("mike456", "mike@ıxample.org", "test123")
+ data = {"email": "mike@ıxample.org"}
form = PasswordResetForm(data)
self.assertTrue(form.is_valid())
form.save()
self.assertEqual(len(mail.outbox), 1)
- self.assertEqual(mail.outbox[0].to, ['mike@ıxample.org'])
+ self.assertEqual(mail.outbox[0].to, ["mike@ıxample.org"])
def test_user_email_unicode_collision_nonexistent(self):
- User.objects.create_user('mike123', 'mike@example.org', 'test123')
- data = {'email': 'mıke@example.org'}
+ User.objects.create_user("mike123", "mike@example.org", "test123")
+ data = {"email": "mıke@example.org"}
form = PasswordResetForm(data)
self.assertTrue(form.is_valid())
form.save()
self.assertEqual(len(mail.outbox), 0)
def test_user_email_domain_unicode_collision_nonexistent(self):
- User.objects.create_user('mike123', 'mike@ixample.org', 'test123')
- data = {'email': 'mike@ıxample.org'}
+ User.objects.create_user("mike123", "mike@ixample.org", "test123")
+ data = {"email": "mike@ıxample.org"}
form = PasswordResetForm(data)
self.assertTrue(form.is_valid())
form.save()
@@ -846,44 +948,51 @@ class PasswordResetFormTest(TestDataMixin, TestCase):
Test nonexistent email address. This should not fail because it would
expose information about registered users.
"""
- data = {'email': 'foo@bar.com'}
+ data = {"email": "foo@bar.com"}
form = PasswordResetForm(data)
self.assertTrue(form.is_valid())
self.assertEqual(len(mail.outbox), 0)
def test_cleaned_data(self):
(user, username, email) = self.create_dummy_user()
- data = {'email': email}
+ data = {"email": email}
form = PasswordResetForm(data)
self.assertTrue(form.is_valid())
- form.save(domain_override='example.com')
- self.assertEqual(form.cleaned_data['email'], email)
+ form.save(domain_override="example.com")
+ self.assertEqual(form.cleaned_data["email"], email)
self.assertEqual(len(mail.outbox), 1)
def test_custom_email_subject(self):
- data = {'email': 'testclient@example.com'}
+ data = {"email": "testclient@example.com"}
form = PasswordResetForm(data)
self.assertTrue(form.is_valid())
# Since we're not providing a request object, we must provide a
# domain_override to prevent the save operation from failing in the
# potential case where contrib.sites is not installed. Refs #16412.
- form.save(domain_override='example.com')
+ form.save(domain_override="example.com")
self.assertEqual(len(mail.outbox), 1)
- self.assertEqual(mail.outbox[0].subject, 'Custom password reset on example.com')
+ self.assertEqual(mail.outbox[0].subject, "Custom password reset on example.com")
def test_custom_email_constructor(self):
- data = {'email': 'testclient@example.com'}
+ data = {"email": "testclient@example.com"}
class CustomEmailPasswordResetForm(PasswordResetForm):
- def send_mail(self, subject_template_name, email_template_name,
- context, from_email, to_email,
- html_email_template_name=None):
+ def send_mail(
+ self,
+ subject_template_name,
+ email_template_name,
+ context,
+ from_email,
+ to_email,
+ html_email_template_name=None,
+ ):
EmailMultiAlternatives(
"Forgot your password?",
"Sorry to hear you forgot your password.",
- None, [to_email],
- ['site_monitor@example.com'],
- headers={'Reply-To': 'webmaster@example.com'},
+ None,
+ [to_email],
+ ["site_monitor@example.com"],
+ headers={"Reply-To": "webmaster@example.com"},
alternatives=[
("Really sorry to hear you forgot your password.", "text/html")
],
@@ -894,10 +1003,10 @@ class PasswordResetFormTest(TestDataMixin, TestCase):
# Since we're not providing a request object, we must provide a
# domain_override to prevent the save operation from failing in the
# potential case where contrib.sites is not installed. Refs #16412.
- form.save(domain_override='example.com')
+ form.save(domain_override="example.com")
self.assertEqual(len(mail.outbox), 1)
- self.assertEqual(mail.outbox[0].subject, 'Forgot your password?')
- self.assertEqual(mail.outbox[0].bcc, ['site_monitor@example.com'])
+ self.assertEqual(mail.outbox[0].subject, "Forgot your password?")
+ self.assertEqual(mail.outbox[0].bcc, ["site_monitor@example.com"])
self.assertEqual(mail.outbox[0].content_subtype, "plain")
def test_preserve_username_case(self):
@@ -905,10 +1014,10 @@ class PasswordResetFormTest(TestDataMixin, TestCase):
Preserve the case of the user name (before the @ in the email address)
when creating a user (#5605).
"""
- user = User.objects.create_user('forms_test2', 'tesT@EXAMple.com', 'test')
- self.assertEqual(user.email, 'tesT@example.com')
- user = User.objects.create_user('forms_test3', 'tesT', 'test')
- self.assertEqual(user.email, 'tesT')
+ user = User.objects.create_user("forms_test2", "tesT@EXAMple.com", "test")
+ self.assertEqual(user.email, "tesT@example.com")
+ user = User.objects.create_user("forms_test3", "tesT", "test")
+ self.assertEqual(user.email, "tesT")
def test_inactive_user(self):
"""
@@ -917,13 +1026,13 @@ class PasswordResetFormTest(TestDataMixin, TestCase):
(user, username, email) = self.create_dummy_user()
user.is_active = False
user.save()
- form = PasswordResetForm({'email': email})
+ form = PasswordResetForm({"email": email})
self.assertTrue(form.is_valid())
form.save()
self.assertEqual(len(mail.outbox), 0)
def test_unusable_password(self):
- user = User.objects.create_user('testuser', 'test@example.com', 'test')
+ user = User.objects.create_user("testuser", "test@example.com", "test")
data = {"email": "test@example.com"}
form = PasswordResetForm(data)
self.assertTrue(form.is_valid())
@@ -948,11 +1057,13 @@ class PasswordResetFormTest(TestDataMixin, TestCase):
self.assertEqual(len(mail.outbox), 1)
message = mail.outbox[0].message()
self.assertFalse(message.is_multipart())
- self.assertEqual(message.get_content_type(), 'text/plain')
- self.assertEqual(message.get('subject'), 'Custom password reset on example.com')
+ self.assertEqual(message.get_content_type(), "text/plain")
+ self.assertEqual(message.get("subject"), "Custom password reset on example.com")
self.assertEqual(len(mail.outbox[0].alternatives), 0)
- self.assertEqual(message.get_all('to'), [email])
- self.assertTrue(re.match(r'^http://example.com/reset/[\w+/-]', message.get_payload()))
+ self.assertEqual(message.get_all("to"), [email])
+ self.assertTrue(
+ re.match(r"^http://example.com/reset/[\w+/-]", message.get_payload())
+ )
def test_save_html_email_template_name(self):
"""
@@ -964,53 +1075,63 @@ class PasswordResetFormTest(TestDataMixin, TestCase):
(user, username, email) = self.create_dummy_user()
form = PasswordResetForm({"email": email})
self.assertTrue(form.is_valid())
- form.save(html_email_template_name='registration/html_password_reset_email.html')
+ form.save(
+ html_email_template_name="registration/html_password_reset_email.html"
+ )
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(len(mail.outbox[0].alternatives), 1)
message = mail.outbox[0].message()
- self.assertEqual(message.get('subject'), 'Custom password reset on example.com')
+ self.assertEqual(message.get("subject"), "Custom password reset on example.com")
self.assertEqual(len(message.get_payload()), 2)
self.assertTrue(message.is_multipart())
- self.assertEqual(message.get_payload(0).get_content_type(), 'text/plain')
- self.assertEqual(message.get_payload(1).get_content_type(), 'text/html')
- self.assertEqual(message.get_all('to'), [email])
- self.assertTrue(re.match(r'^http://example.com/reset/[\w/-]+', message.get_payload(0).get_payload()))
- self.assertTrue(re.match(
- r'^<html><a href="http://example.com/reset/[\w/-]+/">Link</a></html>$',
- message.get_payload(1).get_payload()
- ))
+ self.assertEqual(message.get_payload(0).get_content_type(), "text/plain")
+ self.assertEqual(message.get_payload(1).get_content_type(), "text/html")
+ self.assertEqual(message.get_all("to"), [email])
+ self.assertTrue(
+ re.match(
+ r"^http://example.com/reset/[\w/-]+",
+ message.get_payload(0).get_payload(),
+ )
+ )
+ self.assertTrue(
+ re.match(
+ r'^<html><a href="http://example.com/reset/[\w/-]+/">Link</a></html>$',
+ message.get_payload(1).get_payload(),
+ )
+ )
- @override_settings(AUTH_USER_MODEL='auth_tests.CustomEmailField')
+ @override_settings(AUTH_USER_MODEL="auth_tests.CustomEmailField")
def test_custom_email_field(self):
- email = 'test@mail.com'
- CustomEmailField.objects.create_user('test name', 'test password', email)
- form = PasswordResetForm({'email': email})
+ email = "test@mail.com"
+ CustomEmailField.objects.create_user("test name", "test password", email)
+ form = PasswordResetForm({"email": email})
self.assertTrue(form.is_valid())
form.save()
- self.assertEqual(form.cleaned_data['email'], email)
+ self.assertEqual(form.cleaned_data["email"], email)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].to, [email])
def test_html_autocomplete_attributes(self):
form = PasswordResetForm()
- self.assertEqual(form.fields['email'].widget.attrs['autocomplete'], 'email')
+ self.assertEqual(form.fields["email"].widget.attrs["autocomplete"], "email")
class ReadOnlyPasswordHashTest(SimpleTestCase):
-
def test_bug_19349_render_with_none_value(self):
# Rendering the widget with value set to None
# mustn't raise an exception.
widget = ReadOnlyPasswordHashWidget()
- html = widget.render(name='password', value=None, attrs={})
+ html = widget.render(name="password", value=None, attrs={})
self.assertIn(_("No password set."), html)
- @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.PBKDF2PasswordHasher'])
+ @override_settings(
+ PASSWORD_HASHERS=["django.contrib.auth.hashers.PBKDF2PasswordHasher"]
+ )
def test_render(self):
widget = ReadOnlyPasswordHashWidget()
- value = 'pbkdf2_sha256$100000$a6Pucb1qSFcD$WmCkn9Hqidj48NVe5x0FEM6A9YiOqQcl/83m2Z5udm0='
+ value = "pbkdf2_sha256$100000$a6Pucb1qSFcD$WmCkn9Hqidj48NVe5x0FEM6A9YiOqQcl/83m2Z5udm0="
self.assertHTMLEqual(
- widget.render('name', value, {'id': 'id_password'}),
+ widget.render("name", value, {"id": "id_password"}),
"""
<div id="id_password">
<strong>algorithm</strong>: pbkdf2_sha256
@@ -1018,35 +1139,35 @@ class ReadOnlyPasswordHashTest(SimpleTestCase):
<strong>salt</strong>: a6Pucb******
<strong>hash</strong>: WmCkn9**************************************
</div>
- """
+ """,
)
def test_readonly_field_has_changed(self):
field = ReadOnlyPasswordHashField()
self.assertIs(field.disabled, True)
- self.assertFalse(field.has_changed('aaa', 'bbb'))
+ self.assertFalse(field.has_changed("aaa", "bbb"))
def test_label(self):
"""
ReadOnlyPasswordHashWidget doesn't contain a for attribute in the
<label> because it doesn't have any labelable elements.
"""
+
class TestForm(forms.Form):
hash_field = ReadOnlyPasswordHashField()
- bound_field = TestForm()['hash_field']
- self.assertIsNone(bound_field.field.widget.id_for_label('id'))
- self.assertEqual(bound_field.label_tag(), '<label>Hash field:</label>')
+ bound_field = TestForm()["hash_field"]
+ self.assertIsNone(bound_field.field.widget.id_for_label("id"))
+ self.assertEqual(bound_field.label_tag(), "<label>Hash field:</label>")
class AdminPasswordChangeFormTest(TestDataMixin, TestCase):
-
- @mock.patch('django.contrib.auth.password_validation.password_changed')
+ @mock.patch("django.contrib.auth.password_validation.password_changed")
def test_success(self, password_changed):
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
data = {
- 'password1': 'test123',
- 'password2': 'test123',
+ "password1": "test123",
+ "password2": "test123",
}
form = AdminPasswordChangeForm(user, data)
self.assertTrue(form.is_valid())
@@ -1056,47 +1177,51 @@ class AdminPasswordChangeFormTest(TestDataMixin, TestCase):
self.assertEqual(password_changed.call_count, 1)
def test_password_whitespace_not_stripped(self):
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
data = {
- 'password1': ' pass ',
- 'password2': ' pass ',
+ "password1": " pass ",
+ "password2": " pass ",
}
form = AdminPasswordChangeForm(user, data)
self.assertTrue(form.is_valid())
- self.assertEqual(form.cleaned_data['password1'], data['password1'])
- self.assertEqual(form.cleaned_data['password2'], data['password2'])
+ self.assertEqual(form.cleaned_data["password1"], data["password1"])
+ self.assertEqual(form.cleaned_data["password2"], data["password2"])
def test_non_matching_passwords(self):
- user = User.objects.get(username='testclient')
- data = {'password1': 'password1', 'password2': 'password2'}
+ user = User.objects.get(username="testclient")
+ data = {"password1": "password1", "password2": "password2"}
form = AdminPasswordChangeForm(user, data)
- self.assertEqual(form.errors['password2'], [form.error_messages['password_mismatch']])
+ self.assertEqual(
+ form.errors["password2"], [form.error_messages["password_mismatch"]]
+ )
def test_missing_passwords(self):
- user = User.objects.get(username='testclient')
- data = {'password1': '', 'password2': ''}
+ user = User.objects.get(username="testclient")
+ data = {"password1": "", "password2": ""}
form = AdminPasswordChangeForm(user, data)
- required_error = [Field.default_error_messages['required']]
- self.assertEqual(form.errors['password1'], required_error)
- self.assertEqual(form.errors['password2'], required_error)
+ required_error = [Field.default_error_messages["required"]]
+ self.assertEqual(form.errors["password1"], required_error)
+ self.assertEqual(form.errors["password2"], required_error)
def test_one_password(self):
- user = User.objects.get(username='testclient')
- form1 = AdminPasswordChangeForm(user, {'password1': '', 'password2': 'test'})
- required_error = [Field.default_error_messages['required']]
- self.assertEqual(form1.errors['password1'], required_error)
- self.assertNotIn('password2', form1.errors)
- form2 = AdminPasswordChangeForm(user, {'password1': 'test', 'password2': ''})
- self.assertEqual(form2.errors['password2'], required_error)
- self.assertNotIn('password1', form2.errors)
+ user = User.objects.get(username="testclient")
+ form1 = AdminPasswordChangeForm(user, {"password1": "", "password2": "test"})
+ required_error = [Field.default_error_messages["required"]]
+ self.assertEqual(form1.errors["password1"], required_error)
+ self.assertNotIn("password2", form1.errors)
+ form2 = AdminPasswordChangeForm(user, {"password1": "test", "password2": ""})
+ self.assertEqual(form2.errors["password2"], required_error)
+ self.assertNotIn("password1", form2.errors)
def test_html_autocomplete_attributes(self):
- user = User.objects.get(username='testclient')
+ user = User.objects.get(username="testclient")
form = AdminPasswordChangeForm(user)
tests = (
- ('password1', 'new-password'),
- ('password2', 'new-password'),
+ ("password1", "new-password"),
+ ("password2", "new-password"),
)
for field_name, autocomplete in tests:
with self.subTest(field_name=field_name, autocomplete=autocomplete):
- self.assertEqual(form.fields[field_name].widget.attrs['autocomplete'], autocomplete)
+ self.assertEqual(
+ form.fields[field_name].widget.attrs["autocomplete"], autocomplete
+ )