diff options
| author | Jon Dufresne <jon.dufresne@gmail.com> | 2020-11-05 01:40:41 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-05 10:40:41 +0100 |
| commit | 859cd7c6b43bf70e2852eda10f635c70feeb397f (patch) | |
| tree | 648e43ff9d72edcf162583a123fbdfe047fd0f02 /tests | |
| parent | 76181308fb02e67794d0cc1471766a5d7e4c877e (diff) | |
Fixed #22276 -- Fixed crash when formset management form is invalid.
Co-authored-by: Patryk Zawadzki <patrys@room-303.com>
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/forms_tests/tests/test_formsets.py | 68 | ||||
| -rw-r--r-- | tests/model_formsets/tests.py | 9 |
2 files changed, 66 insertions, 11 deletions
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), + '<tr><td colspan="2">' + '<ul class="errorlist nonfield">' + '<li>(Hidden field TOTAL_FORMS) This field is required.</li>' + '<li>(Hidden field INITIAL_FORMS) This field is required.</li>' + '</ul>' + '<input type="hidden" name="form-TOTAL_FORMS" id="id_form-TOTAL_FORMS">' + '<input type="hidden" name="form-INITIAL_FORMS" id="id_form-INITIAL_FORMS">' + '<input type="hidden" name="form-MIN_NUM_FORMS" id="id_form-MIN_NUM_FORMS">' + '<input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS">' + '</td></tr>\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), + '<tr><td colspan="2">' + '<ul class="errorlist nonfield">' + '<li>(Hidden field TOTAL_FORMS) Enter a whole number.</li>' + '<li>(Hidden field INITIAL_FORMS) Enter a whole number.</li>' + '</ul>' + '<input type="hidden" name="form-TOTAL_FORMS" value="two" id="id_form-TOTAL_FORMS">' + '<input type="hidden" name="form-INITIAL_FORMS" value="one" id="id_form-INITIAL_FORMS">' + '<input type="hidden" name="form-MIN_NUM_FORMS" id="id_form-MIN_NUM_FORMS">' + '<input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS">' + '</td></tr>\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 = { diff --git a/tests/model_formsets/tests.py b/tests/model_formsets/tests.py index aaf76fa7ec..9c06d45339 100644 --- a/tests/model_formsets/tests.py +++ b/tests/model_formsets/tests.py @@ -4,7 +4,7 @@ from datetime import date from decimal import Decimal from django import forms -from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.exceptions import ImproperlyConfigured from django.db import models from django.forms.models import ( BaseModelFormSet, _get_foreign_key, inlineformset_factory, @@ -1783,11 +1783,10 @@ class ModelFormsetTest(TestCase): [{'id': ['Select a valid choice. That choice is not one of the available choices.']}], ) - def test_initial_form_count_empty_data_raises_validation_error(self): + def test_initial_form_count_empty_data(self): AuthorFormSet = modelformset_factory(Author, fields='__all__') - msg = 'ManagementForm data is missing or has been tampered with' - with self.assertRaisesMessage(ValidationError, msg): - AuthorFormSet({}).initial_form_count() + formset = AuthorFormSet({}) + self.assertEqual(formset.initial_form_count(), 0) class TestModelFormsetOverridesTroughFormMeta(TestCase): |
