wcs/tests/api/test_statistics.py

156 lines
4.5 KiB
Python

import datetime
import os
import pytest
from wcs.categories import Category
from wcs.formdef import FormDef
from wcs.qommon.http_request import HTTPRequest
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app
from .utils import sign_uri
@pytest.fixture
def pub():
pub = create_temporary_pub(sql_mode=True)
Category.wipe()
FormDef.wipe()
req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'})
pub.set_app_dir(req)
pub.cfg['identification'] = {'methods': ['password']}
pub.cfg['language'] = {'language': 'en'}
pub.write_cfg()
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd:
fd.write(
'''\
[api-secrets]
coucou = 1234
'''
)
return pub
def teardown_module(module):
clean_temporary_pub()
def test_statistics_index(pub):
get_app(pub).get('/api/statistics/', status=403)
resp = get_app(pub).get(sign_uri('/api/statistics/'))
assert resp.json['data'][0]['name'] == 'Forms Count'
assert resp.json['data'][0]['url'] == 'http://example.net/api/statistics/forms/count/'
def test_statistics_index_no_sql(pub):
pub.is_using_postgresql = lambda: False
assert get_app(pub).get(sign_uri('/api/statistics/')).json == {'data': [], 'err': 0}
def test_statistics_index_categories(pub):
Category(name='Category A').store()
Category(name='Category B').store()
resp = get_app(pub).get(sign_uri('/api/statistics/'))
category_filter = [x for x in resp.json['data'][0]['filters'] if x['id'] == 'category'][0]
assert len(category_filter['options']) == 3
def test_statistics_forms_count(pub):
category_a = Category(name='Category A')
category_a.store()
category_b = Category(name='Category B')
category_b.store()
formdef = FormDef()
formdef.name = 'test 1'
formdef.category_id = category_a.id
formdef.fields = []
formdef.store()
formdef.data_class().wipe()
formdef2 = FormDef()
formdef2.name = 'test 2'
formdef2.category_id = category_b.id
formdef2.fields = []
formdef2.store()
formdef2.data_class().wipe()
for _i in range(20):
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = datetime.datetime(2021, 1, 1, 0, 0).timetuple()
formdata.store()
for _i in range(30):
formdata = formdef2.data_class()()
formdata.just_created()
formdata.receipt_time = datetime.datetime(2021, 3, 1, 2, 0).timetuple()
formdata.store()
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/'))
assert resp.json == {
'data': {
'series': [{'data': [20, 0, 30], 'label': 'Forms Count'}],
'x_labels': ['2021-01', '2021-02', '2021-03'],
},
'err': 0,
}
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=year'))
assert resp.json == {
'data': {
'series': [{'data': [50], 'label': 'Forms Count'}],
'x_labels': ['2021'],
},
'err': 0,
}
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=weekday'))
assert resp.json == {
'data': {
'series': [{'data': [30, 0, 0, 0, 20, 0, 0], 'label': 'Forms Count'}],
'x_labels': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
},
'err': 0,
}
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=hour'))
assert resp.json == {
'data': {
'series': [
{
'label': 'Forms Count',
'data': [20, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
}
],
'x_labels': list(range(24)),
},
'err': 0,
}
# time_interval=day is not supported
get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=day'), status=400)
# apply category filter
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?category=%s' % category_a.id))
assert resp.json == {
'data': {
'series': [{'data': [20], 'label': 'Forms Count'}],
'x_labels': ['2021-01'],
},
'err': 0,
}
# apply period filter
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?end=2021-02-01'))
assert resp.json == {
'data': {
'series': [{'data': [20], 'label': 'Forms Count'}],
'x_labels': ['2021-01'],
},
'err': 0,
}