test_integerfield.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. from django.core.exceptions import ValidationError
  2. from django.forms import IntegerField, Textarea
  3. from django.test import SimpleTestCase
  4. from . import FormFieldAssertionsMixin
  5. class IntegerFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
  6. def test_integerfield_1(self):
  7. f = IntegerField()
  8. self.assertWidgetRendersTo(f, '<input type="number" name="f" id="id_f" required>')
  9. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  10. f.clean('')
  11. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  12. f.clean(None)
  13. self.assertEqual(1, f.clean('1'))
  14. self.assertIsInstance(f.clean('1'), int)
  15. self.assertEqual(23, f.clean('23'))
  16. with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
  17. f.clean('a')
  18. self.assertEqual(42, f.clean(42))
  19. with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
  20. f.clean(3.14)
  21. self.assertEqual(1, f.clean('1 '))
  22. self.assertEqual(1, f.clean(' 1'))
  23. self.assertEqual(1, f.clean(' 1 '))
  24. with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
  25. f.clean('1a')
  26. self.assertIsNone(f.max_value)
  27. self.assertIsNone(f.min_value)
  28. def test_integerfield_2(self):
  29. f = IntegerField(required=False)
  30. self.assertIsNone(f.clean(''))
  31. self.assertEqual('None', repr(f.clean('')))
  32. self.assertIsNone(f.clean(None))
  33. self.assertEqual('None', repr(f.clean(None)))
  34. self.assertEqual(1, f.clean('1'))
  35. self.assertIsInstance(f.clean('1'), int)
  36. self.assertEqual(23, f.clean('23'))
  37. with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
  38. f.clean('a')
  39. self.assertEqual(1, f.clean('1 '))
  40. self.assertEqual(1, f.clean(' 1'))
  41. self.assertEqual(1, f.clean(' 1 '))
  42. with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
  43. f.clean('1a')
  44. self.assertIsNone(f.max_value)
  45. self.assertIsNone(f.min_value)
  46. def test_integerfield_3(self):
  47. f = IntegerField(max_value=10)
  48. self.assertWidgetRendersTo(f, '<input max="10" type="number" name="f" id="id_f" required>')
  49. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  50. f.clean(None)
  51. self.assertEqual(1, f.clean(1))
  52. self.assertEqual(10, f.clean(10))
  53. with self.assertRaisesMessage(ValidationError, "'Ensure this value is less than or equal to 10.'"):
  54. f.clean(11)
  55. self.assertEqual(10, f.clean('10'))
  56. with self.assertRaisesMessage(ValidationError, "'Ensure this value is less than or equal to 10.'"):
  57. f.clean('11')
  58. self.assertEqual(f.max_value, 10)
  59. self.assertIsNone(f.min_value)
  60. def test_integerfield_4(self):
  61. f = IntegerField(min_value=10)
  62. self.assertWidgetRendersTo(f, '<input id="id_f" type="number" name="f" min="10" required>')
  63. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  64. f.clean(None)
  65. with self.assertRaisesMessage(ValidationError, "'Ensure this value is greater than or equal to 10.'"):
  66. f.clean(1)
  67. self.assertEqual(10, f.clean(10))
  68. self.assertEqual(11, f.clean(11))
  69. self.assertEqual(10, f.clean('10'))
  70. self.assertEqual(11, f.clean('11'))
  71. self.assertIsNone(f.max_value)
  72. self.assertEqual(f.min_value, 10)
  73. def test_integerfield_5(self):
  74. f = IntegerField(min_value=10, max_value=20)
  75. self.assertWidgetRendersTo(f, '<input id="id_f" max="20" type="number" name="f" min="10" required>')
  76. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  77. f.clean(None)
  78. with self.assertRaisesMessage(ValidationError, "'Ensure this value is greater than or equal to 10.'"):
  79. f.clean(1)
  80. self.assertEqual(10, f.clean(10))
  81. self.assertEqual(11, f.clean(11))
  82. self.assertEqual(10, f.clean('10'))
  83. self.assertEqual(11, f.clean('11'))
  84. self.assertEqual(20, f.clean(20))
  85. with self.assertRaisesMessage(ValidationError, "'Ensure this value is less than or equal to 20.'"):
  86. f.clean(21)
  87. self.assertEqual(f.max_value, 20)
  88. self.assertEqual(f.min_value, 10)
  89. def test_integerfield_localized(self):
  90. """
  91. A localized IntegerField's widget renders to a text input without any
  92. number input specific attributes.
  93. """
  94. f1 = IntegerField(localize=True)
  95. self.assertWidgetRendersTo(f1, '<input id="id_f" name="f" type="text" required>')
  96. def test_integerfield_float(self):
  97. f = IntegerField()
  98. self.assertEqual(1, f.clean(1.0))
  99. self.assertEqual(1, f.clean('1.0'))
  100. self.assertEqual(1, f.clean(' 1.0 '))
  101. self.assertEqual(1, f.clean('1.'))
  102. self.assertEqual(1, f.clean(' 1. '))
  103. with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
  104. f.clean('1.5')
  105. with self.assertRaisesMessage(ValidationError, "'Enter a whole number.'"):
  106. f.clean('…')
  107. def test_integerfield_big_num(self):
  108. f = IntegerField()
  109. self.assertEqual(9223372036854775808, f.clean(9223372036854775808))
  110. self.assertEqual(9223372036854775808, f.clean('9223372036854775808'))
  111. self.assertEqual(9223372036854775808, f.clean('9223372036854775808.0'))
  112. def test_integerfield_unicode_number(self):
  113. f = IntegerField()
  114. self.assertEqual(50, f.clean('50'))
  115. def test_integerfield_subclass(self):
  116. """
  117. Class-defined widget is not overwritten by __init__() (#22245).
  118. """
  119. class MyIntegerField(IntegerField):
  120. widget = Textarea
  121. f = MyIntegerField()
  122. self.assertEqual(f.widget.__class__, Textarea)
  123. f = MyIntegerField(localize=True)
  124. self.assertEqual(f.widget.__class__, Textarea)