From 15031852c5ef6b3713bb9766d918460ea46e254e Mon Sep 17 00:00:00 2001 From: Baptiste Mispelon Date: Wed, 8 Dec 2021 14:46:22 +0100 Subject: [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. --- tests/test_utils/tests.py | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'tests') 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')] -- cgit v1.3