blob: 8faf987b03ea7ab8d6c81a604ba057f7b5a17edd [file] [log] [blame]
Armin Ronacher93e14c22007-03-20 16:17:48 +01001# -*- 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
Armin Ronacher963f97d2008-04-25 11:44:59 +020010from py.test import raises
Armin Ronacherccf284b2007-05-21 16:44:26 +020011import time
12import tempfile
Christoph Hacke9e43bb2008-04-13 23:35:48 +020013from jinja2 import Environment, loaders
Armin Ronacher9f258ff2008-05-24 22:28:52 +020014from jinja2.loaders import split_template_path
Christoph Hacke9e43bb2008-04-13 23:35:48 +020015from jinja2.exceptions import TemplateNotFound
Armin Ronacher93e14c22007-03-20 16:17:48 +010016
17
18dict_loader = loaders.DictLoader({
19 'justdict.html': 'FOO'
20})
Armin Ronacher93e14c22007-03-20 16:17:48 +010021package_loader = loaders.PackageLoader('loaderres', 'templates')
Armin Ronacher93e14c22007-03-20 16:17:48 +010022filesystem_loader = loaders.FileSystemLoader('loaderres/templates')
Armin Ronacher9baa5ba2007-03-21 18:05:32 +010023function_loader = loaders.FunctionLoader({'justfunction.html': 'FOO'}.get)
Armin Ronacher93e14c22007-03-20 16:17:48 +010024choice_loader = loaders.ChoiceLoader([dict_loader, package_loader])
Armin Ronachere62b7ef2008-05-24 20:47:29 +020025prefix_loader = loaders.PrefixLoader({
26 'a': filesystem_loader,
27 'b': dict_loader
28})
Armin Ronacher93e14c22007-03-20 16:17:48 +010029
30
31def test_dict_loader():
32 env = Environment(loader=dict_loader)
33 tmpl = env.get_template('justdict.html')
34 assert tmpl.render().strip() == 'FOO'
Armin Ronachere62b7ef2008-05-24 20:47:29 +020035 raises(TemplateNotFound, env.get_template, 'missing.html')
Armin Ronacher93e14c22007-03-20 16:17:48 +010036
37
38def test_package_loader():
39 env = Environment(loader=package_loader)
Armin Ronacher963f97d2008-04-25 11:44:59 +020040 tmpl = env.get_template('test.html')
41 assert tmpl.render().strip() == 'BAR'
Armin Ronachere62b7ef2008-05-24 20:47:29 +020042 raises(TemplateNotFound, env.get_template, 'missing.html')
Armin Ronacher93e14c22007-03-20 16:17:48 +010043
44
45def test_filesystem_loader():
46 env = Environment(loader=filesystem_loader)
47 tmpl = env.get_template('test.html')
48 assert tmpl.render().strip() == 'BAR'
Armin Ronachercb58db12007-05-30 00:05:24 +020049 tmpl = env.get_template('foo/test.html')
50 assert tmpl.render().strip() == 'FOO'
Armin Ronachere62b7ef2008-05-24 20:47:29 +020051 raises(TemplateNotFound, env.get_template, 'missing.html')
Armin Ronacher143a07e2007-06-02 01:47:34 +020052
53
Armin Ronacher93e14c22007-03-20 16:17:48 +010054def 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'
Armin Ronachere62b7ef2008-05-24 20:47:29 +020060 raises(TemplateNotFound, env.get_template, 'missing.html')
Armin Ronacher9baa5ba2007-03-21 18:05:32 +010061
62
63def test_function_loader():
64 env = Environment(loader=function_loader)
65 tmpl = env.get_template('justfunction.html')
66 assert tmpl.render().strip() == 'FOO'
Armin Ronachere62b7ef2008-05-24 20:47:29 +020067 raises(TemplateNotFound, env.get_template, 'missing.html')
68
69
70def 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
79def 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
Armin Ronacher9f258ff2008-05-24 22:28:52 +0200105
106
107def 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')