Automated merge with ssh://team@pocoo.org/jinja2-main
[jinja2.git] / tests / test_filters.py
index 7a7ea9f09f32cf72b6b73c952b1515ecdacd7d57..f70bb4c7be19d5dda9b931b58ff8fc892af11325 100644 (file)
@@ -3,16 +3,11 @@
     unit test for the filters
     ~~~~~~~~~~~~~~~~~~~~~~~~~
 
-    Missing tests:
-
-    -   wordcount
-    -   rst
-    -   markdown
-    -   textile
-
-    :copyright: 2007 by Armin Ronacher.
+    :copyright: 2008 by Armin Ronacher.
     :license: BSD, see LICENSE for more details.
 """
+from jinja2 import Markup, Environment
+
 
 CAPITALIZE = '''{{ "foo bar"|capitalize }}'''
 CENTER = '''{{ "foo"|center(9) }}'''
@@ -21,15 +16,20 @@ DEFAULT = '''{{ missing|default("no") }}|{{ false|default('no') }}|\
 DICTSORT = '''{{ foo|dictsort }}|\
 {{ foo|dictsort(true) }}|\
 {{ foo|dictsort(false, 'value') }}'''
-BATCH = '''{{ foo|batch(3) }}|{{ foo|batch(3, 'X') }}'''
-SLICE = '''{{ foo|slice(3) }}|{{ foo|slice(3, 'X') }}'''
-ESCAPE = '''{{ '<">&'|escape }}|{{ '<">&'|escape(true) }}'''
+BATCH = '''{{ foo|batch(3)|list }}|{{ foo|batch(3, 'X')|list }}'''
+SLICE = '''{{ foo|slice(3)|list }}|{{ foo|slice(3, 'X')|list }}'''
+ESCAPE = '''{{ '<">&'|escape }}'''
 STRIPTAGS = '''{{ foo|striptags }}'''
 FILESIZEFORMAT = '{{ 100|filesizeformat }}|\
 {{ 1000|filesizeformat }}|\
 {{ 1000000|filesizeformat }}|\
 {{ 1000000000|filesizeformat }}|\
-{{ 1000000000000|filesizeformat }}'
+{{ 1000000000000|filesizeformat }}|\
+{{ 100|filesizeformat(true) }}|\
+{{ 1000|filesizeformat(true) }}|\
+{{ 1000000|filesizeformat(true) }}|\
+{{ 1000000000|filesizeformat(true) }}|\
+{{ 1000000000000|filesizeformat(true) }}'
 FIRST = '''{{ foo|first }}'''
 FLOAT = '''{{ "42"|float }}|{{ "ajsghasjgd"|float }}|{{ "32.32"|float }}'''
 FORMAT = '''{{ "%s|%s"|format("a", "b") }}'''
@@ -41,7 +41,7 @@ LENGTH = '''{{ "hello world"|length }}'''
 LOWER = '''{{ "FOO"|lower }}'''
 PPRINT = '''{{ data|pprint }}'''
 RANDOM = '''{{ seq|random }}'''
-REVERSE = '''{{ "foobar"|reverse }}|{{ [1, 2, 3]|reverse }}'''
+REVERSE = '''{{ "foobar"|reverse|join }}|{{ [1, 2, 3]|reverse|list }}'''
 STRING = '''{{ range(10)|string }}'''
 TITLE = '''{{ "foo bar"|title }}'''
 TRIM = '''{{ "      foo       "|trim }}'''
@@ -60,12 +60,14 @@ ROUND = '''{{ 2.7|round }}|{{ 2.1|round }}|\
 XMLATTR = '''{{ {'foo': 42, 'bar': 23, 'fish': none,
 'spam': missing, 'blub:blub': '<?>'}|xmlattr }}'''
 SORT = '''{{ [2, 3, 1]|sort }}|{{ [2, 3, 1]|sort(true) }}'''
-GROUPBY = '''{{ [{'foo': 1, 'bar': 2},
+GROUPBY = '''{% for grouper, list in [{'foo': 1, 'bar': 2},
                  {'foo': 2, 'bar': 3},
                  {'foo': 1, 'bar': 1},
-                 {'foo': 3, 'bar': 4}]|groupby('foo') }}'''
+                 {'foo': 3, 'bar': 4}]|groupby('foo') -%}
+{{ grouper }}: {{ list|join(', ') }}
+{% endfor %}'''
 FILTERTAG = '''{% filter upper|replace('FOO', 'foo') %}foobar{% endfilter %}'''
-
+SORT = '''{{ ['foo', 'Bar', 'blah']|sort }}'''
 
 
 def test_capitalize(env):
@@ -108,7 +110,7 @@ def test_slice(env):
 def test_escape(env):
     tmpl = env.from_string(ESCAPE)
     out = tmpl.render()
-    assert out == '&lt;&quot;&gt;&amp;|&lt;&quot;&gt;&amp;'
+    assert out == '&lt;&#34;&gt;&amp;'
 
 
 def test_striptags(env):
@@ -122,7 +124,10 @@ def test_striptags(env):
 def test_filesizeformat(env):
     tmpl = env.from_string(FILESIZEFORMAT)
     out = tmpl.render()
-    assert out == '100 Bytes|1000 Bytes|976.6 KB|953.7 MB|931.3 GB'
+    assert out == (
+        '100 Bytes|1.0 KB|1.0 MB|1.0 GB|1000.0 GB|'
+        '100 Bytes|1000 Bytes|976.6 KiB|953.7 MiB|931.3 GiB'
+    )
 
 
 def test_first(env):
@@ -162,6 +167,10 @@ def test_join(env):
     out = tmpl.render()
     assert out == '1|2|3'
 
+    env2 = Environment(autoescape=True)
+    tmpl = env2.from_string('{{ ["<foo>", "<span>foo</span>"|safe]|join }}')
+    assert tmpl.render() == '&lt;foo&gt;<span>foo</span>'
+
 
 def test_last(env):
     tmpl = env.from_string(LAST)
@@ -279,13 +288,44 @@ def test_sort(env):
 
 def test_groupby(env):
     tmpl = env.from_string(GROUPBY)
-    assert tmpl.render() == (
-        "[{'list': [{'foo': 1, 'bar': 2}, {'foo': 1, 'bar': 1}], "
-        "'grouper': 1}, {'list': [{'foo': 2, 'bar': 3}], 'grouper': 2}, "
-        "{'list': [{'foo': 3, 'bar': 4}], 'grouper': 3}]"
-    )
+    assert tmpl.render().splitlines() == [
+        "1: {'foo': 1, 'bar': 2}, {'foo': 1, 'bar': 1}",
+        "2: {'foo': 2, 'bar': 3}",
+        "3: {'foo': 3, 'bar': 4}"
+    ]
 
 
 def test_filtertag(env):
     tmpl = env.from_string(FILTERTAG)
     assert tmpl.render() == 'fooBAR'
+
+
+def test_replace():
+    env = Environment()
+    tmpl = env.from_string('{{ string|replace("o", 42) }}')
+    assert tmpl.render(string='<foo>') == '<f4242>'
+
+    env = Environment(autoescape=True)
+    tmpl = env.from_string('{{ string|replace("o", 42) }}')
+    assert tmpl.render(string='<foo>') == '&lt;f4242&gt;'
+    tmpl = env.from_string('{{ string|replace("<", 42) }}')
+    assert tmpl.render(string='<foo>') == '42foo&gt;'
+    tmpl = env.from_string('{{ string|replace("o", ">x<") }}')
+    assert tmpl.render(string=Markup('foo')) == 'f&gt;x&lt;&gt;x&lt;'
+
+
+def test_forceescape(env):
+    tmpl = env.from_string('{{ x|forceescape }}')
+    assert tmpl.render(x=Markup('<div />')) == u'&lt;div /&gt;'
+
+
+def test_safe():
+    env = Environment(autoescape=True)
+    tmpl = env.from_string('{{ "<div>foo</div>"|safe }}')
+    assert tmpl.render() == '<div>foo</div>'
+    tmpl = env.from_string('{{ "<div>foo</div>" }}')
+    assert tmpl.render() == '&lt;div&gt;foo&lt;/div&gt;'
+
+
+def test_sort(env):
+    assert env.from_string(SORT).render() == "['Bar', 'blah', 'foo']"