''' functional tests for ordr2 ''' import pytest import re import transaction import webtest from bs4 import BeautifulSoup from .. import APP_SETTINGS, get_example_user WEBTEST_SETTINGS = APP_SETTINGS.copy() WEBTEST_SETTINGS['pyramid.includes'] = [ 'pyramid_mailer.testing' ] class CustomTestApp(webtest.TestApp): ''' might add custom functionality to webtest.TestApp ''' pass def login(self, username, password): ''' login ''' self.logout() result = self.get('/account/login') login_form = result.forms[0] login_form['username'] = username login_form['password'] = password login_form.submit() response = self.get('/faq') return username in response def logout(self): ''' logout ''' self.get('/account/logout') def reset(self): ''' reset the webapp ''' self.logout() super().reset() def create_users(dbsession): ''' create example users ''' from ordr.models.account import Role for role in Role: user = get_example_user(role) dbsession.add(user) def get_token_url(email, prefix='/'): ''' extracts an account token url from an email ''' soup = BeautifulSoup(email.html, 'html.parser') for link in soup.find_all('a'): if re.search(prefix + '[a-f0-9]{32}', link['href']): return link['href'] @pytest.fixture(scope='module') def testappsetup(): ''' setup of fixture for using webtest this fixture just sets up the testapp. please use the testapp() fixture below for real tests. ''' from ordr.models.meta import Base from ordr.models import get_tm_session from ordr import main app = main({}, **WEBTEST_SETTINGS) testapp = CustomTestApp(app) session_factory = app.registry['dbsession_factory'] engine = session_factory.kw['bind'] Base.metadata.create_all(engine) with transaction.manager: # set up test data here dbsession = get_tm_session(session_factory, transaction.manager) create_users(dbsession) yield testapp Base.metadata.drop_all(engine) @pytest.fixture(scope='function') def testapp(testappsetup): ''' fixture using webtests, resets the logged every time ''' testappsetup.reset() yield testappsetup