tests: execute form pages tests twice, with/out sql enabled (#6598)

This commit is contained in:
Frédéric Péters 2015-03-02 15:45:51 +01:00
parent 2853f004b4
commit f7565b4c1e
2 changed files with 113 additions and 39 deletions

View File

@ -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()

View File

@ -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'})