1. import pickle
    
  2. 
    
  3. from django.core.exceptions import ValidationError
    
  4. from django.forms import BooleanField
    
  5. from django.test import SimpleTestCase
    
  6. 
    
  7. 
    
  8. class BooleanFieldTest(SimpleTestCase):
    
  9.     def test_booleanfield_clean_1(self):
    
  10.         f = BooleanField()
    
  11.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  12.             f.clean("")
    
  13.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  14.             f.clean(None)
    
  15.         self.assertTrue(f.clean(True))
    
  16.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  17.             f.clean(False)
    
  18.         self.assertTrue(f.clean(1))
    
  19.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  20.             f.clean(0)
    
  21.         self.assertTrue(f.clean("Django rocks"))
    
  22.         self.assertTrue(f.clean("True"))
    
  23.         with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
    
  24.             f.clean("False")
    
  25. 
    
  26.     def test_booleanfield_clean_2(self):
    
  27.         f = BooleanField(required=False)
    
  28.         self.assertIs(f.clean(""), False)
    
  29.         self.assertIs(f.clean(None), False)
    
  30.         self.assertIs(f.clean(True), True)
    
  31.         self.assertIs(f.clean(False), False)
    
  32.         self.assertIs(f.clean(1), True)
    
  33.         self.assertIs(f.clean(0), False)
    
  34.         self.assertIs(f.clean("1"), True)
    
  35.         self.assertIs(f.clean("0"), False)
    
  36.         self.assertIs(f.clean("Django rocks"), True)
    
  37.         self.assertIs(f.clean("False"), False)
    
  38.         self.assertIs(f.clean("false"), False)
    
  39.         self.assertIs(f.clean("FaLsE"), False)
    
  40. 
    
  41.     def test_boolean_picklable(self):
    
  42.         self.assertIsInstance(pickle.loads(pickle.dumps(BooleanField())), BooleanField)
    
  43. 
    
  44.     def test_booleanfield_changed(self):
    
  45.         f = BooleanField()
    
  46.         self.assertFalse(f.has_changed(None, None))
    
  47.         self.assertFalse(f.has_changed(None, ""))
    
  48.         self.assertFalse(f.has_changed("", None))
    
  49.         self.assertFalse(f.has_changed("", ""))
    
  50.         self.assertTrue(f.has_changed(False, "on"))
    
  51.         self.assertFalse(f.has_changed(True, "on"))
    
  52.         self.assertTrue(f.has_changed(True, ""))
    
  53.         # Initial value may have mutated to a string due to show_hidden_initial (#19537)
    
  54.         self.assertTrue(f.has_changed("False", "on"))
    
  55.         # HiddenInput widget sends string values for boolean but doesn't clean
    
  56.         # them in value_from_datadict.
    
  57.         self.assertFalse(f.has_changed(False, "False"))
    
  58.         self.assertFalse(f.has_changed(True, "True"))
    
  59.         self.assertTrue(f.has_changed(False, "True"))
    
  60.         self.assertTrue(f.has_changed(True, "False"))
    
  61. 
    
  62.     def test_disabled_has_changed(self):
    
  63.         f = BooleanField(disabled=True)
    
  64.         self.assertIs(f.has_changed("True", "False"), False)