From 6ed347d8518e23d7e453bdb21f7fa59ce2c4a885 Mon Sep 17 00:00:00 2001
From: Jon Dufresne <jon.dufresne@gmail.com>
Date: Wed, 11 Oct 2017 21:39:22 -0700
Subject: [PATCH] Fixed #28706 -- Moved AuthenticationFormn invalid login
 ValidationError to a method for reuse.

---
 django/contrib/auth/forms.py   | 13 ++++++++-----
 tests/auth_tests/test_forms.py | 11 +++++++++++
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/django/contrib/auth/forms.py b/django/contrib/auth/forms.py
index 3b14a1791e..2c038e8111 100644
--- a/django/contrib/auth/forms.py
+++ b/django/contrib/auth/forms.py
@@ -192,11 +192,7 @@ class AuthenticationForm(forms.Form):
         if username is not None and password:
             self.user_cache = authenticate(self.request, username=username, password=password)
             if self.user_cache is None:
-                raise forms.ValidationError(
-                    self.error_messages['invalid_login'],
-                    code='invalid_login',
-                    params={'username': self.username_field.verbose_name},
-                )
+                raise self.get_invalid_login_error()
             else:
                 self.confirm_login_allowed(self.user_cache)
 
@@ -227,6 +223,13 @@ class AuthenticationForm(forms.Form):
     def get_user(self):
         return self.user_cache
 
+    def get_invalid_login_error(self):
+        return forms.ValidationError(
+            self.error_messages['invalid_login'],
+            code='invalid_login',
+            params={'username': self.username_field.verbose_name},
+        )
+
 
 class PasswordResetForm(forms.Form):
     email = forms.EmailField(label=_("Email"), max_length=254)
diff --git a/tests/auth_tests/test_forms.py b/tests/auth_tests/test_forms.py
index f15aef37e3..1832f81c1c 100644
--- a/tests/auth_tests/test_forms.py
+++ b/tests/auth_tests/test_forms.py
@@ -453,6 +453,17 @@ class AuthenticationFormTest(TestDataMixin, TestCase):
         self.assertEqual(form.errors, {})
         self.assertEqual(form.user_cache, user)
 
+    def test_get_invalid_login_error(self):
+        error = AuthenticationForm().get_invalid_login_error()
+        self.assertIsInstance(error, forms.ValidationError)
+        self.assertEqual(
+            error.message,
+            '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'})
+
 
 class SetPasswordFormTest(TestDataMixin, TestCase):