blob: 6a45f5926f24f7747ca0bda57251a056c1f2035b [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"""
Christoph Hacke9e43bb2008-04-13 23:35:48 +02009from jinja2 import Environment, DictLoader
10from jinja2.exceptions import TemplateSyntaxError
Armin Ronacherc1e30402007-03-18 22:41:09 +010011
12LAYOUTTEMPLATE = '''\
13|{% block block1 %}block 1 from layout{% endblock %}
14|{% block block2 %}block 2 from layout{% endblock %}
15|{% block block3 %}
16{% block block4 %}nested block 4 from layout{% endblock %}
17{% endblock %}|'''
18
19LEVEL1TEMPLATE = '''\
20{% extends "layout" %}
21{% block block1 %}block 1 from level1{% endblock %}'''
22
23LEVEL2TEMPLATE = '''\
24{% extends "level1" %}
25{% block block2 %}{% block block5 %}nested block 5 from level2{%
26endblock %}{% endblock %}'''
27
28LEVEL3TEMPLATE = '''\
29{% extends "level2" %}
30{% block block5 %}block 5 from level3{% endblock %}
31{% block block4 %}block 4 from level3{% endblock %}
32'''
33
34LEVEL4TEMPLATE = '''\
35{% extends "level3" %}
36{% block block3 %}block 3 from level4{% endblock %}
37'''
38
Armin Ronacher44fb2e12007-04-29 09:45:00 +020039WORKINGTEMPLATE = '''\
40{% extends "layout" %}
41{% block block1 %}
42 {% if false %}
43 {% block block2 %}
44 this should workd
45 {% endblock %}
46 {% endif %}
47{% endblock %}
48'''
49
Armin Ronacherc1e30402007-03-18 22:41:09 +010050def test_layout(env):
51 tmpl = env.get_template('layout')
52 assert tmpl.render() == ('|block 1 from layout|block 2 from '
53 'layout|nested block 4 from layout|')
54
55
56def test_level1(env):
57 tmpl = env.get_template('level1')
58 assert tmpl.render() == ('|block 1 from level1|block 2 from '
59 'layout|nested block 4 from layout|')
60
61
62def test_level2(env):
63 tmpl = env.get_template('level2')
64 assert tmpl.render() == ('|block 1 from level1|nested block 5 from '
65 'level2|nested block 4 from layout|')
66
67
68def test_level3(env):
69 tmpl = env.get_template('level3')
70 assert tmpl.render() == ('|block 1 from level1|block 5 from level3|'
71 'block 4 from level3|')
72
73
74def test_level4(env):
75 tmpl = env.get_template('level4')
76 assert tmpl.render() == ('|block 1 from level1|block 5 from '
77 'level3|block 3 from level4|')
Armin Ronacher21580912007-04-17 17:13:10 +020078
79
80def test_super():
81 env = Environment(loader=DictLoader({
82 'a': '{% block intro %}INTRO{% endblock %}|'
83 'BEFORE|{% block data %}INNER{% endblock %}|AFTER',
84 'b': '{% extends "a" %}{% block data %}({{ '
85 'super() }}){% endblock %}',
86 'c': '{% extends "b" %}{% block intro %}--{{ '
87 'super() }}--{% endblock %}\n{% block data '
88 '%}[{{ super() }}]{% endblock %}'
89 }))
90 tmpl = env.get_template('c')
91 assert tmpl.render() == '--INTRO--|BEFORE|[(INNER)]|AFTER'
Armin Ronacher44fb2e12007-04-29 09:45:00 +020092
93
Armin Ronacher44fb2e12007-04-29 09:45:00 +020094def test_working(env):
95 tmpl = env.get_template('working')
Armin Ronachere25f24d2008-05-19 11:20:41 +020096
97
98def test_reuse_blocks(env):
99 tmpl = env.from_string('{{ self.foo() }}|{% block foo %}42{% endblock %}|{{ self.foo() }}')
100 assert tmpl.render() == '42|42|42'
Armin Ronacher6df604e2008-05-23 22:18:38 +0200101
102
103def test_preserve_blocks():
104 env = Environment(loader=DictLoader({
105 'a': '{% if false %}{% block x %}A{% endblock %}{% endif %}{{ self.x() }}',
106 'b': '{% extends "a" %}{% block x %}B{{ super() }}{% endblock %}'
107 }))
108 tmpl = env.get_template('b')
109 assert tmpl.render() == 'BA'
Armin Ronacherbe1dca12008-05-23 23:43:45 +0200110
111
112def test_dynamic_inheritance():
113 env = Environment(loader=DictLoader({
114 'master1': 'MASTER1{% block x %}{% endblock %}',
115 'master2': 'MASTER2{% block x %}{% endblock %}',
116 'child': '{% extends master %}{% block x %}CHILD{% endblock %}'
117 }))
118 tmpl = env.get_template('child')
119 for m in range(1, 3):
120 assert tmpl.render(master='master%d' % m) == 'MASTER%dCHILD' % m
121
122
123def test_multi_inheritance():
124 env = Environment(loader=DictLoader({
125 'master1': 'MASTER1{% block x %}{% endblock %}',
126 'master2': 'MASTER2{% block x %}{% endblock %}',
127 'child': '''{% if master %}{% extends master %}{% else %}{% extends
128 'master1' %}{% endif %}{% block x %}CHILD{% endblock %}'''
129 }))
130 tmpl = env.get_template('child')
131 assert tmpl.render(master='master2') == 'MASTER2CHILD'
132 assert tmpl.render(master='master1') == 'MASTER1CHILD'
133 assert tmpl.render() == 'MASTER1CHILD'
Armin Ronachere308bf22008-10-30 19:18:45 +0100134
135
136def test_fixed_macro_scoping_bug():
137 assert Environment(loader=DictLoader({
138 'test.html': '''\
139 {% extends 'details.html' %}
140
141 {% macro my_macro() %}
142 my_macro
143 {% endmacro %}
144
145 {% block inner_box %}
146 {{ my_macro() }}
147 {% endblock %}
148 ''',
149 'details.html': '''\
150 {% extends 'standard.html' %}
151
152 {% macro my_macro() %}
153 my_macro
154 {% endmacro %}
155
156 {% block content %}
157 {% block outer_box %}
158 outer_box
159 {% block inner_box %}
160 inner_box
161 {% endblock %}
162 {% endblock %}
163 {% endblock %}
164 ''',
165 'standard.html': '''
166 {% block content %} {% endblock %}
167 '''
168 })).get_template("test.html").render().split() == [u'outer_box', u'my_macro']
Armin Ronacher74a0cd92009-02-19 15:56:53 +0100169
170
171def test_scoped_block():
172 env = Environment(loader=DictLoader({
173 'master.html': '{% for item in seq %}[{% block item scoped %}'
174 '{% endblock %}]{% endfor %}'
175 }))
176 t = env.from_string('{% extends "master.html" %}{% block item %}{{ item }}{% endblock %}')
177 assert t.render(seq=range(5)) == '[0][1][2][3][4]'