blob: 19c3fc257ede32705b410eab364f03db1620b3b1 [file] [log] [blame]
Armin Ronacherc1e30402007-03-18 22:41:09 +01001# -*- coding: utf-8 -*-
2"""
3 unit test for the inheritance
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
Armin Ronacher62ccd1b2009-01-04 14:26:19 +01006 :copyright: (c) 2009 by the Jinja Team.
Armin Ronacherc1e30402007-03-18 22:41:09 +01007 :license: BSD, see LICENSE for more details.
8"""
Rene Leonhardtc7e6c6d2009-04-20 23:08:53 +02009
Christoph Hacke9e43bb2008-04-13 23:35:48 +020010from jinja2 import Environment, DictLoader
11from jinja2.exceptions import TemplateSyntaxError
Armin Ronacherc1e30402007-03-18 22:41:09 +010012
Rene Leonhardtc7e6c6d2009-04-20 23:08:53 +020013import conftest
14conftest.GlobalLoader.scope = globals()
15
16
Armin Ronacherc1e30402007-03-18 22:41:09 +010017LAYOUTTEMPLATE = '''\
18|{% block block1 %}block 1 from layout{% endblock %}
19|{% block block2 %}block 2 from layout{% endblock %}
20|{% block block3 %}
21{% block block4 %}nested block 4 from layout{% endblock %}
22{% endblock %}|'''
23
24LEVEL1TEMPLATE = '''\
25{% extends "layout" %}
26{% block block1 %}block 1 from level1{% endblock %}'''
27
28LEVEL2TEMPLATE = '''\
29{% extends "level1" %}
30{% block block2 %}{% block block5 %}nested block 5 from level2{%
31endblock %}{% endblock %}'''
32
33LEVEL3TEMPLATE = '''\
34{% extends "level2" %}
35{% block block5 %}block 5 from level3{% endblock %}
36{% block block4 %}block 4 from level3{% endblock %}
37'''
38
39LEVEL4TEMPLATE = '''\
40{% extends "level3" %}
41{% block block3 %}block 3 from level4{% endblock %}
42'''
43
Armin Ronacher44fb2e12007-04-29 09:45:00 +020044WORKINGTEMPLATE = '''\
45{% extends "layout" %}
46{% block block1 %}
47 {% if false %}
48 {% block block2 %}
49 this should workd
50 {% endblock %}
51 {% endif %}
52{% endblock %}
53'''
54
Armin Ronacherc1e30402007-03-18 22:41:09 +010055def test_layout(env):
56 tmpl = env.get_template('layout')
57 assert tmpl.render() == ('|block 1 from layout|block 2 from '
58 'layout|nested block 4 from layout|')
59
60
61def test_level1(env):
62 tmpl = env.get_template('level1')
63 assert tmpl.render() == ('|block 1 from level1|block 2 from '
64 'layout|nested block 4 from layout|')
65
66
67def test_level2(env):
68 tmpl = env.get_template('level2')
69 assert tmpl.render() == ('|block 1 from level1|nested block 5 from '
70 'level2|nested block 4 from layout|')
71
72
73def test_level3(env):
74 tmpl = env.get_template('level3')
75 assert tmpl.render() == ('|block 1 from level1|block 5 from level3|'
76 'block 4 from level3|')
77
78
79def test_level4(env):
80 tmpl = env.get_template('level4')
81 assert tmpl.render() == ('|block 1 from level1|block 5 from '
82 'level3|block 3 from level4|')
Armin Ronacher21580912007-04-17 17:13:10 +020083
84
85def test_super():
86 env = Environment(loader=DictLoader({
87 'a': '{% block intro %}INTRO{% endblock %}|'
88 'BEFORE|{% block data %}INNER{% endblock %}|AFTER',
89 'b': '{% extends "a" %}{% block data %}({{ '
90 'super() }}){% endblock %}',
91 'c': '{% extends "b" %}{% block intro %}--{{ '
92 'super() }}--{% endblock %}\n{% block data '
93 '%}[{{ super() }}]{% endblock %}'
94 }))
95 tmpl = env.get_template('c')
96 assert tmpl.render() == '--INTRO--|BEFORE|[(INNER)]|AFTER'
Armin Ronacher44fb2e12007-04-29 09:45:00 +020097
98
Armin Ronacher44fb2e12007-04-29 09:45:00 +020099def test_working(env):
100 tmpl = env.get_template('working')
Armin Ronachere25f24d2008-05-19 11:20:41 +0200101
102
103def test_reuse_blocks(env):
104 tmpl = env.from_string('{{ self.foo() }}|{% block foo %}42{% endblock %}|{{ self.foo() }}')
105 assert tmpl.render() == '42|42|42'
Armin Ronacher6df604e2008-05-23 22:18:38 +0200106
107
108def test_preserve_blocks():
109 env = Environment(loader=DictLoader({
110 'a': '{% if false %}{% block x %}A{% endblock %}{% endif %}{{ self.x() }}',
111 'b': '{% extends "a" %}{% block x %}B{{ super() }}{% endblock %}'
112 }))
113 tmpl = env.get_template('b')
114 assert tmpl.render() == 'BA'
Armin Ronacherbe1dca12008-05-23 23:43:45 +0200115
116
117def test_dynamic_inheritance():
118 env = Environment(loader=DictLoader({
119 'master1': 'MASTER1{% block x %}{% endblock %}',
120 'master2': 'MASTER2{% block x %}{% endblock %}',
121 'child': '{% extends master %}{% block x %}CHILD{% endblock %}'
122 }))
123 tmpl = env.get_template('child')
124 for m in range(1, 3):
125 assert tmpl.render(master='master%d' % m) == 'MASTER%dCHILD' % m
126
127
128def test_multi_inheritance():
129 env = Environment(loader=DictLoader({
130 'master1': 'MASTER1{% block x %}{% endblock %}',
131 'master2': 'MASTER2{% block x %}{% endblock %}',
132 'child': '''{% if master %}{% extends master %}{% else %}{% extends
133 'master1' %}{% endif %}{% block x %}CHILD{% endblock %}'''
134 }))
135 tmpl = env.get_template('child')
136 assert tmpl.render(master='master2') == 'MASTER2CHILD'
137 assert tmpl.render(master='master1') == 'MASTER1CHILD'
138 assert tmpl.render() == 'MASTER1CHILD'
Armin Ronachere308bf22008-10-30 19:18:45 +0100139
140
141def test_fixed_macro_scoping_bug():
142 assert Environment(loader=DictLoader({
143 'test.html': '''\
144 {% extends 'details.html' %}
145
146 {% macro my_macro() %}
147 my_macro
148 {% endmacro %}
149
150 {% block inner_box %}
151 {{ my_macro() }}
152 {% endblock %}
153 ''',
154 'details.html': '''\
155 {% extends 'standard.html' %}
156
157 {% macro my_macro() %}
158 my_macro
159 {% endmacro %}
160
161 {% block content %}
162 {% block outer_box %}
163 outer_box
164 {% block inner_box %}
165 inner_box
166 {% endblock %}
167 {% endblock %}
168 {% endblock %}
169 ''',
170 'standard.html': '''
171 {% block content %} {% endblock %}
172 '''
173 })).get_template("test.html").render().split() == [u'outer_box', u'my_macro']
Armin Ronacher74a0cd92009-02-19 15:56:53 +0100174
175
176def test_scoped_block():
177 env = Environment(loader=DictLoader({
178 'master.html': '{% for item in seq %}[{% block item scoped %}'
179 '{% endblock %}]{% endfor %}'
180 }))
181 t = env.from_string('{% extends "master.html" %}{% block item %}{{ item }}{% endblock %}')
182 assert t.render(seq=range(5)) == '[0][1][2][3][4]'
Armin Ronacher3f1d8f12009-02-19 16:11:11 +0100183
184
185def test_super_in_scoped_block():
186 env = Environment(loader=DictLoader({
187 'master.html': '{% for item in seq %}[{% block item scoped %}'
188 '{{ item }}{% endblock %}]{% endfor %}'
189 }))
190 t = env.from_string('{% extends "master.html" %}{% block item %}{{ super() }}|{{ item * 2 }}{% endblock %}')
191 assert t.render(seq=range(5)) == '[0|0][1|2][2|4][3|6][4|8]'