mirror of
https://github.com/django/django.git
synced 2024-12-23 09:36:06 +00:00
55f12f8709
This patch does three major things: * Merges the django.template.debug implementation into django.template.base. * Simplifies the debug implementation. The old implementation copied debug information to every token and node. The django_template_source attribute was set in multiple places, some quite hacky, like django.template.defaulttags.ForNode. Debug information is now annotated in two high-level places: * Template.compile_nodelist for errors during parsing * Node.render_annotated for errors during rendering These were chosen because they have access to the template and context as well as to all exceptions that happen during either the parse or render phase. * Moves the contextual line traceback information creation from django.views.debug into django.template.base.Template. The debug views now only deal with the presentation of the debug information.
114 lines
3.8 KiB
Python
114 lines
3.8 KiB
Python
import os
|
|
|
|
from django.template import Context
|
|
from django.template.engine import Engine
|
|
from django.test import SimpleTestCase, ignore_warnings
|
|
from django.utils.deprecation import RemovedInDjango20Warning
|
|
|
|
from .utils import ROOT, TEMPLATE_DIR
|
|
|
|
OTHER_DIR = os.path.join(ROOT, 'other_templates')
|
|
|
|
|
|
@ignore_warnings(category=RemovedInDjango20Warning)
|
|
class DeprecatedRenderToStringTest(SimpleTestCase):
|
|
|
|
def setUp(self):
|
|
self.engine = Engine(dirs=[TEMPLATE_DIR])
|
|
|
|
def test_basic_context(self):
|
|
self.assertEqual(
|
|
self.engine.render_to_string('test_context.html', {'obj': 'test'}),
|
|
'obj:test\n',
|
|
)
|
|
|
|
def test_existing_context_kept_clean(self):
|
|
context = Context({'obj': 'before'})
|
|
output = self.engine.render_to_string(
|
|
'test_context.html', {'obj': 'after'}, context_instance=context,
|
|
)
|
|
self.assertEqual(output, 'obj:after\n')
|
|
self.assertEqual(context['obj'], 'before')
|
|
|
|
def test_no_empty_dict_pushed_to_stack(self):
|
|
"""
|
|
#21741 -- An empty dict should not be pushed to the context stack when
|
|
render_to_string is called without a context argument.
|
|
"""
|
|
|
|
# The stack should have a length of 1, corresponding to the builtins
|
|
self.assertEqual(
|
|
'1',
|
|
self.engine.render_to_string('test_context_stack.html').strip(),
|
|
)
|
|
self.assertEqual(
|
|
'1',
|
|
self.engine.render_to_string(
|
|
'test_context_stack.html',
|
|
context_instance=Context()
|
|
).strip(),
|
|
)
|
|
|
|
|
|
class LoaderTests(SimpleTestCase):
|
|
|
|
def test_origin(self):
|
|
engine = Engine(dirs=[TEMPLATE_DIR], debug=True)
|
|
template = engine.get_template('index.html')
|
|
self.assertEqual(template.origin.loadname, 'index.html')
|
|
|
|
def test_loader_priority(self):
|
|
"""
|
|
#21460 -- Check that the order of template loader works.
|
|
"""
|
|
loaders = [
|
|
'django.template.loaders.filesystem.Loader',
|
|
'django.template.loaders.app_directories.Loader',
|
|
]
|
|
engine = Engine(dirs=[OTHER_DIR, TEMPLATE_DIR], loaders=loaders)
|
|
template = engine.get_template('priority/foo.html')
|
|
self.assertEqual(template.render(Context()), 'priority\n')
|
|
|
|
def test_cached_loader_priority(self):
|
|
"""
|
|
Check that the order of template loader works. Refs #21460.
|
|
"""
|
|
loaders = [
|
|
('django.template.loaders.cached.Loader', [
|
|
'django.template.loaders.filesystem.Loader',
|
|
'django.template.loaders.app_directories.Loader',
|
|
]),
|
|
]
|
|
engine = Engine(dirs=[OTHER_DIR, TEMPLATE_DIR], loaders=loaders)
|
|
|
|
template = engine.get_template('priority/foo.html')
|
|
self.assertEqual(template.render(Context()), 'priority\n')
|
|
|
|
template = engine.get_template('priority/foo.html')
|
|
self.assertEqual(template.render(Context()), 'priority\n')
|
|
|
|
|
|
@ignore_warnings(category=RemovedInDjango20Warning)
|
|
class TemplateDirsOverrideTests(SimpleTestCase):
|
|
DIRS = ((OTHER_DIR, ), [OTHER_DIR])
|
|
|
|
def setUp(self):
|
|
self.engine = Engine()
|
|
|
|
def test_render_to_string(self):
|
|
for dirs in self.DIRS:
|
|
self.assertEqual(
|
|
self.engine.render_to_string('test_dirs.html', dirs=dirs),
|
|
'spam eggs\n',
|
|
)
|
|
|
|
def test_get_template(self):
|
|
for dirs in self.DIRS:
|
|
template = self.engine.get_template('test_dirs.html', dirs=dirs)
|
|
self.assertEqual(template.render(Context()), 'spam eggs\n')
|
|
|
|
def test_select_template(self):
|
|
for dirs in self.DIRS:
|
|
template = self.engine.select_template(['test_dirs.html'], dirs=dirs)
|
|
self.assertEqual(template.render(Context()), 'spam eggs\n')
|