django1/django/tests/template_inheritance.py

103 lines
4.6 KiB
Python

from django.core import template, template_loader
# SYNTAX --
# 'template_name': ('template contents', 'context dict', 'expected string output' or Exception class)
TEMPLATE_TESTS = {
# Standard template with no inheritance
'test01': ("1{% block first %}_{% endblock %}3{% block second %}_{% endblock %}", {}, '1_3_'),
# Standard two-level inheritance
'test02': ("{% extends 'test01' %}{% block first %}2{% endblock %}{% block second %}4{% endblock %}", {}, '1234'),
# Three-level with no redefinitions on third level
'test03': ("{% extends 'test02' %}", {}, '1234'),
# Two-level with no redefinitions on second level
'test04': ("{% extends 'test01' %}", {}, '1_3_'),
# Two-level with double quotes instead of single quotes
'test05': ('{% extends "test02" %}', {}, '1234'),
# Three-level with variable parent-template name
'test06': ("{% extends foo %}", {'foo': 'test02'}, '1234'),
# Two-level with one block defined, one block not defined
'test07': ("{% extends 'test01' %}{% block second %}5{% endblock %}", {}, '1_35'),
# Three-level with one block defined on this level, two blocks defined next level
'test08': ("{% extends 'test02' %}{% block second %}5{% endblock %}", {}, '1235'),
# Three-level with second and third levels blank
'test09': ("{% extends 'test04' %}", {}, '1_3_'),
# Three-level with space NOT in a block -- should be ignored
'test10': ("{% extends 'test04' %} ", {}, '1_3_'),
# Three-level with both blocks defined on this level, but none on second level
'test11': ("{% extends 'test04' %}{% block first %}2{% endblock %}{% block second %}4{% endblock %}", {}, '1234'),
# Three-level with this level providing one and second level providing the other
'test12': ("{% extends 'test07' %}{% block first %}2{% endblock %}", {}, '1235'),
# Three-level with this level overriding second level
'test13': ("{% extends 'test02' %}{% block first %}a{% endblock %}{% block second %}b{% endblock %}", {}, '1a3b'),
# A block defined only in a child template shouldn't be displayed
'test14': ("{% extends 'test01' %}{% block newblock %}NO DISPLAY{% endblock %}", {}, '1_3_'),
# A block within another block
'test15': ("{% extends 'test01' %}{% block first %}2{% block inner %}inner{% endblock %}{% endblock %}", {}, '12inner3_'),
# A block within another block (level 2)
'test16': ("{% extends 'test15' %}{% block inner %}out{% endblock %}", {}, '12out3_'),
# {% load %} tag (parent -- setup for test-exception04)
'test17': ("{% load polls.polls %}{% block first %}1234{% endblock %}", {}, '1234'),
# {% load %} tag (standard usage, without inheritance)
'test18': ("{% load polls.polls %}{% voteratio choice poll 400 %}5678", {}, '05678'),
# {% load %} tag (within a child template)
'test19': ("{% extends 'test01' %}{% block first %}{% load polls.polls %}{% voteratio choice poll 400 %}5678{% endblock %}", {}, '1056783_'),
# Raise exception for invalid template name
'test-exception01': ("{% extends 'nonexistent' %}", {}, template.TemplateSyntaxError),
# Raise exception for invalid template name (in variable)
'test-exception02': ("{% extends nonexistent %}", {}, template.TemplateSyntaxError),
# Raise exception for extra {% extends %} tags
'test-exception03': ("{% extends 'test01' %}{% block first %}2{% endblock %}{% extends 'test16' %}", {}, template.TemplateSyntaxError),
# Raise exception for custom tags used in child with {% load %} tag in parent, not in child
'test-exception04': ("{% extends 'test17' %}{% block first %}{% votegraph choice poll 400 %}5678{% endblock %}", {}, template.TemplateSyntaxError),
}
# This replaces the standard template_loader.
def test_template_loader(template_name):
try:
return TEMPLATE_TESTS[template_name][0]
except KeyError:
raise template.TemplateDoesNotExist, template_name
template_loader.load_template_source = test_template_loader
def run_tests():
tests = TEMPLATE_TESTS.items()
tests.sort()
for name, vals in tests:
try:
output = template_loader.get_template(name).render(template.Context(vals[1]))
except Exception, e:
if e.__class__ == vals[2]:
print "%s -- Passed" % name
else:
print "%s -- FAILED. Got %s, exception: %s" % (name, e.__class__, e)
continue
if output == vals[2]:
print "%s -- Passed" % name
else:
print "%s -- FAILED. Expected %r, got %r" % (name, vals[2], output)
if __name__ == "__main__":
run_tests()