blob: 511b1574ec2496e26fd76957361502c6c50707e9 [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
Armin Ronacherba6e25a2008-11-02 15:58:14 +010010from jinja2 import escape, is_undefined
Armin Ronacherccae0552008-10-05 23:08:58 +020011from jinja2.utils import Cycler
Christoph Hacke9e43bb2008-04-13 23:35:48 +020012from jinja2.exceptions import TemplateSyntaxError
Armin Ronacher93e14c22007-03-20 16:17:48 +010013
Rene Leonhardtc7e6c6d2009-04-20 23:08:53 +020014import conftest
15if conftest.NOSE:
16 from nose.tools import assert_raises as raises
17else:
18 from py.test import raises
19
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020020
Armin Ronacher93e14c22007-03-20 16:17:48 +010021UNPACKING = '''{% for a, b, c in [[1, 2, 3]] %}{{ a }}|{{ b }}|{{ c }}{% endfor %}'''
Armin Ronacher93e14c22007-03-20 16:17:48 +010022RAW = '''{% raw %}{{ FOO }} and {% BAR %}{% endraw %}'''
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020023CONST = '''{{ true }}|{{ false }}|{{ none }}|\
24{{ none is defined }}|{{ missing is defined }}'''
Armin Ronacher0a2ac692008-05-13 01:03:08 +020025LOCALSET = '''{% set foo = 0 %}\
26{% for item in [1, 2] %}{% set foo = 1 %}{% endfor %}\
Armin Ronacher1cc232c2007-09-07 17:52:41 +020027{{ foo }}'''
Armin Ronacher0a2ac692008-05-13 01:03:08 +020028CONSTASS1 = '''{% set true = 42 %}'''
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020029CONSTASS2 = '''{% for none in seq %}{% endfor %}'''
Armin Ronacher93e14c22007-03-20 16:17:48 +010030
31
32def test_unpacking(env):
33 tmpl = env.from_string(UNPACKING)
34 assert tmpl.render() == '1|2|3'
35
36
37def test_raw(env):
38 tmpl = env.from_string(RAW)
39 assert tmpl.render() == '{{ FOO }} and {% BAR %}'
40
41
Armin Ronacherecc051b2007-06-01 18:25:28 +020042def test_const(env):
43 tmpl = env.from_string(CONST)
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020044 assert tmpl.render() == 'True|False|None|True|False'
Armin Ronacherecc051b2007-06-01 18:25:28 +020045
46
47def test_const_assign(env):
48 for tmpl in CONSTASS1, CONSTASS2:
Armin Ronacher9f258ff2008-05-24 22:28:52 +020049 raises(TemplateSyntaxError, env.from_string, tmpl)
Armin Ronacher1cc232c2007-09-07 17:52:41 +020050
51
52def test_localset(env):
53 tmpl = env.from_string(LOCALSET)
54 assert tmpl.render() == '0'
Armin Ronacher9f258ff2008-05-24 22:28:52 +020055
56
57def test_markup_leaks():
58 counts = set()
59 for count in xrange(20):
60 for item in xrange(1000):
61 escape("foo")
62 escape("<foo>")
63 escape(u"foo")
64 escape(u"<foo>")
65 counts.add(len(gc.get_objects()))
66 assert len(counts) == 1, 'ouch, c extension seems to leak objects'
Armin Ronacherf15f5f72008-05-26 12:21:45 +020067
68
Armin Ronacher6dc6f292008-06-12 08:50:07 +020069def test_item_and_attribute():
Armin Ronacherf15f5f72008-05-26 12:21:45 +020070 from jinja2 import Environment
71 from jinja2.sandbox import SandboxedEnvironment
72
73 for env in Environment(), SandboxedEnvironment():
74 tmpl = env.from_string('{{ foo.items() }}')
Armin Ronacher6dc6f292008-06-12 08:50:07 +020075 assert tmpl.render(foo={'items': 42}) == "[('items', 42)]"
Armin Ronachere3290ea2008-06-12 10:30:01 +020076 tmpl = env.from_string('{{ foo|attr("items")() }}')
Armin Ronacher6dc6f292008-06-12 08:50:07 +020077 assert tmpl.render(foo={'items': 42}) == "[('items', 42)]"
78 tmpl = env.from_string('{{ foo["items"] }}')
79 assert tmpl.render(foo={'items': 42}) == '42'
Armin Ronacher665bfb82008-07-14 13:41:46 +020080
81
82def test_finalizer():
83 from jinja2 import Environment
84 def finalize_none_empty(value):
85 if value is None:
86 value = u''
87 return value
88 env = Environment(finalize=finalize_none_empty)
89 tmpl = env.from_string('{% for item in seq %}|{{ item }}{% endfor %}')
90 assert tmpl.render(seq=(None, 1, "foo")) == '||1|foo'
91 tmpl = env.from_string('<{{ none }}>')
92 assert tmpl.render() == '<>'
Armin Ronacherccae0552008-10-05 23:08:58 +020093
94
95def test_cycler():
96 items = 1, 2, 3
97 c = Cycler(*items)
98 for item in items + items:
99 assert c.current == item
100 assert c.next() == item
101 c.next()
102 assert c.current == 2
103 c.reset()
104 assert c.current == 1
Armin Ronacherba6e25a2008-11-02 15:58:14 +0100105
106
107def test_expressions(env):
108 expr = env.compile_expression("foo")
109 assert expr() is None
110 assert expr(foo=42) == 42
111 expr2 = env.compile_expression("foo", undefined_to_none=False)
112 assert is_undefined(expr2())
113
114 expr = env.compile_expression("42 + foo")
115 assert expr(foo=42) == 84