blob: 64193f3397e51324c315afb0bee11d6b237e8406 [file] [log] [blame]
Armin Ronacher93e14c22007-03-20 16:17:48 +01001# -*- coding: utf-8 -*-
2"""
3 unit test for the loaders
4 ~~~~~~~~~~~~~~~~~~~~~~~~~
5
Armin Ronacher62ccd1b2009-01-04 14:26:19 +01006 :copyright: (c) 2009 by the Jinja Team.
Armin Ronacher93e14c22007-03-20 16:17:48 +01007 :license: BSD, see LICENSE for more details.
8"""
9
Armin Ronacher8e64adf2010-02-07 02:00:11 +010010import os
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
Armin Ronacher42979eb2009-07-26 11:08:50 +020017from nose.tools import assert_raises
Rene Leonhardtc7e6c6d2009-04-20 23:08:53 +020018
Armin Ronacher93e14c22007-03-20 16:17:48 +010019
20dict_loader = loaders.DictLoader({
21 'justdict.html': 'FOO'
22})
Armin Ronacher93e14c22007-03-20 16:17:48 +010023package_loader = loaders.PackageLoader('loaderres', 'templates')
Armin Ronacher8e64adf2010-02-07 02:00:11 +010024filesystem_loader = loaders.FileSystemLoader('tests/loaderres/templates')
Armin Ronacher9baa5ba2007-03-21 18:05:32 +010025function_loader = loaders.FunctionLoader({'justfunction.html': 'FOO'}.get)
Armin Ronacher93e14c22007-03-20 16:17:48 +010026choice_loader = loaders.ChoiceLoader([dict_loader, package_loader])
Armin Ronachere62b7ef2008-05-24 20:47:29 +020027prefix_loader = loaders.PrefixLoader({
28 'a': filesystem_loader,
29 'b': dict_loader
30})
Armin Ronacher93e14c22007-03-20 16:17:48 +010031
32
33def test_dict_loader():
34 env = Environment(loader=dict_loader)
35 tmpl = env.get_template('justdict.html')
36 assert tmpl.render().strip() == 'FOO'
Armin Ronacher42979eb2009-07-26 11:08:50 +020037 assert_raises(TemplateNotFound, env.get_template, 'missing.html')
Armin Ronacher93e14c22007-03-20 16:17:48 +010038
39
40def test_package_loader():
41 env = Environment(loader=package_loader)
Armin Ronacher963f97d2008-04-25 11:44:59 +020042 tmpl = env.get_template('test.html')
43 assert tmpl.render().strip() == 'BAR'
Armin Ronacher42979eb2009-07-26 11:08:50 +020044 assert_raises(TemplateNotFound, env.get_template, 'missing.html')
Armin Ronacher93e14c22007-03-20 16:17:48 +010045
46
47def test_filesystem_loader():
48 env = Environment(loader=filesystem_loader)
49 tmpl = env.get_template('test.html')
50 assert tmpl.render().strip() == 'BAR'
Armin Ronachercb58db12007-05-30 00:05:24 +020051 tmpl = env.get_template('foo/test.html')
52 assert tmpl.render().strip() == 'FOO'
Armin Ronacher42979eb2009-07-26 11:08:50 +020053 assert_raises(TemplateNotFound, env.get_template, 'missing.html')
Armin Ronacher143a07e2007-06-02 01:47:34 +020054
55
Armin Ronacher93e14c22007-03-20 16:17:48 +010056def test_choice_loader():
57 env = Environment(loader=choice_loader)
58 tmpl = env.get_template('justdict.html')
59 assert tmpl.render().strip() == 'FOO'
60 tmpl = env.get_template('test.html')
61 assert tmpl.render().strip() == 'BAR'
Armin Ronacher42979eb2009-07-26 11:08:50 +020062 assert_raises(TemplateNotFound, env.get_template, 'missing.html')
Armin Ronacher9baa5ba2007-03-21 18:05:32 +010063
64
65def test_function_loader():
66 env = Environment(loader=function_loader)
67 tmpl = env.get_template('justfunction.html')
68 assert tmpl.render().strip() == 'FOO'
Armin Ronacher42979eb2009-07-26 11:08:50 +020069 assert_raises(TemplateNotFound, env.get_template, 'missing.html')
Armin Ronachere62b7ef2008-05-24 20:47:29 +020070
71
72def test_prefix_loader():
73 env = Environment(loader=prefix_loader)
74 tmpl = env.get_template('a/test.html')
75 assert tmpl.render().strip() == 'BAR'
76 tmpl = env.get_template('b/justdict.html')
77 assert tmpl.render().strip() == 'FOO'
Armin Ronacher42979eb2009-07-26 11:08:50 +020078 assert_raises(TemplateNotFound, env.get_template, 'missing')
Armin Ronachere62b7ef2008-05-24 20:47:29 +020079
80
81def test_caching():
82 changed = False
83 class TestLoader(loaders.BaseLoader):
84 def get_source(self, environment, template):
85 return u'foo', None, lambda: not changed
86 env = Environment(loader=TestLoader(), cache_size=-1)
87 tmpl = env.get_template('template')
88 assert tmpl is env.get_template('template')
89 changed = True
90 assert tmpl is not env.get_template('template')
91 changed = False
92
93 env = Environment(loader=TestLoader(), cache_size=0)
94 assert env.get_template('template') \
95 is not env.get_template('template')
96
97 env = Environment(loader=TestLoader(), cache_size=2)
98 t1 = env.get_template('one')
99 t2 = env.get_template('two')
100 print env.cache
101 assert t2 is env.get_template('two')
102 assert t1 is env.get_template('one')
103 t3 = env.get_template('three')
104 assert 'one' in env.cache
105 assert 'two' not in env.cache
106 assert 'three' in env.cache
Armin Ronacher9f258ff2008-05-24 22:28:52 +0200107
108
109def test_split_template_path():
110 assert split_template_path('foo/bar') == ['foo', 'bar']
111 assert split_template_path('./foo/bar') == ['foo', 'bar']
Armin Ronacher42979eb2009-07-26 11:08:50 +0200112 assert_raises(TemplateNotFound, split_template_path, '../foo')