regression.py (5929B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\jinja2\testsuite\regression.py 2 import unittest 3 from jinja2.testsuite import JinjaTestCase 4 from jinja2 import Template, Environment, DictLoader, TemplateSyntaxError, TemplateNotFound, PrefixLoader 5 env = Environment() 6 7 class CornerTestCase(JinjaTestCase): 8 9 def test_assigned_scoping(self): 10 t = env.from_string('\n {%- for item in (1, 2, 3, 4) -%}\n [{{ item }}]\n {%- endfor %}\n {{- item -}}\n ') 11 t = env.from_string('\n {%- for item in (1, 2, 3, 4) -%}\n [{{ item }}]\n {%- endfor %}\n {%- set item = 42 %}\n {{- item -}}\n ') 12 t = env.from_string('\n {%- set item = 42 %}\n {%- for item in (1, 2, 3, 4) -%}\n [{{ item }}]\n {%- endfor %}\n {{- item -}}\n ') 13 14 def test_closure_scoping(self): 15 t = env.from_string('\n {%- set wrapper = "<FOO>" %}\n {%- for item in (1, 2, 3, 4) %}\n {%- macro wrapper() %}[{{ item }}]{% endmacro %}\n {{- wrapper() }}\n {%- endfor %}\n {{- wrapper -}}\n ') 16 t = env.from_string('\n {%- for item in (1, 2, 3, 4) %}\n {%- macro wrapper() %}[{{ item }}]{% endmacro %}\n {{- wrapper() }}\n {%- endfor %}\n {%- set wrapper = "<FOO>" %}\n {{- wrapper -}}\n ') 17 t = env.from_string('\n {%- for item in (1, 2, 3, 4) %}\n {%- macro wrapper() %}[{{ item }}]{% endmacro %}\n {{- wrapper() }}\n {%- endfor %}\n {{- wrapper -}}\n ') 18 19 20 class BugTestCase(JinjaTestCase): 21 22 def test_keyword_folding(self): 23 env = Environment() 24 env.filters['testing'] = lambda value, some: value + some 25 26 def test_extends_output_bugs(self): 27 env = Environment(loader=DictLoader({'parent.html': '(({% block title %}{% endblock %}))'})) 28 t = env.from_string('{% if expr %}{% extends "parent.html" %}{% endif %}[[{% block title %}title{% endblock %}]]{% for item in [1, 2, 3] %}({{ item }}){% endfor %}') 29 30 def test_urlize_filter_escaping(self): 31 tmpl = env.from_string('{{ "http://www.example.org/<foo"|urlize }}') 32 33 def test_loop_call_loop(self): 34 tmpl = env.from_string('\n\n {% macro test() %}\n {{ caller() }}\n {% endmacro %}\n\n {% for num1 in range(5) %}\n {% call test() %}\n {% for num2 in range(10) %}\n {{ loop.index }}\n {% endfor %}\n {% endcall %}\n {% endfor %}\n\n ') 35 36 def test_weird_inline_comment(self): 37 env = Environment(line_statement_prefix='%') 38 self.assert_raises(TemplateSyntaxError, env.from_string, '% for item in seq {# missing #}\n...% endfor') 39 40 def test_old_macro_loop_scoping_bug(self): 41 tmpl = env.from_string('{% for i in (1, 2) %}{{ i }}{% endfor %}{% macro i() %}3{% endmacro %}{{ i() }}') 42 43 def test_partial_conditional_assignments(self): 44 tmpl = env.from_string('{% if b %}{% set a = 42 %}{% endif %}{{ a }}') 45 46 def test_stacked_locals_scoping_bug(self): 47 env = Environment(line_statement_prefix='#') 48 t = env.from_string("# for j in [1, 2]:\n# set x = 1\n# for i in [1, 2]:\n# print x\n# if i % 2 == 0:\n# set x = x + 1\n# endif\n# endfor\n# endfor\n# if a\n# print 'A'\n# elif b\n# print 'B'\n# elif c == d\n# print 'C'\n# else\n# print 'D'\n# endif\n ") 49 50 def test_stacked_locals_scoping_bug_twoframe(self): 51 t = Template('\n {% set x = 1 %}\n {% for item in foo %}\n {% if item == 1 %}\n {% set x = 2 %}\n {% endif %}\n {% endfor %}\n {{ x }}\n ') 52 rv = t.render(foo=[1]).strip() 53 54 def test_call_with_args(self): 55 t = Template('{% macro dump_users(users) -%}\n <ul>\n {%- for user in users -%}\n <li><p>{{ user.username|e }}</p>{{ caller(user) }}</li>\n {%- endfor -%}\n </ul>\n {%- endmacro -%}\n\n {% call(user) dump_users(list_of_user) -%}\n <dl>\n <dl>Realname</dl>\n <dd>{{ user.realname|e }}</dd>\n <dl>Description</dl>\n <dd>{{ user.description }}</dd>\n </dl>\n {% endcall %}') 56 57 def test_empty_if_condition_fails(self): 58 self.assert_raises(TemplateSyntaxError, Template, '{% if %}....{% endif %}') 59 self.assert_raises(TemplateSyntaxError, Template, '{% if foo %}...{% elif %}...{% endif %}') 60 self.assert_raises(TemplateSyntaxError, Template, '{% for x in %}..{% endfor %}') 61 62 def test_recursive_loop_bug(self): 63 tpl1 = Template('\n {% for p in foo recursive%}\n {{p.bar}}\n {% for f in p.fields recursive%}\n {{f.baz}}\n {{p.bar}}\n {% if f.rec %}\n {{ loop(f.sub) }}\n {% endif %}\n {% endfor %}\n {% endfor %}\n ') 64 tpl2 = Template('\n {% for p in foo%}\n {{p.bar}}\n {% for f in p.fields recursive%}\n {{f.baz}}\n {{p.bar}}\n {% if f.rec %}\n {{ loop(f.sub) }}\n {% endif %}\n {% endfor %}\n {% endfor %}\n ') 65 66 def test_correct_prefix_loader_name(self): 67 env = Environment(loader=PrefixLoader({'foo': DictLoader({})})) 68 try: 69 env.get_template('foo/bar.html') 70 except TemplateNotFound as e: 71 pass 72 73 74 def suite(): 75 suite = unittest.TestSuite() 76 suite.addTest(unittest.makeSuite(CornerTestCase)) 77 suite.addTest(unittest.makeSuite(BugTestCase)) 78 return suite