test_regroup.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from datetime import date
  2. from django.template import TemplateSyntaxError
  3. from django.test import SimpleTestCase
  4. from ..utils import setup
  5. class RegroupTagTests(SimpleTestCase):
  6. @setup({'regroup01': ''
  7. '{% regroup data by bar as grouped %}'
  8. '{% for group in grouped %}'
  9. '{{ group.grouper }}:'
  10. '{% for item in group.list %}'
  11. '{{ item.foo }}'
  12. '{% endfor %},'
  13. '{% endfor %}'})
  14. def test_regroup01(self):
  15. output = self.engine.render_to_string('regroup01', {
  16. 'data': [{'foo': 'c', 'bar': 1},
  17. {'foo': 'd', 'bar': 1},
  18. {'foo': 'a', 'bar': 2},
  19. {'foo': 'b', 'bar': 2},
  20. {'foo': 'x', 'bar': 3}],
  21. })
  22. self.assertEqual(output, '1:cd,2:ab,3:x,')
  23. @setup({'regroup02': ''
  24. '{% regroup data by bar as grouped %}'
  25. '{% for group in grouped %}'
  26. '{{ group.grouper }}:'
  27. '{% for item in group.list %}'
  28. '{{ item.foo }}'
  29. '{% endfor %}'
  30. '{% endfor %}'})
  31. def test_regroup02(self):
  32. """
  33. Test for silent failure when target variable isn't found
  34. """
  35. output = self.engine.render_to_string('regroup02', {})
  36. self.assertEqual(output, '')
  37. @setup({'regroup03': ''
  38. '{% regroup data by at|date:"m" as grouped %}'
  39. '{% for group in grouped %}'
  40. '{{ group.grouper }}:'
  41. '{% for item in group.list %}'
  42. '{{ item.at|date:"d" }}'
  43. '{% endfor %},'
  44. '{% endfor %}'})
  45. def test_regroup03(self):
  46. """
  47. Regression tests for #17675
  48. The date template filter has expects_localtime = True
  49. """
  50. output = self.engine.render_to_string('regroup03', {
  51. 'data': [{'at': date(2012, 2, 14)},
  52. {'at': date(2012, 2, 28)},
  53. {'at': date(2012, 7, 4)}],
  54. })
  55. self.assertEqual(output, '02:1428,07:04,')
  56. @setup({'regroup04': ''
  57. '{% regroup data by bar|join:"" as grouped %}'
  58. '{% for group in grouped %}'
  59. '{{ group.grouper }}:'
  60. '{% for item in group.list %}'
  61. '{{ item.foo|first }}'
  62. '{% endfor %},'
  63. '{% endfor %}'})
  64. def test_regroup04(self):
  65. """
  66. The join template filter has needs_autoescape = True
  67. """
  68. output = self.engine.render_to_string('regroup04', {
  69. 'data': [{'foo': 'x', 'bar': ['ab', 'c']},
  70. {'foo': 'y', 'bar': ['a', 'bc']},
  71. {'foo': 'z', 'bar': ['a', 'd']}],
  72. })
  73. self.assertEqual(output, 'abc:xy,ad:z,')
  74. # Test syntax errors
  75. @setup({'regroup05': '{% regroup data by bar as %}'})
  76. def test_regroup05(self):
  77. with self.assertRaises(TemplateSyntaxError):
  78. self.engine.get_template('regroup05')
  79. @setup({'regroup06': '{% regroup data by bar thisaintright grouped %}'})
  80. def test_regroup06(self):
  81. with self.assertRaises(TemplateSyntaxError):
  82. self.engine.get_template('regroup06')
  83. @setup({'regroup07': '{% regroup data thisaintright bar as grouped %}'})
  84. def test_regroup07(self):
  85. with self.assertRaises(TemplateSyntaxError):
  86. self.engine.get_template('regroup07')
  87. @setup({'regroup08': '{% regroup data by bar as grouped toomanyargs %}'})
  88. def test_regroup08(self):
  89. with self.assertRaises(TemplateSyntaxError):
  90. self.engine.get_template('regroup08')
  91. @setup({'regroup_unpack': '{% regroup data by bar as grouped %}'
  92. '{% for grouper, group in grouped %}'
  93. '{{ grouper }}:'
  94. '{% for item in group %}'
  95. '{{ item.foo }}'
  96. '{% endfor %},'
  97. '{% endfor %}'})
  98. def test_regroup_unpack(self):
  99. output = self.engine.render_to_string('regroup_unpack', {
  100. 'data': [
  101. {'foo': 'c', 'bar': 1},
  102. {'foo': 'd', 'bar': 1},
  103. {'foo': 'a', 'bar': 2},
  104. {'foo': 'b', 'bar': 2},
  105. {'foo': 'x', 'bar': 3},
  106. ],
  107. })
  108. self.assertEqual(output, '1:cd,2:ab,3:x,')