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