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