231 lines
7.8 KiB
Python
231 lines
7.8 KiB
Python
from django.template import TemplateSyntaxError
|
|
from django.test import SimpleTestCase
|
|
|
|
from ..utils import setup
|
|
|
|
|
|
class CycleTagTests(SimpleTestCase):
|
|
@setup({"cycle01": "{% cycle a %}"})
|
|
def test_cycle01(self):
|
|
msg = "No named cycles in template. 'a' is not defined"
|
|
with self.assertRaisesMessage(TemplateSyntaxError, msg):
|
|
self.engine.get_template("cycle01")
|
|
|
|
@setup({"cycle05": "{% cycle %}"})
|
|
def test_cycle05(self):
|
|
msg = "'cycle' tag requires at least two arguments"
|
|
with self.assertRaisesMessage(TemplateSyntaxError, msg):
|
|
self.engine.get_template("cycle05")
|
|
|
|
@setup({"cycle07": "{% cycle a,b,c as foo %}{% cycle bar %}"})
|
|
def test_cycle07(self):
|
|
msg = "Could not parse the remainder: ',b,c' from 'a,b,c'"
|
|
with self.assertRaisesMessage(TemplateSyntaxError, msg):
|
|
self.engine.get_template("cycle07")
|
|
|
|
@setup({"cycle10": "{% cycle 'a' 'b' 'c' as abc %}{% cycle abc %}"})
|
|
def test_cycle10(self):
|
|
output = self.engine.render_to_string("cycle10")
|
|
self.assertEqual(output, "ab")
|
|
|
|
@setup({"cycle11": "{% cycle 'a' 'b' 'c' as abc %}{% cycle abc %}{% cycle abc %}"})
|
|
def test_cycle11(self):
|
|
output = self.engine.render_to_string("cycle11")
|
|
self.assertEqual(output, "abc")
|
|
|
|
@setup(
|
|
{
|
|
"cycle12": (
|
|
"{% cycle 'a' 'b' 'c' as abc %}{% cycle abc %}{% cycle abc %}"
|
|
"{% cycle abc %}"
|
|
)
|
|
}
|
|
)
|
|
def test_cycle12(self):
|
|
output = self.engine.render_to_string("cycle12")
|
|
self.assertEqual(output, "abca")
|
|
|
|
@setup({"cycle13": "{% for i in test %}{% cycle 'a' 'b' %}{{ i }},{% endfor %}"})
|
|
def test_cycle13(self):
|
|
output = self.engine.render_to_string("cycle13", {"test": list(range(5))})
|
|
self.assertEqual(output, "a0,b1,a2,b3,a4,")
|
|
|
|
@setup({"cycle14": "{% cycle one two as foo %}{% cycle foo %}"})
|
|
def test_cycle14(self):
|
|
output = self.engine.render_to_string("cycle14", {"one": "1", "two": "2"})
|
|
self.assertEqual(output, "12")
|
|
|
|
@setup({"cycle15": "{% for i in test %}{% cycle aye bee %}{{ i }},{% endfor %}"})
|
|
def test_cycle15(self):
|
|
output = self.engine.render_to_string(
|
|
"cycle15", {"test": list(range(5)), "aye": "a", "bee": "b"}
|
|
)
|
|
self.assertEqual(output, "a0,b1,a2,b3,a4,")
|
|
|
|
@setup({"cycle16": "{% cycle one|lower two as foo %}{% cycle foo %}"})
|
|
def test_cycle16(self):
|
|
output = self.engine.render_to_string("cycle16", {"one": "A", "two": "2"})
|
|
self.assertEqual(output, "a2")
|
|
|
|
@setup(
|
|
{
|
|
"cycle17": "{% cycle 'a' 'b' 'c' as abc silent %}"
|
|
"{% cycle abc %}{% cycle abc %}{% cycle abc %}{% cycle abc %}"
|
|
}
|
|
)
|
|
def test_cycle17(self):
|
|
output = self.engine.render_to_string("cycle17")
|
|
self.assertEqual(output, "")
|
|
|
|
@setup({"cycle18": "{% cycle 'a' 'b' 'c' as foo invalid_flag %}"})
|
|
def test_cycle18(self):
|
|
msg = "Only 'silent' flag is allowed after cycle's name, not 'invalid_flag'."
|
|
with self.assertRaisesMessage(TemplateSyntaxError, msg):
|
|
self.engine.get_template("cycle18")
|
|
|
|
@setup({"cycle19": "{% cycle 'a' 'b' as silent %}{% cycle silent %}"})
|
|
def test_cycle19(self):
|
|
output = self.engine.render_to_string("cycle19")
|
|
self.assertEqual(output, "ab")
|
|
|
|
@setup({"cycle20": "{% cycle one two as foo %} & {% cycle foo %}"})
|
|
def test_cycle20(self):
|
|
output = self.engine.render_to_string(
|
|
"cycle20", {"two": "C & D", "one": "A & B"}
|
|
)
|
|
self.assertEqual(output, "A & B & C & D")
|
|
|
|
@setup(
|
|
{
|
|
"cycle21": "{% filter force_escape %}"
|
|
"{% cycle one two as foo %} & {% cycle foo %}{% endfilter %}"
|
|
}
|
|
)
|
|
def test_cycle21(self):
|
|
output = self.engine.render_to_string(
|
|
"cycle21", {"two": "C & D", "one": "A & B"}
|
|
)
|
|
self.assertEqual(output, "A & B & C & D")
|
|
|
|
@setup(
|
|
{
|
|
"cycle22": (
|
|
"{% for x in values %}{% cycle 'a' 'b' 'c' as abc silent %}{{ x }}"
|
|
"{% endfor %}"
|
|
)
|
|
}
|
|
)
|
|
def test_cycle22(self):
|
|
output = self.engine.render_to_string("cycle22", {"values": [1, 2, 3, 4]})
|
|
self.assertEqual(output, "1234")
|
|
|
|
@setup(
|
|
{
|
|
"cycle23": "{% for x in values %}"
|
|
"{% cycle 'a' 'b' 'c' as abc silent %}{{ abc }}{{ x }}{% endfor %}"
|
|
}
|
|
)
|
|
def test_cycle23(self):
|
|
output = self.engine.render_to_string("cycle23", {"values": [1, 2, 3, 4]})
|
|
self.assertEqual(output, "a1b2c3a4")
|
|
|
|
@setup(
|
|
{
|
|
"cycle24": (
|
|
"{% for x in values %}"
|
|
"{% cycle 'a' 'b' 'c' as abc silent %}{% include 'included-cycle' %}"
|
|
"{% endfor %}"
|
|
),
|
|
"included-cycle": "{{ abc }}",
|
|
}
|
|
)
|
|
def test_cycle24(self):
|
|
output = self.engine.render_to_string("cycle24", {"values": [1, 2, 3, 4]})
|
|
self.assertEqual(output, "abca")
|
|
|
|
@setup({"cycle25": "{% cycle a as abc %}"})
|
|
def test_cycle25(self):
|
|
output = self.engine.render_to_string("cycle25", {"a": "<"})
|
|
self.assertEqual(output, "<")
|
|
|
|
@setup({"cycle26": "{% cycle a b as ab %}{% cycle ab %}"})
|
|
def test_cycle26(self):
|
|
output = self.engine.render_to_string("cycle26", {"a": "<", "b": ">"})
|
|
self.assertEqual(output, "<>")
|
|
|
|
@setup(
|
|
{
|
|
"cycle27": (
|
|
"{% autoescape off %}{% cycle a b as ab %}{% cycle ab %}"
|
|
"{% endautoescape %}"
|
|
)
|
|
}
|
|
)
|
|
def test_cycle27(self):
|
|
output = self.engine.render_to_string("cycle27", {"a": "<", "b": ">"})
|
|
self.assertEqual(output, "<>")
|
|
|
|
@setup({"cycle28": "{% cycle a|safe b as ab %}{% cycle ab %}"})
|
|
def test_cycle28(self):
|
|
output = self.engine.render_to_string("cycle28", {"a": "<", "b": ">"})
|
|
self.assertEqual(output, "<>")
|
|
|
|
@setup(
|
|
{
|
|
"cycle29": "{% cycle 'a' 'b' 'c' as cycler silent %}"
|
|
"{% for x in values %}"
|
|
"{% ifchanged x %}"
|
|
"{% cycle cycler %}{{ cycler }}"
|
|
"{% else %}"
|
|
"{{ cycler }}"
|
|
"{% endifchanged %}"
|
|
"{% endfor %}"
|
|
}
|
|
)
|
|
def test_cycle29(self):
|
|
"""
|
|
A named {% cycle %} tag works inside an {% ifchanged %} block and a
|
|
{% for %} loop.
|
|
"""
|
|
output = self.engine.render_to_string(
|
|
"cycle29", {"values": [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 9, 9]}
|
|
)
|
|
self.assertEqual(output, "bcabcabcccaa")
|
|
|
|
@setup(
|
|
{
|
|
"cycle30": "{% cycle 'a' 'b' 'c' as cycler silent %}"
|
|
"{% for x in values %}"
|
|
"{% with doesnothing=irrelevant %}"
|
|
"{% ifchanged x %}"
|
|
"{% cycle cycler %}{{ cycler }}"
|
|
"{% else %}"
|
|
"{{ cycler }}"
|
|
"{% endifchanged %}"
|
|
"{% endwith %}"
|
|
"{% endfor %}"
|
|
}
|
|
)
|
|
def test_cycle30(self):
|
|
"""
|
|
A {% with %} tag shouldn't reset the {% cycle %} variable.
|
|
"""
|
|
output = self.engine.render_to_string(
|
|
"cycle30", {"irrelevant": 1, "values": [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 9, 9]}
|
|
)
|
|
self.assertEqual(output, "bcabcabcccaa")
|
|
|
|
@setup(
|
|
{
|
|
"undefined_cycle": "{% cycle 'a' 'b' 'c' as cycler silent %}"
|
|
"{% for x in values %}"
|
|
"{% cycle undefined %}{{ cycler }}"
|
|
"{% endfor %}"
|
|
}
|
|
)
|
|
def test_cycle_undefined(self):
|
|
with self.assertRaisesMessage(
|
|
TemplateSyntaxError, "Named cycle 'undefined' does not exist"
|
|
):
|
|
self.engine.render_to_string("undefined_cycle")
|