summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorBaptiste Mispelon <bmispelon@gmail.com>2021-12-08 14:46:22 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-12-08 21:13:00 +0100
commit15031852c5ef6b3713bb9766d918460ea46e254e (patch)
treeed57a5793d8235f377be0794e28c23df6f1d2ae3 /tests
parentb7f2afa8de3cef4a4d5d5e413e502b09ea01163d (diff)
[4.0.x] Fixed #33346 -- Fixed SimpleTestCase.assertFormsetError() crash on a formset named "form".
Thanks OutOfFocus4 for the report. Regression in 456466d932830b096d39806e291fe23ec5ed38d5. Backport of cb383753c0e0eb52306e1024d32a782549c27e61 from main.
Diffstat (limited to 'tests')
-rw-r--r--tests/test_utils/tests.py43
1 files changed, 42 insertions, 1 deletions
diff --git a/tests/test_utils/tests.py b/tests/test_utils/tests.py
index 82ec36ab38..f7a964bfa0 100644
--- a/tests/test_utils/tests.py
+++ b/tests/test_utils/tests.py
@@ -13,7 +13,10 @@ from django.core.files.storage import default_storage
from django.db import (
IntegrityError, connection, connections, models, router, transaction,
)
-from django.forms import EmailField, IntegerField
+from django.forms import (
+ CharField, EmailField, Form, IntegerField, ValidationError,
+ formset_factory,
+)
from django.http import HttpResponse
from django.template.loader import render_to_string
from django.test import (
@@ -1241,6 +1244,44 @@ class AssertURLEqualTests(SimpleTestCase):
)
+class TestForm(Form):
+ field = CharField()
+
+ def clean_field(self):
+ value = self.cleaned_data.get('field', '')
+ if value == 'invalid':
+ raise ValidationError('invalid value')
+ return value
+
+
+class TestFormset(formset_factory(TestForm)):
+ @classmethod
+ def _get_cleaned_formset(cls, field_value):
+ formset = cls({
+ 'form-TOTAL_FORMS': '1',
+ 'form-INITIAL_FORMS': '0',
+ 'form-0-field': field_value,
+ })
+ formset.full_clean()
+ return formset
+
+ @classmethod
+ def invalid(cls):
+ return cls._get_cleaned_formset('invalid')
+
+
+class AssertFormsetErrorTests(SimpleTestCase):
+ def test_formset_named_form(self):
+ formset = TestFormset.invalid()
+ # The mocked context emulates the template-based rendering of the
+ # formset.
+ response = mock.Mock(context=[
+ {'form': formset},
+ {'form': formset.management_form},
+ ])
+ self.assertFormsetError(response, 'form', 0, 'field', 'invalid value')
+
+
class FirstUrls:
urlpatterns = [path('first/', empty_response, name='first')]