wcs/tests/test_backoffice_pages.py

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 &quot;New&quot;' in resp.body
assert 'To Status &quot;Finished&quot;' 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