summaryrefslogtreecommitdiff
path: root/tests/test_asyncfilters.py
blob: c5c55b7d3e6fcaa6ff38223d701fcae193618e9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import pytest
from jinja2 import Environment
from jinja2.utils import Markup


async def make_aiter(iter):
    for item in iter:
        yield item


def mark_dualiter(parameter, factory):
    def decorator(f):
        return pytest.mark.parametrize(parameter, [
            lambda: factory(),
            lambda: make_aiter(factory()),
        ])(f)
    return decorator


@pytest.fixture
def env_async():
    return Environment(enable_async=True)


@mark_dualiter('foo', lambda: range(10))
def test_first(env_async, foo):
    tmpl = env_async.from_string('{{ foo()|first }}')
    out = tmpl.render(foo=foo)
    assert out == '0'


@mark_dualiter('items', lambda: [
    {'foo': 1, 'bar': 2},
    {'foo': 2, 'bar': 3},
    {'foo': 1, 'bar': 1},
    {'foo': 3, 'bar': 4}
])
def test_groupby(env_async, items):
    tmpl = env_async.from_string('''
    {%- for grouper, list in items()|groupby('foo') -%}
        {{ grouper }}{% for x in list %}: {{ x.foo }}, {{ x.bar }}{% endfor %}|
    {%- endfor %}''')
    assert tmpl.render(items=items).split('|') == [
        "1: 1, 2: 1, 1",
        "2: 2, 3",
        "3: 3, 4",
        ""
    ]


@mark_dualiter('items', lambda: [('a', 1), ('a', 2), ('b', 1)])
def test_groupby_tuple_index(env_async, items):
    tmpl = env_async.from_string('''
    {%- for grouper, list in items()|groupby(0) -%}
        {{ grouper }}{% for x in list %}:{{ x.1 }}{% endfor %}|
    {%- endfor %}''')
    assert tmpl.render(items=items) == 'a:1:2|b:1|'


def make_articles():
    class Date(object):
        def __init__(self, day, month, year):
            self.day = day
            self.month = month
            self.year = year

    class Article(object):
        def __init__(self, title, *date):
            self.date = Date(*date)
            self.title = title

    return [
        Article('aha', 1, 1, 1970),
        Article('interesting', 2, 1, 1970),
        Article('really?', 3, 1, 1970),
        Article('totally not', 1, 1, 1971)
    ]


@mark_dualiter('articles', make_articles)
def test_groupby_multidot(env_async, articles):
    tmpl = env_async.from_string('''
    {%- for year, list in articles()|groupby('date.year') -%}
        {{ year }}{% for x in list %}[{{ x.title }}]{% endfor %}|
    {%- endfor %}''')
    assert tmpl.render(articles=articles).split('|') == [
        '1970[aha][interesting][really?]',
        '1971[totally not]',
        ''
    ]


@mark_dualiter('int_items', lambda: [1, 2, 3])
def test_join(env_async, int_items):
    tmpl = env_async.from_string('{{ items()|join("|") }}')
    out = tmpl.render(items=int_items)
    assert out == '1|2|3'


@mark_dualiter('string_items', lambda: ["<foo>", Markup("<span>foo</span>")])
def test_join(string_items):
    env2 = Environment(autoescape=True, enable_async=True)
    tmpl = env2.from_string(
        '{{ ["<foo>", "<span>foo</span>"|safe]|join }}')
    assert tmpl.render(items=string_items) == '&lt;foo&gt;<span>foo</span>'


def make_users():
    class User(object):
        def __init__(self, username):
            self.username = username
    return map(User, ['foo', 'bar'])


@mark_dualiter('users', make_users)
def test_join_attribute(env_async, users):
    tmpl = env_async.from_string('''{{ users()|join(', ', 'username') }}''')
    assert tmpl.render(users=users) == 'foo, bar'


@mark_dualiter('items', lambda: [1, 2, 3, 4, 5])
def test_simple_reject(env_async, items):
    tmpl = env_async.from_string('{{ items()|reject("odd")|join("|") }}')
    assert tmpl.render(items=items) == '2|4'


@mark_dualiter('items', lambda: [None, False, 0, 1, 2, 3, 4, 5])
def test_bool_reject(env_async, items):
    tmpl = env_async.from_string(
        '{{ items()|reject|join("|") }}'
    )
    assert tmpl.render(items=items) == 'None|False|0'