1
# -*- coding: utf-8 -*-
3
jinja2.testsuite.loader
4
~~~~~~~~~~~~~~~~~~~~~~~
8
:copyright: (c) 2010 by the Jinja Team.
9
:license: BSD, see LICENSE for more details.
17
from jinja2.testsuite import JinjaTestCase, dict_loader, \
18
package_loader, filesystem_loader, function_loader, \
19
choice_loader, prefix_loader
21
from jinja2 import Environment, loaders
22
from jinja2._compat import PYPY, PY2
23
from jinja2.loaders import split_template_path
24
from jinja2.exceptions import TemplateNotFound
27
class LoaderTestCase(JinjaTestCase):
29
def test_dict_loader(self):
30
env = Environment(loader=dict_loader)
31
tmpl = env.get_template('justdict.html')
32
assert tmpl.render().strip() == 'FOO'
33
self.assert_raises(TemplateNotFound, env.get_template, 'missing.html')
35
def test_package_loader(self):
36
env = Environment(loader=package_loader)
37
tmpl = env.get_template('test.html')
38
assert tmpl.render().strip() == 'BAR'
39
self.assert_raises(TemplateNotFound, env.get_template, 'missing.html')
41
def test_filesystem_loader(self):
42
env = Environment(loader=filesystem_loader)
43
tmpl = env.get_template('test.html')
44
assert tmpl.render().strip() == 'BAR'
45
tmpl = env.get_template('foo/test.html')
46
assert tmpl.render().strip() == 'FOO'
47
self.assert_raises(TemplateNotFound, env.get_template, 'missing.html')
49
def test_choice_loader(self):
50
env = Environment(loader=choice_loader)
51
tmpl = env.get_template('justdict.html')
52
assert tmpl.render().strip() == 'FOO'
53
tmpl = env.get_template('test.html')
54
assert tmpl.render().strip() == 'BAR'
55
self.assert_raises(TemplateNotFound, env.get_template, 'missing.html')
57
def test_function_loader(self):
58
env = Environment(loader=function_loader)
59
tmpl = env.get_template('justfunction.html')
60
assert tmpl.render().strip() == 'FOO'
61
self.assert_raises(TemplateNotFound, env.get_template, 'missing.html')
63
def test_prefix_loader(self):
64
env = Environment(loader=prefix_loader)
65
tmpl = env.get_template('a/test.html')
66
assert tmpl.render().strip() == 'BAR'
67
tmpl = env.get_template('b/justdict.html')
68
assert tmpl.render().strip() == 'FOO'
69
self.assert_raises(TemplateNotFound, env.get_template, 'missing')
71
def test_caching(self):
73
class TestLoader(loaders.BaseLoader):
74
def get_source(self, environment, template):
75
return u'foo', None, lambda: not changed
76
env = Environment(loader=TestLoader(), cache_size=-1)
77
tmpl = env.get_template('template')
78
assert tmpl is env.get_template('template')
80
assert tmpl is not env.get_template('template')
83
env = Environment(loader=TestLoader(), cache_size=0)
84
assert env.get_template('template') \
85
is not env.get_template('template')
87
env = Environment(loader=TestLoader(), cache_size=2)
88
t1 = env.get_template('one')
89
t2 = env.get_template('two')
90
assert t2 is env.get_template('two')
91
assert t1 is env.get_template('one')
92
t3 = env.get_template('three')
93
assert 'one' in env.cache
94
assert 'two' not in env.cache
95
assert 'three' in env.cache
97
def test_dict_loader_cache_invalidates(self):
98
mapping = {'foo': "one"}
99
env = Environment(loader=loaders.DictLoader(mapping))
100
assert env.get_template('foo').render() == "one"
101
mapping['foo'] = "two"
102
assert env.get_template('foo').render() == "two"
104
def test_split_template_path(self):
105
assert split_template_path('foo/bar') == ['foo', 'bar']
106
assert split_template_path('./foo/bar') == ['foo', 'bar']
107
self.assert_raises(TemplateNotFound, split_template_path, '../foo')
110
class ModuleLoaderTestCase(JinjaTestCase):
113
def compile_down(self, zip='deflated', py_compile=False):
114
super(ModuleLoaderTestCase, self).setup()
116
self.reg_env = Environment(loader=prefix_loader)
118
self.archive = tempfile.mkstemp(suffix='.zip')[1]
120
self.archive = tempfile.mkdtemp()
121
self.reg_env.compile_templates(self.archive, zip=zip,
122
log_function=log.append,
123
py_compile=py_compile)
124
self.mod_env = Environment(loader=loaders.ModuleLoader(self.archive))
128
super(ModuleLoaderTestCase, self).teardown()
129
if hasattr(self, 'mod_env'):
130
if os.path.isfile(self.archive):
131
os.remove(self.archive)
133
shutil.rmtree(self.archive)
137
log = self.compile_down()
138
assert 'Compiled "a/foo/test.html" as ' \
139
'tmpl_a790caf9d669e39ea4d280d597ec891c4ef0404a' in log
140
assert 'Finished compiling templates' in log
141
assert 'Could not compile "a/syntaxerror.html": ' \
142
'Encountered unknown tag \'endif\'' in log
144
def _test_common(self):
145
tmpl1 = self.reg_env.get_template('a/test.html')
146
tmpl2 = self.mod_env.get_template('a/test.html')
147
assert tmpl1.render() == tmpl2.render()
149
tmpl1 = self.reg_env.get_template('b/justdict.html')
150
tmpl2 = self.mod_env.get_template('b/justdict.html')
151
assert tmpl1.render() == tmpl2.render()
153
def test_deflated_zip_compile(self):
154
self.compile_down(zip='deflated')
157
def test_stored_zip_compile(self):
158
self.compile_down(zip='stored')
161
def test_filesystem_compile(self):
162
self.compile_down(zip=None)
165
def test_weak_references(self):
167
tmpl = self.mod_env.get_template('a/test.html')
168
key = loaders.ModuleLoader.get_template_key('a/test.html')
169
name = self.mod_env.loader.module.__name__
171
assert hasattr(self.mod_env.loader.module, key)
172
assert name in sys.modules
174
# unset all, ensure the module is gone from sys.modules
175
self.mod_env = tmpl = None
183
assert name not in sys.modules
185
# This test only makes sense on non-pypy python 2
187
def test_byte_compilation(self):
188
log = self.compile_down(py_compile=True)
189
assert 'Byte-compiled "a/test.html"' in log
190
tmpl1 = self.mod_env.get_template('a/test.html')
191
mod = self.mod_env.loader.module. \
192
tmpl_3c4ddf650c1a73df961a6d3d2ce2752f1b8fd490
193
assert mod.__file__.endswith('.pyc')
195
def test_choice_loader(self):
196
log = self.compile_down()
198
self.mod_env.loader = loaders.ChoiceLoader([
200
loaders.DictLoader({'DICT_SOURCE': 'DICT_TEMPLATE'})
203
tmpl1 = self.mod_env.get_template('a/test.html')
204
self.assert_equal(tmpl1.render(), 'BAR')
205
tmpl2 = self.mod_env.get_template('DICT_SOURCE')
206
self.assert_equal(tmpl2.render(), 'DICT_TEMPLATE')
208
def test_prefix_loader(self):
209
log = self.compile_down()
211
self.mod_env.loader = loaders.PrefixLoader({
212
'MOD': self.mod_env.loader,
213
'DICT': loaders.DictLoader({'test.html': 'DICT_TEMPLATE'})
216
tmpl1 = self.mod_env.get_template('MOD/a/test.html')
217
self.assert_equal(tmpl1.render(), 'BAR')
218
tmpl2 = self.mod_env.get_template('DICT/test.html')
219
self.assert_equal(tmpl2.render(), 'DICT_TEMPLATE')
223
suite = unittest.TestSuite()
224
suite.addTest(unittest.makeSuite(LoaderTestCase))
225
suite.addTest(unittest.makeSuite(ModuleLoaderTestCase))