|
|
|
''' Test package for ordr2. '''
|
|
|
|
|
|
|
|
import os.path
|
|
|
|
import pytest
|
|
|
|
import transaction
|
|
|
|
|
|
|
|
from pyramid import testing
|
|
|
|
from pyramid.csrf import get_csrf_token
|
|
|
|
from webob.multidict import MultiDict
|
|
|
|
|
|
|
|
|
|
|
|
# some path mangling to get the path to passlib.ini
|
|
|
|
currrent_dir = os.path.dirname(__file__)
|
|
|
|
ordr2_dir = os.path.dirname(currrent_dir)
|
|
|
|
passlib_config_path = os.path.join(ordr2_dir, 'passlib.ini')
|
|
|
|
assert os.path.isfile(passlib_config_path)
|
|
|
|
|
|
|
|
APP_SETTINGS = {
|
|
|
|
'sqlalchemy.url': 'sqlite:///:memory:',
|
|
|
|
'auth.secret': 'not-very-secure',
|
|
|
|
'session.secret':
|
|
|
|
'4d72ee16df8cf1238048ade32e3ce4d51757af8ada4a962cfae5cea5c08421a0',
|
|
|
|
'session.auto_csrf': True,
|
|
|
|
'passlib.config': passlib_config_path,
|
|
|
|
'pyramid.includes': [
|
|
|
|
'pyramid_jinja2',
|
|
|
|
],
|
|
|
|
'mail.default_sender': 'ordr@example.com'
|
|
|
|
}
|
|
|
|
|
|
|
|
EXAMPLE_USER_DATA = {
|
|
|
|
'unvalidated': (1, 'Graham', 'Chapman'),
|
|
|
|
'new': (2, 'John', 'Cleese'),
|
|
|
|
'user': (3, 'Terry', 'Gilliam'),
|
|
|
|
'purchaser': (4, 'Eric', 'Idle'),
|
|
|
|
'admin': (5, 'Terry', 'Jones'),
|
|
|
|
'inactive': (6, 'Michael', 'Palin'),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# fixtures
|
|
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
|
|
def app_config():
|
|
|
|
''' fixture for tests requiring a pyramid.testing setup '''
|
|
|
|
with testing.testConfig(settings=APP_SETTINGS) as config:
|
|
|
|
config.include('pyramid_mailer.testing')
|
|
|
|
config.include('pyramid_jinja2')
|
|
|
|
|
|
|
|
from ordr2.models.account import passlib_context
|
|
|
|
passlib_context.update(schemes=['argon2'])
|
|
|
|
|
|
|
|
yield config
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope='function')
|
|
|
|
def dbsession(app_config):
|
|
|
|
''' fixture for testing with database connection '''
|
|
|
|
from ordr2.models.meta import Base
|
|
|
|
from ordr2.models import (
|
|
|
|
get_engine,
|
|
|
|
get_session_factory,
|
|
|
|
get_tm_session
|
|
|
|
)
|
|
|
|
|
|
|
|
settings = app_config.get_settings()
|
|
|
|
engine = get_engine(settings)
|
|
|
|
session_factory = get_session_factory(engine)
|
|
|
|
session = get_tm_session(session_factory, transaction.manager)
|
|
|
|
Base.metadata.create_all(engine)
|
|
|
|
|
|
|
|
yield session
|
|
|
|
|
|
|
|
transaction.abort()
|
|
|
|
Base.metadata.drop_all(engine)
|
|
|
|
|
|
|
|
|
|
|
|
# helpers
|
|
|
|
|
|
|
|
def get_user(role_name):
|
|
|
|
''' get the user model for one well known user '''
|
|
|
|
from ordr2.models import Role, User
|
|
|
|
id_, first_name, last_name = EXAMPLE_USER_DATA[role_name]
|
|
|
|
user = User(
|
|
|
|
id=id_,
|
|
|
|
username=first_name + last_name,
|
|
|
|
first_name = first_name,
|
|
|
|
last_name = last_name,
|
|
|
|
email = last_name.lower() + '@example.com',
|
|
|
|
role=Role(role_name)
|
|
|
|
)
|
|
|
|
user.set_password(first_name)
|
|
|
|
return user
|
|
|
|
|
|
|
|
|
|
|
|
def create_users(db):
|
|
|
|
''' set up all well known example users '''
|
|
|
|
from ordr2.models import Role
|
|
|
|
for role in Role:
|
|
|
|
user = get_user(role.value)
|
|
|
|
db.add(user)
|
|
|
|
|
|
|
|
|
|
|
|
def set_deform_data(request, form_data, extra_data=None, **kwargs):
|
|
|
|
''' augments the request to include post data as provided by deform '''
|
|
|
|
post_dict = MultiDict()
|
|
|
|
post_dict['__formid__'] = 'deform'
|
|
|
|
post_dict['_charset_'] = 'UTF-8'
|
|
|
|
post_dict['csrf_token'] = get_csrf_token(request)
|
|
|
|
post_dict.update(form_data)
|
|
|
|
if extra_data:
|
|
|
|
post_dict.update(extra_data)
|
|
|
|
post_dict.update(kwargs)
|
|
|
|
request.POST = post_dict
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|