blob: 824346e876a33a2cbefb4571100e20995ab67a00 [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 Ronacherc9705c22008-04-27 21:28:03 +020063GROUPBY = '''{% for grouper, list in [{'foo': 1, 'bar': 2},
Armin Ronachere39a5d22007-06-23 21:11:53 +020064 {'foo': 2, 'bar': 3},
65 {'foo': 1, 'bar': 1},
Armin Ronacherc9705c22008-04-27 21:28:03 +020066 {'foo': 3, 'bar': 4}]|groupby('foo') -%}
67{{ grouper }}: {{ list|join(', ') }}
68{% endfor %}'''
Armin Ronacher41883c22007-09-09 01:11:24 +020069FILTERTAG = '''{% filter upper|replace('FOO', 'foo') %}foobar{% endfilter %}'''
Armin Ronacher9bcd4112007-05-29 14:17:24 +020070
Armin Ronacherab45b842007-03-18 20:47:50 +010071
72
73def test_capitalize(env):
74 tmpl = env.from_string(CAPITALIZE)
75 assert tmpl.render() == 'Foo bar'
76
77
78def test_center(env):
79 tmpl = env.from_string(CENTER)
80 assert tmpl.render() == ' foo '
81
82
83def test_default(env):
84 tmpl = env.from_string(DEFAULT)
85 assert tmpl.render(given='yes') == 'no|False|no|yes'
86
87
88def test_dictsort(env):
89 tmpl = env.from_string(DICTSORT)
90 out = tmpl.render(foo={"a": 0, "b": 1, "c": 2, "A": 3})
91 assert out == ("[('a', 0), ('A', 3), ('b', 1), ('c', 2)]|"
92 "[('A', 3), ('a', 0), ('b', 1), ('c', 2)]|"
93 "[('a', 0), ('b', 1), ('c', 2), ('A', 3)]")
94
95
Armin Ronacher21580912007-04-17 17:13:10 +020096def test_batch(env):
97 tmpl = env.from_string(BATCH)
98 out = tmpl.render(foo=range(10))
99 assert out == ("[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]|"
100 "[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 'X', 'X']]")
101
102
103def test_slice(env):
104 tmpl = env.from_string(SLICE)
105 out = tmpl.render(foo=range(10))
106 assert out == ("[[0, 1, 2, 3], [4, 5, 6], [7, 8, 9]]|"
107 "[[0, 1, 2, 3], [4, 5, 6, 'X'], [7, 8, 9, 'X']]")
108
109
Armin Ronacherab45b842007-03-18 20:47:50 +0100110def test_escape(env):
111 tmpl = env.from_string(ESCAPE)
112 out = tmpl.render()
Armin Ronacherf35e2812008-05-06 16:04:10 +0200113 assert out == '&lt;&#34;&gt;&amp;'
Armin Ronacherab45b842007-03-18 20:47:50 +0100114
115
Armin Ronacher21580912007-04-17 17:13:10 +0200116def test_striptags(env):
117 tmpl = env.from_string(STRIPTAGS)
118 out = tmpl.render(foo=' <p>just a small \n <a href="#">'
Armin Ronacher9bcd4112007-05-29 14:17:24 +0200119 'example</a> link</p>\n<p>to a webpage</p> '
120 '<!-- <p>and some commented stuff</p> -->')
Armin Ronacher21580912007-04-17 17:13:10 +0200121 assert out == 'just a small example link to a webpage'
122
123
Armin Ronacherab45b842007-03-18 20:47:50 +0100124def test_filesizeformat(env):
125 tmpl = env.from_string(FILESIZEFORMAT)
126 out = tmpl.render()
127 assert out == '100 Bytes|1000 Bytes|976.6 KB|953.7 MB|931.3 GB'
128
129
130def test_first(env):
131 tmpl = env.from_string(FIRST)
132 out = tmpl.render(foo=range(10))
133 assert out == '0'
134
135
136def test_float(env):
137 tmpl = env.from_string(FLOAT)
138 out = tmpl.render()
139 assert out == '42.0|0.0|32.32'
140
141
Armin Ronacher0b666572007-03-18 23:15:23 +0100142def test_format(env):
143 tmpl = env.from_string(FORMAT)
144 out = tmpl.render()
145 assert out == 'a|b'
146
147
Armin Ronacherab45b842007-03-18 20:47:50 +0100148def test_indent(env):
149 tmpl = env.from_string(INDENT)
150 text = '\n'.join([' '.join(['foo', 'bar'] * 2)] * 2)
151 out = tmpl.render(foo=text)
152 assert out == 'foo bar foo bar\n foo bar foo bar| ' \
153 'foo bar foo bar\n foo bar foo bar'
154
155
156def test_int(env):
157 tmpl = env.from_string(INT)
158 out = tmpl.render()
159 assert out == '42|0|32'
160
161
162def test_join(env):
163 tmpl = env.from_string(JOIN)
164 out = tmpl.render()
165 assert out == '1|2|3'
166
167
168def test_last(env):
169 tmpl = env.from_string(LAST)
170 out = tmpl.render(foo=range(10))
171 assert out == '9'
172
173
174def test_length(env):
175 tmpl = env.from_string(LENGTH)
176 out = tmpl.render()
177 assert out == '11'
178
179
180def test_lower(env):
181 tmpl = env.from_string(LOWER)
182 out = tmpl.render()
183 assert out == 'foo'
184
185
186def test_pprint(env):
187 from pprint import pformat
188 tmpl = env.from_string(PPRINT)
Christoph Hacke9e43bb2008-04-13 23:35:48 +0200189 data = range(1000)
Armin Ronacherab45b842007-03-18 20:47:50 +0100190 assert tmpl.render(data=data) == pformat(data)
191
192
193def test_random(env):
194 tmpl = env.from_string(RANDOM)
195 seq = range(100)
196 for _ in range(10):
197 assert int(tmpl.render(seq=seq)) in seq
198
199
200def test_reverse(env):
201 tmpl = env.from_string(REVERSE)
202 assert tmpl.render() == 'raboof|[3, 2, 1]'
203
204
205def test_string(env):
206 tmpl = env.from_string(STRING)
Christoph Hack80909862008-04-14 01:35:10 +0200207 assert tmpl.render(foo=range(10)) == unicode(xrange(10))
Armin Ronacherab45b842007-03-18 20:47:50 +0100208
209
210def test_title(env):
211 tmpl = env.from_string(TITLE)
212 assert tmpl.render() == "Foo Bar"
213
214
215def test_truncate(env):
216 tmpl = env.from_string(TRUNCATE)
Armin Ronacher566295e2007-03-19 13:19:34 +0100217 assert tmpl.render() == 'foo'
218
219
220def test_truncate(env):
221 tmpl = env.from_string(TRUNCATE)
Armin Ronacherab45b842007-03-18 20:47:50 +0100222 out = tmpl.render(data='foobar baz bar' * 1000,
223 smalldata='foobar baz bar')
224 assert out == 'foobar baz barf>>>|foobar baz >>>|foobar baz bar'
225
226
227def test_upper(env):
228 tmpl = env.from_string(UPPER)
229 assert tmpl.render() == 'FOO'
230
231
Armin Ronacherab45b842007-03-18 20:47:50 +0100232def test_urlize(env):
233 tmpl = env.from_string(URLIZE)
234 assert tmpl.render() == 'foo <a href="http://www.example.com/">'\
235 'http://www.example.com/</a> bar'
236
237
238def test_wordcount(env):
239 tmpl = env.from_string(WORDCOUNT)
240 assert tmpl.render() == '3'
Armin Ronacherc1e30402007-03-18 22:41:09 +0100241
242
243def test_block(env):
244 tmpl = env.from_string(BLOCK)
245 assert tmpl.render() == '&lt;hehe&gt;'
246
247
248def test_chaining(env):
249 tmpl = env.from_string(CHAINING)
250 assert tmpl.render() == '&lt;FOO&gt;'
Armin Ronacher21580912007-04-17 17:13:10 +0200251
252
253def test_sum(env):
254 tmpl = env.from_string(SUM)
255 assert tmpl.render() == '21'
256
257
258def test_abs(env):
259 tmpl = env.from_string(ABS)
260 return tmpl.render() == '1|1'
261
262
263def test_round(env):
264 tmpl = env.from_string(ROUND)
265 return tmpl.render() == '3.0|2.0|2.1|3.0'
266
267
268def test_xmlattr(env):
269 tmpl = env.from_string(XMLATTR)
270 out = tmpl.render().split()
271 assert len(out) == 3
272 assert 'foo="42"' in out
273 assert 'bar="23"' in out
274 assert 'blub:blub="&lt;?&gt;"' in out
Armin Ronacher9bcd4112007-05-29 14:17:24 +0200275
276
277def test_sort(env):
278 tmpl = env.from_string(SORT)
279 assert tmpl.render() == '[1, 2, 3]|[3, 2, 1]'
Armin Ronachere39a5d22007-06-23 21:11:53 +0200280
281
282def test_groupby(env):
283 tmpl = env.from_string(GROUPBY)
Armin Ronacherc9705c22008-04-27 21:28:03 +0200284 assert tmpl.render().splitlines() == [
285 "1: {'foo': 1, 'bar': 2}, {'foo': 1, 'bar': 1}",
286 "2: {'foo': 2, 'bar': 3}",
287 "3: {'foo': 3, 'bar': 4}"
288 ]
Armin Ronacher41883c22007-09-09 01:11:24 +0200289
290
291def test_filtertag(env):
292 tmpl = env.from_string(FILTERTAG)
293 assert tmpl.render() == 'fooBAR'