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
.loaders
import split_template_path
23 from jinja2
.exceptions
import TemplateNotFound
26 class LoaderTestCase(JinjaTestCase
):
28 def test_dict_loader(self
):
29 env
= Environment(loader
=dict_loader
)
30 tmpl
= env
.get_template('justdict.html')
31 assert tmpl
.render().strip() == 'FOO'
32 self
.assert_raises(TemplateNotFound
, env
.get_template
, 'missing.html')
34 def test_package_loader(self
):
35 env
= Environment(loader
=package_loader
)
36 tmpl
= env
.get_template('test.html')
37 assert tmpl
.render().strip() == 'BAR'
38 self
.assert_raises(TemplateNotFound
, env
.get_template
, 'missing.html')
40 def test_filesystem_loader(self
):
41 env
= Environment(loader
=filesystem_loader
)
42 tmpl
= env
.get_template('test.html')
43 assert tmpl
.render().strip() == 'BAR'
44 tmpl
= env
.get_template('foo/test.html')
45 assert tmpl
.render().strip() == 'FOO'
46 self
.assert_raises(TemplateNotFound
, env
.get_template
, 'missing.html')
48 def test_choice_loader(self
):
49 env
= Environment(loader
=choice_loader
)
50 tmpl
= env
.get_template('justdict.html')
51 assert tmpl
.render().strip() == 'FOO'
52 tmpl
= env
.get_template('test.html')
53 assert tmpl
.render().strip() == 'BAR'
54 self
.assert_raises(TemplateNotFound
, env
.get_template
, 'missing.html')
56 def test_function_loader(self
):
57 env
= Environment(loader
=function_loader
)
58 tmpl
= env
.get_template('justfunction.html')
59 assert tmpl
.render().strip() == 'FOO'
60 self
.assert_raises(TemplateNotFound
, env
.get_template
, 'missing.html')
62 def test_prefix_loader(self
):
63 env
= Environment(loader
=prefix_loader
)
64 tmpl
= env
.get_template('a/test.html')
65 assert tmpl
.render().strip() == 'BAR'
66 tmpl
= env
.get_template('b/justdict.html')
67 assert tmpl
.render().strip() == 'FOO'
68 self
.assert_raises(TemplateNotFound
, env
.get_template
, 'missing')
70 def test_caching(self
):
72 class TestLoader(loaders
.BaseLoader
):
73 def get_source(self
, environment
, template
):
74 return u
'foo', None, lambda: not changed
75 env
= Environment(loader
=TestLoader(), cache_size
=-1)
76 tmpl
= env
.get_template('template')
77 assert tmpl
is env
.get_template('template')
79 assert tmpl
is not env
.get_template('template')
82 env
= Environment(loader
=TestLoader(), cache_size
=0)
83 assert env
.get_template('template') \
84 is not env
.get_template('template')
86 env
= Environment(loader
=TestLoader(), cache_size
=2)
87 t1
= env
.get_template('one')
88 t2
= env
.get_template('two')
89 assert t2
is env
.get_template('two')
90 assert t1
is env
.get_template('one')
91 t3
= env
.get_template('three')
92 assert 'one' in env
.cache
93 assert 'two' not in env
.cache
94 assert 'three' in env
.cache
96 def test_split_template_path(self
):
97 assert split_template_path('foo/bar') == ['foo', 'bar']
98 assert split_template_path('./foo/bar') == ['foo', 'bar']
99 self
.assert_raises(TemplateNotFound
, split_template_path
, '../foo')
102 class ModuleLoaderTestCase(JinjaTestCase
):
105 def compile_down(self
, zip='deflated', py_compile
=False):
106 super(ModuleLoaderTestCase
, self
).setup()
108 self
.reg_env
= Environment(loader
=prefix_loader
)
110 self
.archive
= tempfile
.mkstemp(suffix
='.zip')[1]
112 self
.archive
= tempfile
.mkdtemp()
113 self
.reg_env
.compile_templates(self
.archive
, zip=zip,
114 log_function
=log
.append
,
115 py_compile
=py_compile
)
116 self
.mod_env
= Environment(loader
=loaders
.ModuleLoader(self
.archive
))
120 super(ModuleLoaderTestCase
, self
).teardown()
121 if hasattr(self
, 'mod_env'):
122 if os
.path
.isfile(self
.archive
):
123 os
.remove(self
.archive
)
125 shutil
.rmtree(self
.archive
)
129 log
= self
.compile_down()
130 assert 'Compiled "a/foo/test.html" as ' \
131 'tmpl_a790caf9d669e39ea4d280d597ec891c4ef0404a' in log
132 assert 'Finished compiling templates' in log
133 assert 'Could not compile "a/syntaxerror.html": ' \
134 'Encountered unknown tag \'endif\'' in log
136 def _test_common(self
):
137 tmpl1
= self
.reg_env
.get_template('a/test.html')
138 tmpl2
= self
.mod_env
.get_template('a/test.html')
139 assert tmpl1
.render() == tmpl2
.render()
141 tmpl1
= self
.reg_env
.get_template('b/justdict.html')
142 tmpl2
= self
.mod_env
.get_template('b/justdict.html')
143 assert tmpl1
.render() == tmpl2
.render()
145 def test_deflated_zip_compile(self
):
146 self
.compile_down(zip='deflated')
149 def test_stored_zip_compile(self
):
150 self
.compile_down(zip='stored')
153 def test_filesystem_compile(self
):
154 self
.compile_down(zip=None)
157 def test_weak_references(self
):
159 tmpl
= self
.mod_env
.get_template('a/test.html')
160 key
= loaders
.ModuleLoader
.get_template_key('a/test.html')
161 name
= self
.mod_env
.loader
.module
.__name
__
163 assert hasattr(self
.mod_env
.loader
.module
, key
)
164 assert name
in sys
.modules
166 # unset all, ensure the module is gone from sys.modules
167 self
.mod_env
= tmpl
= None
175 assert name
not in sys
.modules
177 def test_byte_compilation(self
):
178 log
= self
.compile_down(py_compile
=True)
179 assert 'Byte-compiled "a/test.html"' in log
180 tmpl1
= self
.mod_env
.get_template('a/test.html')
181 mod
= self
.mod_env
.loader
.module
. \
182 tmpl_3c4ddf650c1a73df961a6d3d2ce2752f1b8fd490
183 assert mod
.__file
__.endswith('.pyc')
187 suite
= unittest
.TestSuite()
188 suite
.addTest(unittest
.makeSuite(LoaderTestCase
))
189 suite
.addTest(unittest
.makeSuite(ModuleLoaderTestCase
))