• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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