test_charfield.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from django.forms import (
  2. CharField, HiddenInput, PasswordInput, Textarea, TextInput,
  3. ValidationError,
  4. )
  5. from django.test import SimpleTestCase
  6. from . import FormFieldAssertionsMixin
  7. class CharFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
  8. def test_charfield_1(self):
  9. f = CharField()
  10. self.assertEqual('1', f.clean(1))
  11. self.assertEqual('hello', f.clean('hello'))
  12. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  13. f.clean(None)
  14. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  15. f.clean('')
  16. self.assertEqual('[1, 2, 3]', f.clean([1, 2, 3]))
  17. self.assertIsNone(f.max_length)
  18. self.assertIsNone(f.min_length)
  19. def test_charfield_2(self):
  20. f = CharField(required=False)
  21. self.assertEqual('1', f.clean(1))
  22. self.assertEqual('hello', f.clean('hello'))
  23. self.assertEqual('', f.clean(None))
  24. self.assertEqual('', f.clean(''))
  25. self.assertEqual('[1, 2, 3]', f.clean([1, 2, 3]))
  26. self.assertIsNone(f.max_length)
  27. self.assertIsNone(f.min_length)
  28. def test_charfield_3(self):
  29. f = CharField(max_length=10, required=False)
  30. self.assertEqual('12345', f.clean('12345'))
  31. self.assertEqual('1234567890', f.clean('1234567890'))
  32. msg = "'Ensure this value has at most 10 characters (it has 11).'"
  33. with self.assertRaisesMessage(ValidationError, msg):
  34. f.clean('1234567890a')
  35. self.assertEqual(f.max_length, 10)
  36. self.assertIsNone(f.min_length)
  37. def test_charfield_4(self):
  38. f = CharField(min_length=10, required=False)
  39. self.assertEqual('', f.clean(''))
  40. msg = "'Ensure this value has at least 10 characters (it has 5).'"
  41. with self.assertRaisesMessage(ValidationError, msg):
  42. f.clean('12345')
  43. self.assertEqual('1234567890', f.clean('1234567890'))
  44. self.assertEqual('1234567890a', f.clean('1234567890a'))
  45. self.assertIsNone(f.max_length)
  46. self.assertEqual(f.min_length, 10)
  47. def test_charfield_5(self):
  48. f = CharField(min_length=10, required=True)
  49. with self.assertRaisesMessage(ValidationError, "'This field is required.'"):
  50. f.clean('')
  51. msg = "'Ensure this value has at least 10 characters (it has 5).'"
  52. with self.assertRaisesMessage(ValidationError, msg):
  53. f.clean('12345')
  54. self.assertEqual('1234567890', f.clean('1234567890'))
  55. self.assertEqual('1234567890a', f.clean('1234567890a'))
  56. self.assertIsNone(f.max_length)
  57. self.assertEqual(f.min_length, 10)
  58. def test_charfield_length_not_int(self):
  59. """
  60. Setting min_length or max_length to something that is not a number
  61. raises an exception.
  62. """
  63. with self.assertRaises(ValueError):
  64. CharField(min_length='a')
  65. with self.assertRaises(ValueError):
  66. CharField(max_length='a')
  67. with self.assertRaises(ValueError):
  68. CharField('a')
  69. def test_charfield_widget_attrs(self):
  70. """
  71. CharField.widget_attrs() always returns a dictionary and includes
  72. minlength/maxlength if min_length/max_length are defined on the field
  73. and the widget is not hidden.
  74. """
  75. # Return an empty dictionary if max_length and min_length are both None.
  76. f = CharField()
  77. self.assertEqual(f.widget_attrs(TextInput()), {})
  78. self.assertEqual(f.widget_attrs(Textarea()), {})
  79. # Return a maxlength attribute equal to max_length.
  80. f = CharField(max_length=10)
  81. self.assertEqual(f.widget_attrs(TextInput()), {'maxlength': '10'})
  82. self.assertEqual(f.widget_attrs(PasswordInput()), {'maxlength': '10'})
  83. self.assertEqual(f.widget_attrs(Textarea()), {'maxlength': '10'})
  84. # Return a minlength attribute equal to min_length.
  85. f = CharField(min_length=5)
  86. self.assertEqual(f.widget_attrs(TextInput()), {'minlength': '5'})
  87. self.assertEqual(f.widget_attrs(PasswordInput()), {'minlength': '5'})
  88. self.assertEqual(f.widget_attrs(Textarea()), {'minlength': '5'})
  89. # Return both maxlength and minlength when both max_length and
  90. # min_length are set.
  91. f = CharField(max_length=10, min_length=5)
  92. self.assertEqual(f.widget_attrs(TextInput()), {'maxlength': '10', 'minlength': '5'})
  93. self.assertEqual(f.widget_attrs(PasswordInput()), {'maxlength': '10', 'minlength': '5'})
  94. self.assertEqual(f.widget_attrs(Textarea()), {'maxlength': '10', 'minlength': '5'})
  95. self.assertEqual(f.widget_attrs(HiddenInput()), {})
  96. def test_charfield_strip(self):
  97. """
  98. Values have whitespace stripped but not if strip=False.
  99. """
  100. f = CharField()
  101. self.assertEqual(f.clean(' 1'), '1')
  102. self.assertEqual(f.clean('1 '), '1')
  103. f = CharField(strip=False)
  104. self.assertEqual(f.clean(' 1'), ' 1')
  105. self.assertEqual(f.clean('1 '), '1 ')
  106. def test_charfield_disabled(self):
  107. f = CharField(disabled=True)
  108. self.assertWidgetRendersTo(f, '<input type="text" name="f" id="id_f" disabled required />')