1433 lines
45 KiB
Python
1433 lines
45 KiB
Python
import os
|
|
import shutil
|
|
import StringIO
|
|
|
|
try:
|
|
import lasso
|
|
except ImportError:
|
|
lasso = None
|
|
|
|
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.qommon.template import get_current_theme
|
|
from wcs.categories import Category
|
|
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
|
|
|
|
def setup_module(module):
|
|
cleanup()
|
|
|
|
global pub
|
|
|
|
pub = create_temporary_pub()
|
|
|
|
req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'})
|
|
pub.set_app_dir(req)
|
|
pub.cfg['identification'] = {'methods': ['password']}
|
|
pub.write_cfg()
|
|
|
|
def create_superuser():
|
|
global user1
|
|
if pub.user_class.has_key('admin'):
|
|
return
|
|
user1 = pub.user_class(name='admin')
|
|
user1.id = 'admin'
|
|
user1.is_admin = True
|
|
user1.store()
|
|
|
|
account1 = PasswordAccount(id='admin')
|
|
account1.set_password('admin')
|
|
account1.user_id = user1.id
|
|
account1.store()
|
|
|
|
pub.cfg['identification'] = {'methods': ['password']}
|
|
pub.write_cfg()
|
|
|
|
def create_role():
|
|
Role.wipe()
|
|
role = Role(name='foobar')
|
|
role.store()
|
|
return role
|
|
|
|
def teardown_module(module):
|
|
shutil.rmtree(pub.APP_DIR)
|
|
|
|
def test_empty_site():
|
|
get_app(pub).get('/admin/')
|
|
|
|
def test_with_user():
|
|
create_superuser()
|
|
resp = get_app(pub).get('/admin/', status=302)
|
|
resp = resp.follow()
|
|
assert resp.location == 'http://example.net/login/'
|
|
|
|
def test_with_superuser():
|
|
app = login(get_app(pub))
|
|
app.get('/admin/')
|
|
|
|
def test_forms():
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/')
|
|
assert 'You first have to define roles.' in resp.body
|
|
assert not 'New Form' in resp.body
|
|
|
|
def test_forms_new():
|
|
app = login(get_app(pub))
|
|
create_role()
|
|
|
|
# create a new form
|
|
resp = app.get('/admin/forms/')
|
|
assert 'New Form' in resp.body
|
|
resp = resp.click('New Form')
|
|
resp.forms[0]['name'] = 'form title'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/forms/1/'
|
|
resp = resp.follow()
|
|
assert 'Form - form title' in resp.body
|
|
|
|
# makes sure the data has been correctly saved
|
|
formdef = FormDef.get(1)
|
|
assert formdef.name == 'form title'
|
|
assert formdef.url_name == 'form-title'
|
|
assert formdef.fields == []
|
|
assert formdef.disabled == True
|
|
assert formdef.last_modification_user_id == 'admin'
|
|
|
|
def test_forms_edit():
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
|
|
# try changing an option
|
|
assert 'Include confirmation page' in resp.body
|
|
resp = resp.click(href='options')
|
|
assert resp.forms[0]['confirmation'].checked
|
|
resp.forms[0]['confirmation'].checked = False
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/forms/1/'
|
|
resp = resp.follow()
|
|
assert not 'Include confirmation page' in resp.body
|
|
assert FormDef.get(1).confirmation == False
|
|
|
|
# try changing title
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click(href='title')
|
|
assert resp.forms[0]['name'].value == 'form title'
|
|
resp.forms[0]['name'] = 'new title'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/forms/1/'
|
|
resp = resp.follow()
|
|
assert FormDef.get(1).name == 'new title'
|
|
assert FormDef.get(1).url_name == 'new-title'
|
|
|
|
def test_form_category():
|
|
create_superuser()
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
assert 'Category:' not in resp.body
|
|
|
|
Category.wipe()
|
|
cat = Category(name='Foo')
|
|
cat.store()
|
|
cat = Category(name='Bar')
|
|
cat.store()
|
|
resp = app.get('/admin/forms/1/')
|
|
assert 'Category:' in resp.body
|
|
|
|
def test_form_category_select():
|
|
create_superuser()
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
Category.wipe()
|
|
cat = Category(name='Foo')
|
|
cat.store()
|
|
cat = Category(name='Bar')
|
|
cat.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click(href='category')
|
|
resp = resp.forms[0].submit('cancel')
|
|
assert FormDef.get(formdef.id).category_id is None
|
|
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click(href='category')
|
|
resp.forms[0]['category_id'] = cat.id
|
|
resp = resp.forms[0].submit('submit')
|
|
assert FormDef.get(formdef.id).category_id == cat.id
|
|
|
|
def test_form_workflow():
|
|
create_superuser()
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
assert 'Workflow:' not in resp.body
|
|
|
|
Workflow.wipe()
|
|
workflow = Workflow(name='Workflow One')
|
|
workflow.store()
|
|
workflow = Workflow(name='Workflow Two')
|
|
workflow.store()
|
|
|
|
resp = app.get('/admin/forms/1/')
|
|
assert 'Workflow:' in resp.body
|
|
|
|
def test_form_workflow_change():
|
|
create_superuser()
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
Workflow.wipe()
|
|
workflow = Workflow(name='Workflow One')
|
|
workflow.store()
|
|
workflow = Workflow(name='Workflow Two')
|
|
workflow.possible_status = Workflow.get_default_workflow().possible_status[:]
|
|
workflow.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click('change', href='workflow')
|
|
resp = resp.forms[0].submit('cancel')
|
|
assert FormDef.get(formdef.id).workflow_id is None
|
|
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click('change', href='workflow')
|
|
assert 'Workflow One' not in resp.body # this workflow doesn't have any status
|
|
resp.forms[0]['workflow_id'] = workflow.id
|
|
resp = resp.forms[0].submit('submit')
|
|
assert FormDef.get(formdef.id).workflow_id == workflow.id
|
|
|
|
def test_form_workflow_remapping():
|
|
create_superuser()
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
formdata = data_class()
|
|
formdata.status = 'wf-new'
|
|
formdata.store()
|
|
|
|
Workflow.wipe()
|
|
workflow = Workflow(name='Workflow One')
|
|
workflow.store()
|
|
workflow = Workflow(name='Workflow Two')
|
|
# create it with a single status
|
|
workflow.possible_status = [Workflow.get_default_workflow().possible_status[-1]]
|
|
workflow.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click('change', href='workflow')
|
|
resp.forms[0]['workflow_id'] = workflow.id
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/forms/1/workflow-status-remapping?new=2'
|
|
resp = resp.follow()
|
|
for status in Workflow.get_default_workflow().possible_status:
|
|
assert resp.forms[0]['mapping-%s' % status.id]
|
|
# there's only one possible new status
|
|
assert len(resp.forms[0]['mapping-just_submitted'].options) == 1
|
|
assert data_class.get(1).status == 'wf-new'
|
|
resp = resp.forms[0].submit()
|
|
assert data_class.get(1).status == 'wf-finished'
|
|
|
|
def test_form_workflow_role():
|
|
create_superuser()
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click('change', href='role/_receiver')
|
|
resp = resp.forms[0].submit('cancel')
|
|
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click('change', href='role/_receiver')
|
|
resp.forms[0]['role_id'] = 'foobar'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert FormDef.get(1).workflow_roles == {'_receiver': 1}
|
|
|
|
def test_form_acl_read():
|
|
create_superuser()
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click('change', href='acl-read')
|
|
resp = resp.forms[0].submit('cancel')
|
|
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click('change', href='acl-read')
|
|
resp.forms[0]['acl_read'] = 'Everybody'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert FormDef.get(1).acl_read == 'all'
|
|
|
|
def test_form_roles():
|
|
create_superuser()
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click('change', href='roles')
|
|
resp = resp.forms[0].submit('cancel')
|
|
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click('change', href='roles')
|
|
resp.forms[0]['always_advertise'] = True
|
|
resp = resp.forms[0].submit('submit')
|
|
assert FormDef.get(1).always_advertise == True
|
|
|
|
def test_form_delete():
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
|
|
resp = resp.click(href='delete')
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/forms/'
|
|
resp = resp.follow()
|
|
assert FormDef.count() == 0
|
|
|
|
def test_form_duplicate():
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
|
|
resp = resp.click(href='duplicate')
|
|
assert resp.location == 'http://example.net/admin/forms/2/'
|
|
resp = resp.follow()
|
|
assert FormDef.count() == 2
|
|
assert FormDef.get(2).name == 'form title (copy)'
|
|
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click(href='duplicate')
|
|
assert resp.location == 'http://example.net/admin/forms/3/'
|
|
resp = resp.follow()
|
|
assert FormDef.count() == 3
|
|
assert FormDef.get(3).name == 'form title (copy 2)'
|
|
|
|
def test_form_export():
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
|
|
resp = resp.click(href='export')
|
|
xml_export = resp.body
|
|
|
|
fd = StringIO.StringIO(xml_export)
|
|
formdef2 = FormDef.import_from_xml(fd)
|
|
assert formdef2.name == 'form title'
|
|
|
|
def test_form_qrcode():
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
|
|
resp = resp.click(href='qrcode')
|
|
assert '<div id="qrcode">' in resp.body
|
|
|
|
def test_form_description():
|
|
create_superuser()
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
assert 'No description or keywords' in resp.body
|
|
|
|
resp = resp.click(href='information')
|
|
resp.forms[0]['description'].value = '<p>Hello World</p>'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/forms/1/'
|
|
resp = resp.follow()
|
|
assert 'No description or keywords' not in resp.body
|
|
assert 'Hello World' in resp.body
|
|
|
|
def test_form_new_field():
|
|
create_superuser()
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click(href='fields/')
|
|
assert 'There are not yet any fields for this form' in resp.body
|
|
|
|
resp.forms[0]['label'] = 'foobar'
|
|
resp.forms[0]['type'] = 'Text (line)'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/forms/1/fields/'
|
|
resp = resp.follow()
|
|
assert 'foobar' in resp.body
|
|
assert 'Use drag and drop to reorder fields.' in resp.body
|
|
|
|
assert len(FormDef.get(1).fields) == 1
|
|
assert FormDef.get(1).fields[0].key == 'string'
|
|
assert FormDef.get(1).fields[0].label == 'foobar'
|
|
|
|
# add a title too
|
|
resp.forms[0]['label'] = 'baz'
|
|
resp.forms[0]['type'] = 'Title'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/forms/1/fields/'
|
|
resp = resp.follow()
|
|
|
|
# check it's in the preview
|
|
resp = app.get('/admin/forms/1/')
|
|
assert '<h3>baz</h3>' in resp.body
|
|
|
|
def test_form_delete_field():
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [fields.StringField(id='1', label='1st field', type='string')]
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click(href='fields/')
|
|
assert '1st field' in resp.body
|
|
assert 'Use drag and drop to reorder fields.' in resp.body
|
|
|
|
resp = resp.click(href='1/delete')
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/forms/1/fields/'
|
|
resp = resp.follow()
|
|
assert len(FormDef.get(1).fields) == 0
|
|
|
|
def test_form_duplicate_field():
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [fields.StringField(id='1', label='1st field', type='string')]
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click(href='fields/')
|
|
assert '1st field' in resp.body
|
|
|
|
resp = resp.click(href='1/duplicate')
|
|
assert resp.location == 'http://example.net/admin/forms/1/fields/'
|
|
resp = resp.follow()
|
|
assert len(FormDef.get(1).fields) == 2
|
|
assert FormDef.get(1).fields[0].label == '1st field'
|
|
assert FormDef.get(1).fields[1].label == '1st field'
|
|
|
|
def test_form_edit_field():
|
|
create_role()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [fields.StringField(id='1', label='1st field', type='string')]
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/forms/1/')
|
|
resp = resp.click(href='fields/')
|
|
assert '1st field' in resp.body
|
|
|
|
resp = resp.click('Edit', href='1/')
|
|
assert resp.forms[0]['label'].value == '1st field'
|
|
resp.forms[0]['label'] = 'changed field'
|
|
resp.forms[0]['required'] = False
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/forms/1/fields/'
|
|
|
|
assert FormDef.get(1).fields[0].label == 'changed field'
|
|
assert FormDef.get(1).fields[0].required == False
|
|
|
|
def test_workflows():
|
|
app = login(get_app(pub))
|
|
app.get('/admin/workflows/')
|
|
|
|
def test_workflows_default():
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/workflows/')
|
|
assert 'Default' in resp.body
|
|
resp = resp.click(href='_default')
|
|
assert 'Just Submitted' in resp.body
|
|
assert 'This is the default workflow' in resp.body
|
|
# makes sure it cannot be edited
|
|
assert 'Edit' not in resp.body
|
|
|
|
# and makes sure status are not editable either
|
|
resp = resp.click('Just Submitted')
|
|
assert 'Workflow - Default - Just Submitted' in resp.body
|
|
assert 'Change Status Name' not in resp.body
|
|
assert 'Delete' not in resp.body
|
|
|
|
def test_workflows_new():
|
|
Workflow.wipe()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/workflows/')
|
|
|
|
# create a new workflow
|
|
resp = resp.click('New Workflow')
|
|
resp.forms[0]['name'] = 'a new workflow'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/workflows/1/'
|
|
resp = resp.follow()
|
|
assert 'There are not yet any status defined in this workflow' in resp.body
|
|
assert not '<svg ' in resp.body
|
|
|
|
# create a new status
|
|
resp.forms[0]['name'] = 'new status'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/workflows/1/'
|
|
resp = resp.follow()
|
|
assert '<svg ' in resp.body
|
|
|
|
# create a new action
|
|
resp = resp.click('new status')
|
|
resp.forms[0]['type'] = 'Display message'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/workflows/1/status/1/'
|
|
resp = resp.follow()
|
|
assert 'Use drag and drop to reorder items' in resp.body
|
|
|
|
# fill action
|
|
resp = resp.click('Display message')
|
|
resp.forms[0]['message'] = 'bla bla bla'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/workflows/1/status/1/items/'
|
|
resp = resp.follow()
|
|
assert resp.location == 'http://example.net/admin/workflows/1/status/1/'
|
|
|
|
wf = Workflow.get(1)
|
|
assert wf.name == 'a new workflow'
|
|
assert wf.possible_status[0].name == 'new status'
|
|
assert wf.possible_status[0].items[0].message == 'bla bla bla'
|
|
|
|
def test_workflows_edit():
|
|
Workflow.wipe()
|
|
workflow = Workflow(name='foo')
|
|
workflow.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/workflows/1/')
|
|
resp = resp.click(href='edit')
|
|
assert resp.forms[0]['name'].value == 'foo'
|
|
resp.forms[0]['name'] = 'baz'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/workflows/'
|
|
resp = resp.follow()
|
|
assert 'baz' in resp.body
|
|
|
|
def test_workflows_edit_status():
|
|
Workflow.wipe()
|
|
workflow = Workflow(name='foo')
|
|
workflow.add_status(name='baz')
|
|
workflow.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/workflows/1/')
|
|
resp = resp.click('baz')
|
|
|
|
resp = resp.click('Change Status Name')
|
|
resp.forms[0]['name'] = 'bza'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/workflows/1/status/1/'
|
|
resp = resp.follow()
|
|
assert Workflow.get(1).possible_status[0].name == 'bza'
|
|
|
|
resp = resp.click('Change Status Visibility')
|
|
resp.forms[0]['hide_status_from_user'].checked = True
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/workflows/1/status/1/'
|
|
resp = resp.follow()
|
|
assert Workflow.get(1).possible_status[0].visibility == ['_receiver']
|
|
|
|
resp = resp.click('Change Terminal Status')
|
|
resp.forms[0]['force_terminal_status'].checked = True
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/workflows/1/status/1/'
|
|
resp = resp.follow()
|
|
assert Workflow.get(1).possible_status[0].forced_endpoint == True
|
|
|
|
resp = resp.click('Change Status Colour')
|
|
assert resp.forms[0]['colour'].value == 'FFFFFF'
|
|
resp.forms[0]['colour'] = 'FF0000'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/workflows/1/status/1/'
|
|
resp = resp.follow()
|
|
assert Workflow.get(1).possible_status[0].colour == 'FF0000'
|
|
|
|
def test_workflows_delete():
|
|
Workflow.wipe()
|
|
workflow = Workflow(name='foo')
|
|
workflow.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/workflows/1/')
|
|
|
|
resp = resp.click(href='delete')
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/workflows/'
|
|
resp = resp.follow()
|
|
assert Workflow.count() == 0
|
|
|
|
def test_workflows_add_all_actions():
|
|
Workflow.wipe()
|
|
workflow = Workflow(name='foo')
|
|
workflow.add_status(name='baz')
|
|
workflow.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/workflows/1/')
|
|
resp = resp.click('baz')
|
|
|
|
for action in [x[0] for x in resp.forms[0]['type'].options]:
|
|
resp.forms[0]['type'] = action
|
|
resp = resp.forms[0].submit()
|
|
resp = resp.follow()
|
|
|
|
for i in range(len(resp.forms[0]['type'].options)):
|
|
resp = resp.click('Edit', href='items/%d/' % (i+1), index=0)
|
|
resp = resp.forms[0].submit('cancel')
|
|
resp = resp.follow() # redirect to items/
|
|
resp = resp.follow() # redirect to ./
|
|
|
|
def test_users():
|
|
create_superuser()
|
|
app = login(get_app(pub))
|
|
app.get('/admin/users/')
|
|
|
|
def test_users_new():
|
|
pub.user_class.wipe()
|
|
create_superuser()
|
|
user_count = pub.user_class.count()
|
|
account_count = PasswordAccount.count()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/users/')
|
|
resp = resp.click('New User')
|
|
resp.forms[0]['name'] = 'a new user'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/users/'
|
|
resp = resp.follow()
|
|
assert 'a new user' in resp.body
|
|
resp = resp.click('a new user')
|
|
assert 'User - a new user' in resp.body
|
|
assert pub.user_class.count() == user_count + 1
|
|
assert PasswordAccount.count() == account_count
|
|
|
|
def test_users_new_with_account():
|
|
pub.user_class.wipe()
|
|
create_superuser()
|
|
user_count = pub.user_class.count()
|
|
account_count = PasswordAccount.count()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/users/')
|
|
resp = resp.click('New User')
|
|
resp.forms[0]['name'] = 'a second user'
|
|
resp.forms[0]['method_password$username'] = 'second-user'
|
|
resp.forms[0]['method_password$password'] = 'foobar'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/users/'
|
|
resp = resp.follow()
|
|
assert 'a second user' in resp.body
|
|
resp = resp.click('a second user')
|
|
assert 'User - a second user' in resp.body
|
|
assert pub.user_class.count() == user_count + 1
|
|
assert PasswordAccount.count() == account_count + 1
|
|
|
|
def test_users_edit():
|
|
pub.user_class.wipe()
|
|
create_superuser()
|
|
user = pub.user_class(name='foo bar')
|
|
user.store()
|
|
assert user.id == 2
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/users/2/')
|
|
resp = resp.click(href='edit')
|
|
resp.forms[0]['is_admin'].checked = True
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/users/2/'
|
|
resp = resp.follow()
|
|
|
|
def test_users_edit_new_account():
|
|
pub.user_class.wipe()
|
|
PasswordAccount.wipe()
|
|
create_superuser()
|
|
user = pub.user_class(name='foo bar')
|
|
user.store()
|
|
assert user.id == 2
|
|
account_count = PasswordAccount.count()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/users/2/')
|
|
resp = resp.click(href='edit')
|
|
resp.forms[0]['is_admin'].checked = True
|
|
resp.forms[0]['method_password$username'] = 'foo'
|
|
resp.forms[0]['method_password$password'] = 'bar'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/users/2/'
|
|
resp = resp.follow()
|
|
|
|
assert PasswordAccount.count() == account_count + 1
|
|
|
|
def test_users_edit_edit_account():
|
|
pub.user_class.wipe()
|
|
PasswordAccount.wipe()
|
|
create_superuser()
|
|
user = pub.user_class(name='foo bar')
|
|
user.store()
|
|
account = PasswordAccount(id='test')
|
|
account.user_id = user.id
|
|
account.store()
|
|
assert PasswordAccount.has_key('test')
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/users/2/')
|
|
resp = resp.click(href='edit')
|
|
resp.forms[0]['is_admin'].checked = True
|
|
resp.forms[0]['method_password$username'] = 'foo' # change username
|
|
resp.forms[0]['method_password$password'] = 'bar'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/users/2/'
|
|
resp = resp.follow()
|
|
|
|
# makes sure the old account has been removed
|
|
assert not PasswordAccount.has_key('test')
|
|
assert PasswordAccount.has_key('foo')
|
|
assert PasswordAccount.get('foo').user_id == user.id
|
|
|
|
def test_users_delete():
|
|
pub.user_class.wipe()
|
|
PasswordAccount.wipe()
|
|
create_superuser()
|
|
user = pub.user_class(name='foo bar')
|
|
user.store()
|
|
account = PasswordAccount(id='test')
|
|
account.user_id = user.id
|
|
account.store()
|
|
|
|
user_count = pub.user_class.count()
|
|
account_count = PasswordAccount.count()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/users/2/')
|
|
|
|
resp = resp.click(href='delete')
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/users/'
|
|
resp = resp.follow()
|
|
|
|
assert pub.user_class.count() == user_count - 1
|
|
assert PasswordAccount.count() == account_count - 1
|
|
|
|
def test_users_pagination():
|
|
pub.user_class.wipe()
|
|
PasswordAccount.wipe()
|
|
create_superuser()
|
|
for i in range(50):
|
|
user = pub.user_class(name='foo bar %s' % (i+1))
|
|
user.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/users/')
|
|
assert 'foo bar 10' in resp.body
|
|
assert 'foo bar 30' not in resp.body
|
|
|
|
resp = resp.click('Next Page')
|
|
assert 'foo bar 10' not in resp.body
|
|
assert 'foo bar 30' in resp.body
|
|
|
|
resp = resp.click('Previous Page')
|
|
assert 'foo bar 10' in resp.body
|
|
assert 'foo bar 30' not in resp.body
|
|
|
|
resp = resp.click('Next Page')
|
|
resp = resp.click('Next Page')
|
|
assert 'foo bar 50' in resp.body
|
|
|
|
def test_users_filter():
|
|
pub.user_class.wipe()
|
|
PasswordAccount.wipe()
|
|
create_superuser()
|
|
role = create_role()
|
|
for i in range(50):
|
|
user = pub.user_class(name='foo bar %s' % (i+1))
|
|
user.store()
|
|
|
|
for i in range(5):
|
|
user = pub.user_class(name='baz bar %s' % (i+1))
|
|
user.roles = [role.id]
|
|
user.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/users/')
|
|
assert 'admin' in resp.body # superuser
|
|
assert 'foo bar 10' in resp.body # simple user
|
|
|
|
# uncheck 'None'; unfortunately this doesn't work with webtest 1.3
|
|
# resp.forms[0].fields['role'][-1].checked = False
|
|
# resp = resp.forms[0].submit()
|
|
# therefore we fall back on using the URL
|
|
resp = app.get('/admin/users/?offset=0&limit=100&q=&filter=true&role=admin')
|
|
assert '>Number of filtered users: 1<' in resp.body
|
|
assert 'user-is-admin' in resp.body # superuser
|
|
assert 'foo bar 1' not in resp.body # simple user
|
|
assert 'baz bar 1' not in resp.body # user with role
|
|
|
|
resp = app.get('/admin/users/?offset=0&limit=100&q=&filter=true&role=1')
|
|
assert '>Number of filtered users: 5<' in resp.body
|
|
assert 'user-is-admin' not in resp.body # superuser
|
|
assert 'foo bar 10' not in resp.body # simple user
|
|
assert 'baz bar 1' in resp.body # user with role
|
|
|
|
def test_users_search():
|
|
pub.user_class.wipe()
|
|
PasswordAccount.wipe()
|
|
create_superuser()
|
|
for i in range(20):
|
|
user = pub.user_class(name='foo %s' % (i+1))
|
|
user.store()
|
|
for i in range(10):
|
|
user = pub.user_class(name='bar %s' % (i+1))
|
|
user.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/users/')
|
|
assert 'foo 10' in resp.body
|
|
|
|
resp.forms[0]['q'] = 'bar'
|
|
resp = resp.forms[0].submit()
|
|
assert 'foo 10' not in resp.body
|
|
assert 'bar 10' in resp.body
|
|
assert 'Number of filtered users: 10' in resp.body
|
|
|
|
def test_roles():
|
|
app = login(get_app(pub))
|
|
app.get('/admin/roles/')
|
|
|
|
def test_roles_new():
|
|
Role.wipe()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/roles/')
|
|
resp = resp.click('New Role')
|
|
resp.forms[0]['name'] = 'a new role'
|
|
resp.forms[0]['details'] = 'bla bla bla'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/roles/'
|
|
resp = resp.follow()
|
|
assert 'a new role' in resp.body
|
|
resp = resp.click('a new role')
|
|
assert 'Role - a new role' in resp.body
|
|
|
|
assert Role.get(1).name == 'a new role'
|
|
assert Role.get(1).details == 'bla bla bla'
|
|
|
|
def test_roles_edit():
|
|
Role.wipe()
|
|
role = Role(name='foobar')
|
|
role.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/roles/1/')
|
|
assert 'Holders of this role are granted access to the backoffice' in resp.body
|
|
|
|
resp = resp.click(href='edit')
|
|
assert resp.forms[0]['name'].value == 'foobar'
|
|
resp.forms[0]['name'] = 'baz'
|
|
resp.forms[0]['details'] = 'bla bla bla'
|
|
resp.forms[0]['emails_to_members'].checked = True
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/roles/1/'
|
|
resp = resp.follow()
|
|
assert 'Role - baz' in resp.body
|
|
assert 'Holders of this role will receive all emails adressed to the role.' in resp.body
|
|
|
|
assert Role.get(1).details == 'bla bla bla'
|
|
assert Role.get(1).emails_to_members == True
|
|
|
|
def test_roles_matching_formdefs():
|
|
Role.wipe()
|
|
role = Role(name='foo')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/roles/1/')
|
|
assert 'form bar' not in resp.body
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'form bar'
|
|
formdef.roles = [role.id]
|
|
formdef.store()
|
|
|
|
resp = app.get('/admin/roles/1/')
|
|
assert 'form bar' in resp.body
|
|
assert 'form baz' not in resp.body
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form baz'
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
resp = app.get('/admin/roles/1/')
|
|
assert 'form baz' in resp.body
|
|
assert 'form bar' not in resp.body
|
|
|
|
def test_roles_delete():
|
|
Role.wipe()
|
|
role = Role(name='foobar')
|
|
role.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/roles/1/')
|
|
|
|
resp = resp.click(href='delete')
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/roles/'
|
|
resp = resp.follow()
|
|
assert Role.count() == 0
|
|
|
|
def test_categories():
|
|
app = login(get_app(pub))
|
|
app.get('/admin/categories/')
|
|
|
|
def test_categories_new():
|
|
Category.wipe()
|
|
app = login(get_app(pub))
|
|
|
|
# go to the page and cancel
|
|
resp = app.get('/admin/categories/')
|
|
resp = resp.click('New Category')
|
|
resp = resp.forms[0].submit('cancel')
|
|
assert resp.location == 'http://example.net/admin/categories/'
|
|
|
|
# go to the page and add a category
|
|
resp = app.get('/admin/categories/')
|
|
resp = resp.click('New Category')
|
|
resp.forms[0]['name'] = 'a new category'
|
|
resp.forms[0]['description'] = 'description of the category'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/categories/'
|
|
resp = resp.follow()
|
|
assert 'a new category' in resp.body
|
|
resp = resp.click('a new category')
|
|
assert 'Category - a new category' in resp.body
|
|
|
|
assert Category.get(1).name == 'a new category'
|
|
assert Category.get(1).description == 'description of the category'
|
|
|
|
def test_categories_edit():
|
|
Category.wipe()
|
|
category = Category(name='foobar')
|
|
category.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/categories/1/')
|
|
assert 'no form associated to this category' in resp.body
|
|
|
|
resp = resp.click(href='edit')
|
|
assert resp.forms[0]['name'].value == 'foobar'
|
|
resp.forms[0]['description'] = 'category description'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/categories/'
|
|
resp = resp.follow()
|
|
resp = resp.click('foobar')
|
|
assert 'Category - foobar' in resp.body
|
|
|
|
assert Category.get(1).description == 'category description'
|
|
|
|
def test_categories_edit_duplicate_name():
|
|
Category.wipe()
|
|
category = Category(name='foobar')
|
|
category.store()
|
|
category = Category(name='foobar2')
|
|
category.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/categories/1/')
|
|
|
|
resp = resp.click(href='edit')
|
|
assert resp.forms[0]['name'].value == 'foobar'
|
|
resp.forms[0]['name'] = 'foobar2'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert 'This name is already used' in resp.body
|
|
|
|
resp = resp.forms[0].submit('cancel')
|
|
assert resp.location == 'http://example.net/admin/categories/'
|
|
|
|
def test_categories_with_formdefs():
|
|
Category.wipe()
|
|
category = Category(name='foobar')
|
|
category.store()
|
|
|
|
FormDef.wipe()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/categories/1/')
|
|
assert 'form bar' not in resp.body
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'form bar'
|
|
formdef.category_id = category.id
|
|
formdef.store()
|
|
|
|
resp = app.get('/admin/categories/1/')
|
|
assert 'form bar' in resp.body
|
|
assert 'no form associated to this category' not in resp.body
|
|
|
|
def test_categories_delete():
|
|
Category.wipe()
|
|
category = Category(name='foobar')
|
|
category.store()
|
|
|
|
FormDef.wipe()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/categories/1/')
|
|
|
|
resp = resp.click(href='delete')
|
|
resp = resp.forms[0].submit('cancel')
|
|
assert resp.location == 'http://example.net/admin/categories/'
|
|
assert Category.count() == 1
|
|
|
|
resp = app.get('/admin/categories/1/')
|
|
resp = resp.click(href='delete')
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/categories/'
|
|
resp = resp.follow()
|
|
assert Category.count() == 0
|
|
|
|
|
|
def test_categories_edit_description():
|
|
Category.wipe()
|
|
category = Category(name='foobar')
|
|
category.description = 'category description'
|
|
category.store()
|
|
|
|
app = login(get_app(pub))
|
|
# this URL is used for editing from the frontoffice, there's no link
|
|
# pointing to it in the admin.
|
|
resp = app.get('/admin/categories/1/description')
|
|
assert resp.forms[0]['description'].value == 'category description'
|
|
resp.forms[0]['description'] = 'updated description'
|
|
|
|
# check cancel doesn't save the change
|
|
resp2 = resp.forms[0].submit('cancel')
|
|
assert resp2.location == 'http://example.net/admin/categories/1/'
|
|
assert Category.get(1).description == 'category description'
|
|
|
|
# check submit does it properly
|
|
resp2 = resp.forms[0].submit('submit')
|
|
assert resp2.location == 'http://example.net/admin/categories/1/'
|
|
resp2 = resp2.follow()
|
|
assert Category.get(1).description == 'updated description'
|
|
|
|
def test_categories_new_duplicate_name():
|
|
Category.wipe()
|
|
category = Category(name='foobar')
|
|
category.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/categories/')
|
|
resp = resp.click('New Category')
|
|
resp.forms[0]['name'] = 'foobar'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert 'This name is already used' in resp.body
|
|
|
|
def test_categories_reorder():
|
|
Category.wipe()
|
|
category = Category(name='foo')
|
|
category.store()
|
|
category = Category(name='bar')
|
|
category.store()
|
|
category = Category(name='baz')
|
|
category.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/categories/update_order?order=1;2;3;')
|
|
categories = Category.select()
|
|
Category.sort_by_position(categories)
|
|
assert [x.id for x in categories] == [1, 2, 3]
|
|
|
|
resp = app.get('/admin/categories/update_order?order=3;1;2;')
|
|
categories = Category.select()
|
|
Category.sort_by_position(categories)
|
|
assert [x.id for x in categories] == [3, 1, 2]
|
|
|
|
def test_settings():
|
|
app = login(get_app(pub))
|
|
app.get('/admin/settings/')
|
|
|
|
app.get('/admin/settings/misc')
|
|
app.get('/admin/settings/debug_options')
|
|
app.get('/admin/settings/language')
|
|
app.get('/admin/settings/import')
|
|
app.get('/admin/settings/export')
|
|
app.get('/admin/settings/identification')
|
|
app.get('/admin/settings/sitename')
|
|
app.get('/admin/settings/sms')
|
|
app.get('/admin/settings/session')
|
|
app.get('/admin/settings/admin-permissions')
|
|
|
|
|
|
def test_settings_themes():
|
|
create_superuser()
|
|
app = login(get_app(pub))
|
|
|
|
# create mock theme
|
|
os.mkdir(os.path.join(pub.app_dir, 'themes'))
|
|
os.mkdir(os.path.join(pub.app_dir, 'themes', 'test'))
|
|
fd = open(os.path.join(pub.app_dir, 'themes', 'test', 'desc.xml'), 'w')
|
|
fd.write('<?xml version="1.0"?>'\
|
|
'<theme name="test" version="1.0">'\
|
|
' <label>Test Theme</label>'\
|
|
'</theme>')
|
|
fd.close()
|
|
|
|
resp = app.get('/admin/settings/themes')
|
|
assert 'biglist themes' in resp.body
|
|
assert 'Test Theme (1.0)' in resp.body
|
|
|
|
# just for the kick, there's no support for uploading file in webtest 1.3
|
|
resp = app.get('/admin/settings/themes')
|
|
resp.click('Install New Theme')
|
|
|
|
# select the theme
|
|
resp = app.get('/admin/settings/themes')
|
|
resp.forms[0]['theme'].value = 'test'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/settings/'
|
|
|
|
resp = app.get('/admin/settings/themes')
|
|
assert 'checked' in resp.body
|
|
assert get_current_theme()['name'] == 'test'
|
|
|
|
def test_settings_template():
|
|
create_superuser()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/settings/template')
|
|
|
|
# change template
|
|
orig_value = resp.forms[0]['template'].value
|
|
assert not 'foobar' in orig_value
|
|
resp.forms[0]['template'] = orig_value + '<!-- foobar -->'
|
|
resp = resp.forms[0].submit('submit')
|
|
|
|
# restore default template
|
|
resp = app.get('/admin/settings/template')
|
|
assert 'foobar' in resp.forms[0]['template'].value
|
|
resp = resp.forms[0].submit('restore-default')
|
|
|
|
# check
|
|
resp = app.get('/admin/settings/template')
|
|
assert resp.forms[0]['template'].value == orig_value
|
|
|
|
def test_settings_user():
|
|
create_superuser()
|
|
app = login(get_app(pub))
|
|
resp = app.get('/admin/settings/users').follow().follow()
|
|
|
|
# add a field
|
|
resp.forms[1]['label'] = 'foobar'
|
|
resp = resp.forms[1].submit()
|
|
assert resp.location == 'http://example.net/admin/settings/users/fields/'
|
|
resp = resp.follow()
|
|
assert 'foobar' in pub.cfg['users']['formdef']
|
|
assert 'foobar' in resp.body
|
|
|
|
# set field as email
|
|
resp.forms[0]['field_email'] = '1'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/settings/users/fields/'
|
|
resp = resp.follow()
|
|
assert pub.cfg['users']['field_email'] == '1'
|
|
|
|
# and unset it
|
|
resp.forms[0]['field_email'] = ''
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/settings/users/fields/'
|
|
resp = resp.follow()
|
|
assert pub.cfg['users']['field_email'] == None
|
|
|
|
def test_settings_emails():
|
|
create_superuser()
|
|
app = login(get_app(pub))
|
|
|
|
pub.cfg['debug'] = {'mail_redirection': 'foo@example.net'}
|
|
pub.write_cfg()
|
|
resp = app.get('/admin/settings/emails/')
|
|
resp = resp.click('General Options')
|
|
assert 'Warning: all emails are sent to <foo@example.net>' in resp.body
|
|
|
|
pub.cfg['debug'] = {}
|
|
pub.write_cfg()
|
|
resp = app.get('/admin/settings/emails/')
|
|
resp = resp.click('General Options')
|
|
assert 'Warning: all emails are sent to <foo@example.net>' not in resp.body
|
|
|
|
resp = app.get('/admin/settings/emails/')
|
|
resp = resp.click('Approval of new account')
|
|
resp.forms[0]['email-new-account-approved_subject'] = 'bla'
|
|
resp.forms[0]['email-new-account-approved'] = 'bla bla bla'
|
|
resp = resp.forms[0].submit()
|
|
assert pub.cfg['emails']['email-new-account-approved_subject'] == 'bla'
|
|
assert pub.cfg['emails']['email-new-account-approved'] == 'bla bla bla'
|
|
|
|
# reset to default value
|
|
resp = app.get('/admin/settings/emails/')
|
|
resp = resp.click('Approval of new account')
|
|
resp.forms[0]['email-new-account-approved_subject'] = 'Your account has been approved'
|
|
resp = resp.forms[0].submit()
|
|
assert pub.cfg['emails']['email-new-account-approved_subject'] is None
|
|
|
|
def test_settings_texts():
|
|
create_superuser()
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/admin/settings/texts/')
|
|
resp = resp.click('Text on top of the login page')
|
|
resp.forms[0]['text-top-of-login'] = 'Hello world'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.location == 'http://example.net/admin/settings/texts/'
|
|
assert pub.cfg['texts']['text-top-of-login'] == 'Hello world'
|
|
|
|
resp = app.get('/admin/settings/texts/')
|
|
resp = resp.click('Text on top of the login page')
|
|
resp = resp.forms[0].submit('restore-default')
|
|
assert resp.location == 'http://example.net/admin/settings/texts/'
|
|
assert pub.cfg['texts']['text-top-of-login'] == None
|
|
|
|
@pytest.mark.skipif('lasso is None')
|
|
def test_settings_auth():
|
|
pub.user_class.wipe() # makes sure there are no users
|
|
pub.cfg['identification'] = {}
|
|
pub.write_cfg()
|
|
app = get_app(pub)
|
|
|
|
resp = app.get('/admin/settings/')
|
|
assert not 'identification/password/' in resp.body
|
|
assert not 'identification/idp/' in resp.body
|
|
|
|
resp = resp.click('Identification')
|
|
assert resp.forms[0]['methods$elementidp'].checked is False
|
|
assert resp.forms[0]['methods$elementpassword'].checked is False
|
|
resp.forms[0]['methods$elementidp'].checked = True
|
|
resp = resp.forms[0].submit()
|
|
resp = resp.follow()
|
|
assert 'identification/idp/' in resp.body
|
|
assert pub.cfg['identification']['methods'] == ['idp']
|
|
|
|
resp = resp.click('Identification')
|
|
assert resp.forms[0]['methods$elementidp'].checked is True
|
|
assert resp.forms[0]['methods$elementpassword'].checked is False
|
|
resp.forms[0]['methods$elementidp'].checked = False
|
|
resp.forms[0]['methods$elementpassword'].checked = True
|
|
resp = resp.forms[0].submit()
|
|
resp = resp.follow()
|
|
assert 'identification/password/' in resp.body
|
|
assert pub.cfg['identification']['methods'] == ['password']
|
|
|
|
@pytest.mark.skipif('lasso is None')
|
|
def test_settings_idp():
|
|
pub.user_class.wipe() # makes sure there are no users
|
|
pub.cfg['identification'] = {'methods': ['idp']}
|
|
pub.write_cfg()
|
|
app = get_app(pub)
|
|
app.get('/saml/metadata', status=404)
|
|
resp = app.get('/admin/settings/')
|
|
resp = resp.click(href='identification/idp/')
|
|
resp = resp.click('Service Provider')
|
|
resp = resp.forms[0].submit()
|
|
resp = resp.follow()
|
|
resp_metadata = app.get('/saml/metadata', status=200)
|
|
assert resp_metadata.body.startswith('<?xml')
|
|
resp2 = resp.click('Identity Providers')
|
|
resp2.click('New') # this would then require file upload support
|
|
|
|
from test_saml_auth import setup_environment
|
|
setup_environment(pub)
|
|
|
|
resp = resp.click('Identity Providers')
|
|
assert 'http://sso.example.net/' in resp.body
|
|
resp2 = resp.click(href='http-sso.example.net-saml2-metadata/', index=0)
|
|
assert 'ns0:EntityDescriptor' in resp2.body
|
|
resp = resp.click(href='http-sso.example.net-saml2-metadata/edit')
|
|
resp = resp.forms[0].submit('submit')
|
|
resp = resp.follow()
|
|
|
|
# test that login initiates a SSO
|
|
login_resp = app.get('/login/', status=302)
|
|
assert login_resp.location.startswith('http://sso.example.net/saml2/sso?SAMLRequest')
|
|
|
|
resp = resp.click(href='/admin/settings/identification/idp/idp/') # breadcrumb
|
|
resp = resp.click(href='http-sso.example.net-saml2-metadata/delete')
|
|
resp = resp.forms[0].submit() # confirm delete
|
|
assert len(pub.cfg['idp']) == 0
|
|
|
|
def test_settings_filetypes():
|
|
create_superuser()
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/admin/settings/filetypes/')
|
|
assert 'There are no file type defined at the moment.' in resp.body
|
|
resp.forms[0]['label'] = 'Text files'
|
|
resp.forms[0]['mimetypes'] = '.odt'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/settings/filetypes/'
|
|
resp = resp.follow()
|
|
assert pub.cfg['filetypes'][1]['label'] == 'Text files'
|
|
|
|
resp = resp.click('Text files')
|
|
assert resp.forms[0]['mimetypes'].value == 'application/vnd.oasis.opendocument.text'
|
|
resp.forms[0]['mimetypes'] = 'application/vnd.oasis.opendocument.text, .doc, .docx, .pdf'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert resp.location == 'http://example.net/admin/settings/filetypes/'
|
|
resp = resp.follow()
|
|
assert 'application/msword (.doc)' in resp.body
|
|
assert 'application/pdf' in pub.cfg['filetypes'][1]['mimetypes']
|
|
|
|
resp.forms[0]['label'] = 'HTML files'
|
|
resp.forms[0]['mimetypes'] = '.html'
|
|
resp = resp.forms[0].submit('submit')
|
|
resp = resp.follow()
|
|
resp = resp.click('HTML files') # go to form
|
|
resp = resp.forms[0].submit('cancel') # and cancel
|
|
assert resp.location == 'http://example.net/admin/settings/filetypes/'
|
|
resp = resp.follow()
|
|
assert 'HTML files' in resp.body
|
|
|
|
resp = resp.click('HTML files') # go to form
|
|
resp = resp.forms[0].submit('delete') # and delete
|
|
assert resp.location == 'http://example.net/admin/settings/filetypes/'
|
|
resp = resp.follow()
|
|
assert 'HTML files' not in resp.body
|
|
|
|
def test_settings_filetypes_update():
|
|
create_superuser()
|
|
app = login(get_app(pub))
|
|
|
|
pub.cfg['filetypes'] = {
|
|
1: {'mimetypes': ['application/pdf', 'application/msword'],
|
|
'label': 'Text files'}
|
|
}
|
|
pub.write_cfg()
|
|
resp = app.get('/admin/settings/filetypes/')
|
|
assert 'Text files' in resp.body
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [fields.FileField(
|
|
id='1', label='1st field', type='file',
|
|
file_type=['application/pdf,application/msword'])]
|
|
formdef.store()
|
|
assert FormDef.get(formdef.id).fields[0].file_type == ['application/pdf,application/msword']
|
|
|
|
resp = resp.click('Text files')
|
|
resp.forms[0]['mimetypes'] = 'application/vnd.oasis.opendocument.text, .doc, .docx, .pdf'
|
|
resp = resp.forms[0].submit('submit')
|
|
assert 'application/pdf' in pub.cfg['filetypes'][1]['mimetypes']
|
|
assert FormDef.get(formdef.id).fields[0].file_type == ['application/vnd.oasis.opendocument.text,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/pdf']
|