mirror of
				https://github.com/django/django.git
				synced 2025-10-27 07:36:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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(
 | |
|             str(f),
 | |
|             '<input type="hidden" name="hidden_nullbool1" value="True" '
 | |
|             'id="id_hidden_nullbool1">'
 | |
|             '<input type="hidden" name="hidden_nullbool2" value="False" '
 | |
|             'id="id_hidden_nullbool2">',
 | |
|         )
 | |
| 
 | |
|     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))
 | |
|         # HiddenInput widget sends string values for boolean but doesn't clean
 | |
|         # them in value_from_datadict.
 | |
|         self.assertFalse(f.has_changed(False, "False"))
 | |
|         self.assertFalse(f.has_changed(True, "True"))
 | |
|         self.assertFalse(f.has_changed(None, ""))
 | |
|         self.assertTrue(f.has_changed(False, "True"))
 | |
|         self.assertTrue(f.has_changed(True, "False"))
 | |
|         self.assertTrue(f.has_changed(None, "False"))
 |