~brad-marshall/charms/trusty/apache2-wsgi/fix-haproxy-relations

« back to all changes in this revision

Viewing changes to hooks/lib/jinja2/testsuite/api.py

  • Committer: Robin Winslow
  • Date: 2014-05-27 14:00:44 UTC
  • Revision ID: robin.winslow@canonical.com-20140527140044-8rpmb3wx4djzwa83
Add all files

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
"""
 
3
    jinja2.testsuite.api
 
4
    ~~~~~~~~~~~~~~~~~~~~
 
5
 
 
6
    Tests the public API and related stuff.
 
7
 
 
8
    :copyright: (c) 2010 by the Jinja Team.
 
9
    :license: BSD, see LICENSE for more details.
 
10
"""
 
11
import unittest
 
12
import os
 
13
import tempfile
 
14
import shutil
 
15
 
 
16
from jinja2.testsuite import JinjaTestCase
 
17
from jinja2._compat import next
 
18
 
 
19
from jinja2 import Environment, Undefined, DebugUndefined, \
 
20
     StrictUndefined, UndefinedError, meta, \
 
21
     is_undefined, Template, DictLoader
 
22
from jinja2.utils import Cycler
 
23
 
 
24
env = Environment()
 
25
 
 
26
 
 
27
class ExtendedAPITestCase(JinjaTestCase):
 
28
 
 
29
    def test_item_and_attribute(self):
 
30
        from jinja2.sandbox import SandboxedEnvironment
 
31
 
 
32
        for env in Environment(), SandboxedEnvironment():
 
33
            # the |list is necessary for python3
 
34
            tmpl = env.from_string('{{ foo.items()|list }}')
 
35
            assert tmpl.render(foo={'items': 42}) == "[('items', 42)]"
 
36
            tmpl = env.from_string('{{ foo|attr("items")()|list }}')
 
37
            assert tmpl.render(foo={'items': 42}) == "[('items', 42)]"
 
38
            tmpl = env.from_string('{{ foo["items"] }}')
 
39
            assert tmpl.render(foo={'items': 42}) == '42'
 
40
 
 
41
    def test_finalizer(self):
 
42
        def finalize_none_empty(value):
 
43
            if value is None:
 
44
                value = u''
 
45
            return value
 
46
        env = Environment(finalize=finalize_none_empty)
 
47
        tmpl = env.from_string('{% for item in seq %}|{{ item }}{% endfor %}')
 
48
        assert tmpl.render(seq=(None, 1, "foo")) == '||1|foo'
 
49
        tmpl = env.from_string('<{{ none }}>')
 
50
        assert tmpl.render() == '<>'
 
51
 
 
52
    def test_cycler(self):
 
53
        items = 1, 2, 3
 
54
        c = Cycler(*items)
 
55
        for item in items + items:
 
56
            assert c.current == item
 
57
            assert next(c) == item
 
58
        next(c)
 
59
        assert c.current == 2
 
60
        c.reset()
 
61
        assert c.current == 1
 
62
 
 
63
    def test_expressions(self):
 
64
        expr = env.compile_expression("foo")
 
65
        assert expr() is None
 
66
        assert expr(foo=42) == 42
 
67
        expr2 = env.compile_expression("foo", undefined_to_none=False)
 
68
        assert is_undefined(expr2())
 
69
 
 
70
        expr = env.compile_expression("42 + foo")
 
71
        assert expr(foo=42) == 84
 
72
 
 
73
    def test_template_passthrough(self):
 
74
        t = Template('Content')
 
75
        assert env.get_template(t) is t
 
76
        assert env.select_template([t]) is t
 
77
        assert env.get_or_select_template([t]) is t
 
78
        assert env.get_or_select_template(t) is t
 
79
 
 
80
    def test_autoescape_autoselect(self):
 
81
        def select_autoescape(name):
 
82
            if name is None or '.' not in name:
 
83
                return False
 
84
            return name.endswith('.html')
 
85
        env = Environment(autoescape=select_autoescape,
 
86
                          loader=DictLoader({
 
87
            'test.txt':     '{{ foo }}',
 
88
            'test.html':    '{{ foo }}'
 
89
        }))
 
90
        t = env.get_template('test.txt')
 
91
        assert t.render(foo='<foo>') == '<foo>'
 
92
        t = env.get_template('test.html')
 
93
        assert t.render(foo='<foo>') == '&lt;foo&gt;'
 
94
        t = env.from_string('{{ foo }}')
 
95
        assert t.render(foo='<foo>') == '<foo>'
 
