diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/auth_tests/test_management.py | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/tests/auth_tests/test_management.py b/tests/auth_tests/test_management.py index f45703fcfd..891cfda50c 100644 --- a/tests/auth_tests/test_management.py +++ b/tests/auth_tests/test_management.py @@ -43,6 +43,8 @@ def mock_inputs(inputs): if six.PY2: # getpass on Windows only supports prompt as bytestring (#19807) assert isinstance(prompt, six.binary_type) + if callable(inputs['password']): + return inputs['password']() return inputs['password'] def mock_input(prompt): @@ -107,6 +109,9 @@ class GetDefaultUsernameTestCase(TestCase): self.assertEqual(management.get_default_username(), 'julia') +@override_settings(AUTH_PASSWORD_VALIDATORS=[ + {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'}, +]) class ChangepasswordManagementCommandTestCase(TestCase): def setUp(self): @@ -139,11 +144,24 @@ class ChangepasswordManagementCommandTestCase(TestCase): mismatched passwords three times. """ command = changepassword.Command() - command._get_pass = lambda *args: args or 'foo' + command._get_pass = lambda *args: str(args) or 'foo' with self.assertRaises(CommandError): command.execute(username="joe", stdout=self.stdout, stderr=self.stderr) + def test_password_validation(self): + """ + A CommandError should be raised if the user enters in passwords which + fail validation three times. + """ + command = changepassword.Command() + command._get_pass = lambda *args: '1234567890' + + abort_msg = "Aborting password change for user 'joe' after 3 attempts" + with self.assertRaisesMessage(CommandError, abort_msg): + command.execute(username="joe", stdout=self.stdout, stderr=self.stderr) + self.assertIn('This password is entirely numeric.', self.stdout.getvalue()) + def test_that_changepassword_command_works_with_nonascii_output(self): """ #21627 -- Executing the changepassword management command should allow @@ -158,7 +176,10 @@ class ChangepasswordManagementCommandTestCase(TestCase): command.execute(username="J\xfalia", stdout=self.stdout) -@override_settings(SILENCED_SYSTEM_CHECKS=['fields.W342']) # ForeignKey(unique=True) +@override_settings( + SILENCED_SYSTEM_CHECKS=['fields.W342'], # ForeignKey(unique=True) + AUTH_PASSWORD_VALIDATORS=[{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'}], +) class CreatesuperuserManagementCommandTestCase(TestCase): def test_basic_usage(self): @@ -443,6 +464,39 @@ class CreatesuperuserManagementCommandTestCase(TestCase): test(self) + def test_password_validation(self): + """ + Creation should fail if the password fails validation. + """ + new_io = six.StringIO() + # Returns '1234567890' the first two times it is called, then + # 'password' subsequently. + def bad_then_good_password(index=[0]): + index[0] += 1 + if index[0] <= 2: + return '1234567890' + return 'password' + + @mock_inputs({ + 'password': bad_then_good_password, + 'username': 'joe1234567890', + }) + def test(self): + call_command( + "createsuperuser", + interactive=True, + stdin=MockTTY(), + stdout=new_io, + stderr=new_io, + ) + self.assertEqual( + new_io.getvalue().strip(), + "This password is entirely numeric.\n" + "Superuser created successfully." + ) + + test(self) + class CustomUserModelValidationTestCase(SimpleTestCase): @override_settings(AUTH_USER_MODEL='auth.CustomUserNonListRequiredFields') |
