test_charfield.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. from __future__ import unicode_literals
  2. from django.forms import (
  3. CharField, PasswordInput, Textarea, TextInput, 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 (#15912).
  72. """
  73. # Return an empty dictionary if max_length and min_length are both None.
  74. f = CharField()
  75. self.assertEqual(f.widget_attrs(TextInput()), {})
  76. self.assertEqual(f.widget_attrs(Textarea()), {})
  77. # Return a maxlength attribute equal to max_length.
  78. f = CharField(max_length=10)
  79. self.assertEqual(f.widget_attrs(TextInput()), {'maxlength': '10'})
  80. self.assertEqual(f.widget_attrs(PasswordInput()), {'maxlength': '10'})
  81. self.assertEqual(f.widget_attrs(Textarea()), {'maxlength': '10'})
  82. # Return a minlength attribute equal to min_length.
  83. f = CharField(min_length=5)
  84. self.assertEqual(f.widget_attrs(TextInput()), {'minlength': '5'})
  85. self.assertEqual(f.widget_attrs(PasswordInput()), {'minlength': '5'})
  86. self.assertEqual(f.widget_attrs(Textarea()), {'minlength': '5'})
  87. # Return both maxlength and minlength when both max_length and
  88. # min_length are set.
  89. f = CharField(max_length=10, min_length=5)
  90. self.assertEqual(f.widget_attrs(TextInput()), {'maxlength': '10', 'minlength': '5'})
  91. self.assertEqual(f.widget_attrs(PasswordInput()), {'maxlength': '10', 'minlength': '5'})
  92. self.assertEqual(f.widget_attrs(Textarea()), {'maxlength': '10', 'minlength': '5'})
  93. def test_charfield_strip(self):
  94. """
  95. Values have whitespace stripped but not if strip=False.
  96. """
  97. f = CharField()
  98. self.assertEqual(f.clean(' 1'), '1')
  99. self.assertEqual(f.clean('1 '), '1')
  100. f = CharField(strip=False)
  101. self.assertEqual(f.clean(' 1'), ' 1')
  102. self.assertEqual(f.clean('1 '), '1 ')
  103. def test_charfield_disabled(self):
  104. f = CharField(disabled=True)
  105. self.assertWidgetRendersTo(f, '<input type="text" name="f" id="id_f" disabled required />')