blob: f0c997da1187ebdc24964fdeee6462ec1d0ca9b7 [file] [log] [blame]
Armin Ronacher93e14c22007-03-20 16:17:48 +01001# -*- coding: utf-8 -*-
2"""
3 unit test for various things
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
Armin Ronacher62ccd1b2009-01-04 14:26:19 +01006 :copyright: (c) 2009 by the Jinja Team.
Armin Ronacher93e14c22007-03-20 16:17:48 +01007 :license: BSD, see LICENSE for more details.
8"""
Armin Ronacher9f258ff2008-05-24 22:28:52 +02009import gc
10from py.test import raises
Armin Ronacherba6e25a2008-11-02 15:58:14 +010011from jinja2 import escape, is_undefined
Armin Ronacherccae0552008-10-05 23:08:58 +020012from jinja2.utils import Cycler
Christoph Hacke9e43bb2008-04-13 23:35:48 +020013from jinja2.exceptions import TemplateSyntaxError
Armin Ronacher93e14c22007-03-20 16:17:48 +010014
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020015
Armin Ronacher93e14c22007-03-20 16:17:48 +010016UNPACKING = '''{% for a, b, c in [[1, 2, 3]] %}{{ a }}|{{ b }}|{{ c }}{% endfor %}'''
Armin Ronacher93e14c22007-03-20 16:17:48 +010017RAW = '''{% raw %}{{ FOO }} and {% BAR %}{% endraw %}'''
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020018CONST = '''{{ true }}|{{ false }}|{{ none }}|\
19{{ none is defined }}|{{ missing is defined }}'''
Armin Ronacher0a2ac692008-05-13 01:03:08 +020020LOCALSET = '''{% set foo = 0 %}\
21{% for item in [1, 2] %}{% set foo = 1 %}{% endfor %}\
Armin Ronacher1cc232c2007-09-07 17:52:41 +020022{{ foo }}'''
Armin Ronacher0a2ac692008-05-13 01:03:08 +020023CONSTASS1 = '''{% set true = 42 %}'''
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020024CONSTASS2 = '''{% for none in seq %}{% endfor %}'''
Armin Ronacher93e14c22007-03-20 16:17:48 +010025
26
27def test_unpacking(env):
28 tmpl = env.from_string(UNPACKING)
29 assert tmpl.render() == '1|2|3'
30
31
32def test_raw(env):
33 tmpl = env.from_string(RAW)
34 assert tmpl.render() == '{{ FOO }} and {% BAR %}'
35
36
Armin Ronacherecc051b2007-06-01 18:25:28 +020037def test_const(env):
38 tmpl = env.from_string(CONST)
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020039 assert tmpl.render() == 'True|False|None|True|False'
Armin Ronacherecc051b2007-06-01 18:25:28 +020040
41
42def test_const_assign(env):
43 for tmpl in CONSTASS1, CONSTASS2:
Armin Ronacher9f258ff2008-05-24 22:28:52 +020044 raises(TemplateSyntaxError, env.from_string, tmpl)
Armin Ronacher1cc232c2007-09-07 17:52:41 +020045
46
47def test_localset(env):
48 tmpl = env.from_string(LOCALSET)
49 assert tmpl.render() == '0'
Armin Ronacher9f258ff2008-05-24 22:28:52 +020050
51
52def test_markup_leaks():
53 counts = set()
54 for count in xrange(20):
55 for item in xrange(1000):
56 escape("foo")
57 escape("<foo>")
58 escape(u"foo")
59 escape(u"<foo>")
60 counts.add(len(gc.get_objects()))
61 assert len(counts) == 1, 'ouch, c extension seems to leak objects'
Armin Ronacherf15f5f72008-05-26 12:21:45 +020062
63
Armin Ronacher6dc6f292008-06-12 08:50:07 +020064def test_item_and_attribute():
Armin Ronacherf15f5f72008-05-26 12:21:45 +020065 from jinja2 import Environment
66 from jinja2.sandbox import SandboxedEnvironment
67
68 for env in Environment(), SandboxedEnvironment():
69 tmpl = env.from_string('{{ foo.items() }}')
Armin Ronacher6dc6f292008-06-12 08:50:07 +020070 assert tmpl.render(foo={'items': 42}) == "[('items', 42)]"
Armin Ronachere3290ea2008-06-12 10:30:01 +020071 tmpl = env.from_string('{{ foo|attr("items")() }}')
Armin Ronacher6dc6f292008-06-12 08:50:07 +020072 assert tmpl.render(foo={'items': 42}) == "[('items', 42)]"
73 tmpl = env.from_string('{{ foo["items"] }}')
74 assert tmpl.render(foo={'items': 42}) == '42'
Armin Ronacher665bfb82008-07-14 13:41:46 +020075
76
77def test_finalizer():
78 from jinja2 import Environment
79 def finalize_none_empty(value):
80 if value is None:
81 value = u''
82 return value
83 env = Environment(finalize=finalize_none_empty)
84 tmpl = env.from_string('{% for item in seq %}|{{ item }}{% endfor %}')
85 assert tmpl.render(seq=(None, 1, "foo")) == '||1|foo'
86 tmpl = env.from_string('<{{ none }}>')
87 assert tmpl.render() == '<>'
Armin Ronacherccae0552008-10-05 23:08:58 +020088
89
90def test_cycler():
91 items = 1, 2, 3
92 c = Cycler(*items)
93 for item in items + items:
94 assert c.current == item
95 assert c.next() == item
96 c.next()
97 assert c.current == 2
98 c.reset()
99 assert c.current == 1
Armin Ronacherba6e25a2008-11-02 15:58:14 +0100100
101
102def test_expressions(env):
103 expr = env.compile_expression("foo")
104 assert expr() is None
105 assert expr(foo=42) == 42
106 expr2 = env.compile_expression("foo", undefined_to_none=False)
107 assert is_undefined(expr2())
108
109 expr = env.compile_expression("42 + foo")
110 assert expr(foo=42) == 84