blob: 05698393b03b8146f237c9acc3a6a92a086a4e9f [file] [log] [blame]
# -*- coding: utf-8 -*-
"""
unit test for the loaders
~~~~~~~~~~~~~~~~~~~~~~~~~
:copyright: 2007 by Armin Ronacher.
:license: BSD, see LICENSE for more details.
"""
import time
import tempfile
from jinja2 import Environment, loaders
from jinja2.exceptions import TemplateNotFound
dict_loader = loaders.DictLoader({
'justdict.html': 'FOO'
})
package_loader = loaders.PackageLoader('loaderres', 'templates')
filesystem_loader = loaders.FileSystemLoader('loaderres/templates')
memcached_loader = loaders.MemcachedFileSystemLoader('loaderres/templates')
function_loader = loaders.FunctionLoader({'justfunction.html': 'FOO'}.get)
choice_loader = loaders.ChoiceLoader([dict_loader, package_loader])
class FakeLoader(loaders.BaseLoader):
local_attr = 42
def test_dict_loader():
env = Environment(loader=dict_loader)
tmpl = env.get_template('justdict.html')
assert tmpl.render().strip() == 'FOO'
try:
env.get_template('missing.html')
except TemplateNotFound:
pass
else:
raise AssertionError('expected template exception')
def test_package_loader():
env = Environment(loader=package_loader)
for x in xrange(2):
tmpl = env.get_template('test.html')
assert tmpl.render().strip() == 'BAR'
try:
env.get_template('missing.html')
except TemplateNotFound:
pass
else:
raise AssertionError('expected template exception')
# second run in native mode (no pkg_resources)
package_loader.force_native = True
del package_loader._load_func
def test_filesystem_loader():
env = Environment(loader=filesystem_loader)
tmpl = env.get_template('test.html')
assert tmpl.render().strip() == 'BAR'
tmpl = env.get_template('foo/test.html')
assert tmpl.render().strip() == 'FOO'
try:
env.get_template('missing.html')
except TemplateNotFound:
pass
else:
raise AssertionError('expected template exception')
def test_memcached_loader():
env = Environment(loader=memcached_loader)
tmpl = env.get_template('test.html')
assert tmpl.render().strip() == 'BAR'
tmpl = env.get_template('foo/test.html')
assert tmpl.render().strip() == 'FOO'
try:
env.get_template('missing.html')
except TemplateNotFound:
pass
else:
raise AssertionError('expected template exception')
def test_choice_loader():
env = Environment(loader=choice_loader)
tmpl = env.get_template('justdict.html')
assert tmpl.render().strip() == 'FOO'
tmpl = env.get_template('test.html')
assert tmpl.render().strip() == 'BAR'
try:
env.get_template('missing.html')
except TemplateNotFound:
pass
else:
raise AssertionError('expected template exception')
# this should raise an TemplateNotFound error with the
# correct name
try:
env.get_template('brokenimport.html')
except TemplateNotFound, e:
assert e.name == 'missing.html'
else:
raise AssertionError('expected exception')
def test_function_loader():
env = Environment(loader=function_loader)
tmpl = env.get_template('justfunction.html')
assert tmpl.render().strip() == 'FOO'
try:
env.get_template('missing.html')
except TemplateNotFound:
pass
else:
raise AssertionError('expected template exception')
def test_loader_redirect():
env = Environment(loader=FakeLoader())
assert env.loader.local_attr == 42
assert env.loader.get_source
assert env.loader.load
class MemcacheTestingLoader(loaders.CachedLoaderMixin, loaders.BaseLoader):
def __init__(self, enable):
loaders.CachedLoaderMixin.__init__(self, enable, 40, None, True, 'foo')
self.times = {}
self.idx = 0
def touch(self, name):
self.times[name] = time.time()
def get_source(self, environment, name, parent):
self.touch(name)
self.idx += 1
return 'Template %s (%d)' % (name, self.idx)
def check_source_changed(self, environment, name):
if name in self.times:
return self.times[name]
return -1
memcache_env = Environment(loader=MemcacheTestingLoader(True))
no_memcache_env = Environment(loader=MemcacheTestingLoader(False))
test_memcaching = r'''
>>> not_caching = MODULE.no_memcache_env.loader
>>> caching = MODULE.memcache_env.loader
>>> touch = caching.touch
>>> tmpl1 = not_caching.load('test.html')
>>> tmpl2 = not_caching.load('test.html')
>>> tmpl1 == tmpl2
False
>>> tmpl1 = caching.load('test.html')
>>> tmpl2 = caching.load('test.html')
>>> tmpl1 == tmpl2
True
>>> touch('test.html')
>>> tmpl2 = caching.load('test.html')
>>> tmpl1 == tmpl2
False
'''