blob: 9a1b89dcf8b8c368b94713c0d96a4d3d132b5c8d [file] [log] [blame]
Armin Ronacherab45b842007-03-18 20:47:50 +01001# -*- coding: utf-8 -*-
2"""
3 unit test for the filters
4 ~~~~~~~~~~~~~~~~~~~~~~~~~
5
6 Missing tests:
7
8 - wordcount
9 - rst
10 - markdown
11 - textile
12
13 :copyright: 2007 by Armin Ronacher.
14 :license: BSD, see LICENSE for more details.
15"""
16
17CAPITALIZE = '''{{ "foo bar"|capitalize }}'''
18CENTER = '''{{ "foo"|center(9) }}'''
19DEFAULT = '''{{ missing|default("no") }}|{{ false|default('no') }}|\
20{{ false|default('no', true) }}|{{ given|default("no") }}'''
21DICTSORT = '''{{ foo|dictsort }}|\
22{{ foo|dictsort(true) }}|\
23{{ foo|dictsort(false, 'value') }}'''
Armin Ronacherbe4ae242008-04-18 09:49:08 +020024BATCH = '''{{ foo|batch(3)|list }}|{{ foo|batch(3, 'X')|list }}'''
25SLICE = '''{{ foo|slice(3)|list }}|{{ foo|slice(3, 'X')|list }}'''
26ESCAPE = '''{{ '<">&'|escape }}'''
Armin Ronacher21580912007-04-17 17:13:10 +020027STRIPTAGS = '''{{ foo|striptags }}'''
Armin Ronacherab45b842007-03-18 20:47:50 +010028FILESIZEFORMAT = '{{ 100|filesizeformat }}|\
29{{ 1000|filesizeformat }}|\
30{{ 1000000|filesizeformat }}|\
31{{ 1000000000|filesizeformat }}|\
32{{ 1000000000000|filesizeformat }}'
33FIRST = '''{{ foo|first }}'''
34FLOAT = '''{{ "42"|float }}|{{ "ajsghasjgd"|float }}|{{ "32.32"|float }}'''
Armin Ronacher0b666572007-03-18 23:15:23 +010035FORMAT = '''{{ "%s|%s"|format("a", "b") }}'''
Armin Ronacherab45b842007-03-18 20:47:50 +010036INDENT = '''{{ foo|indent(2) }}|{{ foo|indent(2, true) }}'''
37INT = '''{{ "42"|int }}|{{ "ajsghasjgd"|int }}|{{ "32.32"|int }}'''
38JOIN = '''{{ [1, 2, 3]|join("|") }}'''
39LAST = '''{{ foo|last }}'''
40LENGTH = '''{{ "hello world"|length }}'''
41LOWER = '''{{ "FOO"|lower }}'''
42PPRINT = '''{{ data|pprint }}'''
43RANDOM = '''{{ seq|random }}'''
Armin Ronacherbe4ae242008-04-18 09:49:08 +020044REVERSE = '''{{ "foobar"|reverse|join }}|{{ [1, 2, 3]|reverse|list }}'''
Armin Ronacherab45b842007-03-18 20:47:50 +010045STRING = '''{{ range(10)|string }}'''
46TITLE = '''{{ "foo bar"|title }}'''
Armin Ronacher566295e2007-03-19 13:19:34 +010047TRIM = '''{{ " foo "|trim }}'''
Armin Ronacherab45b842007-03-18 20:47:50 +010048TRUNCATE = '''{{ data|truncate(15, true, ">>>") }}|\
49{{ data|truncate(15, false, ">>>") }}|\
50{{ smalldata|truncate(15) }}'''
51UPPER = '''{{ "foo"|upper }}'''
Armin Ronacherab45b842007-03-18 20:47:50 +010052URLIZE = '''{{ "foo http://www.example.com/ bar"|urlize }}'''
53WORDCOUNT = '''{{ "foo bar baz"|wordcount }}'''
Armin Ronacherc1e30402007-03-18 22:41:09 +010054BLOCK = '''{% filter lower|escape %}<HEHE>{% endfilter %}'''
55CHAINING = '''{{ ['<foo>', '<bar>']|first|upper|escape }}'''
Armin Ronacher21580912007-04-17 17:13:10 +020056SUM = '''{{ [1, 2, 3, 4, 5, 6]|sum }}'''
57ABS = '''{{ -1|abs }}|{{ 1|abs }}'''
58ROUND = '''{{ 2.7|round }}|{{ 2.1|round }}|\
59{{ 2.1234|round(2, 'floor') }}|{{ 2.1|round(0, 'ceil') }}'''
60XMLATTR = '''{{ {'foo': 42, 'bar': 23, 'fish': none,
61'spam': missing, 'blub:blub': '<?>'}|xmlattr }}'''
Armin Ronacher9bcd4112007-05-29 14:17:24 +020062SORT = '''{{ [2, 3, 1]|sort }}|{{ [2, 3, 1]|sort(true) }}'''
Armin Ronachere39a5d22007-06-23 21:11:53 +020063GROUPBY = '''{{ [{'foo': 1, 'bar': 2},
64 {'foo': 2, 'bar': 3},
65 {'foo': 1, 'bar': 1},
66 {'foo': 3, 'bar': 4}]|groupby('foo') }}'''
Armin Ronacher41883c22007-09-09 01:11:24 +020067FILTERTAG = '''{% filter upper|replace('FOO', 'foo') %}foobar{% endfilter %}'''
Armin Ronacher9bcd4112007-05-29 14:17:24 +020068
Armin Ronacherab45b842007-03-18 20:47:50 +010069
70
71def test_capitalize(env):
72 tmpl = env.from_string(CAPITALIZE)
73 assert tmpl.render() == 'Foo bar'
74
75
76def test_center(env):
77 tmpl = env.from_string(CENTER)
78 assert tmpl.render() == ' foo '
79
80
81def test_default(env):
82 tmpl = env.from_string(DEFAULT)
83 assert tmpl.render(given='yes') == 'no|False|no|yes'
84
85
86def test_dictsort(env):
87 tmpl = env.from_string(DICTSORT)
88 out = tmpl.render(foo={"a": 0, "b": 1, "c": 2, "A": 3})
89 assert out == ("[('a', 0), ('A', 3), ('b', 1), ('c', 2)]|"
90 "[('A', 3), ('a', 0), ('b', 1), ('c', 2)]|"
91 "[('a', 0), ('b', 1), ('c', 2), ('A', 3)]")
92
93
Armin Ronacher21580912007-04-17 17:13:10 +020094def test_batch(env):
95 tmpl = env.from_string(BATCH)
96 out = tmpl.render(foo=range(10))
97 assert out == ("[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]|"
98 "[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 'X', 'X']]")
99
100
101def test_slice(env):
102 tmpl = env.from_string(SLICE)
103 out = tmpl.render(foo=range(10))
104 assert out == ("[[0, 1, 2, 3], [4, 5, 6], [7, 8, 9]]|"
105 "[[0, 1, 2, 3], [4, 5, 6, 'X'], [7, 8, 9, 'X']]")
106
107
Armin Ronacherab45b842007-03-18 20:47:50 +0100108def test_escape(env):
109 tmpl = env.from_string(ESCAPE)
110 out = tmpl.render()
Armin Ronacherbe4ae242008-04-18 09:49:08 +0200111 assert out == '&lt;&quot;&gt;&amp;'
Armin Ronacherab45b842007-03-18 20:47:50 +0100112
113
Armin Ronacher21580912007-04-17 17:13:10 +0200114def test_striptags(env):
115 tmpl = env.from_string(STRIPTAGS)
116 out = tmpl.render(foo=' <p>just a small \n <a href="#">'
Armin Ronacher9bcd4112007-05-29 14:17:24 +0200117 'example</a> link</p>\n<p>to a webpage</p> '
118 '<!-- <p>and some commented stuff</p> -->')
Armin Ronacher21580912007-04-17 17:13:10 +0200119 assert out == 'just a small example link to a webpage'
120
121
Armin Ronacherab45b842007-03-18 20:47:50 +0100122def test_filesizeformat(env):
123 tmpl = env.from_string(FILESIZEFORMAT)
124 out = tmpl.render()
125 assert out == '100 Bytes|1000 Bytes|976.6 KB|953.7 MB|931.3 GB'
126
127
128def test_first(env):
129 tmpl = env.from_string(FIRST)
130 out = tmpl.render(foo=range(10))
131 assert out == '0'
132
133
134def test_float(env):
135 tmpl = env.from_string(FLOAT)
136 out = tmpl.render()
137 assert out == '42.0|0.0|32.32'
138
139
Armin Ronacher0b666572007-03-18 23:15:23 +0100140def test_format(env):
141 tmpl = env.from_string(FORMAT)
142 out = tmpl.render()
143 assert out == 'a|b'
144
145
Armin Ronacherab45b842007-03-18 20:47:50 +0100146def test_indent(env):
147 tmpl = env.from_string(INDENT)
148 text = '\n'.join([' '.join(['foo', 'bar'] * 2)] * 2)
149 out = tmpl.render(foo=text)
150 assert out == 'foo bar foo bar\n foo bar foo bar| ' \
151 'foo bar foo bar\n foo bar foo bar'
152
153
154def test_int(env):
155 tmpl = env.from_string(INT)
156 out = tmpl.render()
157 assert out == '42|0|32'
158
159
160def test_join(env):
161 tmpl = env.from_string(JOIN)
162 out = tmpl.render()
163 assert out == '1|2|3'
164
165
166def test_last(env):
167 tmpl = env.from_string(LAST)
168 out = tmpl.render(foo=range(10))
169 assert out == '9'
170
171
172def test_length(env):
173 tmpl = env.from_string(LENGTH)
174 out = tmpl.render()
175 assert out == '11'
176
177
178def test_lower(env):
179 tmpl = env.from_string(LOWER)
180 out = tmpl.render()
181 assert out == 'foo'
182
183
184def test_pprint(env):
185 from pprint import pformat
186 tmpl = env.from_string(PPRINT)
Christoph Hacke9e43bb2008-04-13 23:35:48 +0200187 data = range(1000)
Armin Ronacherab45b842007-03-18 20:47:50 +0100188 assert tmpl.render(data=data) == pformat(data)
189
190
191def test_random(env):
192 tmpl = env.from_string(RANDOM)
193 seq = range(100)
194 for _ in range(10):
195 assert int(tmpl.render(seq=seq)) in seq
196
197
198def test_reverse(env):
199 tmpl = env.from_string(REVERSE)
200 assert tmpl.render() == 'raboof|[3, 2, 1]'
201
202
203def test_string(env):
204 tmpl = env.from_string(STRING)
Christoph Hack80909862008-04-14 01:35:10 +0200205 assert tmpl.render(foo=range(10)) == unicode(xrange(10))
Armin Ronacherab45b842007-03-18 20:47:50 +0100206
207
208def test_title(env):
209 tmpl = env.from_string(TITLE)
210 assert tmpl.render() == "Foo Bar"
211
212
213def test_truncate(env):
214 tmpl = env.from_string(TRUNCATE)
Armin Ronacher566295e2007-03-19 13:19:34 +0100215 assert tmpl.render() == 'foo'
216
217
218def test_truncate(env):
219 tmpl = env.from_string(TRUNCATE)
Armin Ronacherab45b842007-03-18 20:47:50 +0100220 out = tmpl.render(data='foobar baz bar' * 1000,
221 smalldata='foobar baz bar')
222 assert out == 'foobar baz barf>>>|foobar baz >>>|foobar baz bar'
223
224
225def test_upper(env):
226 tmpl = env.from_string(UPPER)
227 assert tmpl.render() == 'FOO'
228
229
Armin Ronacherab45b842007-03-18 20:47:50 +0100230def test_urlize(env):
231 tmpl = env.from_string(URLIZE)
232 assert tmpl.render() == 'foo <a href="http://www.example.com/">'\
233 'http://www.example.com/</a> bar'
234
235
236def test_wordcount(env):
237 tmpl = env.from_string(WORDCOUNT)
238 assert tmpl.render() == '3'
Armin Ronacherc1e30402007-03-18 22:41:09 +0100239
240
241def test_block(env):
242 tmpl = env.from_string(BLOCK)
243 assert tmpl.render() == '&lt;hehe&gt;'
244
245
246def test_chaining(env):
247 tmpl = env.from_string(CHAINING)
248 assert tmpl.render() == '&lt;FOO&gt;'
Armin Ronacher21580912007-04-17 17:13:10 +0200249
250
251def test_sum(env):
252 tmpl = env.from_string(SUM)
253 assert tmpl.render() == '21'
254
255
256def test_abs(env):
257 tmpl = env.from_string(ABS)
258 return tmpl.render() == '1|1'
259
260
261def test_round(env):
262 tmpl = env.from_string(ROUND)
263 return tmpl.render() == '3.0|2.0|2.1|3.0'
264
265
266def test_xmlattr(env):
267 tmpl = env.from_string(XMLATTR)
268 out = tmpl.render().split()
269 assert len(out) == 3
270 assert 'foo="42"' in out
271 assert 'bar="23"' in out
272 assert 'blub:blub="&lt;?&gt;"' in out
Armin Ronacher9bcd4112007-05-29 14:17:24 +0200273
274
275def test_sort(env):
276 tmpl = env.from_string(SORT)
277 assert tmpl.render() == '[1, 2, 3]|[3, 2, 1]'
Armin Ronachere39a5d22007-06-23 21:11:53 +0200278
279
280def test_groupby(env):
281 tmpl = env.from_string(GROUPBY)
282 assert tmpl.render() == (
283 "[{'list': [{'foo': 1, 'bar': 2}, {'foo': 1, 'bar': 1}], "
284 "'grouper': 1}, {'list': [{'foo': 2, 'bar': 3}], 'grouper': 2}, "
285 "{'list': [{'foo': 3, 'bar': 4}], 'grouper': 3}]"
286 )
Armin Ronacher41883c22007-09-09 01:11:24 +0200287
288
289def test_filtertag(env):
290 tmpl = env.from_string(FILTERTAG)
291 assert tmpl.render() == 'fooBAR'