diff options
Diffstat (limited to 'service/test/functional/features/environment.py')
-rw-r--r-- | service/test/functional/features/environment.py | 145 |
1 files changed, 99 insertions, 46 deletions
diff --git a/service/test/functional/features/environment.py b/service/test/functional/features/environment.py index 77efc499..d49016b6 100644 --- a/service/test/functional/features/environment.py +++ b/service/test/functional/features/environment.py @@ -13,31 +13,29 @@ # # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see <http://www.gnu.org/licenses/>. -import uuid import os +import re +import time +from urlparse import urlparse +import uuid -from selenium import webdriver from crochet import setup, wait_for - -from twisted.internet import defer -from twisted.logger import globalLogBeginner, textFileLogObserver, Logger - -from test.support.integration import AppTestClient -from steps.common import * - from leap.common.events.server import ensure_server +from selenium import webdriver +from twisted.internet import defer from pixelated.application import UserAgentMode from pixelated.config.site import PixelatedSite from pixelated.resources.features_resource import FeaturesResource +from test.support.integration import AppTestClient +from steps.common import DEFAULT_IMPLICIT_WAIT_TIMEOUT_IN_S -setup() -observers = [textFileLogObserver(open(os.devnull, 'w'))] +class UnsuportedWebDriverError(Exception): + pass -globalLogBeginner.beginLoggingTo(observers) -Logger('twisted') +setup() @wait_for(timeout=5.0) @@ -46,61 +44,116 @@ def start_app_test_client(client, mode): def before_all(context): + _setup_webdriver(context) + userdata = context.config.userdata + context.host = userdata.get('host', 'http://localhost') + + if not context.host.startswith('http'): + context.host = 'https://{}'.format(context.host) + + hostname = urlparse(context.host).hostname + context.signup_url = 'https://{}/signup'.format(hostname) + context.login_url = 'https://mail.{}/login'.format(hostname) + context.username = 'testuser_{}'.format(uuid.uuid4()) + + if 'localhost' in context.host: + _mock_user_agent(context) + context.login_url = context.multi_user_url + '/login' + context.username = 'username' + + +def _setup_webdriver(context): + browser = context.config.userdata.get('webdriver', 'phantomjs') + supported_webdrivers = { + 'phantomjs': webdriver.PhantomJS, + 'firefox': webdriver.Firefox, + 'chrome': webdriver.Chrome, + } + + try: + context.browser = supported_webdrivers[browser]() + except KeyError: + raise UnsuportedWebDriverError('{} is not a supported webdriver'.format(browser)) + + context.browser.set_window_size(1280, 1024) + context.browser.implicitly_wait(DEFAULT_IMPLICIT_WAIT_TIMEOUT_IN_S) + context.browser.set_page_load_timeout(60) + + +def _mock_user_agent(context): ensure_server() PixelatedSite.disable_csp_requests() - client = AppTestClient() - start_app_test_client(client, UserAgentMode(is_single_user=True)) - client.listenTCP(port=8889) FeaturesResource.DISABLED_FEATURES.append('autoRefresh') - context.client = client - multi_user_client = AppTestClient() - start_app_test_client(multi_user_client, UserAgentMode(is_single_user=False)) - multi_user_client.listenTCP(port=MULTI_USER_PORT) - context.multi_user_client = multi_user_client + context.single_user_url = _define_url(8889) + context.single_user_client = _start_user_agent(8889, is_single_user=True) + + context.multi_user_url = _define_url(4568) + context.multi_user_client = _start_user_agent(4568, is_single_user=False) + + +def _start_user_agent(port, is_single_user): + client = AppTestClient() + start_app_test_client(client, UserAgentMode(is_single_user=is_single_user)) + client.listenTCP(port=port) + return client + + +def _define_url(port): + return 'http://localhost:{port}'.format(port=port) def after_all(context): - context.client.stop() + context.browser.quit() + if 'localhost' in context.host: + context.single_user_client.stop() def before_feature(context, feature): - # context.browser = webdriver.Chrome() - # context.browser = webdriver.Firefox() - context.browser = webdriver.PhantomJS() - context.browser.set_window_size(1280, 1024) - context.browser.implicitly_wait(DEFAULT_IMPLICIT_WAIT_TIMEOUT_IN_S) - context.browser.set_page_load_timeout(60) # wait for data - context.browser.get(HOMEPAGE_URL) + if 'localhost' in context.host: + context.browser.get(context.single_user_url) + + +def after_feature(context, feature): + if 'localhost' in context.host: + cleanup_all_mails(context) + context.last_mail = None def after_step(context, step): - if step.status == 'failed': - id = str(uuid.uuid4()) - os.chdir("screenshots") - context.browser.save_screenshot('failed ' + str(step.name) + '_' + id + ".png") - save_source(context, 'failed ' + str(step.name) + '_' + id + ".html") - os.chdir("../") + _debug_on_error(context, step) + _save_screenshot(context, step) -def after_feature(context, feature): - context.browser.quit() +def _debug_on_error(context, step): + if step.status == 'failed' and context.config.userdata.getbool("debug"): + try: + import ipdb + ipdb.post_mortem(step.exc_traceback) + except ImportError: + import pdb + pdb.post_mortem(step.exc_traceback) - cleanup_all_mails(context) - context.last_mail = None + +def _save_screenshot(context, step): + if (step.status == 'failed' and + context.config.userdata.getbool("screenshots", True)): + timestamp = time.strftime("%Y-%m-%d-%H-%M-%S") + filename = _slugify('{} failed {}'.format(timestamp, str(step.name))) + filepath = os.path.join('screenshots', filename + '.png') + context.browser.save_screenshot(filepath) + + +def _slugify(string_): + return re.sub('\W', '-', string_) @wait_for(timeout=10.0) def cleanup_all_mails(context): @defer.inlineCallbacks def _delete_all_mails(): - mails = yield context.client.mail_store.all_mails() + mails = yield context.single_user_client.mail_store.all_mails() for mail in mails: - yield context.client.mail_store.delete_mail(mail.ident) + yield context.single_user_client.mail_store.delete_mail(mail.ident) return _delete_all_mails() - - -def save_source(context, filename='/tmp/source.html'): - with open(filename, 'w') as out: - out.write(context.browser.page_source.encode('utf8')) |