Completed
Push — master ( 99cd20...0ff6d7 )
by Chris
58s
created

count()   A

Complexity

Conditions 1

Size

Total Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
cc 1
c 2
b 0
f 1
dl 0
loc 1
rs 10
1
from contextlib import nested
2
import json
3
from datetime import datetime as dt
4
5
from flask import (
6
    Flask,
7
    current_app,
8
    url_for,
9
)
10
import mock
11
import pytest
12
13
from flask_jsondash import charts_builder
14
15
16
URL_BASE = 'http://127.0.0.1:80'
17
app = Flask('test_flask_jsondash')
18
app.secret_key = '123'
19
app.debug = True
20
app.register_blueprint(charts_builder.charts)
21
22
23
def _username():
24
    return 'Username'
25
26
27
def _authtest(**kwargs):
28
    return False
29
30
31
@pytest.fixture()
32
def client():
33
    app.config.update(
34
        JSONDASH_GLOBALDASH=False,
35
        JSONDASH_FILTERUSERS=False,
36
        JSONDASH_GLOBAL_USER='global-test',
37
    )
38
    app.config['JSONDASH'] = dict(
39
        metadata=dict(
40
            created_by=_username,
41
            username=_username,
42
        ),
43
        static=dict(
44
            js_path='js/vendor/',
45
            css_path='css/vendor/',
46
        ),
47
        auth=dict(
48
            edit_others=_authtest,
49
            edit_global=_authtest,
50
            create=_authtest,
51
            view=_authtest,
52
            clone=_authtest,
53
            delete=_authtest,
54
        )
55
    )
56
    return app.test_client()
57
58
59
def test_no_config_sanity_test(client):
60
    assert not app.config.get('JSONDASH_GLOBALDASH')
61
    assert not app.config.get('JSONDASH_FILTERUSERS')
62
    assert app.config.get('JSONDASH_GLOBAL_USER') == 'global-test'
63
64
65
def test_setting(client):
66
    with app.app_context():
67
        _get = charts_builder.setting
68
        assert not _get('JSONDASH_GLOBALDASH')
69
        assert not _get('JSONDASH_FILTERUSERS')
70
        assert _get('JSONDASH_GLOBAL_USER') == 'global-test'
71
72
73
def test_is_global_dashboard_true(client):
74
    with app.app_context():
75
        app.config.update(JSONDASH_GLOBALDASH=True)
76
        assert charts_builder.is_global_dashboard(
77
            dict(created_by='global-test'))
78
79
80
def test_is_global_dashboard_false(client):
81
    with app.app_context():
82
        is_global = charts_builder.is_global_dashboard
83
        assert not is_global(dict(created_by='foo'))
84
        assert not is_global(dict(created_by='Username'))
85
86
87
def test_auth_false_realauth():
88
    with app.app_context():
89
        assert not charts_builder.auth(authtype='create')
90
        assert not charts_builder.auth(authtype='view')
91
        assert not charts_builder.auth(authtype='delete')
92
        assert not charts_builder.auth(authtype='clone')
93
        assert not charts_builder.auth(authtype='edit_global')
94
        assert not charts_builder.auth(authtype='edit_others')
95
96
97
def test_auth_true_realauth():
98
    with app.app_context():
99
        def authfunc(*args):
100
            return True
101
102
        app.config['JSONDASH']['auth'] = dict(
103
            clone=authfunc,
104
            edit_global=authfunc,
105
            create=authfunc,
106
            delete=authfunc,
107
            view=authfunc,
108
        )
109
        assert charts_builder.auth(authtype='create')
110
        assert charts_builder.auth(authtype='view')
111
        assert charts_builder.auth(authtype='delete')
112
        assert charts_builder.auth(authtype='clone')
113
        assert charts_builder.auth(authtype='edit_global')
114
        assert charts_builder.auth(authtype='edit_others')
115
116
117
def test_auth_true_fakeauth():
118
    with app.app_context():
