tests: execute form pages tests twice, with/out sql enabled (#6598)
This commit is contained in:
parent
2853f004b4
commit
f7565b4c1e
|
@ -1,5 +1,4 @@
|
|||
import shutil
|
||||
from quixote import cleanup
|
||||
import pytest
|
||||
|
||||
from wcs.qommon.ident.password_accounts import PasswordAccount
|
||||
from wcs.formdef import FormDef
|
||||
|
@ -8,20 +7,27 @@ from wcs.tracking_code import TrackingCode
|
|||
from wcs import fields
|
||||
from wcs.sessions import BasicSession
|
||||
|
||||
from utilities import get_app, login, create_temporary_pub, emails
|
||||
from utilities import get_app, login, create_temporary_pub, clean_temporary_pub, emails
|
||||
|
||||
def setup_module(module):
|
||||
cleanup()
|
||||
global pub
|
||||
pub = create_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'))
|
||||
pub.cfg['identification'] = {'methods': ['password']}
|
||||
pub.write_cfg()
|
||||
|
||||
cat = Category(name='foobar')
|
||||
cat.store()
|
||||
if Category.count() == 0:
|
||||
cat = Category(name='foobar')
|
||||
cat.store()
|
||||
|
||||
return pub
|
||||
|
||||
|
||||
def teardown_module(module):
|
||||
shutil.rmtree(pub.APP_DIR)
|
||||
clean_temporary_pub()
|
||||
|
||||
|
||||
def create_formdef():
|
||||
|
@ -32,7 +38,7 @@ def create_formdef():
|
|||
formdef.store()
|
||||
return formdef
|
||||
|
||||
def create_user():
|
||||
def create_user(pub):
|
||||
pub.user_class.wipe()
|
||||
PasswordAccount.wipe()
|
||||
|
||||
|
@ -45,13 +51,13 @@ def create_user():
|
|||
account.store()
|
||||
return user
|
||||
|
||||
def test_home():
|
||||
def test_home(pub):
|
||||
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():
|
||||
def test_home_category(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.category_id = 1
|
||||
formdef.store()
|
||||
|
@ -60,14 +66,14 @@ def test_home_category():
|
|||
assert not 'category-misc' in home.body
|
||||
assert '<a class="" href="foobar/test/">test</a>' in home.body
|
||||
|
||||
def test_home_disabled():
|
||||
def test_home_disabled(pub):
|
||||
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():
|
||||
def test_home_inaccessible(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.roles = ['xxx']
|
||||
formdef.store()
|
||||
|
@ -75,7 +81,7 @@ def test_home_inaccessible():
|
|||
assert home.status_int == 302
|
||||
assert home.location == 'http://example.net/login'
|
||||
|
||||
def test_home_always_advertise():
|
||||
def test_home_always_advertise(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.roles = ['xxx']
|
||||
formdef.always_advertise = True
|
||||
|
@ -84,7 +90,7 @@ def test_home_always_advertise():
|
|||
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():
|
||||
def test_form_submit(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
page = get_app(pub).get('/test/')
|
||||
|
@ -96,7 +102,7 @@ def test_form_submit():
|
|||
assert 'The form has been recorded' in next_page.body
|
||||
assert formdef.data_class().count() == 1
|
||||
|
||||
def test_form_submit_no_confirmation():
|
||||
def test_form_submit_no_confirmation(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
formdef.confirmation = False
|
||||
|
@ -108,7 +114,7 @@ def test_form_submit_no_confirmation():
|
|||
assert 'The form has been recorded' in next_page.body
|
||||
assert formdef.data_class().count() == 1
|
||||
|
||||
def test_form_string_field_submit():
|
||||
def test_form_string_field_submit(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields = [fields.StringField(id='0', label='string')]
|
||||
|
@ -127,7 +133,7 @@ def test_form_string_field_submit():
|
|||
data = formdef.data_class().get(1)
|
||||
assert data.data == {'0': 'foobar'}
|
||||
|
||||
def test_form_multi_page():
|
||||
def test_form_multi_page(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),
|
||||
|
@ -151,7 +157,7 @@ def test_form_multi_page():
|
|||
data = formdef.data_class().get(1)
|
||||
assert data.data == {'1': 'foo', '3': 'bar'}
|
||||
|
||||
def test_form_multi_page_condition():
|
||||
def test_form_multi_page_condition(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),
|
||||
|
@ -167,8 +173,8 @@ def test_form_multi_page_condition():
|
|||
resp = resp.forms[0].submit('previous')
|
||||
assert resp.forms[0]['f1']
|
||||
|
||||
def test_form_submit_with_user():
|
||||
create_user()
|
||||
def test_form_submit_with_user(pub):
|
||||
create_user(pub)
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
page = login(get_app(pub), username='foo', password='foo').get('/test/')
|
||||
|
@ -183,8 +189,8 @@ def test_form_submit_with_user():
|
|||
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()
|
||||
def test_form_visit_existing(pub):
|
||||
user = create_user(pub)
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
|
||||
|
@ -204,8 +210,8 @@ def test_form_visit_existing():
|
|||
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()
|
||||
def test_form_auth(pub):
|
||||
create_user(pub)
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
resp = get_app(pub).get('/test/auth')
|
||||
|
@ -214,8 +220,8 @@ def test_form_auth():
|
|||
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()
|
||||
def test_form_tryauth(pub):
|
||||
create_user(pub)
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
resp = get_app(pub).get('/test/tryauth')
|
||||
|
@ -235,7 +241,7 @@ def test_form_tryauth():
|
|||
pub.cfg['identification'] = {'methods': ['password']}
|
||||
pub.write_cfg()
|
||||
|
||||
def test_form_no_tracking_code():
|
||||
def test_form_no_tracking_code(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields = [fields.StringField(id='0', label='string')]
|
||||
|
@ -244,7 +250,7 @@ def test_form_no_tracking_code():
|
|||
resp = get_app(pub).get('/test/')
|
||||
assert not '<h3>Tracking code</h3>' in resp.body
|
||||
|
||||
def test_form_tracking_code():
|
||||
def test_form_tracking_code(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields = [fields.StringField(id='0', label='string')]
|
||||
|
@ -310,8 +316,8 @@ def test_form_tracking_code():
|
|||
assert formdef.data_class().get(formdata_id).evolution[-1].comment == 'hello world'
|
||||
|
||||
|
||||
def test_form_tracking_code_as_user():
|
||||
user = create_user()
|
||||
def test_form_tracking_code_as_user(pub):
|
||||
user = create_user(pub)
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields = [fields.StringField(id='0', label='string')]
|
||||
|
@ -355,7 +361,7 @@ def test_form_tracking_code_as_user():
|
|||
assert 'barfoo' in resp.body
|
||||
assert formdef.data_class().count() == 1 # check the draft one has been removed
|
||||
assert formdef.data_class().select()[0].tracking_code == tracking_code
|
||||
assert formdef.data_class().select()[0].user_id == user.id
|
||||
assert str(formdef.data_class().select()[0].user_id) == str(user.id)
|
||||
assert formdef.data_class().select()[0].status == 'wf-new'
|
||||
assert formdef.data_class().select()[0].data['0'] == 'barfoo'
|
||||
formdata_id = formdef.data_class().select()[0].id
|
||||
|
@ -387,7 +393,7 @@ def test_form_tracking_code_as_user():
|
|||
assert 'form_comment' in resp.body # makes sure user is treated as submitter
|
||||
|
||||
|
||||
def test_form_tracking_code_email():
|
||||
def test_form_tracking_code_email(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields = [fields.StringField(id='0', label='string')]
|
||||
|
@ -407,7 +413,7 @@ def test_form_tracking_code_email():
|
|||
assert 'ABCDEF' in emails.emails.values()[0]['args'][0]
|
||||
assert resp.location == 'http://example.net/test/code/ABCDEF/load'
|
||||
|
||||
def test_form_invalid_tracking_code():
|
||||
def test_form_invalid_tracking_code(pub):
|
||||
formdef = create_formdef()
|
||||
formdef.data_class().wipe()
|
||||
formdef.fields = [fields.StringField(id='0', label='string')]
|
||||
|
@ -426,7 +432,7 @@ def test_form_invalid_tracking_code():
|
|||
formdata.data = {'0': 'foobar'}
|
||||
formdata.store()
|
||||
|
||||
code = TrackingCode()
|
||||
code = pub.tracking_code_class()
|
||||
code.formdata = formdata
|
||||
code.store()
|
||||
|
||||
|
|
|
@ -1,7 +1,16 @@
|
|||
import cPickle
|
||||
import os
|
||||
import tempfile
|
||||
import random
|
||||
import psycopg2
|
||||
import pytest
|
||||
import shutil
|
||||
import threading
|
||||
|
||||
from wcs import sql
|
||||
|
||||
from webtest import TestApp
|
||||
from quixote import cleanup
|
||||
from quixote.wsgi import QWIP
|
||||
|
||||
import wcs
|
||||
|
@ -10,17 +19,76 @@ from wcs.qommon.http_request import HTTPRequest
|
|||
|
||||
QWIP.request_class = HTTPRequest
|
||||
|
||||
def create_temporary_pub():
|
||||
APP_DIR = tempfile.mkdtemp()
|
||||
class KnownElements(object):
|
||||
pickle_app_dir = None
|
||||
sql_app_dir = None
|
||||
sql_db_name = None
|
||||
|
||||
known_elements = KnownElements()
|
||||
|
||||
def create_temporary_pub(sql_mode=False):
|
||||
if sql_mode is True:
|
||||
if pytest.config.getoption('without_postgresql_tests'):
|
||||
pytest.skip("unsupported configuration")
|
||||
return
|
||||
cleanup()
|
||||
if sql_mode is False and known_elements.pickle_app_dir:
|
||||
APP_DIR = known_elements.pickle_app_dir
|
||||
elif sql_mode is True and known_elements.sql_app_dir:
|
||||
APP_DIR = known_elements.sql_app_dir
|
||||
else:
|
||||
APP_DIR = tempfile.mkdtemp()
|
||||
if sql_mode is True:
|
||||
known_elements.sql_app_dir = APP_DIR
|
||||
elif sql_mode is False:
|
||||
known_elements.pickle_app_dir = APP_DIR
|
||||
|
||||
publisher.WcsPublisher.APP_DIR = APP_DIR
|
||||
publisher.WcsPublisher.DATA_DIR = os.path.abspath(
|
||||
os.path.join(os.path.dirname(wcs.__file__), '..', 'data'))
|
||||
pub = publisher.WcsPublisher.create_publisher()
|
||||
# allow saving the user
|
||||
pub.app_dir = os.path.join(APP_DIR, 'example.net')
|
||||
|
||||
if os.path.exists(pub.app_dir):
|
||||
return pub
|
||||
|
||||
os.mkdir(pub.app_dir)
|
||||
if sql_mode:
|
||||
pub.has_site_option = lambda x: True
|
||||
|
||||
conn = psycopg2.connect(user=os.environ['USER'])
|
||||
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
|
||||
cur = conn.cursor()
|
||||
dbname = 'wcstests%d' % random.randint(0, 100000)
|
||||
known_elements.sql_db_name = dbname
|
||||
cur.execute('CREATE DATABASE %s' % dbname)
|
||||
cur.close()
|
||||
|
||||
pub.cfg['postgresql'] = {'database': dbname, 'user': os.environ['USER']}
|
||||
|
||||
sql.do_user_table()
|
||||
sql.do_tracking_code_table()
|
||||
|
||||
pub.user_class = sql.SqlUser
|
||||
pub.tracking_code_class = sql.TrackingCode
|
||||
|
||||
conn.close()
|
||||
|
||||
return pub
|
||||
|
||||
def clean_temporary_pub():
|
||||
if known_elements.pickle_app_dir:
|
||||
shutil.rmtree(known_elements.pickle_app_dir)
|
||||
if known_elements.sql_app_dir:
|
||||
shutil.rmtree(known_elements.sql_app_dir)
|
||||
if known_elements.sql_db_name:
|
||||
conn = psycopg2.connect(user=os.environ['USER'])
|
||||
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
|
||||
cur = conn.cursor()
|
||||
cur.execute('DROP DATABASE %s' % known_elements.sql_db_name)
|
||||
cur.close()
|
||||
|
||||
def get_app(pub):
|
||||
return TestApp(QWIP(pub), extra_environ={'HTTP_HOST': 'example.net'})
|
||||
|
||||
|
|
Loading…
Reference in New Issue