1. from django.template import Context, Engine
    
  2. from django.template.base import TextNode, VariableNode
    
  3. from django.test import SimpleTestCase
    
  4. 
    
  5. 
    
  6. class NodelistTest(SimpleTestCase):
    
  7.     @classmethod
    
  8.     def setUpClass(cls):
    
  9.         cls.engine = Engine()
    
  10.         super().setUpClass()
    
  11. 
    
  12.     def test_for(self):
    
  13.         template = self.engine.from_string("{% for i in 1 %}{{ a }}{% endfor %}")
    
  14.         vars = template.nodelist.get_nodes_by_type(VariableNode)
    
  15.         self.assertEqual(len(vars), 1)
    
  16. 
    
  17.     def test_if(self):
    
  18.         template = self.engine.from_string("{% if x %}{{ a }}{% endif %}")
    
  19.         vars = template.nodelist.get_nodes_by_type(VariableNode)
    
  20.         self.assertEqual(len(vars), 1)
    
  21. 
    
  22.     def test_ifchanged(self):
    
  23.         template = self.engine.from_string("{% ifchanged x %}{{ a }}{% endifchanged %}")
    
  24.         vars = template.nodelist.get_nodes_by_type(VariableNode)
    
  25.         self.assertEqual(len(vars), 1)
    
  26. 
    
  27. 
    
  28. class TextNodeTest(SimpleTestCase):
    
  29.     def test_textnode_repr(self):
    
  30.         engine = Engine()
    
  31.         for temptext, reprtext in [
    
  32.             ("Hello, world!", "<TextNode: 'Hello, world!'>"),
    
  33.             ("One\ntwo.", "<TextNode: 'One\\ntwo.'>"),
    
  34.         ]:
    
  35.             template = engine.from_string(temptext)
    
  36.             texts = template.nodelist.get_nodes_by_type(TextNode)
    
  37.             self.assertEqual(repr(texts[0]), reprtext)
    
  38. 
    
  39. 
    
  40. class ErrorIndexTest(SimpleTestCase):
    
  41.     """
    
  42.     Checks whether index of error is calculated correctly in
    
  43.     template debugger in for loops. Refs ticket #5831
    
  44.     """
    
  45. 
    
  46.     def test_correct_exception_index(self):
    
  47.         tests = [
    
  48.             (
    
  49.                 "{% load bad_tag %}{% for i in range %}{% badsimpletag %}{% endfor %}",
    
  50.                 (38, 56),
    
  51.             ),
    
  52.             (
    
  53.                 "{% load bad_tag %}{% for i in range %}{% for j in range %}"
    
  54.                 "{% badsimpletag %}{% endfor %}{% endfor %}",
    
  55.                 (58, 76),
    
  56.             ),
    
  57.             (
    
  58.                 "{% load bad_tag %}{% for i in range %}{% badsimpletag %}"
    
  59.                 "{% for j in range %}Hello{% endfor %}{% endfor %}",
    
  60.                 (38, 56),
    
  61.             ),
    
  62.             (
    
  63.                 "{% load bad_tag %}{% for i in range %}{% for j in five %}"
    
  64.                 "{% badsimpletag %}{% endfor %}{% endfor %}",
    
  65.                 (38, 57),
    
  66.             ),
    
  67.             (
    
  68.                 "{% load bad_tag %}{% for j in five %}{% badsimpletag %}{% endfor %}",
    
  69.                 (18, 37),
    
  70.             ),
    
  71.         ]
    
  72.         context = Context(
    
  73.             {
    
  74.                 "range": range(5),
    
  75.                 "five": 5,
    
  76.             }
    
  77.         )
    
  78.         engine = Engine(
    
  79.             debug=True, libraries={"bad_tag": "template_tests.templatetags.bad_tag"}
    
  80.         )
    
  81.         for source, expected_error_source_index in tests:
    
  82.             template = engine.from_string(source)
    
  83.             try:
    
  84.                 template.render(context)
    
  85.             except (RuntimeError, TypeError) as e:
    
  86.                 debug = e.template_debug
    
  87.                 self.assertEqual(
    
  88.                     (debug["start"], debug["end"]), expected_error_source_index
    
  89.                 )