blob: 58b992fa35aac876688355070819e7afb6c57d83 [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 +020013
Armin Ronacherc1e30402007-03-18 22:41:09 +010014LAYOUTTEMPLATE = '''\
15|{% block block1 %}block 1 from layout{% endblock %}
16|{% block block2 %}block 2 from layout{% endblock %}
17|{% block block3 %}
18{% block block4 %}nested block 4 from layout{% endblock %}
19{% endblock %}|'''
20
21LEVEL1TEMPLATE = '''\
22{% extends "layout" %}
23{% block block1 %}block 1 from level1{% endblock %}'''
24
25LEVEL2TEMPLATE = '''\
26{% extends "level1" %}
27{% block block2 %}{% block block5 %}nested block 5 from level2{%
28endblock %}{% endblock %}'''
29
30LEVEL3TEMPLATE = '''\
31{% extends "level2" %}
32{% block block5 %}block 5 from level3{% endblock %}
33{% block block4 %}block 4 from level3{% endblock %}
34'''
35
36LEVEL4TEMPLATE = '''\
37{% extends "level3" %}
38{% block block3 %}block 3 from level4{% endblock %}
39'''
40
Armin Ronacher44fb2e12007-04-29 09:45:00 +020041WORKINGTEMPLATE = '''\
42{% extends "layout" %}
43{% block block1 %}
44 {% if false %}
45 {% block block2 %}
46 this should workd
47 {% endblock %}
48 {% endif %}
49{% endblock %}
50'''
51
Armin Ronacher42979eb2009-07-26 11:08:50 +020052env = Environment(loader=DictLoader({
53 'layout': LAYOUTTEMPLATE,
54 'level1': LEVEL1TEMPLATE,
55 'level2': LEVEL2TEMPLATE,
56 'level3': LEVEL3TEMPLATE,
57 'level4': LEVEL4TEMPLATE,
58 'working': WORKINGTEMPLATE
59}), trim_blocks=True)
60
61def test_layout():
Armin Ronacherc1e30402007-03-18 22:41:09 +010062 tmpl = env.get_template('layout')
63 assert tmpl.render() == ('|block 1 from layout|block 2 from '
64 'layout|nested block 4 from layout|')
65
66
Armin Ronacher42979eb2009-07-26 11:08:50 +020067def test_level1():
Armin Ronacherc1e30402007-03-18 22:41:09 +010068 tmpl = env.get_template('level1')
69 assert tmpl.render() == ('|block 1 from level1|block 2 from '
70 'layout|nested block 4 from layout|')
71
72
Armin Ronacher42979eb2009-07-26 11:08:50 +020073def test_level2():
Armin Ronacherc1e30402007-03-18 22:41:09 +010074 tmpl = env.get_template('level2')
75 assert tmpl.render() == ('|block 1 from level1|nested block 5 from '
76 'level2|nested block 4 from layout|')
77
78
Armin Ronacher42979eb2009-07-26 11:08:50 +020079def test_level3():
Armin Ronacherc1e30402007-03-18 22:41:09 +010080 tmpl = env.get_template('level3')
81 assert tmpl.render() == ('|block 1 from level1|block 5 from level3|'
82 'block 4 from level3|')
83
84
Armin Ronacher42979eb2009-07-26 11:08:50 +020085def test_level4():
Armin Ronacherc1e30402007-03-18 22:41:09 +010086 tmpl = env.get_template('level4')
87 assert tmpl.render() == ('|block 1 from level1|block 5 from '
88 'level3|block 3 from level4|')
Armin Ronacher21580912007-04-17 17:13:10 +020089
90
91def test_super():
92 env = Environment(loader=DictLoader({
93 'a': '{% block intro %}INTRO{% endblock %}|'
94 'BEFORE|{% block data %}INNER{% endblock %}|AFTER',
95 'b': '{% extends "a" %}{% block data %}({{ '
96 'super() }}){% endblock %}',
97 'c': '{% extends "b" %}{% block intro %}--{{ '
98 'super() }}--{% endblock %}\n{% block data '
99 '%}[{{ super() }}]{% endblock %}'
100 }))
101 tmpl = env.get_template('c')
102 assert tmpl.render() == '--INTRO--|BEFORE|[(INNER)]|AFTER'
Armin Ronacher44fb2e12007-04-29 09:45:00 +0200103
104
Armin Ronacher42979eb2009-07-26 11:08:50 +0200105def test_working():
Armin Ronacher44fb2e12007-04-29 09:45:00 +0200106 tmpl = env.get_template('working')
Armin Ronachere25f24d2008-05-19 11:20:41 +0200107
108
Armin Ronacher42979eb2009-07-26 11:08:50 +0200109def test_reuse_blocks():
Armin Ronachere25f24d2008-05-19 11:20:41 +0200110 tmpl = env.from_string('{{ self.foo() }}|{% block foo %}42{% endblock %}|{{ self.foo() }}')
111 assert tmpl.render() == '42|42|42'
Armin Ronacher6df604e2008-05-23 22:18:38 +0200112
113
114def test_preserve_blocks():
115 env = Environment(loader=DictLoader({
116 'a': '{% if false %}{% block x %}A{% endblock %}{% endif %}{{ self.x() }}',
117 'b': '{% extends "a" %}{% block x %}B{{ super() }}{% endblock %}'
118 }))
119 tmpl = env.get_template('b')
120 assert tmpl.render() == 'BA'
Armin Ronacherbe1dca12008-05-23 23:43:45 +0200121
122
123def test_dynamic_inheritance():
124 env = Environment(loader=DictLoader({
125 'master1': 'MASTER1{% block x %}{% endblock %}',
126 'master2': 'MASTER2{% block x %}{% endblock %}',
127 'child': '{% extends master %}{% block x %}CHILD{% endblock %}'
128 }))
129 tmpl = env.get_template('child')
130 for m in range(1, 3):
131 assert tmpl.render(master='master%d' % m) == 'MASTER%dCHILD' % m
132
133
134def test_multi_inheritance():
135 env = Environment(loader=DictLoader({
136 'master1': 'MASTER1{% block x %}{% endblock %}',
137 'master2': 'MASTER2{% block x %}{% endblock %}',
138 'child': '''{% if master %}{% extends master %}{% else %}{% extends
139 'master1' %}{% endif %}{% block x %}CHILD{% endblock %}'''
140 }))
141 tmpl = env.get_template('child')
142 assert tmpl.render(master='master2') == 'MASTER2CHILD'
143 assert tmpl.render(master='master1') == 'MASTER1CHILD'
144 assert tmpl.render() == 'MASTER1CHILD'
Armin Ronachere308bf22008-10-30 19:18:45 +0100145
146
147def test_fixed_macro_scoping_bug():
148 assert Environment(loader=DictLoader({
149 'test.html': '''\
150 {% extends 'details.html' %}
151
152 {% macro my_macro() %}
153 my_macro
154 {% endmacro %}
155
156 {% block inner_box %}
157 {{ my_macro() }}
158 {% endblock %}
159 ''',
160 'details.html': '''\
161 {% extends 'standard.html' %}
162
163 {% macro my_macro() %}
164 my_macro
165 {% endmacro %}
166
167 {% block content %}
168 {% block outer_box %}
169 outer_box
170 {% block inner_box %}
171 inner_box
172 {% endblock %}
173 {% endblock %}
174 {% endblock %}
175 ''',
176 'standard.html': '''
177 {% block content %} {% endblock %}
178 '''
179 })).get_template("test.html").render().split() == [u'outer_box', u'my_macro']
Armin Ronacher74a0cd92009-02-19 15:56:53 +0100180
181
182def test_scoped_block():
183 env = Environment(loader=DictLoader({
184 'master.html': '{% for item in seq %}[{% block item scoped %}'
185 '{% endblock %}]{% endfor %}'
186 }))
187 t = env.from_string('{% extends "master.html" %}{% block item %}{{ item }}{% endblock %}')
188 assert t.render(seq=range(5)) == '[0][1][2][3][4]'
Armin Ronacher3f1d8f12009-02-19 16:11:11 +0100189
190
191def test_super_in_scoped_block():
192 env = Environment(loader=DictLoader({
193 'master.html': '{% for item in seq %}[{% block item scoped %}'
194 '{{ item }}{% endblock %}]{% endfor %}'
195 }))
196 t = env.from_string('{% extends "master.html" %}{% block item %}{{ super() }}|{{ item * 2 }}{% endblock %}')
197 assert t.render(seq=range(5)) == '[0|0][1|2][2|4][3|6][4|8]'