summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
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')]