2
Test cases for the template loaders
4
Note: This test requires setuptools!
7
from django.conf import settings
9
if __name__ == '__main__':
17
from django.template import TemplateDoesNotExist, Context
18
from django.template.loaders.eggs import Loader as EggLoader
19
from django.template import loader
20
from django.utils import unittest, six
21
from django.utils._os import upath
22
from django.utils.six import StringIO
25
# Mock classes and objects for pkg_resources functions.
26
class MockProvider(pkg_resources.NullProvider):
27
def __init__(self, module):
28
pkg_resources.NullProvider.__init__(self, module)
32
return path in self.module._resources
34
def _isdir(self, path):
37
def get_resource_stream(self, manager, resource_name):
38
return self.module._resources[resource_name]
41
return self.module._resources[path].read()
43
class MockLoader(object):
46
def create_egg(name, resources):
48
Creates a mock egg with a list of resources.
50
name: The name of the module.
51
resources: A dictionary of resources. Keys are the names and values the data.
53
egg = imp.new_module(name)
54
egg.__loader__ = MockLoader()
55
egg._resources = resources
56
sys.modules[name] = egg
59
class EggLoaderTest(unittest.TestCase):
61
pkg_resources._provider_factories[MockLoader] = MockProvider
63
self.empty_egg = create_egg("egg_empty", {})
64
self.egg_1 = create_egg("egg_1", {
65
os.path.normcase('templates/y.html'): StringIO("y"),
66
os.path.normcase('templates/x.txt'): StringIO("x"),
68
self._old_installed_apps = settings.INSTALLED_APPS
69
settings.INSTALLED_APPS = []
72
settings.INSTALLED_APPS = self._old_installed_apps
75
"Loading any template on an empty egg should fail"
76
settings.INSTALLED_APPS = ['egg_empty']
77
egg_loader = EggLoader()
78
self.assertRaises(TemplateDoesNotExist, egg_loader.load_template_source, "not-existing.html")
80
def test_non_existing(self):
81
"Template loading fails if the template is not in the egg"
82
settings.INSTALLED_APPS = ['egg_1']
83
egg_loader = EggLoader()
84
self.assertRaises(TemplateDoesNotExist, egg_loader.load_template_source, "not-existing.html")
86
def test_existing(self):
87
"A template can be loaded from an egg"
88
settings.INSTALLED_APPS = ['egg_1']
89
egg_loader = EggLoader()
90
contents, template_name = egg_loader.load_template_source("y.html")
91
self.assertEqual(contents, "y")
92
self.assertEqual(template_name, "egg:egg_1:templates/y.html")
94
def test_not_installed(self):
95
"Loading an existent template from an egg not included in INSTALLED_APPS should fail"
96
settings.INSTALLED_APPS = []
97
egg_loader = EggLoader()
98
self.assertRaises(TemplateDoesNotExist, egg_loader.load_template_source, "y.html")
100
class CachedLoader(unittest.TestCase):
102
self.old_TEMPLATE_LOADERS = settings.TEMPLATE_LOADERS
103
settings.TEMPLATE_LOADERS = (
104
('django.template.loaders.cached.Loader', (
105
'django.template.loaders.filesystem.Loader',
110
settings.TEMPLATE_LOADERS = self.old_TEMPLATE_LOADERS
112
def test_templatedir_caching(self):
113
"Check that the template directories form part of the template cache key. Refs #13573"
114
# Retrive a template specifying a template directory to check
115
t1, name = loader.find_template('test.html', (os.path.join(os.path.dirname(upath(__file__)), 'templates', 'first'),))
116
# Now retrieve the same template name, but from a different directory
117
t2, name = loader.find_template('test.html', (os.path.join(os.path.dirname(upath(__file__)), 'templates', 'second'),))
119
# The two templates should not have the same content
120
self.assertNotEqual(t1.render(Context({})), t2.render(Context({})))
122
class RenderToStringTest(unittest.TestCase):
125
self._old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
126
settings.TEMPLATE_DIRS = (
127
os.path.join(os.path.dirname(upath(__file__)), 'templates'),
131
settings.TEMPLATE_DIRS = self._old_TEMPLATE_DIRS
133
def test_basic(self):
134
self.assertEqual(loader.render_to_string('test_context.html'), 'obj:')
136
def test_basic_context(self):
137
self.assertEqual(loader.render_to_string('test_context.html',
138
{'obj': 'test'}), 'obj:test')
140
def test_existing_context_kept_clean(self):
141
context = Context({'obj': 'before'})
142
output = loader.render_to_string('test_context.html', {'obj': 'after'},
143
context_instance=context)
144
self.assertEqual(output, 'obj:after')
145
self.assertEqual(context['obj'], 'before')
147
def test_empty_list(self):
148
six.assertRaisesRegex(self, TemplateDoesNotExist,
149
'No template names provided$',
150
loader.render_to_string, [])
153
def test_select_templates_from_empty_list(self):
154
six.assertRaisesRegex(self, TemplateDoesNotExist,
155
'No template names provided$',
156
loader.select_template, [])