test_nodelist.py 3.1 KB

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