~jonas-drange/ubuntu-start-page/1252899-mobile-friendly

« back to all changes in this revision

Viewing changes to src/Mako-0.1.9/test/template.py

  • Committer: Matthew Nuzum
  • Date: 2008-04-18 01:58:53 UTC
  • Revision ID: matthew.nuzum@canonical.com-20080418015853-2b8rf979z2c2exxl
adding files

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
 
 
3
from mako.template import Template
 
4
from mako.lookup import TemplateLookup
 
5
from mako.ext.preprocessors import convert_comments
 
6
from mako import exceptions
 
7
import unittest, re, os
 
8
from util import flatten_result, result_lines
 
9
import codecs
 
10
 
 
11
if not os.access('./test_htdocs', os.F_OK):
 
12
    os.mkdir('./test_htdocs')
 
13
if not os.access('./test_htdocs/subdir', os.F_OK):
 
14
    os.mkdir('./test_htdocs/subdir')
 
15
file('./test_htdocs/unicode.html', 'w').write("""## -*- coding: utf-8 -*-
 
16
Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »""")
 
17
file('./test_htdocs/unicode_syntax_error.html', 'w').write("""## -*- coding: utf-8 -*-
 
18
<% print 'Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! » %>""")
 
19
file('./test_htdocs/unicode_runtime_error.html', 'w').write("""## -*- coding: utf-8 -*-
 
20
<% print 'Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »' + int(5/0) %>""")
 
21
 
 
22
file('./test_htdocs/bommagic.html', 'w').write(codecs.BOM_UTF8 + """## -*- coding: utf-8 -*-
 
23
Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »""")
 
24
file('./test_htdocs/badbom.html', 'w').write(codecs.BOM_UTF8 + """## -*- coding: ascii -*-
 
25
Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »""")
 
26
file('./test_htdocs/bom.html', 'w').write(codecs.BOM_UTF8 + """Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »""")
 
27
    
 
28
class EncodingTest(unittest.TestCase):
 
29
    def test_unicode(self):
 
