summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBaptiste Mispelon <bmispelon@gmail.com>2022-02-14 08:42:27 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-02-14 08:43:46 +0100
commit7986028e3fbc9f84fca5a25a03cecfbc85ca5ce7 (patch)
tree817ce34252ceb1765e4118d1c8c28e93f4f00c8f
parentcdd4ff67d23b80741047eaf6b180dc67a782dfbd (diff)
Refs #33348 -- Made SimpleTestCase.assertFormError()/assertFormsetErrors() raise an error for unbound forms/formsets.
-rw-r--r--django/contrib/admin/helpers.py8
-rw-r--r--django/test/testcases.py12
-rw-r--r--tests/test_utils/tests.py14
3 files changed, 32 insertions, 2 deletions
diff --git a/django/contrib/admin/helpers.py b/django/contrib/admin/helpers.py
index 2e7a20a49b..aea13b94d7 100644
--- a/django/contrib/admin/helpers.py
+++ b/django/contrib/admin/helpers.py
@@ -84,6 +84,10 @@ class AdminForm:
return self.form.non_field_errors
@property
+ def is_bound(self):
+ return self.form.is_bound
+
+ @property
def media(self):
media = self.form.media
for fs in self:
@@ -438,6 +442,10 @@ class InlineAdminFormSet:
return self.formset.non_form_errors
@property
+ def is_bound(self):
+ return self.formset.is_bound
+
+ @property
def media(self):
media = self.opts.media + self.formset.media
for fs in self:
diff --git a/django/test/testcases.py b/django/test/testcases.py
index 14416807be..0d24bf0d40 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -595,6 +595,12 @@ class SimpleTestCase(unittest.TestCase):
for i, context in enumerate(contexts):
if form not in context:
continue
+ if not context[form].is_bound:
+ form_repr = repr(context[form])
+ self.fail(
+ f"{msg_prefix}The form {form_repr} is not bound, it will never "
+ f"have any errors."
+ )
found_form = True
for err in errors:
if field:
@@ -680,6 +686,12 @@ class SimpleTestCase(unittest.TestCase):
for i, context in enumerate(contexts):
if formset not in context or not hasattr(context[formset], "forms"):
continue
+ if not context[formset].is_bound:
+ formset_repr = repr(context[formset])
+ self.fail(
+ f"{msg_prefix}The formset {formset_repr} is not bound, it will "
+ f"never have any errors."
+ )
found_formset = True
for err in errors:
if field is not None:
diff --git a/tests/test_utils/tests.py b/tests/test_utils/tests.py
index c755d356ee..bfc9633122 100644
--- a/tests/test_utils/tests.py
+++ b/tests/test_utils/tests.py
@@ -1454,8 +1454,13 @@ class AssertFormErrorTests(SimpleTestCase):
self.assertFormError(response, "form", "field", "invalid value")
def test_empty_errors_unbound_form(self):
+ msg = (
+ "The form <TestForm bound=False, valid=Unknown, fields=(field)> is not "
+ "bound, it will never have any errors."
+ )
response = mock.Mock(context=[{"form": TestForm()}])
- self.assertFormError(response, "form", "field", [])
+ with self.assertRaisesMessage(AssertionError, msg):
+ self.assertFormError(response, "form", "field", [])
def test_empty_errors_valid_form(self):
response = mock.Mock(context=[{"form": TestForm.valid()}])
@@ -1590,8 +1595,13 @@ class AssertFormsetErrorTests(SimpleTestCase):
self.assertFormsetError(response, "formset", 0, "field", "invalid value")
def test_empty_errors_unbound_formset(self):
+ msg = (
+ "The formset <TestFormset: bound=False valid=Unknown total_forms=1> is not "
+ "bound, it will never have any errors."
+ )
response = mock.Mock(context=[{"formset": TestFormset()}])
- self.assertFormsetError(response, "formset", 0, "field", [])
+ with self.assertRaisesMessage(AssertionError, msg):
+ self.assertFormsetError(response, "formset", 0, "field", [])
def test_empty_errors_valid_formset(self):
response = mock.Mock(context=[{}, {"formset": TestFormset.valid()}])