summaryrefslogtreecommitdiff
path: root/tests/forms_tests/field_tests/test_nullbooleanfield.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/forms_tests/field_tests/test_nullbooleanfield.py')
-rw-r--r--tests/forms_tests/field_tests/test_nullbooleanfield.py69
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))