You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.1 KiB
117 lines
3.1 KiB
''' 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, modifyer=None): |
|
''' 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 modifyer: |
|
post_dict.update(modifyer) |
|
request.POST = post_dict |
|
|
|
|
|
|
|
|
|
|