from mako.template import Template from mako import lookup import unittest from test.util import flatten_result, result_lines class DecoratorTest(unittest.TestCase): def test_toplevel(self): template = Template(""" <%! def bar(fn): def decorate(context, *args, **kw): return "BAR" + runtime.capture(context, fn, *args, **kw) + "BAR" return decorate %> <%def name="foo(y, x)" decorator="bar"> this is foo ${y} ${x} ${foo(1, x=5)} """) assert flatten_result(template.render()) == "BAR this is foo 1 5 BAR" def test_toplevel_contextual(self): template = Template(""" <%! def bar(fn): def decorate(context): context.write("BAR") fn() context.write("BAR") return '' return decorate %> <%def name="foo()" decorator="bar"> this is foo ${foo()} """) assert flatten_result(template.render()) == "BAR this is foo BAR" assert flatten_result(template.get_def('foo').render()) == "BAR this is foo BAR" def test_nested(self): template = Template(""" <%! def bat(fn): def decorate(context): return "BAT" + runtime.capture(context, fn) + "BAT" return decorate %> <%def name="foo()"> <%def name="bar()" decorator="bat"> this is bar ${bar()} ${foo()} """) assert flatten_result(template.render()) == "BAT this is bar BAT" def test_toplevel_decorated_name(self): template = Template(""" <%! def bar(fn): def decorate(context, *args, **kw): return "function " + fn.__name__ + " " + runtime.capture(context, fn, *args, **kw) return decorate %> <%def name="foo(y, x)" decorator="bar"> this is foo ${y} ${x} ${foo(1, x=5)} """) assert flatten_result(template.render()) == "function foo this is foo 1 5" def test_nested_decorated_name(self): template = Template(""" <%! def bat(fn): def decorate(context): return "function " + fn.__name__ + " " + runtime.capture(context, fn) return decorate %> <%def name="foo()"> <%def name="bar()" decorator="bat"> this is bar ${bar()} ${foo()} """) assert flatten_result(template.render()) == "function bar this is bar"