test_nodelist.py 3.2 KB

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