30
        template = Template(u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »""")
 
31
        assert template.render_unicode() == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
32
        
 
33
    def test_unicode_arg(self):
 
34
        val = u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
35
        template = Template("${val}")
 
36
        assert template.render_unicode(val=val) == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
37
 
 
38
    def test_unicode_file(self):
 
39
        template = Template(filename='./test_htdocs/unicode.html', module_directory='./test_htdocs')
 
40
        assert template.render_unicode() == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
41
 
 
42
    def test_unicode_bom(self):
 
43
        template = Template(filename='./test_htdocs/bom.html', module_directory='./test_htdocs')
 
44
        assert template.render_unicode() == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
45
 
 
46
        template = Template(filename='./test_htdocs/bommagic.html', module_directory='./test_htdocs')
 
47
        assert template.render_unicode() == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
48
 
 
49
        try:
 
50
            template = Template(filename='./test_htdocs/badbom.html', module_directory='./test_htdocs')
 
51
            assert False
 
52
        except exceptions.CompileException:
 
53
            assert True
 
54
 
 
55
    def test_unicode_memory(self):
 
56
        val = u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
57
        val = "## coding: utf-8\n" + val.encode('utf-8')
 
58
        template = Template(val)
 
59
        #print template.code
 
60
        assert template.render_unicode() == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
61
    
 
62
    def test_unicode_text(self):
 
63
        val = u"""<%text>Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »</%text>"""
 
64
        val = "## -*- coding: utf-8 -*-\n" + val.encode('utf-8')
 
65
        template = Template(val)
 
66
        #print template.code
 
67
        assert template.render_unicode() == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
68
 
 
69
    def test_unicode_text_ccall(self):
 
70
        val = u"""
 
71
        <%def name="foo()">
 
72
            ${capture(caller.body)}
 
73
        </%def>
 
74
        <%call expr="foo()">
 
75
        <%text>Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »</%text>
 
76
        </%call>"""
 
77
        val = "## -*- coding: utf-8 -*-\n" + val.encode('utf-8')
 
78
        template = Template(val)
 
79
        #print template.code
 
80
        assert flatten_result(template.render_unicode()) == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
81
        
 
82
    def test_unicode_literal_in_expr(self):
 
83
        template = Template(u"""## -*- coding: utf-8 -*-
 
84
        ${u"Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"}
 
85
        """.encode('utf-8'))
 
86
        assert template.render_unicode().strip() == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
87
 
 
88
    def test_unicode_literal_in_code(self):
 
89
        template = Template(u"""## -*- coding: utf-8 -*-
 
90
        <%
 
91
            context.write(u"Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »")
 
92
        %>
 
93
        """.encode('utf-8'))
 
94
        assert template.render_unicode().strip() == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
95
 
 
96
    def test_unicode_literal_in_controlline(self):
 
97
        template = Template(u"""## -*- coding: utf-8 -*-
 
98
        <%
 
99
            x = u"drôle de petit voix m’a réveillé."
 
100
        %>
 
101
        % if x==u"drôle de petit voix m’a réveillé.":
 
102
            hi, ${x}
 
103
        % endif
 
104
        """.encode('utf-8'))
 
105
        assert template.render_unicode().strip() == u"""hi, drôle de petit voix m’a réveillé."""
 
106
    
 
107
    def test_unicode_literal_in_def(self):
 
108
        template = Template(u"""## -*- coding: utf-8 -*-
 
109
        <%def name="bello(foo, bar)">
 
110
        Foo: ${ foo }
 
111
        Bar: ${ bar }
 
112
        </%def>
 
113
        <%call expr="bello(foo=u'árvíztűrő tükörfúrógép', bar=u'ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP')">
 
114
        </%call>""".encode('utf-8'))
 
115
        assert flatten_result(template.render_unicode()) == u"""Foo: árvíztűrő tükörfúrógép Bar: ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP"""
 
116
        
 
117
        template = Template(u"""## -*- coding: utf-8 -*-
 
118
        <%def name="hello(foo=u'árvíztűrő tükörfúrógép', bar=u'ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP')">
 
119
        Foo: ${ foo }
 
120
        Bar: ${ bar }
 
121
        </%def>
 
122
        ${ hello() }""".encode('utf-8'))
 
123
        assert flatten_result(template.render_unicode()) == u"""Foo: árvíztűrő tükörfúrógép Bar: ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP"""
 
124
        
 
125
    def test_input_encoding(self):
 
126
        """test the 'input_encoding' flag on Template, and that unicode objects arent double-decoded"""
 
127
        s2 = u"hello ${f(u'śląsk')}"
 
128
        res = Template(s2, input_encoding='utf-8').render_unicode(f=lambda x:x)
 
129
        assert res == u"hello śląsk"
 
130
 
 
131
        s2 = u"## -*- coding: utf-8 -*-\nhello ${f(u'śląsk')}"
 
132
        res = Template(s2).render_unicode(f=lambda x:x)
 
133
        assert res == u"hello śląsk"
 
134
 
 
135
    def test_raw_strings(self):
 
136
        """test that raw strings go straight thru with default_filters turned off"""
 
137
        g = 'śląsk'
 
138
        s = u"## -*- coding: utf-8 -*-\nhello ${x}"
 
139
        t = Template(s, default_filters=[])
 
140
        y = t.render(x=g)
 
141
        assert y == "hello śląsk"
 
142
 
 
143
        # now, the way you *should* be doing it....
 
144
        q = g.decode('utf-8')
 
145
        y = t.render_unicode(x=q)
 
146
        assert y == u"hello śląsk"
 
147
        
 
148
    def test_encoding(self):
 
149
        val = u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »"""
 
150
        template = Template(val, output_encoding='utf-8')
 
151
        assert template.render() == val.encode('utf-8')
 
152
 
 
153
    def test_encoding_errors(self):
 
154
        val = u"""KGB (transliteration of "КГБ") is the Russian-language abbreviation for Committee for State Security, (Russian: Комит́ет Госуд́арственной Безоп́асности (help·info); Komitet Gosudarstvennoy Bezopasnosti)"""
 
155
        template = Template(val, output_encoding='iso-8859-1', encoding_errors='replace')
 
156
        assert template.render() == val.encode('iso-8859-1', 'replace')
 
157
    
 
158
    def test_read_unicode(self):
 
159
        lookup = TemplateLookup(directories=['./test_htdocs'], filesystem_checks=True, output_encoding='utf-8')
 
160
        template = lookup.get_template('/read_unicode.html')
 
161
        data = template.render(path=os.path.join('./test_htdocs', 'internationalization.html'))
 
162
        
 
163
 
 
164
class PageArgsTest(unittest.TestCase):
 
165
    def test_basic(self):
 
166
        template = Template("""
 
167
            <%page args="x, y, z=7"/>
 
168
            
 
169
            this is page, ${x}, ${y}, ${z}
 
170
""")
 
171
 
 
172
        assert flatten_result(template.render(x=5, y=10)) == "this is page, 5, 10, 7"
 
173
        assert flatten_result(template.render(x=5, y=10, z=32)) == "this is page, 5, 10, 32"
 
174
        try:
 
175
            template.render(y=10)
 
176
            assert False
 
177
        except TypeError, e:
 
178
            assert True
 
179
 
 
180
    def test_with_context(self):
 
181
        template = Template("""
 
182
            <%page args="x, y, z=7"/>
 
183
 
 
184
            this is page, ${x}, ${y}, ${z}, ${w}
 
185
""")
 
186
        #print template.code
 
187
        assert flatten_result(template.render(x=5, y=10, w=17)) == "this is page, 5, 10, 7, 17"
 
188
 
 
189
    def test_overrides_builtins(self):
 
190
        template = Template("""
 
191
            <%page args="id"/>
 
192
            
 
193
            this is page, id is ${id}
 
194
        """)
 
195
        
 
196
        assert flatten_result(template.render(id="im the id")) == "this is page, id is im the id"
 
197
        
 
198
class IncludeTest(unittest.TestCase):
 
199
    def test_basic(self):
 
200
        lookup = TemplateLookup()
 
201
        lookup.put_string("a", """
 
202
            this is a
 
203
            <%include file="b" args="a=3,b=4,c=5"/>
 
204
        """)
 
205
        lookup.put_string("b", """
 
206
            <%page args="a,b,c"/>
 
207
            this is b.  ${a}, ${b}, ${c}
 
208
        """)
 
209
        assert flatten_result(lookup.get_template("a").render()) == "this is a this is b. 3, 4, 5"
 
210
 
 
211
    def test_localargs(self):
 
212
        lookup = TemplateLookup()
 
213
        lookup.put_string("a", """
 
214
            this is a
 
215
            <%include file="b" args="a=a,b=b,c=5"/>
 
216
        """)
 
217
        lookup.put_string("b", """
 
218
            <%page args="a,b,c"/>
 
219
            this is b.  ${a}, ${b}, ${c}
 
220
        """)
 
221
        assert flatten_result(lookup.get_template("a").render(a=7,b=8)) == "this is a this is b. 7, 8, 5"
 
222
    
 
223
    def test_viakwargs(self):    
 
224
        lookup = TemplateLookup()
 
225
        lookup.put_string("a", """
 
226
            this is a
 
227
            <%include file="b" args="c=5, **context.kwargs"/>
 
228
        """)
 
229
        lookup.put_string("b", """
 
230
            <%page args="a,b,c"/>
 
231
            this is b.  ${a}, ${b}, ${c}
 
232
        """)
 
233
        #print lookup.get_template("a").code
 
234
        assert flatten_result(lookup.get_template("a").render(a=7,b=8)) == "this is a this is b. 7, 8, 5"
 
235
 
 
236
    def test_include_withargs(self):
 
237
        lookup = TemplateLookup()
 
238
        lookup.put_string("a", """
 
239
            this is a
 
240
            <%include file="${i}" args="c=5, **context.kwargs"/>
 
241
        """)
 
242
        lookup.put_string("b", """
 
243
            <%page args="a,b,c"/>
 
244
            this is b.  ${a}, ${b}, ${c}
 
245
        """)
 
246
        assert flatten_result(lookup.get_template("a").render(a=7,b=8,i='b')) == "this is a this is b. 7, 8, 5"
 
247
 
 
248
class ControlTest(unittest.TestCase):
 
249
    def test_control(self):
 
250
        t = Template("""
 
251
    ## this is a template.
 
252
    % for x in y:
 
253
    %   if x.has_key('test'):
 
254
        yes x has test
 
255
    %   else:
 
256
        no x does not have test
 
257
    %endif
 
258
    %endfor
 
259
""")
 
260
        assert result_lines(t.render(y=[{'test':'one'}, {'foo':'bar'}, {'foo':'bar', 'test':'two'}])) == [
 
261
            "yes x has test",
 
262
            "no x does not have test",
 
263
            "yes x has test"
 
264
        ]
 
265
 
 
266
    def test_multiline_control(self):
 
267
        t = Template("""
 
268
    % for x in \\
 
269
        [y for y in [1,2,3]]:
 
270
        ${x}
 
271
    % endfor
 
272
""")
 
273
        #print t.code
 
274
        assert flatten_result(t.render()) == "1 2 3"
 
275
        
 
276
class GlobalsTest(unittest.TestCase):
 
277
    def test_globals(self):
 
278
        t= Template("""
 
279
            <%!
 
280
                y = "hi"
 
281
            %>
 
282
        y is ${y}
 
283
""")
 
284
        assert t.render().strip() == "y is hi"
 
285
 
 
286
class RichTracebackTest(unittest.TestCase):
 
287
    def do_test_traceback(self, utf8, memory, syntax):
 
288
        if memory:
 
289
            if syntax:
 
290
                source = u'## coding: utf-8\n<% print "m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! » %>'
 
291
            else:
 
292
                source = u'## coding: utf-8\n<% print u"m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »" + str(5/0) %>'
 
293
            if utf8:
 
294
                source = source.encode('utf-8')
 
295
            else:
 
296
                source = source
 
297
            templateargs = {'text':source}
 
298
        else:
 
299
            if syntax:
 
300
                filename = './test_htdocs/unicode_syntax_error.html'
 
301
            else:
 
302
                filename = './test_htdocs/unicode_runtime_error.html'
 
303
            source = file(filename).read()
 
304
            if not utf8:
 
305
                source = source.decode('utf-8')
 
306
            templateargs = {'filename':filename}
 
307
        try:
 
308
            template = Template(**templateargs)
 
309
            if not syntax:
 
310
                template.render_unicode()
 
311
            assert False
 
312
        except Exception, e:
 
313
            tback = exceptions.RichTraceback()
 
314
            if utf8:
 
315
                assert tback.source == source.decode('utf-8')
 
316
            else:
 
317
                assert tback.source == source
 
318
 
 
319
for utf8 in (True, False):
 
320
    for memory in (True, False):
 
321
        for syntax in (True, False):
 
322
            def do_test(self):
 
323
                self.do_test_traceback(utf8, memory, syntax)
 
324
            name = 'test_%s_%s_%s' % (utf8 and 'utf8' or 'unicode', memory and 'memory' or 'file', syntax and 'syntax' or 'runtime')
 
325
            try:
 
326
               do_test.__name__ = name
 
327
            except:
 
328
               pass
 
329
            setattr(RichTracebackTest, name, do_test)
 
330
 
 
331
        
 
332
class ModuleDirTest(unittest.TestCase):
 
333
    def test_basic(self):
 
334
        file('./test_htdocs/modtest.html', 'w').write("""this is a test""")
 
335
        file('./test_htdocs/subdir/modtest.html', 'w').write("""this is a test""")
 
336
        t = Template(filename='./test_htdocs/modtest.html', module_directory='./test_htdocs/modules')
 
337
        t2 = Template(filename='./test_htdocs/subdir/modtest.html', module_directory='./test_htdocs/modules')
 
338
        assert t.module.__file__ == os.path.abspath('./test_htdocs/modules/test_htdocs/modtest.html.py')
 
339
        assert t2.module.__file__ == os.path.abspath('./test_htdocs/modules/test_htdocs/subdir/modtest.html.py')
 
340
    def test_callable(self):
 
341
        file('./test_htdocs/modtest.html', 'w').write("""this is a test""")
 
342
        file('./test_htdocs/subdir/modtest.html', 'w').write("""this is a test""")
 
343
        def get_modname(filename, uri):
 
344
            return os.path.dirname(filename) + "/foo/" + os.path.basename(filename) + ".py"
 
345
        lookup = TemplateLookup('./test_htdocs', modulename_callable=get_modname)
 
346
        t = lookup.get_template('/modtest.html')
 
347
        t2 = lookup.get_template('/subdir/modtest.html')
 
348
        assert t.module.__file__ == 'test_htdocs/foo/modtest.html.py'
 
349
        assert t2.module.__file__ == 'test_htdocs/subdir/foo/modtest.html.py'
 
350
 
 
351
class PreprocessTest(unittest.TestCase):
 
352
    def test_old_comments(self):
 
353
        t = Template("""
 
354
        im a template
 
355
# old style comment
 
356
    # more old style comment
 
357
    
 
358
    ## new style comment
 
359
    - # not a comment
 
360
    - ## not a comment
 
361
""", preprocessor=convert_comments)
 
362
 
 
363
        assert flatten_result(t.render()) == "im a template - # not a comment - ## not a comment"
 
364
            
 
365
if __name__ == '__main__':
 
366
    unittest.main()