119
        assert charts_builder.auth(authtype=None)
120
        assert charts_builder.auth(authtype='foo')
121
        assert charts_builder.metadata(key='foo') is None
122
123
124
def test_metadata():
125
    with app.app_context():
126
        assert charts_builder.metadata() == dict(
127
            username='Username',
128
            created_by='Username',
129
        )
130
        assert charts_builder.metadata(key='username') == 'Username'
131
        assert charts_builder.metadata(key='created_by') == 'Username'
132
        assert charts_builder.metadata(exclude='created_by') == dict(
133
            username='Username'
134
        )
135
        assert charts_builder.metadata(exclude='username') == dict(
136
            created_by='Username'
137
        )
138
139
140
@pytest.mark.filters
141
def test_getdims_normal():
142
    with app.app_context():
143
        data = dict(width=100, height=100, type='foo')
144
        expected = dict(width=100, height=100)
145
        assert charts_builder.get_dims(object, data) == expected
146
147
148
@pytest.mark.filters
149
def test_getdims_youtube():
150
    with app.app_context():
151
        yt = ('<iframe width="650" height="366" '
152
              'src="https://www.youtube.com/embed/'
153
              '_hI0qMtdfng?list=RD_hI0qMtdfng&amp;'
154
              'controls=0&amp;showinfo=0" frameborder="0"'
155
              ' allowfullscreen></iframe>')
156
        data = dict(type='youtube', dataSource=yt, width=100, height=100)
157
        expected = dict(width=650 + 20, height=366 + 60)
158
        assert charts_builder.get_dims(object, data) == expected
159
160
161
@pytest.mark.filters
162
def test_jsonstring():
163
    with app.app_context():
164
        now = dt.now()
165
        data = dict(date=now, foo='bar')
166
        res = charts_builder.jsonstring(object, data)
167
        assert 'foo' in res
168
        assert isinstance(res, str)
169
        d = json.loads(res)
170
        assert isinstance(d['date'], unicode)
171
172
173
def test_app_redirects(client):
174
    res = client.get('/charts')
175
    assert 'You should be redirected automatically' in res.data
176
177
178
def test_routes(client):
179
    app.config['SERVER_NAME'] = '127.0.0.1:80'
180
    with app.app_context():
181
        # Index
182
        url = '{}/charts/'.format(URL_BASE)
183
        assert url_for('jsondash.dashboard') == url
184
        # View
185
        url = '{}/charts/foo'.format(URL_BASE)
186
        assert url_for('jsondash.view', c_id='foo') == url
187
        # Update
188
        url = '{}/charts/foo/update'.format(URL_BASE)
189
        assert url_for('jsondash.update', c_id='foo') == url
190
        # Clone
191
        url = '{}/charts/foo/clone'.format(URL_BASE)
192
        assert url_for('jsondash.clone', c_id='foo') == url
193
        # Delete
194
        url = '{}/charts/foo/delete'.format(URL_BASE)
195
        assert url_for('jsondash.delete', c_id='foo') == url
196
        # Create
197
        url = '{}/charts/create'.format(URL_BASE)
198
        assert url_for('jsondash.create') == url
199
200
201
def test_paginator_default():
202
    with app.app_context():
203
        def count(*args, **kwargs): return 1000
204
        def setting(*args, **kwargs): return 30
205
        # Need context for 2 different patch operations.
206
        with nested(
207
            mock.patch.object(charts_builder, 'setting', setting),
208
            mock.patch.object(charts_builder.adapter, 'count', count),
209
        ):
210
            paginator = charts_builder.paginator(0)
211
            assert isinstance(paginator, charts_builder.Paginator)
212
            assert paginator.limit == 30
213
            assert paginator.per_page == 30
214
            assert paginator.curr_page == 0
215
            assert paginator.skip == 0
216
            assert paginator.num_pages == range(1, 35)
217
            assert paginator.count == 1000
218