mirror of https://github.com/django/django.git
159 lines
4.7 KiB
Python
159 lines
4.7 KiB
Python
from datetime import date
|
|
|
|
from django.template import TemplateSyntaxError
|
|
from django.test import SimpleTestCase
|
|
|
|
from ..utils import setup
|
|
|
|
|
|
class RegroupTagTests(SimpleTestCase):
|
|
@setup(
|
|
{
|
|
"regroup01": ""
|
|
"{% regroup data by bar as grouped %}"
|
|
"{% for group in grouped %}"
|
|
"{{ group.grouper }}:"
|
|
"{% for item in group.list %}"
|
|
"{{ item.foo }}"
|
|
"{% endfor %},"
|
|
"{% endfor %}"
|
|
}
|
|
)
|
|
def test_regroup01(self):
|
|
output = self.engine.render_to_string(
|
|
"regroup01",
|
|
{
|
|
"data": [
|
|
{"foo": "c", "bar": 1},
|
|
{"foo": "d", "bar": 1},
|
|
{"foo": "a", "bar": 2},
|
|
{"foo": "b", "bar": 2},
|
|
{"foo": "x", "bar": 3},
|
|
],
|
|
},
|
|
)
|
|
self.assertEqual(output, "1:cd,2:ab,3:x,")
|
|
|
|
@setup(
|
|
{
|
|
"regroup02": ""
|
|
"{% regroup data by bar as grouped %}"
|
|
"{% for group in grouped %}"
|
|
"{{ group.grouper }}:"
|
|
"{% for item in group.list %}"
|
|
"{{ item.foo }}"
|
|
"{% endfor %}"
|
|
"{% endfor %}"
|
|
}
|
|
)
|
|
def test_regroup02(self):
|
|
"""
|
|
Test for silent failure when target variable isn't found
|
|
"""
|
|
output = self.engine.render_to_string("regroup02", {})
|
|
self.assertEqual(output, "")
|
|
|
|
@setup(
|
|
{
|
|
"regroup03": ""
|
|
'{% regroup data by at|date:"m" as grouped %}'
|
|
"{% for group in grouped %}"
|
|
"{{ group.grouper }}:"
|
|
"{% for item in group.list %}"
|
|
'{{ item.at|date:"d" }}'
|
|
"{% endfor %},"
|
|
"{% endfor %}"
|
|
}
|
|
)
|
|
def test_regroup03(self):
|
|
"""
|
|
Regression tests for #17675
|
|
The date template filter has expects_localtime = True
|
|
"""
|
|
output = self.engine.render_to_string(
|
|
"regroup03",
|
|
{
|
|
"data": [
|
|
{"at": date(2012, 2, 14)},
|
|
{"at": date(2012, 2, 28)},
|
|
{"at": date(2012, 7, 4)},
|
|
],
|
|
},
|
|
)
|
|
self.assertEqual(output, "02:1428,07:04,")
|
|
|
|
@setup(
|
|
{
|
|
"regroup04": ""
|
|
'{% regroup data by bar|join:"" as grouped %}'
|
|
"{% for group in grouped %}"
|
|
"{{ group.grouper }}:"
|
|
"{% for item in group.list %}"
|
|
"{{ item.foo|first }}"
|
|
"{% endfor %},"
|
|
"{% endfor %}"
|
|
}
|
|
)
|
|
def test_regroup04(self):
|
|
"""
|
|
The join template filter has needs_autoescape = True
|
|
"""
|
|
output = self.engine.render_to_string(
|
|
"regroup04",
|
|
{
|
|
"data": [
|
|
{"foo": "x", "bar": ["ab", "c"]},
|
|
{"foo": "y", "bar": ["a", "bc"]},
|
|
{"foo": "z", "bar": ["a", "d"]},
|
|
],
|
|
},
|
|
)
|
|
self.assertEqual(output, "abc:xy,ad:z,")
|
|
|
|
# Test syntax errors
|
|
@setup({"regroup05": "{% regroup data by bar as %}"})
|
|
def test_regroup05(self):
|
|
with self.assertRaises(TemplateSyntaxError):
|
|
self.engine.get_template("regroup05")
|
|
|
|
@setup({"regroup06": "{% regroup data by bar thisaintright grouped %}"})
|
|
def test_regroup06(self):
|
|
with self.assertRaises(TemplateSyntaxError):
|
|
self.engine.get_template("regroup06")
|
|
|
|
@setup({"regroup07": "{% regroup data thisaintright bar as grouped %}"})
|
|
def test_regroup07(self):
|
|
with self.assertRaises(TemplateSyntaxError):
|
|
self.engine.get_template("regroup07")
|
|
|
|
@setup({"regroup08": "{% regroup data by bar as grouped toomanyargs %}"})
|
|
def test_regroup08(self):
|
|
with self.assertRaises(TemplateSyntaxError):
|
|
self.engine.get_template("regroup08")
|
|
|
|
@setup(
|
|
{
|
|
"regroup_unpack": "{% regroup data by bar as grouped %}"
|
|
"{% for grouper, group in grouped %}"
|
|
"{{ grouper }}:"
|
|
"{% for item in group %}"
|
|
"{{ item.foo }}"
|
|
"{% endfor %},"
|
|
"{% endfor %}"
|
|
}
|
|
)
|
|
def test_regroup_unpack(self):
|
|
output = self.engine.render_to_string(
|
|
"regroup_unpack",
|
|
{
|
|
"data": [
|
|
{"foo": "c", "bar": 1},
|
|
{"foo": "d", "bar": 1},
|
|
{"foo": "a", "bar": 2},
|
|
{"foo": "b", "bar": 2},
|
|
{"foo": "x", "bar": 3},
|
|
],
|
|
},
|
|
)
|
|
self.assertEqual(output, "1:cd,2:ab,3:x,")
|