import pytest import transaction from pyramid import testing from pyramid.csrf import get_csrf_token APP_SETTINGS = { 'sqlalchemy.url': 'sqlite:///:memory:', 'session.secret': 'something', 'session.auto_csrf': True, 'passlib.schemes': 'argon2 bcrypt', 'passlib.default': 'argon2', 'passlib.deprecated': 'auto', '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_jinja2') config.include('pyramid_listing') config.include('pyramid_mailer.testing') yield config @pytest.fixture(scope='function') def dbsession(app_config): ''' fixture for testing with database connection ''' from ordr.models.meta import Base from ordr.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_example_user(role): ''' get the user model for one well known user ''' from ordr.models import 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 ) user.set_password(first_name) return user def get_post_request(dbsession, data): ''' returns a dummy request with csrf_token for validating deform forms ''' request = testing.DummyRequest() post_data = {'csrf_token': get_csrf_token(request)} post_data.update(data) return testing.DummyRequest(dbsession=dbsession, POST=post_data)