beavyHQ/beavy

View on GitHub
beavy/testing/environment.py

Summary

Maintainability
A
2 hrs
Test Coverage
# import os
from behaving import environment as benv
from beavy.app import app
from .database import ensure_personas, mixer
from pprint import pprint

import logging
import json
import os


log = logging.Logger(__name__)

BEHAVE_DEBUG_ON_ERROR = not os.getenv("CI", False)
BEHAVE_ERROR_ON_BROWSER_WARNINGS = os.getenv("BEHAVE_ERROR_ON_BROWSER_WARNINGS", not BEHAVE_DEBUG_ON_ERROR)  # noqa


def before_all(context):
    context.default_browser = os.getenv("BEHAVE_DEFAULT_BROWSER", 'chrome')

    context.default_browser_size = (1280, 1024)
    port = "2992" if app.config.get("DEBUG", False) else "5000"
    default_url = "http://localhost:{}".format(port)
    context.base_url = os.getenv("BEHAVE_BASE_URL", default_url)

    benv.before_all(context)

    mixer.init_app(app)


def after_all(context):
    benv.after_all(context)


def before_feature(context, feature):
    benv.before_feature(context, feature)


def after_feature(context, feature):
    benv.after_feature(context, feature)


def before_scenario(context, scenario):
    benv.before_scenario(context, scenario)
    context.personas = ensure_personas()


def after_scenario(context, scenario):

    if getattr(context, "browser", None):
        has_warnings = False
        for entry in context.browser.driver.get_log('browser'):

            if entry["level"] not in ["WARNING", "ERROR"]:
                continue

            try:
                msg = json.loads(entry["message"])["message"]
            except (ValueError, KeyError):
                pass
            else:
                # in chrome we can extract much more info!
                if msg["level"] in ["warn", "error"] and \
                   msg.get("source") == "console-api":
                    entry = dict(level=msg["level"],
                                 timestamp=entry["timestamp"],
                                 message=msg["text"])
                else:
                    continue

            has_warnings = True

            log.warning("Browser {level}: {timestamp}: {message}".format(
                        **entry))

        if BEHAVE_ERROR_ON_BROWSER_WARNINGS and has_warnings:
            print("Exciting – Browser Warnings/Errors!")
            exit(1)

    benv.after_scenario(context, scenario)


def after_step(context, step):
    if BEHAVE_DEBUG_ON_ERROR and step.status == "failed":
        # -- ENTER DEBUGGER: Zoom in on failure location.
        # NOTE: Use IPython debugger, same for pdb (basic python debugger).
        try:
            import ipdb as pdb
        except ImportError:
            import pdb

        if getattr(context, "browser", None):
            pprint(context.browser.driver.get_log('browser')[-10:])
            print("Current Screen: {}".format(context.browser.screenshot()))

        pdb.post_mortem(step.exc_traceback)