Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 1 | # -*- 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 | |
| 17 | CAPITALIZE = '''{{ "foo bar"|capitalize }}''' |
| 18 | CENTER = '''{{ "foo"|center(9) }}''' |
| 19 | DEFAULT = '''{{ missing|default("no") }}|{{ false|default('no') }}|\ |
| 20 | {{ false|default('no', true) }}|{{ given|default("no") }}''' |
| 21 | DICTSORT = '''{{ foo|dictsort }}|\ |
| 22 | {{ foo|dictsort(true) }}|\ |
| 23 | {{ foo|dictsort(false, 'value') }}''' |
Armin Ronacher | 2158091 | 2007-04-17 17:13:10 +0200 | [diff] [blame] | 24 | BATCH = '''{{ foo|batch(3) }}|{{ foo|batch(3, 'X') }}''' |
| 25 | SLICE = '''{{ foo|slice(3) }}|{{ foo|slice(3, 'X') }}''' |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 26 | ESCAPE = '''{{ '<">&'|escape }}|{{ '<">&'|escape(true) }}''' |
Armin Ronacher | 2158091 | 2007-04-17 17:13:10 +0200 | [diff] [blame] | 27 | STRIPTAGS = '''{{ foo|striptags }}''' |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 28 | FILESIZEFORMAT = '{{ 100|filesizeformat }}|\ |
| 29 | {{ 1000|filesizeformat }}|\ |
| 30 | {{ 1000000|filesizeformat }}|\ |
| 31 | {{ 1000000000|filesizeformat }}|\ |
| 32 | {{ 1000000000000|filesizeformat }}' |
| 33 | FIRST = '''{{ foo|first }}''' |
| 34 | FLOAT = '''{{ "42"|float }}|{{ "ajsghasjgd"|float }}|{{ "32.32"|float }}''' |
Armin Ronacher | 0b66657 | 2007-03-18 23:15:23 +0100 | [diff] [blame] | 35 | FORMAT = '''{{ "%s|%s"|format("a", "b") }}''' |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 36 | INDENT = '''{{ foo|indent(2) }}|{{ foo|indent(2, true) }}''' |
| 37 | INT = '''{{ "42"|int }}|{{ "ajsghasjgd"|int }}|{{ "32.32"|int }}''' |
| 38 | JOIN = '''{{ [1, 2, 3]|join("|") }}''' |
| 39 | LAST = '''{{ foo|last }}''' |
| 40 | LENGTH = '''{{ "hello world"|length }}''' |
| 41 | LOWER = '''{{ "FOO"|lower }}''' |
| 42 | PPRINT = '''{{ data|pprint }}''' |
| 43 | RANDOM = '''{{ seq|random }}''' |
| 44 | REVERSE = '''{{ "foobar"|reverse }}|{{ [1, 2, 3]|reverse }}''' |
| 45 | STRING = '''{{ range(10)|string }}''' |
| 46 | TITLE = '''{{ "foo bar"|title }}''' |
Armin Ronacher | 566295e | 2007-03-19 13:19:34 +0100 | [diff] [blame] | 47 | TRIM = '''{{ " foo "|trim }}''' |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 48 | TRUNCATE = '''{{ data|truncate(15, true, ">>>") }}|\ |
| 49 | {{ data|truncate(15, false, ">>>") }}|\ |
| 50 | {{ smalldata|truncate(15) }}''' |
| 51 | UPPER = '''{{ "foo"|upper }}''' |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 52 | URLIZE = '''{{ "foo http://www.example.com/ bar"|urlize }}''' |
| 53 | WORDCOUNT = '''{{ "foo bar baz"|wordcount }}''' |
Armin Ronacher | c1e3040 | 2007-03-18 22:41:09 +0100 | [diff] [blame] | 54 | BLOCK = '''{% filter lower|escape %}<HEHE>{% endfilter %}''' |
| 55 | CHAINING = '''{{ ['<foo>', '<bar>']|first|upper|escape }}''' |
Armin Ronacher | 2158091 | 2007-04-17 17:13:10 +0200 | [diff] [blame] | 56 | SUM = '''{{ [1, 2, 3, 4, 5, 6]|sum }}''' |
| 57 | ABS = '''{{ -1|abs }}|{{ 1|abs }}''' |
| 58 | ROUND = '''{{ 2.7|round }}|{{ 2.1|round }}|\ |
| 59 | {{ 2.1234|round(2, 'floor') }}|{{ 2.1|round(0, 'ceil') }}''' |
| 60 | XMLATTR = '''{{ {'foo': 42, 'bar': 23, 'fish': none, |
| 61 | 'spam': missing, 'blub:blub': '<?>'}|xmlattr }}''' |
Armin Ronacher | 9bcd411 | 2007-05-29 14:17:24 +0200 | [diff] [blame] | 62 | SORT = '''{{ [2, 3, 1]|sort }}|{{ [2, 3, 1]|sort(true) }}''' |
Armin Ronacher | e39a5d2 | 2007-06-23 21:11:53 +0200 | [diff] [blame] | 63 | GROUPBY = '''{{ [{'foo': 1, 'bar': 2}, |
| 64 | {'foo': 2, 'bar': 3}, |
| 65 | {'foo': 1, 'bar': 1}, |
| 66 | {'foo': 3, 'bar': 4}]|groupby('foo') }}''' |
Armin Ronacher | 41883c2 | 2007-09-09 01:11:24 +0200 | [diff] [blame] | 67 | FILTERTAG = '''{% filter upper|replace('FOO', 'foo') %}foobar{% endfilter %}''' |
Armin Ronacher | 9bcd411 | 2007-05-29 14:17:24 +0200 | [diff] [blame] | 68 | |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 69 | |
| 70 | |
| 71 | def test_capitalize(env): |
| 72 | tmpl = env.from_string(CAPITALIZE) |
| 73 | assert tmpl.render() == 'Foo bar' |
| 74 | |
| 75 | |
| 76 | def test_center(env): |
| 77 | tmpl = env.from_string(CENTER) |
| 78 | assert tmpl.render() == ' foo ' |
| 79 | |
| 80 | |
| 81 | def test_default(env): |
| 82 | tmpl = env.from_string(DEFAULT) |
| 83 | assert tmpl.render(given='yes') == 'no|False|no|yes' |
| 84 | |
| 85 | |
| 86 | def 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 Ronacher | 2158091 | 2007-04-17 17:13:10 +0200 | [diff] [blame] | 94 | def 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 | |
| 101 | def 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 Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 108 | def test_escape(env): |
| 109 | tmpl = env.from_string(ESCAPE) |
| 110 | out = tmpl.render() |
Christoph Hack | e9e43bb | 2008-04-13 23:35:48 +0200 | [diff] [blame] | 111 | assert out == '<">&|<">&' |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 112 | |
| 113 | |
Armin Ronacher | 2158091 | 2007-04-17 17:13:10 +0200 | [diff] [blame] | 114 | def test_striptags(env): |
| 115 | tmpl = env.from_string(STRIPTAGS) |
| 116 | out = tmpl.render(foo=' <p>just a small \n <a href="#">' |
Armin Ronacher | 9bcd411 | 2007-05-29 14:17:24 +0200 | [diff] [blame] | 117 | 'example</a> link</p>\n<p>to a webpage</p> ' |
| 118 | '<!-- <p>and some commented stuff</p> -->') |
Armin Ronacher | 2158091 | 2007-04-17 17:13:10 +0200 | [diff] [blame] | 119 | assert out == 'just a small example link to a webpage' |
| 120 | |
| 121 | |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 122 | def 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 | |
| 128 | def test_first(env): |
| 129 | tmpl = env.from_string(FIRST) |
| 130 | out = tmpl.render(foo=range(10)) |
| 131 | assert out == '0' |
| 132 | |
| 133 | |
| 134 | def 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 Ronacher | 0b66657 | 2007-03-18 23:15:23 +0100 | [diff] [blame] | 140 | def test_format(env): |
| 141 | tmpl = env.from_string(FORMAT) |
| 142 | out = tmpl.render() |
| 143 | assert out == 'a|b' |
| 144 | |
| 145 | |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 146 | def 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 | |
| 154 | def test_int(env): |
| 155 | tmpl = env.from_string(INT) |
| 156 | out = tmpl.render() |
| 157 | assert out == '42|0|32' |
| 158 | |
| 159 | |
| 160 | def test_join(env): |
| 161 | tmpl = env.from_string(JOIN) |
| 162 | out = tmpl.render() |
| 163 | assert out == '1|2|3' |
| 164 | |
| 165 | |
| 166 | def test_last(env): |
| 167 | tmpl = env.from_string(LAST) |
| 168 | out = tmpl.render(foo=range(10)) |
| 169 | assert out == '9' |
| 170 | |
| 171 | |
| 172 | def test_length(env): |
| 173 | tmpl = env.from_string(LENGTH) |
| 174 | out = tmpl.render() |
| 175 | assert out == '11' |
| 176 | |
| 177 | |
| 178 | def test_lower(env): |
| 179 | tmpl = env.from_string(LOWER) |
| 180 | out = tmpl.render() |
| 181 | assert out == 'foo' |
| 182 | |
| 183 | |
| 184 | def test_pprint(env): |
| 185 | from pprint import pformat |
| 186 | tmpl = env.from_string(PPRINT) |
Christoph Hack | e9e43bb | 2008-04-13 23:35:48 +0200 | [diff] [blame] | 187 | data = range(1000) |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 188 | assert tmpl.render(data=data) == pformat(data) |
| 189 | |
| 190 | |
| 191 | def 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 | |
| 198 | def test_reverse(env): |
| 199 | tmpl = env.from_string(REVERSE) |
| 200 | assert tmpl.render() == 'raboof|[3, 2, 1]' |
| 201 | |
| 202 | |
| 203 | def test_string(env): |
| 204 | tmpl = env.from_string(STRING) |
Christoph Hack | 8090986 | 2008-04-14 01:35:10 +0200 | [diff] [blame^] | 205 | assert tmpl.render(foo=range(10)) == unicode(xrange(10)) |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 206 | |
| 207 | |
| 208 | def test_title(env): |
| 209 | tmpl = env.from_string(TITLE) |
| 210 | assert tmpl.render() == "Foo Bar" |
| 211 | |
| 212 | |
| 213 | def test_truncate(env): |
| 214 | tmpl = env.from_string(TRUNCATE) |
Armin Ronacher | 566295e | 2007-03-19 13:19:34 +0100 | [diff] [blame] | 215 | assert tmpl.render() == 'foo' |
| 216 | |
| 217 | |
| 218 | def test_truncate(env): |
| 219 | tmpl = env.from_string(TRUNCATE) |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 220 | 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 | |
| 225 | def test_upper(env): |
| 226 | tmpl = env.from_string(UPPER) |
| 227 | assert tmpl.render() == 'FOO' |
| 228 | |
| 229 | |
Armin Ronacher | ab45b84 | 2007-03-18 20:47:50 +0100 | [diff] [blame] | 230 | def 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 | |
| 236 | def test_wordcount(env): |
| 237 | tmpl = env.from_string(WORDCOUNT) |
| 238 | assert tmpl.render() == '3' |
Armin Ronacher | c1e3040 | 2007-03-18 22:41:09 +0100 | [diff] [blame] | 239 | |
| 240 | |
| 241 | def test_block(env): |
| 242 | tmpl = env.from_string(BLOCK) |
| 243 | assert tmpl.render() == '<hehe>' |
| 244 | |
| 245 | |
| 246 | def test_chaining(env): |
| 247 | tmpl = env.from_string(CHAINING) |
| 248 | assert tmpl.render() == '<FOO>' |
Armin Ronacher | 2158091 | 2007-04-17 17:13:10 +0200 | [diff] [blame] | 249 | |
| 250 | |
| 251 | def test_sum(env): |
| 252 | tmpl = env.from_string(SUM) |
| 253 | assert tmpl.render() == '21' |
| 254 | |
| 255 | |
| 256 | def test_abs(env): |
| 257 | tmpl = env.from_string(ABS) |
| 258 | return tmpl.render() == '1|1' |
| 259 | |
| 260 | |
| 261 | def test_round(env): |
| 262 | tmpl = env.from_string(ROUND) |
| 263 | return tmpl.render() == '3.0|2.0|2.1|3.0' |
| 264 | |
| 265 | |
| 266 | def 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="<?>"' in out |
Armin Ronacher | 9bcd411 | 2007-05-29 14:17:24 +0200 | [diff] [blame] | 273 | |
| 274 | |
| 275 | def test_sort(env): |
| 276 | tmpl = env.from_string(SORT) |
| 277 | assert tmpl.render() == '[1, 2, 3]|[3, 2, 1]' |
Armin Ronacher | e39a5d2 | 2007-06-23 21:11:53 +0200 | [diff] [blame] | 278 | |
| 279 | |
| 280 | def 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 Ronacher | 41883c2 | 2007-09-09 01:11:24 +0200 | [diff] [blame] | 287 | |
| 288 | |
| 289 | def test_filtertag(env): |
| 290 | tmpl = env.from_string(FILTERTAG) |
| 291 | assert tmpl.render() == 'fooBAR' |