added more unittests for various tasks
authorArmin Ronacher <armin.ronacher@active-4.com>
Sat, 24 May 2008 20:28:52 +0000 (22:28 +0200)
committerArmin Ronacher <armin.ronacher@active-4.com>
Sat, 24 May 2008 20:28:52 +0000 (22:28 +0200)
--HG--
branch : trunk

jinja2/tests.py
tests/test_ext.py
tests/test_forloop.py
tests/test_loaders.py
tests/test_lrucache.py
tests/test_tests.py
tests/test_various.py

index 37e6f3127860311d629c14635ba5e2c4c5009c70..6873b5a8f5fc0de9a59c004a4096b6abaaac9231 100644 (file)
@@ -42,14 +42,14 @@ def test_defined(value):
             variable is not defined
         {% endif %}
 
-    See the ``default`` filter for a simple way to set undefined
+    See the :func:`default` filter for a simple way to set undefined
     variables.
     """
     return not isinstance(value, Undefined)
 
 
 def test_undefined(value):
-    """Like `defined` but the other way round."""
+    """Like :func:`defined` but the other way round."""
     return isinstance(value, Undefined)
 
 
index 7da2515a1840896677662be3a32b800bb5a5a18c..d3364bb61a4b7fedcf11c0230cf9b8c0ed9a77ee 100644 (file)
@@ -70,3 +70,11 @@ def test_extension_nodes():
 
 def test_identifier():
     assert TestExtension.identifier == __name__ + '.TestExtension'
+
+
+def test_rebinding():
+    original = Environment(extensions=[TestExtension])
+    overlay = original.overlay()
+    for env in original, overlay:
+        for ext in env.extensions.itervalues():
+            assert ext.environment is env
index 67fb39e5809a4d62b67e00cba149a645d8445b91..b8d3ae610685b1e1ea989c7e50d35791a5ee25a6 100644 (file)
@@ -7,7 +7,7 @@
     :license: BSD, see LICENSE for more details.
 """
 from py.test import raises
-from jinja2.exceptions import UndefinedError
+from jinja2.exceptions import UndefinedError, TemplateSyntaxError
 
 
 SIMPLE = '''{% for item in seq %}{{ item }}{% endfor %}'''
@@ -40,6 +40,8 @@ LOOPFILTER = '''\
 EXTENDEDLOOPFILTER = '''\
 {% for item in range(10) if item is even %}[{{ loop.index
 }}:{{ item }}]{% endfor %}'''
+LOOPUNASSIGNABLE = '''\
+{% for loop in seq %}...{% endfor %}'''
 
 
 def test_simple(env):
@@ -126,3 +128,7 @@ def test_loop_filter(env):
     assert tmpl.render() == '[0][2][4][6][8]'
     tmpl = env.from_string(EXTENDEDLOOPFILTER)
     assert tmpl.render() == '[1:0][2:2][3:4][4:6][5:8]'
+
+
+def test_loop_unassignable(env):
+    raises(TemplateSyntaxError, env.from_string, LOOPUNASSIGNABLE)
index 9cc1dcc06aad2560ac9c40abe6cc6bc4b58d7125..8faf987b03ea7ab8d6c81a604ba057f7b5a17edd 100644 (file)
@@ -11,6 +11,7 @@ from py.test import raises
 import time
 import tempfile
 from jinja2 import Environment, loaders
+from jinja2.loaders import split_template_path
 from jinja2.exceptions import TemplateNotFound
 
 
@@ -101,3 +102,9 @@ def test_caching():
     assert 'one' in env.cache
     assert 'two' not in env.cache
     assert 'three' in env.cache
+
+
+def test_split_template_path():
+    assert split_template_path('foo/bar') == ['foo', 'bar']
+    assert split_template_path('./foo/bar') == ['foo', 'bar']
+    raises(TemplateNotFound, split_template_path, '../foo')
index 6617e5c7eb8f40648cdce3cfb22fdac353ec5667..0f93f7b71febd8e794c5968c3263e3a5af1c14c0 100644 (file)
@@ -11,6 +11,7 @@
 import thread
 import time
 import random
+import pickle
 from jinja2.utils import LRUCache
 
 
@@ -23,3 +24,16 @@ def test_simple():
     d["d"] = 4
     assert len(d) == 3
     assert 'a' in d and 'c' in d and 'd' in d and 'b' not in d
+
+
+def test_pickleable():
+    cache = LRUCache(2)
+    cache["foo"] = 42
+    cache["bar"] = 23
+    cache["foo"]
+
+    for protocol in range(3):
+        copy = pickle.loads(pickle.dumps(cache, protocol))
+        assert copy.capacity == cache.capacity
+        assert copy._mapping == cache._mapping
+        assert copy._queue == cache._queue
index 3943ab451573d3ba70b947447c5e09b80ca0b6ed..c02d0b3299f77908c94c98f82ddc52bd6c5f055e 100644 (file)
@@ -6,6 +6,8 @@
     :copyright: 2007 by Armin Ronacher.
     :license: BSD, see LICENSE for more details.
 """
+from jinja2 import Environment, Markup
+
 
 DEFINED = '''{{ missing is defined }}|{{ true is defined }}'''
 EVEN = '''{{ 1 is even }}|{{ 2 is even }}'''
@@ -17,6 +19,19 @@ SEQUENCE = '''{{ [1, 2, 3] is sequence }}|\
 UPPER = '''{{ "FOO" is upper }}|{{ "foo" is upper }}'''
 SAMEAS = '''{{ foo is sameas false }}|{{ 0 is sameas false }}'''
 NOPARENFORARG1 = '''{{ foo is sameas none }}'''
