790 lines
28 KiB
Python
790 lines
28 KiB
Python
import datetime
|
|
import json
|
|
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, CommentableWorkflowStatusItem,
|
|
ChoiceWorkflowStatusItem)
|
|
from wcs.wf.wscall import WebserviceCallStatusItem
|
|
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.roles = [x.id for x in Role.select() if x.name == 'foobar']
|
|
user1.store()
|
|
return user1
|
|
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()
|
|
|
|
return user1
|
|
|
|
def create_superuser(pub):
|
|
create_user(pub, is_admin=True)
|
|
|
|
def create_environment(pub, set_receiver=True):
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
if set_receiver:
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
|
|
datasource = {'type': 'formula',
|
|
'value': repr([('A', 'aa'), ('B', 'bb'), ('C', 'cc')])}
|
|
|
|
formdef.fields = [fields.StringField(id='1', label='1st field', type='string'),
|
|
fields.ItemField(id='2', label='2nd field', type='item',
|
|
items=['foo', 'bar', 'baz']),
|
|
fields.ItemField(id='3', label='3rd field', type='item',
|
|
data_source=datasource, in_listing=False),
|
|
]
|
|
|
|
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'
|
|
formdata.data['3'] = 'A'
|
|
formdata.data['3_display'] = 'aa'
|
|
elif i%4 == 1:
|
|
formdata.data['2'] = 'bar'
|
|
formdata.data['2_display'] = 'bar'
|
|
formdata.data['3'] = 'B'
|
|
formdata.data['3_display'] = 'bb'
|
|
else:
|
|
formdata.data['2'] = 'baz'
|
|
formdata.data['2_display'] = 'baz'
|
|
formdata.data['3'] = 'C'
|
|
formdata.data['3_display'] = 'cc'
|
|
if i%3 == 0:
|
|
formdata.jump_status('new')
|
|
else:
|
|
formdata.jump_status('finished')
|
|
formdata.store()
|
|
|
|
formdef = FormDef()
|
|
if set_receiver:
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
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.jump_status('new')
|
|
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(pub, 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(pub, 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(pub)
|
|
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_legacy_urls(pub):
|
|
create_superuser(pub)
|
|
create_environment(pub)
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/form-title/')
|
|
assert resp.location == 'http://example.net/backoffice/management/form-title/'
|
|
resp = app.get('/backoffice/form-title/1/')
|
|
assert resp.location == 'http://example.net/backoffice/management/form-title/1/'
|
|
resp = app.get('/backoffice/form-title/listing/?bla')
|
|
assert resp.location == 'http://example.net/backoffice/management/form-title/listing/?bla'
|
|
resp = app.get('/backoffice/form-title/listing/foo?bla')
|
|
assert resp.location == 'http://example.net/backoffice/management/form-title/listing/foo?bla'
|
|
|
|
def test_backoffice_columns(pub):
|
|
create_superuser(pub)
|
|
create_environment(pub)
|
|
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(pub)
|
|
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(pub)
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.click('Export as CSV File')
|
|
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('Export as CSV File')
|
|
assert len(resp.body.splitlines()) == 51
|
|
|
|
def test_backoffice_ods(pub):
|
|
create_superuser(pub)
|
|
create_environment(pub)
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.click('Export a Spreadsheet')
|
|
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(pub)
|
|
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(pub)
|
|
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(pub)
|
|
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
|
|
|
|
# check it also works with item fields with a data source
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.click('Statistics')
|
|
resp.forms[0]['filter-3'].checked = True
|
|
resp = resp.forms[0].submit()
|
|
resp.forms[0]['filter-3-value'].value = 'A'
|
|
resp = resp.forms[0].submit()
|
|
assert 'Total number of records: 13' in resp.body
|
|
|
|
|
|
def test_backoffice_handling(pub):
|
|
create_user(pub)
|
|
create_environment(pub)
|
|
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/')
|
|
assert re.findall('<tbody.*\/tbody>', resp.body, re.DOTALL)[0].count('<tr') == 17
|
|
|
|
# check sidebar links are ok
|
|
assert 'Statistics' in resp.body
|
|
assert 'Export' in resp.body
|
|
app.get('/backoffice/management/form-title/stats', status=200)
|
|
app.get('/backoffice/management/form-title/csv', status=200)
|
|
app.get('/backoffice/management/form-title/ods', status=200)
|
|
app.get('/backoffice/management/form-title/json', status=200)
|
|
|
|
# click on a formdata
|
|
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_backoffice_submission_context(pub):
|
|
user = create_user(pub)
|
|
create_environment(pub)
|
|
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]
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert re.findall('<tbody.*\/tbody>', resp.body, re.DOTALL)[0].count('<tr') == 17
|
|
|
|
# click on a formdata
|
|
resp = resp.click(href='%s/' % number31.id)
|
|
assert (' with the number %s.' % number31.id) in resp.body
|
|
|
|
# check there's nothing in the sidebar
|
|
assert not 'Channel' in resp.body
|
|
|
|
number31.submission_context = {
|
|
'channel': 'mail',
|
|
'mail_url': 'http://www.example.com/test.pdf',
|
|
'thumbnail_url': 'http://www.example.com/thumbnail.png',
|
|
'user_id': user.id,
|
|
'comments': 'test_backoffice_submission_context',
|
|
'summary_url': 'http://www.example.com/summary',
|
|
}
|
|
number31.store()
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.click(href='%s/' % number31.id)
|
|
assert 'Channel' in resp.body
|
|
assert 'http://www.example.com/thumbnail.png' in resp.body
|
|
assert 'http://www.example.com/test.pdf' in resp.body
|
|
assert 'Associated User' in resp.body
|
|
assert 'test_backoffice_submission_context' in resp.body
|
|
assert 'http://www.example.com/summary' in resp.body
|
|
|
|
|
|
def test_backoffice_info_text(pub):
|
|
create_user(pub)
|
|
create_environment(pub)
|
|
formdef = FormDef.get_by_urlname('form-title')
|
|
form_class = formdef.data_class()
|
|
|
|
number31 = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0].id
|
|
number31_status = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0].status
|
|
|
|
# attach a custom workflow
|
|
workflow = Workflow(name='info texts')
|
|
st1 = workflow.add_status('Status1', number31_status.split('-')[1])
|
|
|
|
commentable = CommentableWorkflowStatusItem()
|
|
commentable.id = '_commentable'
|
|
commentable.by = ['_submitter', '_receiver']
|
|
commentable.button_label = 'CLICK ME!'
|
|
st1.items.append(commentable)
|
|
commentable.parent = st1
|
|
|
|
commentable2 = CommentableWorkflowStatusItem()
|
|
commentable2.id = '_commentable2'
|
|
commentable2.by = ['_submitter']
|
|
commentable2.button_label = 'CLICK ME2!'
|
|
st1.items.append(commentable2)
|
|
commentable2.parent = st1
|
|
|
|
workflow.store()
|
|
|
|
formdef.workflow_id = workflow.id
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/management/form-title/%s/' % number31)
|
|
assert (' with the number %s.' % number31) in resp.body
|
|
assert 'CLICK ME!' in resp.body
|
|
assert not 'CLICK ME2!' in resp.body
|
|
assert not 'backoffice-description' in resp.body
|
|
|
|
# add an info text to the status
|
|
st1.backoffice_info_text = '<p>Foo</p>'
|
|
workflow.store()
|
|
resp = app.get('/backoffice/management/form-title/%s/' % number31)
|
|
assert 'backoffice-description' in resp.body
|
|
assert '<p>Foo</p>' in resp.body
|
|
|
|
# add an info text to the button
|
|
commentable.backoffice_info_text = '<p>Bar</p>'
|
|
workflow.store()
|
|
resp = app.get('/backoffice/management/form-title/%s/' % number31)
|
|
assert 'backoffice-description' in resp.body
|
|
assert '<p>Foo</p>' in resp.body
|
|
assert '<p>Bar</p>' in resp.body
|
|
|
|
# remove info text from the status
|
|
st1.backoffice_info_text = None
|
|
workflow.store()
|
|
resp = app.get('/backoffice/management/form-title/%s/' % number31)
|
|
assert 'backoffice-description' in resp.body
|
|
assert not '<p>Foo</p>' in resp.body
|
|
assert '<p>Bar</p>' in resp.body
|
|
|
|
# add info text to second button
|
|
commentable2.backoffice_info_text = '<p>Baz</p>'
|
|
workflow.store()
|
|
resp = app.get('/backoffice/management/form-title/%s/' % number31)
|
|
assert 'backoffice-description' in resp.body
|
|
assert not '<p>Foo</p>' in resp.body
|
|
assert '<p>Bar</p>' in resp.body
|
|
assert not '<p>Baz</p>' in resp.body
|
|
|
|
# remove info text from first button
|
|
commentable.backoffice_info_text = None
|
|
workflow.store()
|
|
resp = app.get('/backoffice/management/form-title/%s/' % number31)
|
|
assert not 'backoffice-description' in resp.body
|
|
|
|
def test_backoffice_handling_post_dispatch(pub):
|
|
# check a formdata that has been dispatched to another role is accessible
|
|
# by an user with that role.
|
|
user1 = create_user(pub)
|
|
role = Role(name='foobaz')
|
|
role.store()
|
|
user1.roles = [role.id]
|
|
user1.store()
|
|
create_environment(pub)
|
|
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))
|
|
|
|
# check there's no access at the moment
|
|
resp = app.get('/backoffice/management/')
|
|
assert not 'form-title/' in resp.body
|
|
resp = app.get('/backoffice/management/form-title/', status=403)
|
|
resp = app.get('/backoffice/management/form-title/%s/' % number31, status=403)
|
|
|
|
# emulate a dispatch (setting formdata.workflow_roles), receiver of that
|
|
# formdata is now the local role we gave to the user.
|
|
formdata31 = form_class.get(number31)
|
|
formdata31.workflow_roles = {'_receiver': role.id}
|
|
formdata31.store()
|
|
|
|
# check listing is accessible, with a single item
|
|
resp = app.get('/backoffice/management/')
|
|
assert 'form-title/' in resp.body
|
|
resp = app.get('/backoffice/management/form-title/', status=200)
|
|
assert re.findall('<tbody.*\/tbody>', resp.body, re.DOTALL)[0].count('<tr') == 1
|
|
|
|
# check statistics and exports are also available
|
|
assert 'Statistics' in resp.body
|
|
assert 'Export' in resp.body
|
|
app.get('/backoffice/management/form-title/stats', status=200)
|
|
app.get('/backoffice/management/form-title/csv', status=200)
|
|
app.get('/backoffice/management/form-title/ods', status=200)
|
|
app.get('/backoffice/management/form-title/json', status=200)
|
|
|
|
# check formdata is accessible, and that it's possible to perform an action
|
|
# on it.
|
|
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(pub)
|
|
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
|
|
|
|
def test_backoffice_submission(pub):
|
|
user = create_user(pub)
|
|
create_environment(pub)
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/')
|
|
assert not 'Submission' in resp.body
|
|
app.get('/backoffice/submission/', status=403)
|
|
|
|
formdef = FormDef.get_by_urlname('form-title')
|
|
formdef.backoffice_submission_roles = user.roles[:]
|
|
formdef.store()
|
|
resp = app.get('/backoffice/')
|
|
assert 'Submission' in resp.body
|
|
resp = app.get('/backoffice/submission/')
|
|
assert formdef.url_name in resp.body
|
|
|
|
resp = resp.click(formdef.name)
|
|
resp.form['f1'] = 'test submission'
|
|
resp.form['f2'] = 'baz'
|
|
resp.form['f3'] = 'C'
|
|
resp = resp.form.submit('submit')
|
|
assert 'Check values then click submit.' in resp.body
|
|
|
|
# going back to first page, to check
|
|
resp = resp.form.submit('previous')
|
|
assert resp.form['f1'].value == 'test submission'
|
|
resp = resp.form.submit('submit')
|
|
|
|
# final submit
|
|
resp = resp.form.submit('submit')
|
|
|
|
formdata_no = resp.location.split('/')[-2]
|
|
data_class = formdef.data_class()
|
|
assert data_class.get(formdata_no).data['1'] == 'test submission'
|
|
assert data_class.get(formdata_no).data['2'] == 'baz'
|
|
assert data_class.get(formdata_no).status == 'wf-new'
|
|
assert data_class.get(formdata_no).user is None
|
|
assert data_class.get(formdata_no).backoffice_submission is True
|
|
|
|
resp = resp.follow() # get to the formdata page
|
|
|
|
formdata_count = data_class.count()
|
|
|
|
# test submission when agent is not receiver
|
|
formdef.workflow_roles = {}
|
|
formdef.store()
|
|
resp = app.get('/backoffice/submission/')
|
|
resp = resp.click(formdef.name)
|
|
resp.form['f1'] = 'test submission'
|
|
resp.form['f2'] = 'baz'
|
|
resp.form['f3'] = 'C'
|
|
resp = resp.form.submit('submit') # to validation screen
|
|
resp = resp.form.submit('submit') # final submit
|
|
assert resp.location == 'http://example.net/backoffice/submission/'
|
|
resp = resp.follow() # should go back to submission screen
|
|
|
|
assert data_class.count() == formdata_count + 1
|
|
|
|
def test_backoffice_submission_tracking_code(pub):
|
|
user = create_user(pub)
|
|
create_environment(pub)
|
|
|
|
app = login(get_app(pub))
|
|
|
|
formdef = FormDef.get_by_urlname('form-title')
|
|
formdef.enable_tracking_codes = True
|
|
formdef.backoffice_submission_roles = user.roles[:]
|
|
formdef.store()
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
resp = app.get('/backoffice/submission/')
|
|
assert formdef.url_name in resp.body
|
|
|
|
resp = resp.click(formdef.name)
|
|
resp.form['f1'] = 'test submission'
|
|
resp.form['f2'] = 'baz'
|
|
resp.form['f3'] = 'C'
|
|
resp = resp.form.submit('submit')
|
|
assert 'Check values then click submit.' in resp.body
|
|
|
|
# stop here, don't validate, let user finish it.
|
|
assert data_class.count() == 1
|
|
formdata_no = data_class.select()[0].id
|
|
tracking_code = data_class.select()[0].tracking_code
|
|
|
|
assert data_class.get(formdata_no).data['1'] == 'test submission'
|
|
assert data_class.get(formdata_no).data['2'] == 'baz'
|
|
assert data_class.get(formdata_no).status == 'draft'
|
|
assert data_class.get(formdata_no).user is None
|
|
|
|
resp = get_app(pub).get('/code/%s/load' % data_class.select()[0].tracking_code)
|
|
resp = resp.follow()
|
|
assert resp.location.startswith('http://example.net/form-title/?mt=')
|
|
resp = resp.follow()
|
|
assert 'Check values then click submit.' in resp.body
|
|
assert 'test submission' in resp.body
|
|
|
|
def test_backoffice_submission_drafts(pub):
|
|
user = create_user(pub)
|
|
create_environment(pub)
|
|
|
|
app = login(get_app(pub))
|
|
|
|
formdef = FormDef.get_by_urlname('form-title')
|
|
formdef.enable_tracking_codes = True
|
|
formdef.backoffice_submission_roles = user.roles[:]
|
|
formdef.store()
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
resp = app.get('/backoffice/submission/')
|
|
assert formdef.url_name in resp.body
|
|
|
|
resp = resp.click(formdef.name)
|
|
resp.form['f1'] = 'test submission'
|
|
resp.form['f2'] = 'baz'
|
|
resp.form['f3'] = 'C'
|
|
resp = resp.form.submit('submit')
|
|
assert 'Check values then click submit.' in resp.body
|
|
|
|
assert data_class.count() == 1
|
|
formdata_no = data_class.select()[0].id
|
|
tracking_code = data_class.select()[0].tracking_code
|
|
|
|
# stop here, go back to index
|
|
resp = app.get('/backoffice/submission/')
|
|
assert '%s/%s' % (formdef.url_name, formdata_no) in resp.body
|
|
resp = resp.click('Draft')
|
|
resp = resp.follow()
|
|
assert tracking_code in resp.body
|
|
resp = resp.form.submit('previous')
|
|
assert resp.form['f1'].value == 'test submission'
|
|
|
|
resp = resp.form.submit('submit')
|
|
assert "Check values then click submit." in resp.body
|
|
resp = resp.form.submit('submit')
|
|
# check it kept the same id
|
|
assert resp.location == 'http://example.net/backoffice/management/form-title/%s/' % formdata_no
|
|
|
|
def test_backoffice_wscall_failure_display(pub):
|
|
create_user(pub)
|
|
create_environment(pub)
|
|
formdef = FormDef.get_by_urlname('form-title')
|
|
form_class = formdef.data_class()
|
|
|
|
number31 = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0].id
|
|
number31_status = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0].status
|
|
|
|
# attach a custom workflow
|
|
workflow = Workflow(name='wscall')
|
|
st1 = workflow.add_status('Status1', number31_status.split('-')[1])
|
|
|
|
wscall = WebserviceCallStatusItem()
|
|
wscall.id = '_wscall'
|
|
wscall.varname = 'xxx'
|
|
wscall.url = 'http://remote.example.net/xml'
|
|
wscall.action_on_bad_data = ':stop'
|
|
wscall.record_errors = True
|
|
st1.items.append(wscall)
|
|
wscall.parent = st1
|
|
|
|
again = ChoiceWorkflowStatusItem()
|
|
again.id = '_again'
|
|
again.label = 'Again'
|
|
again.by = ['_receiver']
|
|
again.status = st1.id
|
|
st1.items.append(again)
|
|
again.parent = st1
|
|
|
|
workflow.store()
|
|
|
|
formdef.workflow_id = workflow.id
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/management/form-title/%s/' % number31)
|
|
assert (' with the number %s.' % number31) in resp.body
|
|
assert 'Again' in resp.body
|
|
resp = resp.forms[0].submit('button_again')
|
|
resp = resp.follow()
|
|
assert 'Error during webservice call' in resp.body
|
|
|
|
# the failure message shouldn't be displayed in the frontoffice
|
|
resp = app.get('/form-title/%s/' % number31)
|
|
assert (' with the number %s.' % number31) in resp.body
|
|
assert not 'Error during webservice call' in resp.body
|
|
|
|
def test_global_listing(pub):
|
|
if not pub.is_using_postgresql():
|
|
pytest.skip('this requires SQL')
|
|
return
|
|
|
|
create_user(pub)
|
|
create_environment(pub)
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/')
|
|
assert 'Global View' in resp.body
|
|
resp = resp.click('Global View')
|
|
assert resp.body.count('<tr') == 20
|
|
|
|
resp = app.get('/backoffice/management/listing?limit=500')
|
|
assert resp.body.count('<tr') == 37 # 17 formdef1 + 20 formdef2
|
|
|
|
resp = app.get('/backoffice/management/listing?offset=20&limit=20')
|
|
assert resp.body.count('<tr') == 17
|
|
|
|
resp = app.get('/backoffice/management/listing')
|
|
resp.form['end'] = '2014-02-01'
|
|
resp = resp.form.submit()
|
|
|
|
assert resp.body.count('<tr') == 20
|
|
assert 'http://example.net/backoffice/management/other-form/' in resp.body
|
|
assert not 'http://example.net/backoffice/management/form-title/' in resp.body
|