from mako import exceptions from mako.lookup import TemplateLookup from mako.template import Template from mako.testing.assertions import assert_raises_message from mako.testing.fixtures import TemplateTest from mako.testing.helpers import 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 """, ) def test_anonymous_block_in_call(self): template = Template( """ <%self:foo x="5"> <%block> this is the block x <%def name="foo(x)"> foo: ${caller.body()} """ ) 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 <%def name="foo(x)"> foo: ${caller.body()} ${caller.y()} """, ) 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 foob <%block name="x"> 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 foob <%block name="x"> 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 foob <%block name="x"> block """, ) 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 foob <%def name="x()"> block """, ) 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 foob <%block name="x"> block """, ) def test_named_block_renders(self): template = Template( """ above <%block name="header"> the header 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 """, ) l.put_string( "base", """ above <%block name="header"> the header ${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"> """, ) def test_inherited_block_nested_both(self): l = TemplateLookup() l.put_string( "index", """ <%inherit file="base"/> <%block name="title"> index title <%block name="header"> index header ${parent.header()} """, ) l.put_string( "base", """ above <%block name="header"> base header <%block name="title"> the title ${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 """, ) l.put_string( "base", """ above <%block name="header"> base header <%block name="title"> the title ${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 """, ) l.put_string( "base", """ above <%block name="header"> the header ${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 """, ) l.put_string( "base", """ above <%block name="header"> the header ${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 """, ) def test_two_levels_one(self): l = TemplateLookup() l.put_string( "index", """ <%inherit file="middle"/> <%block name="header"> index header <%block> index anon """, ) l.put_string( "middle", """ <%inherit file="base"/> <%block> middle anon ${next.body()} """, ) l.put_string( "base", """ above <%block name="header"> the header ${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"> """ ) self._do_test(template, ["<html>"], filters=result_lines) def test_anon_in_named(self): template = Template( """ <%block name="x"> outer above <%block> inner outer below """ ) self._test_block_in_block(template) def test_named_in_anon(self): template = Template( """ <%block> outer above <%block name="x"> inner outer below """ ) self._test_block_in_block(template) def test_anon_in_anon(self): template = Template( """ <%block> outer above <%block> inner outer below """ ) self._test_block_in_block(template) def test_named_in_named(self): template = Template( """ <%block name="x"> outer above <%block name="y"> inner outer below """ ) 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} % endfor """ ) self._do_test(t, ["1", "2", "3"], filters=result_lines) def test_conditional(self): t = Template( """ % if True: <%block>true % endif % if False: <%block>false % 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 """, ) l.put_string( "base", """ above <%block name="header"> the header ${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 """, ) l.put_string( "base", """ above ${self.header()} <%def name="header()"> the header ${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} """, ) 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} """ ) 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} """ ) 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']} """ ) 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']} """, ) self._do_test( l.get_template("caller"), ["foob, 3, 4"], filters=result_lines )