From f034c79cbc4f1a235e53d4ec666885ab8e9af8d9 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Tue, 2 Mar 2010 07:42:51 +0000 Subject: Fixed #6510 -- Refactored the way child nodes are found in template nodes to avoid potential inconsistencies. Thanks to SmileyChris for the patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@12654 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/regressiontests/templates/nodelist.py | 30 +++++++++++++++++++++++++++++ tests/regressiontests/templates/tests.py | 27 ++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 tests/regressiontests/templates/nodelist.py (limited to 'tests') diff --git a/tests/regressiontests/templates/nodelist.py b/tests/regressiontests/templates/nodelist.py new file mode 100644 index 0000000000..89fac97c66 --- /dev/null +++ b/tests/regressiontests/templates/nodelist.py @@ -0,0 +1,30 @@ +from unittest import TestCase +from django.template.loader import get_template_from_string +from django.template import VariableNode + + +class NodelistTest(TestCase): + + def test_for(self): + source = '{% for i in 1 %}{{ a }}{% endfor %}' + template = get_template_from_string(source) + vars = template.nodelist.get_nodes_by_type(VariableNode) + self.assertEqual(len(vars), 1) + + def test_if(self): + source = '{% if x %}{{ a }}{% endif %}' + template = get_template_from_string(source) + vars = template.nodelist.get_nodes_by_type(VariableNode) + self.assertEqual(len(vars), 1) + + def test_ifequal(self): + source = '{% ifequal x y %}{{ a }}{% endifequal %}' + template = get_template_from_string(source) + vars = template.nodelist.get_nodes_by_type(VariableNode) + self.assertEqual(len(vars), 1) + + def test_ifchanged(self): + source = '{% ifchanged x %}{{ a }}{% endifchanged %}' + template = get_template_from_string(source) + vars = template.nodelist.get_nodes_by_type(VariableNode) + self.assertEqual(len(vars), 1) diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 31c9e249a9..0d283dd9b7 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -24,6 +24,7 @@ from context import context_tests from custom import custom_filters from parser import token_parsing, filter_parsing, variable_parsing from unicode import unicode_tests +from nodelist import NodelistTest from smartif import * try: @@ -886,6 +887,32 @@ class Templates(unittest.TestCase): # Inheritance from a template with a space in its name should work. 'inheritance29': ("{% extends 'inheritance 28' %}", {}, '!'), + # Base template, putting block in a conditional {% if %} tag + 'inheritance30': ("1{% if optional %}{% block opt %}2{% endblock %}{% endif %}3", {'optional': True}, '123'), + + # Inherit from a template with block wrapped in an {% if %} tag (in parent), still gets overridden + 'inheritance31': ("{% extends 'inheritance30' %}{% block opt %}two{% endblock %}", {'optional': True}, '1two3'), + 'inheritance32': ("{% extends 'inheritance30' %}{% block opt %}two{% endblock %}", {}, '13'), + + # Base template, putting block in a conditional {% ifequal %} tag + 'inheritance33': ("1{% ifequal optional 1 %}{% block opt %}2{% endblock %}{% endifequal %}3", {'optional': 1}, '123'), + + # Inherit from a template with block wrapped in an {% ifequal %} tag (in parent), still gets overridden + 'inheritance34': ("{% extends 'inheritance33' %}{% block opt %}two{% endblock %}", {'optional': 1}, '1two3'), + 'inheritance35': ("{% extends 'inheritance33' %}{% block opt %}two{% endblock %}", {'optional': 2}, '13'), + + # Base template, putting block in a {% for %} tag + 'inheritance36': ("{% for n in numbers %}_{% block opt %}{{ n }}{% endblock %}{% endfor %}_", {'numbers': '123'}, '_1_2_3_'), + + # Inherit from a template with block wrapped in an {% for %} tag (in parent), still gets overridden + 'inheritance37': ("{% extends 'inheritance36' %}{% block opt %}X{% endblock %}", {'numbers': '123'}, '_X_X_X_'), + 'inheritance38': ("{% extends 'inheritance36' %}{% block opt %}X{% endblock %}", {}, '_'), + + # The super block will still be found. + 'inheritance39': ("{% extends 'inheritance30' %}{% block opt %}new{{ block.super }}{% endblock %}", {'optional': True}, '1new23'), + 'inheritance40': ("{% extends 'inheritance33' %}{% block opt %}new{{ block.super }}{% endblock %}", {'optional': 1}, '1new23'), + 'inheritance41': ("{% extends 'inheritance36' %}{% block opt %}new{{ block.super }}{% endblock %}", {'numbers': '123'}, '_new1_new2_new3_'), + ### I18N ################################################################## # {% spaceless %} tag -- cgit v1.3