1 # -*- coding: utf-8 -*-
3 unit test for the inheritance
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 :copyright: 2007 by Armin Ronacher.
7 :license: BSD, see LICENSE for more details.
9 from jinja2 import Environment, DictLoader
10 from jinja2.exceptions import TemplateSyntaxError
13 |{% block block1 %}block 1 from layout{% endblock %}
14 |{% block block2 %}block 2 from layout{% endblock %}
16 {% block block4 %}nested block 4 from layout{% endblock %}
20 {% extends "layout" %}
21 {% block block1 %}block 1 from level1{% endblock %}'''
24 {% extends "level1" %}
25 {% block block2 %}{% block block5 %}nested block 5 from level2{%
26 endblock %}{% endblock %}'''
29 {% extends "level2" %}
30 {% block block5 %}block 5 from level3{% endblock %}
31 {% block block4 %}block 4 from level3{% endblock %}
35 {% extends "level3" %}
36 {% block block3 %}block 3 from level4{% endblock %}
39 WORKINGTEMPLATE = '''\
40 {% extends "layout" %}
51 tmpl = env.get_template('layout')
52 assert tmpl.render() == ('|block 1 from layout|block 2 from '
53 'layout|nested block 4 from layout|')
57 tmpl = env.get_template('level1')
58 assert tmpl.render() == ('|block 1 from level1|block 2 from '
59 'layout|nested block 4 from layout|')
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|')
69 tmpl = env.get_template('level3')
70 assert tmpl.render() == ('|block 1 from level1|block 5 from level3|'
71 'block 4 from level3|')
75 tmpl = env.get_template('level4')
76 assert tmpl.render() == ('|block 1 from level1|block 5 from '
77 'level3|block 3 from level4|')
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 %}'
90 tmpl = env.get_template('c')
91 assert tmpl.render() == '--INTRO--|BEFORE|[(INNER)]|AFTER'
94 def test_working(env):
95 tmpl = env.get_template('working')
98 def test_reuse_blocks(env):
99 tmpl = env.from_string('{{ self.foo() }}|{% block foo %}42{% endblock %}|{{ self.foo() }}')
100 assert tmpl.render() == '42|42|42'
103 def 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 %}'
108 tmpl = env.get_template('b')
109 assert tmpl.render() == 'BA'
112 def 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 %}'
118 tmpl = env.get_template('child')
119 for m in range(1, 3):
120 assert tmpl.render(master='master%d' % m) == 'MASTER%dCHILD' % m
123 def 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 %}'''
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'