96
 
 
97
 
 
98
class MetaTestCase(JinjaTestCase):
 
99
 
 
100
    def test_find_undeclared_variables(self):
 
101
        ast = env.parse('{% set foo = 42 %}{{ bar + foo }}')
 
102
        x = meta.find_undeclared_variables(ast)
 
103
        assert x == set(['bar'])
 
104
 
 
105
        ast = env.parse('{% set foo = 42 %}{{ bar + foo }}'
 
106
                        '{% macro meh(x) %}{{ x }}{% endmacro %}'
 
107
                        '{% for item in seq %}{{ muh(item) + meh(seq) }}{% endfor %}')
 
108
        x = meta.find_undeclared_variables(ast)
 
109
        assert x == set(['bar', 'seq', 'muh'])
 
110
 
 
111
    def test_find_refererenced_templates(self):
 
112
        ast = env.parse('{% extends "layout.html" %}{% include helper %}')
 
113
        i = meta.find_referenced_templates(ast)
 
114
        assert next(i) == 'layout.html'
 
115
        assert next(i) is None
 
116
        assert list(i) == []
 
117
 
 
118
        ast = env.parse('{% extends "layout.html" %}'
 
119
                        '{% from "test.html" import a, b as c %}'
 
120
                        '{% import "meh.html" as meh %}'
 
121
                        '{% include "muh.html" %}')
 
122
        i = meta.find_referenced_templates(ast)
 
123
        assert list(i) == ['layout.html', 'test.html', 'meh.html', 'muh.html']
 
124
 
 
125
    def test_find_included_templates(self):
 
126
        ast = env.parse('{% include ["foo.html", "bar.html"] %}')
 
127
        i = meta.find_referenced_templates(ast)
 
128
        assert list(i) == ['foo.html', 'bar.html']
 
129
 
 
130
        ast = env.parse('{% include ("foo.html", "bar.html") %}')
 
131
        i = meta.find_referenced_templates(ast)
 
132
        assert list(i) == ['foo.html', 'bar.html']
 
133
 
 
134
        ast = env.parse('{% include ["foo.html", "bar.html", foo] %}')
 
135
        i = meta.find_referenced_templates(ast)
 
136
        assert list(i) == ['foo.html', 'bar.html', None]
 
137
 
 
138
        ast = env.parse('{% include ("foo.html", "bar.html", foo) %}')
 
139
        i = meta.find_referenced_templates(ast)
 
140
        assert list(i) == ['foo.html', 'bar.html', None]
 
141
 
 
142
 
 
143
class StreamingTestCase(JinjaTestCase):
 
144
 
 
145
    def test_basic_streaming(self):
 
146
        tmpl = env.from_string("<ul>{% for item in seq %}<li>{{ loop.index "
 
147
                               "}} - {{ item }}</li>{%- endfor %}</ul>")
 
148
        stream = tmpl.stream(seq=list(range(4)))
 
149
        self.assert_equal(next(stream), '<ul>')
 
150
        self.assert_equal(next(stream), '<li>1 - 0</li>')
 
151
        self.assert_equal(next(stream), '<li>2 - 1</li>')
 
152
        self.assert_equal(next(stream), '<li>3 - 2</li>')
 
153
        self.assert_equal(next(stream), '<li>4 - 3</li>')
 
154
        self.assert_equal(next(stream), '</ul>')
 
155
 
 
156
    def test_buffered_streaming(self):
 
157
        tmpl = env.from_string("<ul>{% for item in seq %}<li>{{ loop.index "
 
158
                               "}} - {{ item }}</li>{%- endfor %}</ul>")
 
159
        stream = tmpl.stream(seq=list(range(4)))
 
160
        stream.enable_buffering(size=3)
 
161
        self.assert_equal(next(stream), u'<ul><li>1 - 0</li><li>2 - 1</li>')
 
162
        self.assert_equal(next(stream), u'<li>3 - 2</li><li>4 - 3</li></ul>')
 
163
 
 
164
    def test_streaming_behavior(self):
 
165
        tmpl = env.from_string("")
 
166
        stream = tmpl.stream()
 
167
        assert not stream.buffered
 
168
        stream.enable_buffering(20)
 
169
        assert stream.buffered
 
170
        stream.disable_buffering()
 
171
        assert not stream.buffered
 
172
 
 
173
    def test_dump_stream(self):
 
174
        tmp = tempfile.mkdtemp()
 
175
        try:
 
176
            tmpl = env.from_string(u"\u2713")
 
177
            stream = tmpl.stream()
 
178
            stream.dump(os.path.join(tmp, 'dump.txt'), 'utf-8')
 
