1from mako.template import Template 2from mako.testing.helpers import flatten_result 3 4 5class DecoratorTest: 6 def test_toplevel(self): 7 template = Template( 8 """ 9 <%! 10 def bar(fn): 11 def decorate(context, *args, **kw): 12 return "BAR" + runtime.capture""" 13 """(context, fn, *args, **kw) + "BAR" 14 return decorate 15 %> 16 17 <%def name="foo(y, x)" decorator="bar"> 18 this is foo ${y} ${x} 19 </%def> 20 21 ${foo(1, x=5)} 22 """ 23 ) 24 25 assert flatten_result(template.render()) == "BAR this is foo 1 5 BAR" 26 27 def test_toplevel_contextual(self): 28 template = Template( 29 """ 30 <%! 31 def bar(fn): 32 def decorate(context): 33 context.write("BAR") 34 fn() 35 context.write("BAR") 36 return '' 37 return decorate 38 %> 39 40 <%def name="foo()" decorator="bar"> 41 this is foo 42 </%def> 43 44 ${foo()} 45 """ 46 ) 47 48 assert flatten_result(template.render()) == "BAR this is foo BAR" 49 50 assert ( 51 flatten_result(template.get_def("foo").render()) 52 == "BAR this is foo BAR" 53 ) 54 55 def test_nested(self): 56 template = Template( 57 """ 58 <%! 59 def bat(fn): 60 def decorate(context): 61 return "BAT" + runtime.capture(context, fn) + "BAT" 62 return decorate 63 %> 64 65 <%def name="foo()"> 66 67 <%def name="bar()" decorator="bat"> 68 this is bar 69 </%def> 70 ${bar()} 71 </%def> 72 73 ${foo()} 74 """ 75 ) 76 77 assert flatten_result(template.render()) == "BAT this is bar BAT" 78 79 def test_toplevel_decorated_name(self): 80 template = Template( 81 """ 82 <%! 83 def bar(fn): 84 def decorate(context, *args, **kw): 85 return "function " + fn.__name__ + """ 86 """" " + runtime.capture(context, fn, *args, **kw) 87 return decorate 88 %> 89 90 <%def name="foo(y, x)" decorator="bar"> 91 this is foo ${y} ${x} 92 </%def> 93 94 ${foo(1, x=5)} 95 """ 96 ) 97 98 assert ( 99 flatten_result(template.render()) == "function foo this is foo 1 5" 100 ) 101 102 def test_nested_decorated_name(self): 103 template = Template( 104 """ 105 <%! 106 def bat(fn): 107 def decorate(context): 108 return "function " + fn.__name__ + " " + """ 109 """runtime.capture(context, fn) 110 return decorate 111 %> 112 113 <%def name="foo()"> 114 115 <%def name="bar()" decorator="bat"> 116 this is bar 117 </%def> 118 ${bar()} 119 </%def> 120 121 ${foo()} 122 """ 123 ) 124 125 assert flatten_result(template.render()) == "function bar this is bar" 126