/tests/forms_tests/tests/test_utils.py

https://gitlab.com/Guy1394/django
Python | 167 lines | 123 code | 25 blank | 19 comment | 0 complexity | ab1450444bb22f9b3982bb162ac07fb9 MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import copy
  4. from django.core.exceptions import ValidationError
  5. from django.forms.utils import ErrorDict, ErrorList, flatatt
  6. from django.test import SimpleTestCase
  7. from django.utils import six
  8. from django.utils.encoding import force_text, python_2_unicode_compatible
  9. from django.utils.safestring import mark_safe
  10. from django.utils.translation import ugettext_lazy
  11. class FormsUtilsTestCase(SimpleTestCase):
  12. # Tests for forms/utils.py module.
  13. def test_flatatt(self):
  14. ###########
  15. # flatatt #
  16. ###########
  17. self.assertEqual(flatatt({'id': "header"}), ' id="header"')
  18. self.assertEqual(flatatt({'class': "news", 'title': "Read this"}), ' class="news" title="Read this"')
  19. self.assertEqual(
  20. flatatt({'class': "news", 'title': "Read this", 'required': "required"}),
  21. ' class="news" required="required" title="Read this"'
  22. )
  23. self.assertEqual(
  24. flatatt({'class': "news", 'title': "Read this", 'required': True}),
  25. ' class="news" title="Read this" required'
  26. )
  27. self.assertEqual(
  28. flatatt({'class': "news", 'title': "Read this", 'required': False}),
  29. ' class="news" title="Read this"'
  30. )
  31. self.assertEqual(flatatt({}), '')
  32. def test_flatatt_no_side_effects(self):
  33. """
  34. Fixes #23883 -- Check that flatatt does not modify the dict passed in
  35. """
  36. attrs = {'foo': 'bar', 'true': True, 'false': False}
  37. attrs_copy = copy.copy(attrs)
  38. self.assertEqual(attrs, attrs_copy)
  39. first_run = flatatt(attrs)
  40. self.assertEqual(attrs, attrs_copy)
  41. self.assertEqual(first_run, ' foo="bar" true')
  42. second_run = flatatt(attrs)
  43. self.assertEqual(attrs, attrs_copy)
  44. self.assertEqual(first_run, second_run)
  45. def test_validation_error(self):
  46. ###################
  47. # ValidationError #
  48. ###################
  49. # Can take a string.
  50. self.assertHTMLEqual(str(ErrorList(ValidationError("There was an error.").messages)),
  51. '<ul class="errorlist"><li>There was an error.</li></ul>')
  52. # Can take a unicode string.
  53. self.assertHTMLEqual(six.text_type(ErrorList(ValidationError("Not \u03C0.").messages)),
  54. '<ul class="errorlist"><li>Not π.</li></ul>')
  55. # Can take a lazy string.
  56. self.assertHTMLEqual(str(ErrorList(ValidationError(ugettext_lazy("Error.")).messages)),
  57. '<ul class="errorlist"><li>Error.</li></ul>')
  58. # Can take a list.
  59. self.assertHTMLEqual(str(ErrorList(ValidationError(["Error one.", "Error two."]).messages)),
  60. '<ul class="errorlist"><li>Error one.</li><li>Error two.</li></ul>')
  61. # Can take a dict.
  62. self.assertHTMLEqual(
  63. str(ErrorList(sorted(ValidationError({'error_1': "1. Error one.", 'error_2': "2. Error two."}).messages))),
  64. '<ul class="errorlist"><li>1. Error one.</li><li>2. Error two.</li></ul>'
  65. )
  66. # Can take a mixture in a list.
  67. self.assertHTMLEqual(
  68. str(ErrorList(sorted(ValidationError([
  69. "1. First error.",
  70. "2. Not \u03C0.",
  71. ugettext_lazy("3. Error."),
  72. {
  73. 'error_1': "4. First dict error.",
  74. 'error_2': "5. Second dict error.",
  75. },
  76. ]).messages))),
  77. '<ul class="errorlist">'
  78. '<li>1. First error.</li>'
  79. '<li>2. Not π.</li>'
  80. '<li>3. Error.</li>'
  81. '<li>4. First dict error.</li>'
  82. '<li>5. Second dict error.</li>'
  83. '</ul>'
  84. )
  85. @python_2_unicode_compatible
  86. class VeryBadError:
  87. def __str__(self):
  88. return "A very bad error."
  89. # Can take a non-string.
  90. self.assertHTMLEqual(
  91. str(ErrorList(ValidationError(VeryBadError()).messages)),
  92. '<ul class="errorlist"><li>A very bad error.</li></ul>'
  93. )
  94. # Escapes non-safe input but not input marked safe.
  95. example = 'Example of link: <a href="http://www.example.com/">example</a>'
  96. self.assertHTMLEqual(
  97. str(ErrorList([example])),
  98. '<ul class="errorlist"><li>Example of link: '
  99. '&lt;a href=&quot;http://www.example.com/&quot;&gt;example&lt;/a&gt;</li></ul>'
  100. )
  101. self.assertHTMLEqual(
  102. str(ErrorList([mark_safe(example)])),
  103. '<ul class="errorlist"><li>Example of link: '
  104. '<a href="http://www.example.com/">example</a></li></ul>'
  105. )
  106. self.assertHTMLEqual(
  107. str(ErrorDict({'name': example})),
  108. '<ul class="errorlist"><li>nameExample of link: '
  109. '&lt;a href=&quot;http://www.example.com/&quot;&gt;example&lt;/a&gt;</li></ul>'
  110. )
  111. self.assertHTMLEqual(
  112. str(ErrorDict({'name': mark_safe(example)})),
  113. '<ul class="errorlist"><li>nameExample of link: '
  114. '<a href="http://www.example.com/">example</a></li></ul>'
  115. )
  116. def test_error_dict_copy(self):
  117. e = ErrorDict()
  118. e['__all__'] = ErrorList([
  119. ValidationError(
  120. message='message %(i)s',
  121. params={'i': 1},
  122. ),
  123. ValidationError(
  124. message='message %(i)s',
  125. params={'i': 2},
  126. ),
  127. ])
  128. e_copy = copy.copy(e)
  129. self.assertEqual(e, e_copy)
  130. self.assertEqual(e.as_data(), e_copy.as_data())
  131. e_deepcopy = copy.deepcopy(e)
  132. self.assertEqual(e, e_deepcopy)
  133. self.assertEqual(e.as_data(), e_copy.as_data())
  134. def test_error_dict_html_safe(self):
  135. e = ErrorDict()
  136. e['username'] = 'Invalid username.'
  137. self.assertTrue(hasattr(ErrorDict, '__html__'))
  138. self.assertEqual(force_text(e), e.__html__())
  139. def test_error_list_html_safe(self):
  140. e = ErrorList(['Invalid username.'])
  141. self.assertTrue(hasattr(ErrorList, '__html__'))
  142. self.assertEqual(force_text(e), e.__html__())