blob: 1ff5a5506f5d3f347f571f7fbbf58b6634b4eaec [file] [log] [blame]
Armin Ronacher335b87a2008-09-21 17:08:48 +02001# -*- coding: utf-8 -*-
2"""
3 Tests for old bugs
4 ~~~~~~~~~~~~~~~~~~
5
6 Unittest that test situations caused by various older bugs.
7
Armin Ronacher62ccd1b2009-01-04 14:26:19 +01008 :copyright: (c) 2009 by the Jinja Team.
Armin Ronacher335b87a2008-09-21 17:08:48 +02009 :license: BSD.
10"""
Armin Ronacher88dc32c2010-02-09 01:27:57 +010011from jinja2 import Template, Environment, DictLoader, TemplateSyntaxError, \
12 TemplateNotFound, PrefixLoader
Armin Ronacher79668952008-09-23 22:52:46 +020013
Armin Ronacher42979eb2009-07-26 11:08:50 +020014env = Environment()
15
Armin Ronacher2b488392009-09-18 19:32:46 +020016from nose import SkipTest
Armin Ronacher42979eb2009-07-26 11:08:50 +020017from nose.tools import assert_raises
Rene Leonhardtc7e6c6d2009-04-20 23:08:53 +020018
Armin Ronacher335b87a2008-09-21 17:08:48 +020019
20def test_keyword_folding():
21 env = Environment()
22 env.filters['testing'] = lambda value, some: value + some
23 assert env.from_string("{{ 'test'|testing(some='stuff') }}") \
24 .render() == 'teststuff'
25
Armin Ronacher79668952008-09-23 22:52:46 +020026
27def test_extends_output_bugs():
28 env = Environment(loader=DictLoader({
29 'parent.html': '(({% block title %}{% endblock %}))'
30 }))
31
32 t = env.from_string('{% if expr %}{% extends "parent.html" %}{% endif %}'
33 '[[{% block title %}title{% endblock %}]]'
34 '{% for item in [1, 2, 3] %}({{ item }}){% endfor %}')
35 assert t.render(expr=False) == '[[title]](1)(2)(3)'
36 assert t.render(expr=True) == '((title))'
Armin Ronacherd9342dc2008-11-17 00:35:30 +010037
38
Armin Ronacher42979eb2009-07-26 11:08:50 +020039def test_urlize_filter_escaping():
Armin Ronacherd9342dc2008-11-17 00:35:30 +010040 tmpl = env.from_string('{{ "http://www.example.org/<foo"|urlize }}')
41 assert tmpl.render() == '<a href="http://www.example.org/&lt;foo">http://www.example.org/&lt;foo</a>'
Armin Ronacher02b42a82009-03-18 00:59:32 +010042
43
Armin Ronacher42979eb2009-07-26 11:08:50 +020044def test_loop_call_loop():
Armin Ronacher02b42a82009-03-18 00:59:32 +010045 tmpl = env.from_string('''
46
47 {% macro test() %}
48 {{ caller() }}
49 {% endmacro %}
50
51 {% for num1 in range(5) %}
52 {% call test() %}
53 {% for num2 in range(10) %}
54 {{ loop.index }}
55 {% endfor %}
56 {% endcall %}
57 {% endfor %}
58
59 ''')
60
Armin Ronachereabf3dd2009-09-12 23:48:18 -070061 assert tmpl.render().split() == map(unicode, range(1, 11)) * 5
Armin Ronacher1dcafe52009-03-30 18:50:49 +020062
63
64def test_weird_inline_comment():
65 env = Environment(line_statement_prefix='%')
Armin Ronacher42979eb2009-07-26 11:08:50 +020066 assert_raises(TemplateSyntaxError, env.from_string,
67 '% for item in seq {# missing #}\n...% endfor')
Armin Ronacher59b6bd52009-03-30 21:00:16 +020068
69
Armin Ronacher42979eb2009-07-26 11:08:50 +020070def test_old_macro_loop_scoping_bug():
Armin Ronacher59b6bd52009-03-30 21:00:16 +020071 tmpl = env.from_string('{% for i in (1, 2) %}{{ i }}{% endfor %}'
72 '{% macro i() %}3{% endmacro %}{{ i() }}')
73 assert tmpl.render() == '123'
Armin Ronacherf1c421d2009-09-17 00:48:41 +020074
75
76def test_partial_conditional_assignments():
77 tmpl = env.from_string('{% if b %}{% set a = 42 %}{% endif %}{{ a }}')
78 assert tmpl.render(a=23) == '23'
79 assert tmpl.render(b=True) == '42'
Armin Ronacher2b488392009-09-18 19:32:46 +020080
81
Armin Ronacher74230e62009-10-25 12:46:31 +010082def test_stacked_locals_scoping_bug():
83 env = Environment(line_statement_prefix='#')
84 t = env.from_string('''\
85# for j in [1, 2]:
86# set x = 1
87# for i in [1, 2]:
88# print x
89# if i % 2 == 0:
90# set x = x + 1
91# endif
92# endfor
93# endfor
94# if a
95# print 'A'
96# elif b
97# print 'B'
98# elif c == d
99# print 'C'
100# else
101# print 'D'
102# endif
103''')
104 assert t.render(a=0, b=False, c=42, d=42.0) == '1111C'
Armin Ronachere0016f52010-01-14 01:20:46 +0100105
106
107def test_call_with_args():
108 t = Template("""{% macro dump_users(users) -%}
109 <ul>
110 {%- for user in users -%}
111 <li><p>{{ user.username|e }}</p>{{ caller(user) }}</li>
112 {%- endfor -%}
113 </ul>
114 {%- endmacro -%}
115
116 {% call(user) dump_users(list_of_user) -%}
117 <dl>
118 <dl>Realname</dl>
119 <dd>{{ user.realname|e }}</dd>
120 <dl>Description</dl>
121 <dd>{{ user.description }}</dd>
122 </dl>
123 {% endcall %}""")
124
125 assert [x.strip() for x in t.render(list_of_user=[{
126 'username':'apo',
127 'realname':'something else',
128 'description':'test'
129 }]).splitlines()] == [
130 u'<ul><li><p>apo</p><dl>',
131 u'<dl>Realname</dl>',
132 u'<dd>something else</dd>',
133 u'<dl>Description</dl>',
134 u'<dd>test</dd>',
135 u'</dl>',
136 u'</li></ul>'
137 ]
Armin Ronachere614e882010-02-06 15:04:46 +0100138
139
140def test_empty_if_condition_fails():
141 assert_raises(TemplateSyntaxError, Template, '{% if %}....{% endif %}')
142 assert_raises(TemplateSyntaxError, Template, '{% if foo %}...{% elif %}...{% endif %}')
143 assert_raises(TemplateSyntaxError, Template, '{% for x in %}..{% endfor %}')
Armin Ronacher7fd4ad62010-02-06 19:01:58 +0100144
145
146def test_recursive_loop_bug():
147 tpl1 = Template("""
148 {% for p in foo recursive%}
149 {{p.bar}}
150 {% for f in p.fields recursive%}
151 {{f.baz}}
152 {{p.bar}}
153 {% if f.rec %}
154 {{ loop(f.sub) }}
155 {% endif %}
156 {% endfor %}
157 {% endfor %}
158 """)
Armin Ronacher7fd4ad62010-02-06 19:01:58 +0100159
160 tpl2 = Template("""
161 {% for p in foo%}
162 {{p.bar}}
163 {% for f in p.fields recursive%}
164 {{f.baz}}
165 {{p.bar}}
166 {% if f.rec %}
167 {{ loop(f.sub) }}
168 {% endif %}
169 {% endfor %}
170 {% endfor %}
171 """)
Armin Ronacher88dc32c2010-02-09 01:27:57 +0100172
173
174def test_correct_prefix_loader_name():
175 env = Environment(loader=PrefixLoader({
176 'foo': DictLoader({})
177 }))
178 try:
179 env.get_template('foo/bar.html')
180 except TemplateNotFound, e:
181 assert e.name == 'foo/bar.html'
182 else:
183 assert False, 'expected error here'