import unittest from mako.template import Template from test.util import flatten_result 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"