blob: c4468f12e93bbedbb38dc73e139095ee87719dd5 [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 Ronacher1dcafe52009-03-30 18:50:49 +020011from jinja2 import Environment, DictLoader, TemplateSyntaxError
Armin Ronacher79668952008-09-23 22:52:46 +020012
Armin Ronacher42979eb2009-07-26 11:08:50 +020013env = Environment()
14
Armin Ronacher2b488392009-09-18 19:32:46 +020015from nose import SkipTest
Armin Ronacher42979eb2009-07-26 11:08:50 +020016from nose.tools import assert_raises
Rene Leonhardtc7e6c6d2009-04-20 23:08:53 +020017
Armin Ronacher335b87a2008-09-21 17:08:48 +020018
19def 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
Armin Ronacher79668952008-09-23 22:52:46 +020025
26def 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))'
Armin Ronacherd9342dc2008-11-17 00:35:30 +010036
37
Armin Ronacher42979eb2009-07-26 11:08:50 +020038def test_urlize_filter_escaping():
Armin Ronacherd9342dc2008-11-17 00:35:30 +010039 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>'
Armin Ronacher02b42a82009-03-18 00:59:32 +010041
42
Armin Ronacher42979eb2009-07-26 11:08:50 +020043def test_loop_call_loop():
Armin Ronacher02b42a82009-03-18 00:59:32 +010044 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
Armin Ronachereabf3dd2009-09-12 23:48:18 -070060 assert tmpl.render().split() == map(unicode, range(1, 11)) * 5
Armin Ronacher1dcafe52009-03-30 18:50:49 +020061
62
63def test_weird_inline_comment():
64 env = Environment(line_statement_prefix='%')
Armin Ronacher42979eb2009-07-26 11:08:50 +020065 assert_raises(TemplateSyntaxError, env.from_string,
66 '% for item in seq {# missing #}\n...% endfor')
Armin Ronacher59b6bd52009-03-30 21:00:16 +020067
68
Armin Ronacher42979eb2009-07-26 11:08:50 +020069def test_old_macro_loop_scoping_bug():
Armin Ronacher59b6bd52009-03-30 21:00:16 +020070 tmpl = env.from_string('{% for i in (1, 2) %}{{ i }}{% endfor %}'
71 '{% macro i() %}3{% endmacro %}{{ i() }}')
72 assert tmpl.render() == '123'
Armin Ronacherf1c421d2009-09-17 00:48:41 +020073
74
75def 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'
Armin Ronacher2b488392009-09-18 19:32:46 +020079
80
81def test_local_macros_first():
82 raise SkipTest('Behavior will change in 2.3')
83 env = Environment(loader=DictLoader({
84 'layout.html': ('{% macro foo() %}LAYOUT{% endmacro %}'
85 '{% block body %}{% endblock %}'),
86 'child.html': ('{% extends "layout.html" %}'
87 '{% macro foo() %}CHILD{% endmacro %}'
88 '{% block body %}{{ foo() }}{% endblock %}')
89 }))
90 assert env.get_template('child.html').render() == 'CHILD'