blob: da3de15279b4346b5e1f89bbc9068b0383a53ad4 [file] [log] [blame]
from mako.template import Template
from mako.lookup import TemplateLookup
from mako import exceptions
from test import TemplateTest, assert_raises, assert_raises_message
from test.util import flatten_result, result_lines
class BlockTest(TemplateTest):
def test_anonymous_block_namespace_raises(self):
assert_raises_message(
exceptions.CompileException,
"Can't put anonymous blocks inside <%namespace>",
Template, """
<%namespace name="foo">
<%block>
block
</%block>
</%namespace>
"""
)
def test_anonymous_block_in_call(self):
template = Template("""
<%self:foo x="5">
<%block>
this is the block x
</%block>
</%self:foo>
<%def name="foo(x)">
foo:
${caller.body()}
</%def>
""")
self._do_test(
template,
["foo:", "this is the block x"],
filters=result_lines
)
def test_named_block_in_call(self):
assert_raises_message(
exceptions.CompileException,
"Named block 'y' not allowed inside of <%call> tag",
Template,"""
<%self:foo x="5">
<%block name="y">
this is the block
</%block>
</%self:foo>
<%def name="foo(x)">
foo:
${caller.body()}
${caller.y()}
</%def>
""")
def test_name_collision_blocks_toplevel(self):
assert_raises_message(
exceptions.CompileException,
"%def or %block named 'x' already exists in this template",
Template,
"""
<%block name="x">
block
</%block>
foob
<%block name="x">
block
</%block>
"""
)
def test_name_collision_blocks_nested_block(self):
assert_raises_message(
exceptions.CompileException,
"%def or %block named 'x' already exists in this template",
Template,
"""
<%block>
<%block name="x">
block
</%block>
foob
<%block name="x">
block
</%block>
</%block>
"""
)
def test_name_collision_blocks_nested_def(self):
assert_raises_message(
exceptions.CompileException,
"Named block 'x' not allowed inside of def 'foo'",
Template,
"""
<%def name="foo()">
<%block name="x">
block
</%block>
foob
<%block name="x">
block
</%block>
</%def>
"""
)
def test_name_collision_block_def_toplevel(self):
assert_raises_message(
exceptions.CompileException,
"%def or %block named 'x' already exists in this template",
Template,
"""
<%block name="x">
block
</%block>
foob
<%def name="x()">
block
</%def>
"""
)
def test_name_collision_def_block_toplevel(self):
assert_raises_message(
exceptions.CompileException,
"%def or %block named 'x' already exists in this template",
Template,
"""
<%def name="x()">
block
</%def>
foob
<%block name="x">
block
</%block>
"""
)
def test_named_block_renders(self):
template = Template("""
above
<%block name="header">
the header
</%block>
below
""")
self._do_test(template, ["above", "the header", "below"],
filters=result_lines)
def test_inherited_block_no_render(self):
l = TemplateLookup()
l.put_string("index",
"""
<%inherit file="base"/>
<%block name="header">
index header
</%block>
"""
)
l.put_string("base","""
above
<%block name="header">
the header
</%block>
${next.body()}
below
""")
self._do_test(l.get_template("index"),
["above", "index header", "below"],
filters=result_lines)
def test_no_named_in_def(self):
assert_raises_message(
exceptions.CompileException,
"Named block 'y' not allowed inside of def 'q'",
Template,
"""
<%def name="q()">
<%block name="y">
</%block>
</%def>
""")
def test_inherited_block_nested_both(self):
l = TemplateLookup()
l.put_string("index",
"""
<%inherit file="base"/>
<%block name="title">
index title
</%block>
<%block name="header">
index header
${parent.header()}
</%block>
"""
)
l.put_string("base","""
above
<%block name="header">
base header
<%block name="title">
the title
</%block>
</%block>
${next.body()}
below
""")
self._do_test(l.get_template("index"),
["above", "index header", "base header", "index title", "below"],
filters=result_lines)
def test_inherited_block_nested_inner_only(self):
l = TemplateLookup()
l.put_string("index",
"""
<%inherit file="base"/>
<%block name="title">
index title
</%block>
"""
)
l.put_string("base","""
above
<%block name="header">
base header
<%block name="title">
the title
</%block>
</%block>
${next.body()}
below
""")
self._do_test(l.get_template("index"),
["above", "base header", "index title", "below"],
filters=result_lines)
def test_noninherited_block_no_render(self):
l = TemplateLookup()
l.put_string("index",
"""
<%inherit file="base"/>
<%block name="some_thing">
some thing
</%block>
"""
)
l.put_string("base","""
above
<%block name="header">
the header
</%block>
${next.body()}
below
""")
self._do_test(l.get_template("index"),
["above", "the header", "some thing", "below"],
filters=result_lines)
def test_no_conflict_nested_one(self):
l = TemplateLookup()
l.put_string("index",
"""
<%inherit file="base"/>
<%block>
<%block name="header">
inner header
</%block>
</%block>
"""
)
l.put_string("base","""
above
<%block name="header">
the header
</%block>
${next.body()}
below
""")
self._do_test(l.get_template("index"),
["above", "inner header", "below"],
filters=result_lines)
def test_nested_dupe_names_raise(self):
assert_raises_message(
exceptions.CompileException,
"%def or %block named 'header' already exists in this template.",
Template,
"""
<%inherit file="base"/>
<%block name="header">
<%block name="header">
inner header
</%block>
</%block>
"""
)
def test_two_levels_one(self):
l = TemplateLookup()
l.put_string("index",
"""
<%inherit file="middle"/>
<%block name="header">
index header
</%block>
<%block>
index anon
</%block>
"""
)
l.put_string("middle", """
<%inherit file="base"/>
<%block>
middle anon
</%block>
${next.body()}
""")
l.put_string("base","""
above
<%block name="header">
the header
</%block>
${next.body()}
below
""")
self._do_test(l.get_template("index"),
["above", "index header", "middle anon",
"index anon", "below"],
filters=result_lines)
def test_filter(self):
template = Template("""
<%block filter="h">
<html>
</%block>
""")
self._do_test(template, ['&lt;html&gt;'],
filters=result_lines)
def test_anon_in_named(self):
template = Template("""
<%block name="x">
outer above
<%block>
inner
</%block>
outer below
</%block>
""")
self._test_block_in_block(template)
def test_named_in_anon(self):
template = Template("""
<%block>
outer above
<%block name="x">
inner
</%block>
outer below
</%block>
""")
self._test_block_in_block(template)
def test_anon_in_anon(self):
template = Template("""
<%block>
outer above
<%block>
inner
</%block>
outer below
</%block>
""")
self._test_block_in_block(template)
def test_named_in_named(self):
template = Template("""
<%block name="x">
outer above
<%block name="y">
inner
</%block>
outer below
</%block>
""")
self._test_block_in_block(template)
def _test_block_in_block(self, template):
self._do_test(template,
["outer above", "inner", "outer below"],
filters=result_lines
)
def test_iteration(self):
t = Template("""
% for i in (1, 2, 3):
<%block>${i}</%block>
% endfor
""")
self._do_test(t,
["1", "2", "3"],
filters=result_lines
)
def test_conditional(self):
t = Template("""
% if True:
<%block>true</%block>
% endif
% if False:
<%block>false</%block>
% endif
""")
self._do_test(t,
["true"],
filters=result_lines
)
def test_block_overridden_by_def(self):
l = TemplateLookup()
l.put_string("index",
"""
<%inherit file="base"/>
<%def name="header()">
inner header
</%def>
"""
)
l.put_string("base","""
above
<%block name="header">
the header
</%block>
${next.body()}
below
""")
self._do_test(l.get_template("index"),
["above", "inner header", "below"],
filters=result_lines)
def test_def_overridden_by_block(self):
l = TemplateLookup()
l.put_string("index",
"""
<%inherit file="base"/>
<%block name="header">
inner header
</%block>
"""
)
l.put_string("base","""
above
${self.header()}
<%def name="header()">
the header
</%def>
${next.body()}
below
""")
self._do_test(l.get_template("index"),
["above", "inner header", "below"],
filters=result_lines)
def test_block_args(self):
l = TemplateLookup()
l.put_string("caller", """
<%include file="callee" args="val1='3', val2='4'"/>
""")
l.put_string("callee", """
<%page args="val1, val2"/>
<%block name="foob" args="val1, val2">
foob, ${val1}, ${val2}
</%block>
""")
self._do_test(
l.get_template("caller"),
['foob, 3, 4'],
filters=result_lines
)
def test_block_variables_contextual(self):
t = Template("""
<%block name="foob" >
foob, ${val1}, ${val2}
</%block>
""")
self._do_test(
t,
['foob, 3, 4'],
template_args={'val1':3, 'val2':4},
filters=result_lines
)
def test_block_args_contextual(self):
t = Template("""
<%page args="val1"/>
<%block name="foob" args="val1">
foob, ${val1}, ${val2}
</%block>
""")
self._do_test(
t,
['foob, 3, 4'],
template_args={'val1':3, 'val2':4},
filters=result_lines
)
def test_block_pageargs_contextual(self):
t = Template("""
<%block name="foob">
foob, ${pageargs['val1']}, ${pageargs['val2']}
</%block>
""")
self._do_test(
t,
['foob, 3, 4'],
template_args={'val1':3, 'val2':4},
filters=result_lines
)
def test_block_pageargs(self):
l = TemplateLookup()
l.put_string("caller", """
<%include file="callee" args="val1='3', val2='4'"/>
""")
l.put_string("callee", """
<%block name="foob">
foob, ${pageargs['val1']}, ${pageargs['val2']}
</%block>
""")
self._do_test(
l.get_template("caller"),
['foob, 3, 4'],
filters=result_lines
)