test_textinput.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. from django.forms import CharField, Form, TextInput
  2. from django.utils.safestring import mark_safe
  3. from .base import WidgetTest
  4. class TextInputTest(WidgetTest):
  5. widget = TextInput()
  6. def test_render(self):
  7. self.check_html(
  8. self.widget, "email", "", html='<input type="text" name="email">'
  9. )
  10. def test_render_none(self):
  11. self.check_html(
  12. self.widget, "email", None, html='<input type="text" name="email">'
  13. )
  14. def test_render_value(self):
  15. self.check_html(
  16. self.widget,
  17. "email",
  18. "test@example.com",
  19. html=('<input type="text" name="email" value="test@example.com">'),
  20. )
  21. def test_render_boolean(self):
  22. """
  23. Boolean values are rendered to their string forms ("True" and
  24. "False").
  25. """
  26. self.check_html(
  27. self.widget,
  28. "get_spam",
  29. False,
  30. html=('<input type="text" name="get_spam" value="False">'),
  31. )
  32. self.check_html(
  33. self.widget,
  34. "get_spam",
  35. True,
  36. html=('<input type="text" name="get_spam" value="True">'),
  37. )
  38. def test_render_quoted(self):
  39. self.check_html(
  40. self.widget,
  41. "email",
  42. 'some "quoted" & ampersanded value',
  43. html=(
  44. '<input type="text" name="email" '
  45. 'value="some &quot;quoted&quot; &amp; ampersanded value">'
  46. ),
  47. )
  48. def test_render_custom_attrs(self):
  49. self.check_html(
  50. self.widget,
  51. "email",
  52. "test@example.com",
  53. attrs={"class": "fun"},
  54. html=(
  55. '<input type="text" name="email" value="test@example.com" class="fun">'
  56. ),
  57. )
  58. def test_render_unicode(self):
  59. self.check_html(
  60. self.widget,
  61. "email",
  62. "ŠĐĆŽćžšđ",
  63. attrs={"class": "fun"},
  64. html=(
  65. '<input type="text" name="email" '
  66. 'value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" class="fun">'
  67. ),
  68. )
  69. def test_constructor_attrs(self):
  70. widget = TextInput(attrs={"class": "fun", "type": "email"})
  71. self.check_html(
  72. widget, "email", "", html='<input type="email" class="fun" name="email">'
  73. )
  74. self.check_html(
  75. widget,
  76. "email",
  77. "foo@example.com",
  78. html=(
  79. '<input type="email" class="fun" value="foo@example.com" name="email">'
  80. ),
  81. )
  82. def test_attrs_precedence(self):
  83. """
  84. `attrs` passed to render() get precedence over those passed to the
  85. constructor
  86. """
  87. widget = TextInput(attrs={"class": "pretty"})
  88. self.check_html(
  89. widget,
  90. "email",
  91. "",
  92. attrs={"class": "special"},
  93. html='<input type="text" class="special" name="email">',
  94. )
  95. def test_attrs_safestring(self):
  96. widget = TextInput(attrs={"onBlur": mark_safe("function('foo')")})
  97. self.check_html(
  98. widget,
  99. "email",
  100. "",
  101. html='<input onBlur="function(\'foo\')" type="text" name="email">',
  102. )
  103. def test_use_required_attribute(self):
  104. # Text inputs can safely trigger the browser validation.
  105. self.assertIs(self.widget.use_required_attribute(None), True)
  106. self.assertIs(self.widget.use_required_attribute(""), True)
  107. self.assertIs(self.widget.use_required_attribute("resume.txt"), True)
  108. def test_fieldset(self):
  109. class TestForm(Form):
  110. template_name = "forms_tests/use_fieldset.html"
  111. field = CharField(widget=self.widget)
  112. form = TestForm()
  113. self.assertIs(self.widget.use_fieldset, False)
  114. self.assertHTMLEqual(
  115. '<div><label for="id_field">Field:</label>'
  116. '<input type="text" name="field" required id="id_field"></div>',
  117. form.render(),
  118. )