From 859cd7c6b43bf70e2852eda10f635c70feeb397f Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Thu, 5 Nov 2020 01:40:41 -0800 Subject: Fixed #22276 -- Fixed crash when formset management form is invalid. Co-authored-by: Patryk Zawadzki --- tests/forms_tests/tests/test_formsets.py | 68 +++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 6 deletions(-) (limited to 'tests/forms_tests') diff --git a/tests/forms_tests/tests/test_formsets.py b/tests/forms_tests/tests/test_formsets.py index a11c183f86..889560aa74 100644 --- a/tests/forms_tests/tests/test_formsets.py +++ b/tests/forms_tests/tests/test_formsets.py @@ -1300,13 +1300,69 @@ ArticleFormSet = formset_factory(ArticleForm) class TestIsBoundBehavior(SimpleTestCase): - def test_no_data_raises_validation_error(self): - msg = ( - 'ManagementForm data is missing or has been tampered with. ' - 'Missing fields: form-TOTAL_FORMS, form-INITIAL_FORMS' + def test_no_data_error(self): + formset = ArticleFormSet({}) + self.assertIs(formset.is_valid(), False) + self.assertEqual( + formset.non_form_errors(), + [ + 'ManagementForm data is missing or has been tampered with. ' + 'Missing fields: form-TOTAL_FORMS, form-INITIAL_FORMS. ' + 'You may need to file a bug report if the issue persists.', + ], + ) + self.assertEqual(formset.errors, []) + # Can still render the formset. + self.assertEqual( + str(formset), + '' + '' + '' + '' + '' + '' + '\n' ) - with self.assertRaisesMessage(ValidationError, msg): - ArticleFormSet({}).is_valid() + + def test_management_form_invalid_data(self): + data = { + 'form-TOTAL_FORMS': 'two', + 'form-INITIAL_FORMS': 'one', + } + formset = ArticleFormSet(data) + self.assertIs(formset.is_valid(), False) + self.assertEqual( + formset.non_form_errors(), + [ + 'ManagementForm data is missing or has been tampered with. ' + 'Missing fields: form-TOTAL_FORMS, form-INITIAL_FORMS. ' + 'You may need to file a bug report if the issue persists.', + ], + ) + self.assertEqual(formset.errors, []) + # Can still render the formset. + self.assertEqual( + str(formset), + '' + '' + '' + '' + '' + '' + '\n', + ) + + def test_customize_management_form_error(self): + formset = ArticleFormSet({}, error_messages={'missing_management_form': 'customized'}) + self.assertIs(formset.is_valid(), False) + self.assertEqual(formset.non_form_errors(), ['customized']) + self.assertEqual(formset.errors, []) def test_with_management_data_attrs_work_fine(self): data = { -- cgit v1.3