test_for.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. from django.template import TemplateSyntaxError
  2. from django.test import SimpleTestCase, ignore_warnings
  3. from django.utils.deprecation import RemovedInDjango20Warning
  4. from ..utils import setup
  5. class ForTagTests(SimpleTestCase):
  6. libraries = {'custom': 'template_tests.templatetags.custom'}
  7. @setup({'for-tag01': '{% for val in values %}{{ val }}{% endfor %}'})
  8. def test_for_tag01(self):
  9. output = self.engine.render_to_string('for-tag01', {'values': [1, 2, 3]})
  10. self.assertEqual(output, '123')
  11. @setup({'for-tag02': '{% for val in values reversed %}{{ val }}{% endfor %}'})
  12. def test_for_tag02(self):
  13. output = self.engine.render_to_string('for-tag02', {'values': [1, 2, 3]})
  14. self.assertEqual(output, '321')
  15. @setup({'for-tag-vars01': '{% for val in values %}{{ forloop.counter }}{% endfor %}'})
  16. def test_for_tag_vars01(self):
  17. output = self.engine.render_to_string('for-tag-vars01', {'values': [6, 6, 6]})
  18. self.assertEqual(output, '123')
  19. @setup({'for-tag-vars02': '{% for val in values %}{{ forloop.counter0 }}{% endfor %}'})
  20. def test_for_tag_vars02(self):
  21. output = self.engine.render_to_string('for-tag-vars02', {'values': [6, 6, 6]})
  22. self.assertEqual(output, '012')
  23. @setup({'for-tag-vars03': '{% for val in values %}{{ forloop.revcounter }}{% endfor %}'})
  24. def test_for_tag_vars03(self):
  25. output = self.engine.render_to_string('for-tag-vars03', {'values': [6, 6, 6]})
  26. self.assertEqual(output, '321')
  27. @setup({'for-tag-vars04': '{% for val in values %}{{ forloop.revcounter0 }}{% endfor %}'})
  28. def test_for_tag_vars04(self):
  29. output = self.engine.render_to_string('for-tag-vars04', {'values': [6, 6, 6]})
  30. self.assertEqual(output, '210')
  31. @setup({'for-tag-vars05': '{% for val in values %}'
  32. '{% if forloop.first %}f{% else %}x{% endif %}{% endfor %}'})
  33. def test_for_tag_vars05(self):
  34. output = self.engine.render_to_string('for-tag-vars05', {'values': [6, 6, 6]})
  35. self.assertEqual(output, 'fxx')
  36. @setup({'for-tag-vars06': '{% for val in values %}'
  37. '{% if forloop.last %}l{% else %}x{% endif %}{% endfor %}'})
  38. def test_for_tag_vars06(self):
  39. output = self.engine.render_to_string('for-tag-vars06', {'values': [6, 6, 6]})
  40. self.assertEqual(output, 'xxl')
  41. @setup({'for-tag-unpack01': '{% for key,value in items %}{{ key }}:{{ value }}/{% endfor %}'})
  42. def test_for_tag_unpack01(self):
  43. output = self.engine.render_to_string('for-tag-unpack01', {'items': (('one', 1), ('two', 2))})
  44. self.assertEqual(output, 'one:1/two:2/')
  45. @setup({'for-tag-unpack03': '{% for key, value in items %}{{ key }}:{{ value }}/{% endfor %}'})
  46. def test_for_tag_unpack03(self):
  47. output = self.engine.render_to_string('for-tag-unpack03', {'items': (('one', 1), ('two', 2))})
  48. self.assertEqual(output, 'one:1/two:2/')
  49. @setup({'for-tag-unpack04': '{% for key , value in items %}{{ key }}:{{ value }}/{% endfor %}'})
  50. def test_for_tag_unpack04(self):
  51. output = self.engine.render_to_string('for-tag-unpack04', {'items': (('one', 1), ('two', 2))})
  52. self.assertEqual(output, 'one:1/two:2/')
  53. @setup({'for-tag-unpack05': '{% for key ,value in items %}{{ key }}:{{ value }}/{% endfor %}'})
  54. def test_for_tag_unpack05(self):
  55. output = self.engine.render_to_string('for-tag-unpack05', {'items': (('one', 1), ('two', 2))})
  56. self.assertEqual(output, 'one:1/two:2/')
  57. @setup({'for-tag-unpack06': '{% for key value in items %}{{ key }}:{{ value }}/{% endfor %}'})
  58. def test_for_tag_unpack06(self):
  59. with self.assertRaises(TemplateSyntaxError):
  60. self.engine.render_to_string('for-tag-unpack06', {'items': (('one', 1), ('two', 2))})
  61. @setup({'for-tag-unpack07': '{% for key,,value in items %}{{ key }}:{{ value }}/{% endfor %}'})
  62. def test_for_tag_unpack07(self):
  63. with self.assertRaises(TemplateSyntaxError):
  64. self.engine.render_to_string('for-tag-unpack07', {'items': (('one', 1), ('two', 2))})
  65. @setup({'for-tag-unpack08': '{% for key,value, in items %}{{ key }}:{{ value }}/{% endfor %}'})
  66. def test_for_tag_unpack08(self):
  67. with self.assertRaises(TemplateSyntaxError):
  68. self.engine.render_to_string('for-tag-unpack08', {'items': (('one', 1), ('two', 2))})
  69. @setup({'for-tag-unpack09': '{% for val in items %}{{ val.0 }}:{{ val.1 }}/{% endfor %}'})
  70. def test_for_tag_unpack09(self):
  71. """
  72. Ensure that a single loopvar doesn't truncate the list in val.
  73. """
  74. output = self.engine.render_to_string('for-tag-unpack09', {'items': (('one', 1), ('two', 2))})
  75. self.assertEqual(output, 'one:1/two:2/')
  76. @setup({'for-tag-unpack13': '{% for x,y,z in items %}{{ x }}:{{ y }},{{ z }}/{% endfor %}'})
  77. def test_for_tag_unpack13(self):
  78. output = self.engine.render_to_string('for-tag-unpack13', {'items': (('one', 1, 'carrot'), ('two', 2, 'cheese'))})
  79. if self.engine.string_if_invalid:
  80. self.assertEqual(output, 'one:1,carrot/two:2,cheese/')
  81. else:
  82. self.assertEqual(output, 'one:1,carrot/two:2,cheese/')
  83. @setup({'for-tag-empty01': '{% for val in values %}{{ val }}{% empty %}empty text{% endfor %}'})
  84. def test_for_tag_empty01(self):
  85. output = self.engine.render_to_string('for-tag-empty01', {'values': [1, 2, 3]})
  86. self.assertEqual(output, '123')
  87. @setup({'for-tag-empty02': '{% for val in values %}{{ val }}{% empty %}values array empty{% endfor %}'})
  88. def test_for_tag_empty02(self):
  89. output = self.engine.render_to_string('for-tag-empty02', {'values': []})
  90. self.assertEqual(output, 'values array empty')
  91. @setup({'for-tag-empty03': '{% for val in values %}'
  92. '{{ val }}{% empty %}values array not found{% endfor %}'})
  93. def test_for_tag_empty03(self):
  94. output = self.engine.render_to_string('for-tag-empty03')
  95. self.assertEqual(output, 'values array not found')
  96. @setup({'for-tag-filter-ws': "{% load custom %}{% for x in s|noop:'x y' %}{{ x }}{% endfor %}"})
  97. def test_for_tag_filter_ws(self):
  98. """
  99. #19882
  100. """
  101. output = self.engine.render_to_string('for-tag-filter-ws', {'s': 'abc'})
  102. self.assertEqual(output, 'abc')
  103. # These tests raise deprecation warnings and will raise an exception
  104. # in Django 2.0. The existing behavior is silent truncation if the
  105. # length of loopvars differs to the length of each set of items.
  106. @ignore_warnings(category=RemovedInDjango20Warning)
  107. @setup({'for-tag-unpack10': '{% for x,y in items %}{{ x }}:{{ y }}/{% endfor %}'})
  108. def test_for_tag_unpack10(self):
  109. output = self.engine.render_to_string(
  110. 'for-tag-unpack10',
  111. {'items': (('one', 1, 'carrot'), ('two', 2, 'orange'))},
  112. )
  113. self.assertEqual(output, 'one:1/two:2/')
  114. @ignore_warnings(category=RemovedInDjango20Warning)
  115. @setup({'for-tag-unpack11': '{% for x,y,z in items %}{{ x }}:{{ y }},{{ z }}/{% endfor %}'})
  116. def test_for_tag_unpack11(self):
  117. output = self.engine.render_to_string(
  118. 'for-tag-unpack11',
  119. {'items': (('one', 1), ('two', 2))},
  120. )
  121. if self.engine.string_if_invalid:
  122. self.assertEqual(output, 'one:1,INVALID/two:2,INVALID/')
  123. else:
  124. self.assertEqual(output, 'one:1,/two:2,/')
  125. @ignore_warnings(category=RemovedInDjango20Warning)
  126. @setup({'for-tag-unpack12': '{% for x,y,z in items %}{{ x }}:{{ y }},{{ z }}/{% endfor %}'})
  127. def test_for_tag_unpack12(self):
  128. output = self.engine.render_to_string(
  129. 'for-tag-unpack12',
  130. {'items': (('one', 1, 'carrot'), ('two', 2))}
  131. )
  132. if self.engine.string_if_invalid:
  133. self.assertEqual(output, 'one:1,carrot/two:2,INVALID/')
  134. else:
  135. self.assertEqual(output, 'one:1,carrot/two:2,/')
  136. @ignore_warnings(category=RemovedInDjango20Warning)
  137. @setup({'for-tag-unpack14': '{% for x,y in items %}{{ x }}:{{ y }}/{% endfor %}'})
  138. def test_for_tag_unpack14(self):
  139. output = self.engine.render_to_string('for-tag-unpack14', {'items': (1, 2)})
  140. if self.engine.string_if_invalid:
  141. self.assertEqual(output, 'INVALID:INVALID/INVALID:INVALID/')
  142. else:
  143. self.assertEqual(output, ':/:/')