235 lines
8.0 KiB
Python
235 lines
8.0 KiB
Python
import shutil
|
|
from quixote import cleanup
|
|
|
|
from wcs.qommon.ident.password_accounts import PasswordAccount
|
|
from wcs.formdef import FormDef
|
|
from wcs.categories import Category
|
|
from wcs import fields
|
|
|
|
from utilities import get_app, login, create_temporary_pub, emails
|
|
|
|
def setup_module(module):
|
|
cleanup()
|
|
global pub
|
|
pub = create_temporary_pub()
|
|
pub.cfg['identification'] = {'methods': ['password']}
|
|
pub.write_cfg()
|
|
|
|
cat = Category(name='foobar')
|
|
cat.store()
|
|
|
|
def teardown_module(module):
|
|
shutil.rmtree(pub.APP_DIR)
|
|
|
|
|
|
def create_formdef():
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'test'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
return formdef
|
|
|
|
def create_user():
|
|
pub.user_class.wipe()
|
|
PasswordAccount.wipe()
|
|
|
|
user = pub.user_class()
|
|
user.email = 'foo@localhost'
|
|
user.store()
|
|
account = PasswordAccount(id='foo')
|
|
account.set_password('foo')
|
|
account.user_id = user.id
|
|
account.store()
|
|
return user
|
|
|
|
def test_home():
|
|
create_formdef()
|
|
home = get_app(pub).get('/')
|
|
assert 'category-misc' in home.body
|
|
assert '<a class="" href="test/">test</a>' in home.body
|
|
|
|
def test_home_category():
|
|
formdef = create_formdef()
|
|
formdef.category_id = 1
|
|
formdef.store()
|
|
home = get_app(pub).get('/')
|
|
assert 'category-foobar' in home.body
|
|
assert not 'category-misc' in home.body
|
|
assert '<a class="" href="foobar/test/">test</a>' in home.body
|
|
|
|
def test_home_disabled():
|
|
formdef = create_formdef()
|
|
formdef.disabled = True
|
|
formdef.store()
|
|
home = get_app(pub).get('/')
|
|
assert not '<a href="test/">test</a>' in home.body
|
|
|
|
def test_home_inaccessible():
|
|
formdef = create_formdef()
|
|
formdef.roles = ['xxx']
|
|
formdef.store()
|
|
home = get_app(pub).get('/')
|
|
assert home.status_int == 302
|
|
assert home.location == 'http://example.net/login'
|
|
|
|
def test_home_always_advertise():
|
|
formdef = create_formdef()
|
|
formdef.roles = ['xxx']
|
|
formdef.always_advertise = True
|
|
formdef.store()
|
|
home = get_app(pub).get('/')
|
|
assert '<a href="test/">test</a>' in home.body
|
|
assert '<a href="test/">test</a><span> (authentication required)</span>' in home.body
|
|
|
|
def test_form_submit():
|
|
formdef = create_formdef()
|
|
formdef.data_class().wipe()
|
|
page = get_app(pub).get('/test/')
|
|
next_page = page.forms[0].submit('submit')
|
|
assert 'Check values then click submit.' in next_page.body
|
|
next_page = next_page.forms[0].submit('submit')
|
|
assert next_page.status_int == 302
|
|
next_page = next_page.follow()
|
|
assert 'The form has been recorded' in next_page.body
|
|
assert formdef.data_class().count() == 1
|
|
|
|
def test_form_submit_no_confirmation():
|
|
formdef = create_formdef()
|
|
formdef.data_class().wipe()
|
|
formdef.confirmation = False
|
|
formdef.store()
|
|
page = get_app(pub).get('/test/')
|
|
next_page = page.forms[0].submit('submit')
|
|
assert next_page.status_int == 302
|
|
next_page = next_page.follow()
|
|
assert 'The form has been recorded' in next_page.body
|
|
assert formdef.data_class().count() == 1
|
|
|
|
def test_form_string_field_submit():
|
|
formdef = create_formdef()
|
|
formdef.data_class().wipe()
|
|
formdef.fields = [fields.StringField(id='0', label='string')]
|
|
formdef.store()
|
|
page = get_app(pub).get('/test/')
|
|
next_page = page.forms[0].submit('submit') # but the field is required
|
|
assert '<div class="error">required field</div>' in next_page.body
|
|
next_page.forms[0]['f0'] = 'foobar'
|
|
next_page = next_page.forms[0].submit('submit')
|
|
assert 'Check values then click submit.' in next_page.body
|
|
next_page = next_page.forms[0].submit('submit')
|
|
assert next_page.status_int == 302
|
|
next_page = next_page.follow()
|
|
assert 'The form has been recorded' in next_page.body
|
|
assert formdef.data_class().count() == 1
|
|
data = formdef.data_class().get(1)
|
|
assert data.data == {'0': 'foobar'}
|
|
|
|
def test_form_multi_page():
|
|
formdef = create_formdef()
|
|
formdef.data_class().wipe()
|
|
formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),
|
|
fields.StringField(id='1', label='string'),
|
|
fields.PageField(id='2', label='2nd page', type='page'),
|
|
fields.StringField(id='3', label='string 2')]
|
|
formdef.store()
|
|
page = get_app(pub).get('/test/')
|
|
page.forms[0]['f1'] = 'foo'
|
|
assert page.forms[0].fields['submit'][0].value_if_submitted() == 'Next'
|
|
next_page = page.forms[0].submit('submit')
|
|
assert next_page.forms[0]['previous']
|
|
next_page.forms[0]['f3'] = 'bar'
|
|
next_page = next_page.forms[0].submit('submit')
|
|
assert 'Check values then click submit.' in next_page.body
|
|
next_page = next_page.forms[0].submit('submit')
|
|
assert next_page.status_int == 302
|
|
next_page = next_page.follow()
|
|
assert 'The form has been recorded' in next_page.body
|
|
assert formdef.data_class().count() == 1
|
|
data = formdef.data_class().get(1)
|
|
assert data.data == {'1': 'foo', '3': 'bar'}
|
|
|
|
def test_form_multi_page_condition():
|
|
formdef = create_formdef()
|
|
formdef.data_class().wipe()
|
|
formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),
|
|
fields.StringField(id='1', label='string'),
|
|
fields.PageField(id='2', label='2nd page', type='page', condition='False'),
|
|
fields.StringField(id='3', label='string 2')]
|
|
formdef.store()
|
|
resp = get_app(pub).get('/test/')
|
|
resp.forms[0]['f1'] = 'foo'
|
|
resp = resp.forms[0].submit('submit') # should go straight to validation
|
|
assert 'Check values then click submit.' in resp.body
|
|
assert resp.forms[0]['previous']
|
|
resp = resp.forms[0].submit('previous')
|
|
assert resp.forms[0]['f1']
|
|
|
|
def test_form_submit_with_user():
|
|
create_user()
|
|
formdef = create_formdef()
|
|
formdef.data_class().wipe()
|
|
page = login(get_app(pub), username='foo', password='foo').get('/test/')
|
|
next_page = page.forms[0].submit('submit')
|
|
assert 'Check values then click submit.' in next_page.body
|
|
next_page = next_page.forms[0].submit('submit')
|
|
assert next_page.status_int == 302
|
|
next_page = next_page.follow()
|
|
assert 'The form has been recorded' in next_page.body
|
|
assert formdef.data_class().count() == 1
|
|
# check the user received a copy by email
|
|
assert emails.emails.get('New form (test)')
|
|
assert emails.emails.get('New form (test)')['kwargs']['email_rcpt'] == ['foo@localhost']
|
|
|
|
def test_form_visit_existing():
|
|
user = create_user()
|
|
formdef = create_formdef()
|
|
formdef.data_class().wipe()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.store()
|
|
|
|
formdata_user = formdef.data_class()()
|
|
formdata_user.user_id = user.id
|
|
formdata_user.store()
|
|
|
|
resp = get_app(pub).get('/test/%s/' % formdata.id)
|
|
assert resp.location == 'http://example.net/login'
|
|
|
|
resp = get_app(pub).get('/test/%s/' % formdata_user.id)
|
|
assert resp.location == 'http://example.net/login'
|
|
|
|
resp = login(get_app(pub), username='foo', password='foo').get('/test/%s/' % formdata_user.id)
|
|
assert 'The form has been recorded on' in resp
|
|
|
|
def test_form_auth():
|
|
create_user()
|
|
formdef = create_formdef()
|
|
formdef.data_class().wipe()
|
|
resp = get_app(pub).get('/test/auth')
|
|
assert resp.location == 'http://example.net/login/?ReturnUrl=http%3A//example.net/test/'
|
|
|
|
resp = login(get_app(pub), username='foo', password='foo').get('/test/auth')
|
|
assert resp.location == 'http://example.net/test/'
|
|
|
|
def test_form_tryauth():
|
|
create_user()
|
|
formdef = create_formdef()
|
|
formdef.data_class().wipe()
|
|
resp = get_app(pub).get('/test/tryauth')
|
|
assert resp.location == 'http://example.net/test/'
|
|
|
|
app = login(get_app(pub), username='foo', password='foo')
|
|
pub.cfg['identification'] = {'methods': ['idp']}
|
|
pub.write_cfg()
|
|
# if the user is logged in, the form should be presented
|
|
resp = app.get('/test/tryauth')
|
|
assert resp.location == 'http://example.net/test/'
|
|
|
|
# if the user is unlogged, there should be a passive redirection to SSO
|
|
resp = get_app(pub).get('/test/tryauth')
|
|
assert 'IsPassive=true' in resp.location
|
|
|
|
pub.cfg['identification'] = {'methods': ['password']}
|
|
pub.write_cfg()
|