1 # -*- coding: utf-8 -*-
3 jinja2.testsuite.regression
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 Tests corner cases and bugs.
8 :copyright: (c) 2010 by the Jinja Team.
9 :license: BSD, see LICENSE for more details.
13 from jinja2
.testsuite
import JinjaTestCase
15 from jinja2
import Template
, Environment
, DictLoader
, TemplateSyntaxError
, \
16 TemplateNotFound
, PrefixLoader
21 class CornerTestCase(JinjaTestCase
):
23 def test_assigned_scoping(self
):
24 t
= env
.from_string('''
25 {%- for item in (1, 2, 3, 4) -%}
30 assert t
.render(item
=42) == '[1][2][3][4]42'
32 t
= env
.from_string('''
33 {%- for item in (1, 2, 3, 4) -%}
39 assert t
.render() == '[1][2][3][4]42'
41 t
= env
.from_string('''
43 {%- for item in (1, 2, 3, 4) -%}
48 assert t
.render() == '[1][2][3][4]42'
50 def test_closure_scoping(self
):
51 t
= env
.from_string('''
52 {%- set wrapper = "<FOO>" %}
53 {%- for item in (1, 2, 3, 4) %}
54 {%- macro wrapper() %}[{{ item }}]{% endmacro %}
59 assert t
.render() == '[1][2][3][4]<FOO>'
61 t
= env
.from_string('''
62 {%- for item in (1, 2, 3, 4) %}
63 {%- macro wrapper() %}[{{ item }}]{% endmacro %}
66 {%- set wrapper = "<FOO>" %}
69 assert t
.render() == '[1][2][3][4]<FOO>'
71 t
= env
.from_string('''
72 {%- for item in (1, 2, 3, 4) %}
73 {%- macro wrapper() %}[{{ item }}]{% endmacro %}
78 assert t
.render(wrapper
=23) == '[1][2][3][4]23'
81 class BugTestCase(JinjaTestCase
):
83 def test_keyword_folding(self
):
85 env
.filters
['testing'] = lambda value
, some
: value
+ some
86 assert env
.from_string("{{ 'test'|testing(some='stuff') }}") \
87 .render() == 'teststuff'
89 def test_extends_output_bugs(self
):
90 env
= Environment(loader
=DictLoader({
91 'parent.html': '(({% block title %}{% endblock %}))'
94 t
= env
.from_string('{% if expr %}{% extends "parent.html" %}{% endif %}'
95 '[[{% block title %}title{% endblock %}]]'
96 '{% for item in [1, 2, 3] %}({{ item }}){% endfor %}')
97 assert t
.render(expr
=False) == '[[title]](1)(2)(3)'
98 assert t
.render(expr
=True) == '((title))'
100 def test_urlize_filter_escaping(self
):
101 tmpl
= env
.from_string('{{ "http://www.example.org/<foo"|urlize }}')
102 assert tmpl
.render() == '<a href="http://www.example.org/<foo">http://www.example.org/<foo</a>'
104 def test_loop_call_loop(self
):
105 tmpl
= env
.from_string('''
111 {% for num1 in range(5) %}
113 {% for num2 in range(10) %}
121 assert tmpl
.render().split() == map(unicode, range(1, 11)) * 5
123 def test_weird_inline_comment(self
):
124 env
= Environment(line_statement_prefix
='%')
125 self
.assert_raises(TemplateSyntaxError
, env
.from_string
,
126 '% for item in seq {# missing #}\n...% endfor')
128 def test_old_macro_loop_scoping_bug(self
):
129 tmpl
= env
.from_string('{% for i in (1, 2) %}{{ i }}{% endfor %}'
130 '{% macro i() %}3{% endmacro %}{{ i() }}')
131 assert tmpl
.render() == '123'
133 def test_partial_conditional_assignments(self
):
134 tmpl
= env
.from_string('{% if b %}{% set a = 42 %}{% endif %}{{ a }}')
135 assert tmpl
.render(a
=23) == '23'
136 assert tmpl
.render(b
=True) == '42'
138 def test_stacked_locals_scoping_bug(self
):
139 env
= Environment(line_statement_prefix
='#')
140 t
= env
.from_string('''\
160 assert t
.render(a
=0, b
=False, c
=42, d
=42.0) == '1111C'
162 def test_stacked_locals_scoping_bug_twoframe(self
):
165 {% for item in foo %}
172 rv
= t
.render(foo
=[1]).strip()
175 def test_call_with_args(self
):
176 t
= Template("""{% macro dump_users(users) -%}
178 {%- for user in users -%}
179 <li><p>{{ user.username|e }}</p>{{ caller(user) }}</li>
184 {% call(user) dump_users(list_of_user) -%}
187 <dd>{{ user.realname|e }}</dd>
189 <dd>{{ user.description }}</dd>
193 assert [x
.strip() for x
in t
.render(list_of_user
=[{
195 'realname':'something else',
197 }]).splitlines()] == [
198 u
'<ul><li><p>apo</p><dl>',
199 u
'<dl>Realname</dl>',
200 u
'<dd>something else</dd>',
201 u
'<dl>Description</dl>',
207 def test_empty_if_condition_fails(self
):
208 self
.assert_raises(TemplateSyntaxError
, Template
, '{% if %}....{% endif %}')
209 self
.assert_raises(TemplateSyntaxError
, Template
, '{% if foo %}...{% elif %}...{% endif %}')
210 self
.assert_raises(TemplateSyntaxError
, Template
, '{% for x in %}..{% endfor %}')
212 def test_recursive_loop_bug(self
):
214 {% for p in foo recursive%}
216 {% for f in p.fields recursive%}
229 {% for f in p.fields recursive%}
239 def test_correct_prefix_loader_name(self
):
240 env
= Environment(loader
=PrefixLoader({
241 'foo': DictLoader({})
244 env
.get_template('foo/bar.html')
245 except TemplateNotFound
, e
:
246 assert e
.name
== 'foo/bar.html'
248 assert False, 'expected error here'
252 suite
= unittest
.TestSuite()
253 suite
.addTest(unittest
.makeSuite(CornerTestCase
))
254 suite
.addTest(unittest
.makeSuite(BugTestCase
))