diff options
Diffstat (limited to 'tests/forms_tests/field_tests/test_nullbooleanfield.py')
| -rw-r--r-- | tests/forms_tests/field_tests/test_nullbooleanfield.py | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/tests/forms_tests/field_tests/test_nullbooleanfield.py b/tests/forms_tests/field_tests/test_nullbooleanfield.py new file mode 100644 index 0000000000..74a2d7c173 --- /dev/null +++ b/tests/forms_tests/field_tests/test_nullbooleanfield.py @@ -0,0 +1,69 @@ +from __future__ import unicode_literals + +from django.forms import Form, HiddenInput, NullBooleanField, RadioSelect +from django.test import SimpleTestCase + +from . import FormFieldAssertionsMixin + + +class NullBooleanFieldTest(FormFieldAssertionsMixin, SimpleTestCase): + + def test_nullbooleanfield_clean(self): + f = NullBooleanField() + self.assertIsNone(f.clean('')) + self.assertTrue(f.clean(True)) + self.assertFalse(f.clean(False)) + self.assertIsNone(f.clean(None)) + self.assertFalse(f.clean('0')) + self.assertTrue(f.clean('1')) + self.assertIsNone(f.clean('2')) + self.assertIsNone(f.clean('3')) + self.assertIsNone(f.clean('hello')) + self.assertTrue(f.clean('true')) + self.assertFalse(f.clean('false')) + + def test_nullbooleanfield_2(self): + # The internal value is preserved if using HiddenInput (#7753). + class HiddenNullBooleanForm(Form): + hidden_nullbool1 = NullBooleanField(widget=HiddenInput, initial=True) + hidden_nullbool2 = NullBooleanField(widget=HiddenInput, initial=False) + f = HiddenNullBooleanForm() + self.assertHTMLEqual( + '<input type="hidden" name="hidden_nullbool1" value="True" id="id_hidden_nullbool1" />' + '<input type="hidden" name="hidden_nullbool2" value="False" id="id_hidden_nullbool2" />', + str(f) + ) + + def test_nullbooleanfield_3(self): + class HiddenNullBooleanForm(Form): + hidden_nullbool1 = NullBooleanField(widget=HiddenInput, initial=True) + hidden_nullbool2 = NullBooleanField(widget=HiddenInput, initial=False) + f = HiddenNullBooleanForm({'hidden_nullbool1': 'True', 'hidden_nullbool2': 'False'}) + self.assertIsNone(f.full_clean()) + self.assertTrue(f.cleaned_data['hidden_nullbool1']) + self.assertFalse(f.cleaned_data['hidden_nullbool2']) + + def test_nullbooleanfield_4(self): + # Make sure we're compatible with MySQL, which uses 0 and 1 for its + # boolean values (#9609). + NULLBOOL_CHOICES = (('1', 'Yes'), ('0', 'No'), ('', 'Unknown')) + + class MySQLNullBooleanForm(Form): + nullbool0 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES)) + nullbool1 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES)) + nullbool2 = NullBooleanField(widget=RadioSelect(choices=NULLBOOL_CHOICES)) + f = MySQLNullBooleanForm({'nullbool0': '1', 'nullbool1': '0', 'nullbool2': ''}) + self.assertIsNone(f.full_clean()) + self.assertTrue(f.cleaned_data['nullbool0']) + self.assertFalse(f.cleaned_data['nullbool1']) + self.assertIsNone(f.cleaned_data['nullbool2']) + + def test_nullbooleanfield_changed(self): + f = NullBooleanField() + self.assertTrue(f.has_changed(False, None)) + self.assertTrue(f.has_changed(None, False)) + self.assertFalse(f.has_changed(None, None)) + self.assertFalse(f.has_changed(False, False)) + self.assertTrue(f.has_changed(True, False)) + self.assertTrue(f.has_changed(True, None)) + self.assertTrue(f.has_changed(True, False)) |
