e3a403bdd5d075c935ab7ba2e969532bbe551a76
[jinja2.git] / tests / test_old_bugs.py
1 # -*- coding: utf-8 -*-
2 """
3     Tests for old bugs
4     ~~~~~~~~~~~~~~~~~~
5
6     Unittest that test situations caused by various older bugs.
7
8     :copyright: (c) 2009 by the Jinja Team.
9     :license: BSD.
10 """
11 from jinja2 import Template, Environment, DictLoader, TemplateSyntaxError
12
13 env = Environment()
14
15 from nose import SkipTest
16 from nose.tools import assert_raises
17
18
19 def test_keyword_folding():
20     env = Environment()
21     env.filters['testing'] = lambda value, some: value + some
22     assert env.from_string("{{ 'test'|testing(some='stuff') }}") \
23            .render() == 'teststuff'
24
25
26 def test_extends_output_bugs():
27     env = Environment(loader=DictLoader({
28         'parent.html': '(({% block title %}{% endblock %}))'
29     }))
30
31     t = env.from_string('{% if expr %}{% extends "parent.html" %}{% endif %}'
32                         '[[{% block title %}title{% endblock %}]]'
33                         '{% for item in [1, 2, 3] %}({{ item }}){% endfor %}')
34     assert t.render(expr=False) == '[[title]](1)(2)(3)'
35     assert t.render(expr=True) == '((title))'
36
37
38 def test_urlize_filter_escaping():
39     tmpl = env.from_string('{{ "http://www.example.org/<foo"|urlize }}')
40     assert tmpl.render() == '<a href="http://www.example.org/&lt;foo">http://www.example.org/&lt;foo</a>'
41
42
43 def test_loop_call_loop():
44     tmpl = env.from_string('''
45
46     {% macro test() %}
47         {{ caller() }}
48     {% endmacro %}
49
50     {% for num1 in range(5) %}
51         {% call test() %}
52             {% for num2 in range(10) %}
53                 {{ loop.index }}
54             {% endfor %}
55         {% endcall %}
56     {% endfor %}
57
58     ''')
59
60     assert tmpl.render().split() == map(unicode, range(1, 11)) * 5
61
62
63 def test_weird_inline_comment():
64     env = Environment(line_statement_prefix='%')
65     assert_raises(TemplateSyntaxError, env.from_string,
66                   '% for item in seq {# missing #}\n...% endfor')
67
68
69 def test_old_macro_loop_scoping_bug():
70     tmpl = env.from_string('{% for i in (1, 2) %}{{ i }}{% endfor %}'
71                            '{% macro i() %}3{% endmacro %}{{ i() }}')
72     assert tmpl.render() == '123'
73
74
75 def test_partial_conditional_assignments():
76     tmpl = env.from_string('{% if b %}{% set a = 42 %}{% endif %}{{ a }}')
77     assert tmpl.render(a=23) == '23'
78     assert tmpl.render(b=True) == '42'
79
80
81 def test_stacked_locals_scoping_bug():
82     env = Environment(line_statement_prefix='#')
83     t = env.from_string('''\
84 # for j in [1, 2]:
85 #   set x = 1
86 #   for i in [1, 2]:
87 #     print x
88 #     if i % 2 == 0:
89 #       set x = x + 1
90 #     endif
91 #   endfor
92 # endfor
93 # if a
94 #   print 'A'
95 # elif b
96 #   print 'B'
97 # elif c == d
98 #   print 'C'
99 # else
100 #   print 'D'
101 # endif
102 ''')
103     assert t.render(a=0, b=False, c=42, d=42.0) == '1111C'
104
105
106 def test_call_with_args():
107     t = Template("""{% macro dump_users(users) -%}
108     <ul>
109       {%- for user in users -%}
110         <li><p>{{ user.username|e }}</p>{{ caller(user) }}</li>
111       {%- endfor -%}
112       </ul>
113     {%- endmacro -%}
114
115     {% call(user) dump_users(list_of_user) -%}
116       <dl>
117         <dl>Realname</dl>
118         <dd>{{ user.realname|e }}</dd>
119         <dl>Description</dl>
120         <dd>{{ user.description }}</dd>
121       </dl>
122     {% endcall %}""")
123
124     assert [x.strip() for x in t.render(list_of_user=[{
125         'username':'apo',
126         'realname':'something else',
127         'description':'test'
128     }]).splitlines()] == [
129         u'<ul><li><p>apo</p><dl>',
130         u'<dl>Realname</dl>',
131         u'<dd>something else</dd>',
132         u'<dl>Description</dl>',
133         u'<dd>test</dd>',
134         u'</dl>',
135         u'</li></ul>'
136     ]