179
            with open(os.path.join(tmp, 'dump.txt'), 'rb') as f:
 
180
                self.assertEqual(f.read(), b'\xe2\x9c\x93')
 
181
        finally:
 
182
            shutil.rmtree(tmp)
 
183
 
 
184
 
 
185
class UndefinedTestCase(JinjaTestCase):
 
186
 
 
187
    def test_stopiteration_is_undefined(self):
 
188
        def test():
 
189
            raise StopIteration()
 
190
        t = Template('A{{ test() }}B')
 
191
        assert t.render(test=test) == 'AB'
 
192
        t = Template('A{{ test().missingattribute }}B')
 
193
        self.assert_raises(UndefinedError, t.render, test=test)
 
194
 
 
195
    def test_undefined_and_special_attributes(self):
 
196
        try:
 
197
            Undefined('Foo').__dict__
 
198
        except AttributeError:
 
199
            pass
 
200
        else:
 
201
            assert False, "Expected actual attribute error"
 
202
 
 
203
    def test_default_undefined(self):
 
204
        env = Environment(undefined=Undefined)
 
205
        self.assert_equal(env.from_string('{{ missing }}').render(), u'')
 
206
        self.assert_raises(UndefinedError,
 
207
                           env.from_string('{{ missing.attribute }}').render)
 
208
        self.assert_equal(env.from_string('{{ missing|list }}').render(), '[]')
 
209
        self.assert_equal(env.from_string('{{ missing is not defined }}').render(), 'True')
 
210
        self.assert_equal(env.from_string('{{ foo.missing }}').render(foo=42), '')
 
211
        self.assert_equal(env.from_string('{{ not missing }}').render(), 'True')
 
212
 
 
213
    def test_debug_undefined(self):
 
214
        env = Environment(undefined=DebugUndefined)
 
215
        self.assert_equal(env.from_string('{{ missing }}').render(), '{{ missing }}')
 
216
        self.assert_raises(UndefinedError,
 
217
                           env.from_string('{{ missing.attribute }}').render)
 
218
        self.assert_equal(env.from_string('{{ missing|list }}').render(), '[]')
 
219
        self.assert_equal(env.from_string('{{ missing is not defined }}').render(), 'True')
 
220
        self.assert_equal(env.from_string('{{ foo.missing }}').render(foo=42),
 
221
                          u"{{ no such element: int object['missing'] }}")
 
222
        self.assert_equal(env.from_string('{{ not missing }}').render(), 'True')
 
223
 
 
224
    def test_strict_undefined(self):
 
225
        env = Environment(undefined=StrictUndefined)
 
226
        self.assert_raises(UndefinedError, env.from_string('{{ missing }}').render)
 
227
        self.assert_raises(UndefinedError, env.from_string('{{ missing.attribute }}').render)
 
228
        self.assert_raises(UndefinedError, env.from_string('{{ missing|list }}').render)
 
229
        self.assert_equal(env.from_string('{{ missing is not defined }}').render(), 'True')
 
230
        self.assert_raises(UndefinedError, env.from_string('{{ foo.missing }}').render, foo=42)
 
231
        self.assert_raises(UndefinedError, env.from_string('{{ not missing }}').render)
 
232
        self.assert_equal(env.from_string('{{ missing|default("default", true) }}').render(), 'default')
 
233
 
 
234
    def test_indexing_gives_undefined(self):
 
235
        t = Template("{{ var[42].foo }}")
 
236
        self.assert_raises(UndefinedError, t.render, var=0)
 
237
 
 
238
    def test_none_gives_proper_error(self):
 
239
        try:
 
240
            Environment().getattr(None, 'split')()
 
241
        except UndefinedError as e:
 
242
            assert e.message == "'None' has no attribute 'split'"
 
243
        else:
 
244
            assert False, 'expected exception'
 
245
 
 
246
    def test_object_repr(self):
 
247
        try:
 
248
            Undefined(obj=42, name='upper')()
 
249
        except UndefinedError as e:
 
250
            assert e.message == "'int object' has no attribute 'upper'"
 
251
        else:
 
252
            assert False, 'expected exception'
 
253
 
 
254
 
 
255
def suite():
 
256
    suite = unittest.TestSuite()
 
257
    suite.addTest(unittest.makeSuite(ExtendedAPITestCase))
 
258
    suite.addTest(unittest.makeSuite(MetaTestCase))
 
259
    suite.addTest(unittest.makeSuite(StreamingTestCase))
 
260
    suite.addTest(unittest.makeSuite(UndefinedTestCase))
 
261
    return suite