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