summaryrefslogtreecommitdiff
path: root/test/test_decorators.py
blob: 68ea903c6ebc18c7ae6c2c68d3bc691f346524c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from mako.template import Template
from mako.testing.helpers import flatten_result


class DecoratorTest:
    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}
            </%def>

            ${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
            </%def>

            ${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
                </%def>
                ${bar()}
            </%def>

            ${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}
            </%def>

            ${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
                </%def>
                ${bar()}
            </%def>

            ${foo()}
        """
        )

        assert flatten_result(template.render()) == "function bar this is bar"