1 # -*- coding: utf-8 -*-
6 Unittest that test situations caused by various older bugs.
8 :copyright: (c) 2009 by the Jinja Team.
11 from jinja2 import Template, Environment, DictLoader, TemplateSyntaxError
15 from nose import SkipTest
16 from nose.tools import assert_raises
19 def test_keyword_folding():
21 env.filters['testing'] = lambda value, some: value + some
22 assert env.from_string("{{ 'test'|testing(some='stuff') }}") \
23 .render() == 'teststuff'
26 def test_extends_output_bugs():
27 env = Environment(loader=DictLoader({
28 'parent.html': '(({% block title %}{% endblock %}))'
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))'
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/<foo">http://www.example.org/<foo</a>'
43 def test_loop_call_loop():
44 tmpl = env.from_string('''
50 {% for num1 in range(5) %}
52 {% for num2 in range(10) %}
60 assert tmpl.render().split() == map(unicode, range(1, 11)) * 5
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')
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'
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'
81 def test_stacked_locals_scoping_bug():
82 env = Environment(line_statement_prefix='#')
83 t = env.from_string('''\
103 assert t.render(a=0, b=False, c=42, d=42.0) == '1111C'
106 def test_call_with_args():
107 t = Template("""{% macro dump_users(users) -%}
109 {%- for user in users -%}
110 <li><p>{{ user.username|e }}</p>{{ caller(user) }}</li>
115 {% call(user) dump_users(list_of_user) -%}
118 <dd>{{ user.realname|e }}</dd>
120 <dd>{{ user.description }}</dd>
124 assert [x.strip() for x in t.render(list_of_user=[{
126 'realname':'something else',
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>',