test_booleanfield.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. from django.core.exceptions import ValidationError
  2. from django.db import IntegrityError, models, transaction
  3. from django.test import SimpleTestCase, TestCase
  4. from .models import BooleanModel, FksToBooleans, NullBooleanModel
  5. class BooleanFieldTests(TestCase):
  6. def _test_get_prep_value(self, f):
  7. self.assertIs(f.get_prep_value(True), True)
  8. self.assertIs(f.get_prep_value('1'), True)
  9. self.assertIs(f.get_prep_value(1), True)
  10. self.assertIs(f.get_prep_value(False), False)
  11. self.assertIs(f.get_prep_value('0'), False)
  12. self.assertIs(f.get_prep_value(0), False)
  13. self.assertIsNone(f.get_prep_value(None))
  14. def _test_to_python(self, f):
  15. self.assertIs(f.to_python(1), True)
  16. self.assertIs(f.to_python(0), False)
  17. def test_booleanfield_get_prep_value(self):
  18. self._test_get_prep_value(models.BooleanField())
  19. def test_nullbooleanfield_get_prep_value(self):
  20. self._test_get_prep_value(models.NullBooleanField())
  21. def test_booleanfield_to_python(self):
  22. self._test_to_python(models.BooleanField())
  23. def test_nullbooleanfield_to_python(self):
  24. self._test_to_python(models.NullBooleanField())
  25. def test_booleanfield_choices_blank(self):
  26. """
  27. BooleanField with choices and defaults doesn't generate a formfield
  28. with the blank option (#9640, #10549).
  29. """
  30. choices = [(1, 'Si'), (2, 'No')]
  31. f = models.BooleanField(choices=choices, default=1, null=False)
  32. self.assertEqual(f.formfield().choices, choices)
  33. def test_return_type(self):
  34. b = BooleanModel.objects.create(bfield=True)
  35. b.refresh_from_db()
  36. self.assertIs(b.bfield, True)
  37. b2 = BooleanModel.objects.create(bfield=False)
  38. b2.refresh_from_db()
  39. self.assertIs(b2.bfield, False)
  40. b3 = NullBooleanModel.objects.create(nbfield=True)
  41. b3.refresh_from_db()
  42. self.assertIs(b3.nbfield, True)
  43. b4 = NullBooleanModel.objects.create(nbfield=False)
  44. b4.refresh_from_db()
  45. self.assertIs(b4.nbfield, False)
  46. # When an extra clause exists, the boolean conversions are applied with
  47. # an offset (#13293).
  48. b5 = BooleanModel.objects.all().extra(select={'string_col': 'string'})[0]
  49. self.assertNotIsInstance(b5.pk, bool)
  50. def test_select_related(self):
  51. """
  52. Boolean fields retrieved via select_related() should return booleans.
  53. """
  54. bmt = BooleanModel.objects.create(bfield=True)
  55. bmf = BooleanModel.objects.create(bfield=False)
  56. nbmt = NullBooleanModel.objects.create(nbfield=True)
  57. nbmf = NullBooleanModel.objects.create(nbfield=False)
  58. m1 = FksToBooleans.objects.create(bf=bmt, nbf=nbmt)
  59. m2 = FksToBooleans.objects.create(bf=bmf, nbf=nbmf)
  60. # select_related('fk_field_name')
  61. ma = FksToBooleans.objects.select_related('bf').get(pk=m1.id)
  62. self.assertIs(ma.bf.bfield, True)
  63. self.assertIs(ma.nbf.nbfield, True)
  64. # select_related()
  65. mb = FksToBooleans.objects.select_related().get(pk=m1.id)
  66. mc = FksToBooleans.objects.select_related().get(pk=m2.id)
  67. self.assertIs(mb.bf.bfield, True)
  68. self.assertIs(mb.nbf.nbfield, True)
  69. self.assertIs(mc.bf.bfield, False)
  70. self.assertIs(mc.nbf.nbfield, False)
  71. def test_null_default(self):
  72. """
  73. A BooleanField defaults to None, which isn't a valid value (#15124).
  74. """
  75. boolean_field = BooleanModel._meta.get_field('bfield')
  76. self.assertFalse(boolean_field.has_default())
  77. b = BooleanModel()
  78. self.assertIsNone(b.bfield)
  79. with transaction.atomic():
  80. with self.assertRaises(IntegrityError):
  81. b.save()
  82. nb = NullBooleanModel()
  83. self.assertIsNone(nb.nbfield)
  84. nb.save() # no error
  85. class ValidationTest(SimpleTestCase):
  86. def test_boolean_field_doesnt_accept_empty_input(self):
  87. f = models.BooleanField()
  88. with self.assertRaises(ValidationError):
  89. f.clean(None, None)
  90. def test_nullbooleanfield_blank(self):
  91. """
  92. NullBooleanField shouldn't throw a validation error when given a value
  93. of None.
  94. """
  95. nullboolean = NullBooleanModel(nbfield=None)
  96. nullboolean.full_clean()