+TYPECHECKS = '''\
+{{ 42 is undefined }}
+{{ 42 is defined }}
+{{ 42 is none }}
+{{ none is none }}
+{{ 42 is number }}
+{{ 42 is string }}
+{{ "foo" is string }}
+{{ "foo" is sequence }}
+{{ [1] is sequence }}
+{{ range is callable }}
+{{ 42 is callable }}
+{{ range(5) is iterable }}'''
 
 
 def test_defined(env):
@@ -29,14 +44,19 @@ def test_even(env):
     assert tmpl.render() == 'False|True'
 
 
+def test_odd(env):
+    tmpl = env.from_string(ODD)
+    assert tmpl.render() == 'True|False'
+
+
 def test_lower(env):
     tmpl = env.from_string(LOWER)
     assert tmpl.render() == 'True|False'
 
 
-def test_odd(env):
-    tmpl = env.from_string(ODD)
-    assert tmpl.render() == 'True|False'
+def test_typechecks(env):
+    tmpl = env.from_string(TYPECHECKS)
+    assert tmpl.render() == ''
 
 
 def test_sequence(env):
@@ -54,6 +74,20 @@ def test_sameas(env):
     assert tmpl.render(foo=False) == 'True|False'
 
 
+def test_typechecks(env):
+    tmpl = env.from_string(TYPECHECKS)
+    assert tmpl.render() == (
+        'False\nTrue\nFalse\nTrue\nTrue\nFalse\n'
+        'True\nTrue\nTrue\nTrue\nFalse\nTrue'
+    )
+
+
 def test_no_paren_for_arg1(env):
     tmpl = env.from_string(NOPARENFORARG1)
     assert tmpl.render(foo=None) == 'True'
+
+
+def test_escaped():
+    env = Environment(autoescape=True)
+    tmpl = env.from_string('{{ x is escaped }}|{{ y is escaped }}')
+    assert tmpl.render(x='foo', y=Markup('foo')) == 'False|True'
index e81dfc0173533d5e38319aada375630666f7c6a9..147f459d573eb37e51489712e410cc5617f21760 100644 (file)
@@ -6,6 +6,9 @@
     :copyright: 2007 by Armin Ronacher.
     :license: BSD, see LICENSE for more details.
 """
+import gc
+from py.test import raises
+from jinja2 import escape
 from jinja2.exceptions import TemplateSyntaxError
 
 
@@ -37,14 +40,21 @@ def test_const(env):
 
 def test_const_assign(env):
     for tmpl in CONSTASS1, CONSTASS2:
-        try:
-            env.from_string(tmpl)
-        except TemplateSyntaxError:
-            pass
-        else:
-            raise AssertionError('expected syntax error')
+        raises(TemplateSyntaxError, env.from_string, tmpl)
 
 
 def test_localset(env):
     tmpl = env.from_string(LOCALSET)
     assert tmpl.render() == '0'
+
+
+def test_markup_leaks():
+    counts = set()
+    for count in xrange(20):
+        for item in xrange(1000):
+            escape("foo")
+            escape("<foo>")
+            escape(u"foo")
+            escape(u"<foo>")
+        counts.add(len(gc.get_objects()))
+    assert len(counts) == 1, 'ouch, c extension seems to leak objects'