summaryrefslogtreecommitdiff
path: root/service/test/functional/features/environment.py
diff options
context:
space:
mode:
Diffstat (limited to 'service/test/functional/features/environment.py')
-rw-r--r--service/test/functional/features/environment.py145
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'))