test_charfield.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. from django.core.exceptions import ValidationError
  2. from django.forms import (
  3. CharField, HiddenInput, PasswordInput, Textarea, TextInput,
  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. msg = '__init__() takes 1 positional argument but 2 were given'
  68. with self.assertRaisesMessage(TypeError, msg):
  69. CharField('a')
  70. def test_charfield_widget_attrs(self):
  71. """
  72. CharField.widget_attrs() always returns a dictionary and includes
  73. minlength/maxlength if min_length/max_length are defined on the field
  74. and the widget is not hidden.
  75. """
  76. # Return an empty dictionary if max_length and min_length are both None.
  77. f = CharField()
  78. self.assertEqual(f.widget_attrs(TextInput()), {})
  79. self.assertEqual(f.widget_attrs(Textarea()), {})
  80. # Return a maxlength attribute equal to max_length.
  81. f = CharField(max_length=10)
  82. self.assertEqual(f.widget_attrs(TextInput()), {'maxlength': '10'})
  83. self.assertEqual(f.widget_attrs(PasswordInput()), {'maxlength': '10'})
  84. self.assertEqual(f.widget_attrs(Textarea()), {'maxlength': '10'})
  85. # Return a minlength attribute equal to min_length.
  86. f = CharField(min_length=5)
  87. self.assertEqual(f.widget_attrs(TextInput()), {'minlength': '5'})
  88. self.assertEqual(f.widget_attrs(PasswordInput()), {'minlength': '5'})
  89. self.assertEqual(f.widget_attrs(Textarea()), {'minlength': '5'})
  90. # Return both maxlength and minlength when both max_length and
  91. # min_length are set.
  92. f = CharField(max_length=10, min_length=5)
  93. self.assertEqual(f.widget_attrs(TextInput()), {'maxlength': '10', 'minlength': '5'})
  94. self.assertEqual(f.widget_attrs(PasswordInput()), {'maxlength': '10', 'minlength': '5'})
  95. self.assertEqual(f.widget_attrs(Textarea()), {'maxlength': '10', 'minlength': '5'})
  96. self.assertEqual(f.widget_attrs(HiddenInput()), {})
  97. def test_charfield_strip(self):
  98. """
  99. Values have whitespace stripped but not if strip=False.
  100. """
  101. f = CharField()
  102. self.assertEqual(f.clean(' 1'), '1')
  103. self.assertEqual(f.clean('1 '), '1')
  104. f = CharField(strip=False)
  105. self.assertEqual(f.clean(' 1'), ' 1')
  106. self.assertEqual(f.clean('1 '), '1 ')
  107. def test_strip_before_checking_empty(self):
  108. """
  109. A whitespace-only value, ' ', is stripped to an empty string and then
  110. converted to the empty value, None.
  111. """
  112. f = CharField(required=False, empty_value=None)
  113. self.assertIsNone(f.clean(' '))
  114. def test_clean_non_string(self):
  115. """CharField.clean() calls str(value) before stripping it."""
  116. class StringWrapper:
  117. def __init__(self, v):
  118. self.v = v
  119. def __str__(self):
  120. return self.v
  121. value = StringWrapper(' ')
  122. f1 = CharField(required=False, empty_value=None)
  123. self.assertIsNone(f1.clean(value))
  124. f2 = CharField(strip=False)
  125. self.assertEqual(f2.clean(value), ' ')
  126. def test_charfield_disabled(self):
  127. f = CharField(disabled=True)
  128. self.assertWidgetRendersTo(f, '<input type="text" name="f" id="id_f" disabled required>')
  129. def test_null_characters_prohibited(self):
  130. f = CharField()
  131. msg = 'Null characters are not allowed.'
  132. with self.assertRaisesMessage(ValidationError, msg):
  133. f.clean('\x00something')