8faf987b03ea7ab8d6c81a604ba057f7b5a17edd
[jinja2.git] / tests / test_loaders.py
1 # -*- coding: utf-8 -*-
2 """
3     unit test for the loaders
4     ~~~~~~~~~~~~~~~~~~~~~~~~~
5
6     :copyright: 2007 by Armin Ronacher.
7     :license: BSD, see LICENSE for more details.
8 """
9
10 from py.test import raises
11 import time
12 import tempfile
13 from jinja2 import Environment, loaders
14 from jinja2.loaders import split_template_path
15 from jinja2.exceptions import TemplateNotFound
16
17
18 dict_loader = loaders.DictLoader({
19     'justdict.html':        'FOO'
20 })
21 package_loader = loaders.PackageLoader('loaderres', 'templates')
22 filesystem_loader = loaders.FileSystemLoader('loaderres/templates')
23 function_loader = loaders.FunctionLoader({'justfunction.html': 'FOO'}.get)
24 choice_loader = loaders.ChoiceLoader([dict_loader, package_loader])
25 prefix_loader = loaders.PrefixLoader({
26     'a':        filesystem_loader,
27     'b':        dict_loader
28 })
29
30
31 def test_dict_loader():
32     env = Environment(loader=dict_loader)
33     tmpl = env.get_template('justdict.html')
34     assert tmpl.render().strip() == 'FOO'
35     raises(TemplateNotFound, env.get_template, 'missing.html')
36
37
38 def test_package_loader():
39     env = Environment(loader=package_loader)
40     tmpl = env.get_template('test.html')
41     assert tmpl.render().strip() == 'BAR'
42     raises(TemplateNotFound, env.get_template, 'missing.html')
43
44
45 def test_filesystem_loader():
46     env = Environment(loader=filesystem_loader)
47     tmpl = env.get_template('test.html')
48     assert tmpl.render().strip() == 'BAR'
49     tmpl = env.get_template('foo/test.html')
50     assert tmpl.render().strip() == 'FOO'
51     raises(TemplateNotFound, env.get_template, 'missing.html')
52
53
54 def test_choice_loader():
55     env = Environment(loader=choice_loader)
56     tmpl = env.get_template('justdict.html')
57     assert tmpl.render().strip() == 'FOO'
58     tmpl = env.get_template('test.html')
59     assert tmpl.render().strip() == 'BAR'
60     raises(TemplateNotFound, env.get_template, 'missing.html')
61
62
63 def test_function_loader():
64     env = Environment(loader=function_loader)
65     tmpl = env.get_template('justfunction.html')
66     assert tmpl.render().strip() == 'FOO'
67     raises(TemplateNotFound, env.get_template, 'missing.html')
68
69
70 def test_prefix_loader():
71     env = Environment(loader=prefix_loader)
72     tmpl = env.get_template('a/test.html')
73     assert tmpl.render().strip() == 'BAR'
74     tmpl = env.get_template('b/justdict.html')
75     assert tmpl.render().strip() == 'FOO'
76     raises(TemplateNotFound, env.get_template, 'missing')
77
78
79 def test_caching():
80     changed = False
81     class TestLoader(loaders.BaseLoader):
82         def get_source(self, environment, template):
83             return u'foo', None, lambda: not changed
84     env = Environment(loader=TestLoader(), cache_size=-1)
85     tmpl = env.get_template('template')
86     assert tmpl is env.get_template('template')
87     changed = True
88     assert tmpl is not env.get_template('template')
89     changed = False
90
91     env = Environment(loader=TestLoader(), cache_size=0)
92     assert env.get_template('template') \
93            is not env.get_template('template')
94
95     env = Environment(loader=TestLoader(), cache_size=2)
96     t1 = env.get_template('one')
97     t2 = env.get_template('two')
98     print env.cache
99     assert t2 is env.get_template('two')
100     assert t1 is env.get_template('one')
101     t3 = env.get_template('three')
102     assert 'one' in env.cache
103     assert 'two' not in env.cache
104     assert 'three' in env.cache
105
106
107 def test_split_template_path():
108     assert split_template_path('foo/bar') == ['foo', 'bar']
109     assert split_template_path('./foo/bar') == ['foo', 'bar']
110     raises(TemplateNotFound, split_template_path, '../foo')