357 lines
12 KiB
Python
357 lines
12 KiB
Python
import datetime
|
|
import os
|
|
import re
|
|
import shutil
|
|
import StringIO
|
|
|
|
import pytest
|
|
|
|
from quixote import cleanup, get_publisher
|
|
from wcs.qommon import errors, sessions
|
|
from qommon.ident.password_accounts import PasswordAccount
|
|
from wcs.qommon.http_request import HTTPRequest
|
|
from wcs.roles import Role
|
|
from wcs.workflows import Workflow
|
|
from wcs.formdef import FormDef
|
|
from wcs import fields
|
|
|
|
from utilities import get_app, login, create_temporary_pub, clean_temporary_pub
|
|
|
|
def pytest_generate_tests(metafunc):
|
|
if 'pub' in metafunc.fixturenames:
|
|
metafunc.parametrize('pub', ['pickle', 'sql'], indirect=True)
|
|
|
|
@pytest.fixture
|
|
def pub(request):
|
|
pub = create_temporary_pub(sql_mode=(request.param == 'sql'))
|
|
|
|
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()
|
|
|
|
return pub
|
|
|
|
def create_user(pub, is_admin=False):
|
|
if pub.user_class.select(lambda x: x.name == 'admin'):
|
|
user1 = pub.user_class.select(lambda x: x.name == 'admin')[0]
|
|
user1.is_admin = is_admin
|
|
user1.store()
|
|
return
|
|
user1 = pub.user_class(name='admin')
|
|
user1.is_admin = is_admin
|
|
user1.store()
|
|
|
|
account1 = PasswordAccount(id='admin')
|
|
account1.set_password('admin')
|
|
account1.user_id = user1.id
|
|
account1.store()
|
|
|
|
Role.wipe()
|
|
role = Role(name='foobar')
|
|
role.store()
|
|
|
|
user1.roles = [role.id]
|
|
user1.store()
|
|
|
|
def create_superuser(pub):
|
|
create_user(pub, is_admin=True)
|
|
|
|
def create_environment(set_receiver=True):
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
if set_receiver:
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.fields = [fields.StringField(id='1', label='1st field', type='string'),
|
|
fields.ItemField(id='2', label='2nd field', type='item',
|
|
items=['foo', 'bar', 'baz']),
|
|
]
|
|
formdef.store()
|
|
formdef.data_class().wipe()
|
|
for i in range(50):
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
formdata.receipt_time = datetime.datetime(2015, 1, 1).timetuple()
|
|
formdata.data = {'1': 'FOO BAR %d' % i}
|
|
if i%4 == 0:
|
|
formdata.data['2'] = 'foo'
|
|
formdata.data['2_display'] = 'foo'
|
|
elif i%4 == 1:
|
|
formdata.data['2'] = 'bar'
|
|
formdata.data['2_display'] = 'bar'
|
|
else:
|
|
formdata.data['2'] = 'baz'
|
|
formdata.data['2_display'] = 'baz'
|
|
if i%3 == 0:
|
|
formdata.jump_status('new')
|
|
else:
|
|
formdata.jump_status('finished')
|
|
formdata.store()
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'other form'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
formdef.data_class().wipe()
|
|
for i in range(20):
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
formdata.receipt_time = datetime.datetime(2014, 1, 1).timetuple()
|
|
formdata.store()
|
|
|
|
def teardown_module(module):
|
|
clean_temporary_pub()
|
|
|
|
def test_backoffice_unlogged(pub):
|
|
create_superuser(pub)
|
|
resp = get_app(pub).get('/backoffice/', status=302)
|
|
resp = resp.follow()
|
|
assert resp.location == 'http://example.net/login/'
|
|
|
|
def test_backoffice_home(pub):
|
|
create_superuser(pub)
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/')
|
|
assert 'Management' in resp.body
|
|
assert 'Forms Workshop' in resp.body
|
|
assert 'Workflows Workshop' in resp.body
|
|
|
|
def test_backoffice_role_user(pub):
|
|
create_user(pub)
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/')
|
|
assert 'Management' in resp.body
|
|
assert not 'Forms Workshop' in resp.body
|
|
assert not 'Workflows Workshop' in resp.body
|
|
|
|
pub.cfg['admin-permissions'] = {'forms': [x.id for x in Role.select()]}
|
|
pub.write_cfg()
|
|
resp = app.get('/backoffice/')
|
|
assert 'Management' in resp.body
|
|
assert 'Forms Workshop' in resp.body
|
|
assert not 'Workflows Workshop' in resp.body
|
|
|
|
pub.cfg['admin-permissions'] = {'workflows': [x.id for x in Role.select()]}
|
|
pub.write_cfg()
|
|
resp = app.get('/backoffice/')
|
|
assert 'Management' in resp.body
|
|
assert not 'Forms Workshop' in resp.body
|
|
assert 'Workflows Workshop' in resp.body
|
|
|
|
# check role id int->str migration
|
|
pub.cfg['admin-permissions'] = {'workflows': [int(x.id) for x in Role.select()]}
|
|
pub.write_cfg()
|
|
resp = app.get('/backoffice/')
|
|
assert 'Management' in resp.body
|
|
assert not 'Forms Workshop' in resp.body
|
|
assert 'Workflows Workshop' in resp.body
|
|
|
|
def test_backoffice_forms(pub):
|
|
create_superuser(pub)
|
|
create_environment(set_receiver=False)
|
|
|
|
# 1st time with user not handling those forms
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/')
|
|
resp = resp.click('Management', index=0)
|
|
assert not 'Forms in your care' in resp.body
|
|
assert re.findall('Other Forms.*form-title', resp.body)
|
|
|
|
# 2nd time with user set as receiver of the forms
|
|
create_environment(set_receiver=True)
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/')
|
|
resp = resp.click('Management', index=0)
|
|
assert 'Forms in your care' in resp.body
|
|
assert '17 open on 50' in resp.body
|
|
|
|
def test_backoffice_listing(pub):
|
|
create_superuser(pub)
|
|
create_environment()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.body.count('data-link') == 17
|
|
|
|
# check status filter <select>
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms[0]['filter'] = 'all'
|
|
resp = resp.forms[0].submit()
|
|
if getattr(pub, 'pgconn', None):
|
|
assert resp.body.count('data-link') == 20
|
|
else:
|
|
# not using sql -> no pagination
|
|
assert resp.body.count('data-link') == 50
|
|
|
|
# check status filter <select>
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms[0]['filter'] = 'done'
|
|
resp = resp.forms[0].submit()
|
|
if getattr(pub, 'pgconn', None):
|
|
assert resp.body.count('data-link') == 20
|
|
resp = resp.click('Next Page')
|
|
assert resp.body.count('data-link') == 13
|
|
else:
|
|
assert resp.body.count('data-link') == 33
|
|
|
|
def test_backoffice_columns(pub):
|
|
create_superuser(pub)
|
|
create_environment()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.body.count('</th>') == 6 # five columns
|
|
resp.forms[0]['1'].checked = False
|
|
resp = resp.forms[0].submit()
|
|
assert resp.body.count('</th>') == 5 # four columns
|
|
assert resp.body.count('data-link') == 17 # 17 rows
|
|
assert resp.body.count('FOO BAR') == 0 # no field 1 column
|
|
|
|
def test_backoffice_filter(pub):
|
|
create_superuser(pub)
|
|
create_environment()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.forms[0]['filter-status'].checked == True
|
|
resp.forms[0]['filter-status'].checked = False
|
|
resp.forms[0]['filter-2'].checked = True
|
|
resp = resp.forms[0].submit()
|
|
assert '<select name="filter">' not in resp.body
|
|
|
|
resp.forms[0]['filter-2-value'] = 'baz'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.body.count('<td>baz</td>') == 8
|
|
assert resp.body.count('<td>foo</td>') == 0
|
|
assert resp.body.count('<td>bar</td>') == 0
|
|
|
|
resp.forms[0]['filter-start'].checked = True
|
|
resp = resp.forms[0].submit()
|
|
resp.forms[0]['filter-start-value'] = datetime.datetime(2015, 2, 1).strftime('%Y-%m-%d')
|
|
resp = resp.forms[0].submit()
|
|
assert resp.body.count('<td>baz</td>') == 0
|
|
resp.forms[0]['filter-start-value'] = datetime.datetime(2014, 2, 1).strftime('%Y-%m-%d')
|
|
resp = resp.forms[0].submit()
|
|
assert resp.body.count('<td>baz</td>') == 8
|
|
|
|
def test_backoffice_csv(pub):
|
|
create_superuser(pub)
|
|
create_environment()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.click('CSV Export')
|
|
assert resp.headers['content-type'].startswith('text/')
|
|
assert len(resp.body.splitlines()) == 18 # 17 + header line
|
|
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms[0]['filter'] = 'all'
|
|
resp = resp.forms[0].submit()
|
|
resp = resp.click('CSV Export')
|
|
assert len(resp.body.splitlines()) == 51
|
|
|
|
def test_backoffice_ods(pub):
|
|
create_superuser(pub)
|
|
create_environment()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.click('Open Document Format Export')
|
|
assert resp.headers['content-type'] == 'application/vnd.oasis.opendocument.spreadsheet'
|
|
assert 'filename=form-title.ods' in resp.headers['content-disposition']
|
|
assert resp.body[:2] == 'PK' # ods has a zip container
|
|
|
|
def test_backoffice_statistics(pub):
|
|
create_superuser(pub)
|
|
create_environment()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.click('Statistics')
|
|
assert 'Total number of records: 50' in resp.body
|
|
assert 'New: 17' in resp.body
|
|
assert 'Finished: 33' in resp.body
|
|
assert re.findall('foo.*26.*bar.*26.*bar.*48', resp.body) # percentages
|
|
assert 'Resolution time' in resp.body
|
|
assert 'To Status "New"' in resp.body
|
|
assert 'To Status "Finished"' in resp.body
|
|
|
|
resp.forms[0]['filter-end-value'] = '2013-01-01'
|
|
resp = resp.forms[0].submit()
|
|
assert 'Total number of records: 0' in resp.body
|
|
|
|
def test_backoffice_statistics_status_filter(pub):
|
|
create_superuser(pub)
|
|
create_environment()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.click('Statistics')
|
|
assert 'filter' not in resp.forms[0].fields # status is not displayed by default
|
|
|
|
# add 'status' as a filter
|
|
resp.forms[0]['filter-status'].checked = True
|
|
resp = resp.forms[0].submit()
|
|
assert 'filter' in resp.forms[0].fields
|
|
|
|
assert resp.forms[0]['filter'].value == 'all'
|
|
resp.forms[0]['filter'].value = 'pending'
|
|
resp = resp.forms[0].submit()
|
|
assert 'Total number of records: 17' in resp.body
|
|
|
|
resp.forms[0]['filter'].value = 'done'
|
|
resp = resp.forms[0].submit()
|
|
assert 'Total number of records: 33' in resp.body
|
|
|
|
resp.forms[0]['filter'].value = 'rejected'
|
|
resp = resp.forms[0].submit()
|
|
assert 'Total number of records: 0' in resp.body
|
|
|
|
resp.forms[0]['filter'].value = 'all'
|
|
resp = resp.forms[0].submit()
|
|
assert 'Total number of records: 50' in resp.body
|
|
|
|
def test_backoffice_statistics_status_select(pub):
|
|
create_superuser(pub)
|
|
create_environment()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.click('Statistics')
|
|
|
|
resp.forms[0]['filter-2'].checked = True
|
|
resp = resp.forms[0].submit()
|
|
resp.forms[0]['filter-2-value'].value = 'bar'
|
|
resp = resp.forms[0].submit()
|
|
assert 'Total number of records: 13' in resp.body
|
|
|
|
resp.forms[0]['filter-2-value'].value = 'baz'
|
|
resp = resp.forms[0].submit()
|
|
assert 'Total number of records: 24' in resp.body
|
|
|
|
resp.forms[0]['filter-2-value'].value = 'foo'
|
|
resp = resp.forms[0].submit()
|
|
assert 'Total number of records: 13' in resp.body
|
|
|
|
def test_backoffice_handling(pub):
|
|
create_superuser(pub)
|
|
create_environment()
|
|
form_class = FormDef.get_by_urlname('form-title').data_class()
|
|
number31 = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0].id
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.click(href='%s/' % number31)
|
|
assert (' with the number %s.' % number31) in resp.body
|
|
resp.forms[0]['comment'] = 'HELLO WORLD'
|
|
resp = resp.forms[0].submit('button_accept')
|
|
resp = resp.follow()
|
|
assert FormDef.get_by_urlname('form-title').data_class().get(number31).status == 'wf-accepted'
|
|
assert 'HELLO WORLD' in resp.body
|
|
|
|
def test_global_statisticspub(pub):
|
|
create_superuser(pub)
|
|
create_environment()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/')
|
|
resp = resp.click('Global statistics')
|
|
assert 'Total count: 70' in resp.body
|
|
|
|
resp.forms[0]['start'] = '2014-01-01'
|
|
resp.forms[0]['end'] = '2014-12-31'
|
|
resp = resp.forms[0].submit()
|
|
assert 'Total count: 20' in resp.body
|