frontend_tests.py 2.84 KB
import os
import urllib.request

from flask_testing import LiveServerTestCase
from selenium import webdriver

from app import create_app
from pdc_config import TestConfig


class BaseFrontTestCase(LiveServerTestCase):
    def create_app(self):
        # # remove logging lines on test output
        import logging
        log = logging.getLogger('werkzeug')
        log.setLevel(logging.INFO)
        log.disabled = True
        os.environ['WERKZEUG_RUN_MAIN'] = 'true'

        # pass in test configurations
        app = create_app(TestConfig)
        self.db_path = os.path.join(app.instance_path, 'test-app.db')
        app.config.update(
            # Specify the test database as the default in_memory wont work for web tests
            SQLALCHEMY_DATABASE_URI='sqlite:///' + self.db_path,
            # Change the port that the liveserver listens on as we dont want to conflict with running:5000
            LIVESERVER_PORT=8943
        )

        self.app_context = app.app_context()
        self.app_context.push()
        return app

    def setUp(self):
        self.driver = self.create_chrome_driver()
        # db.create_all()

    def tearDown(self):
        # fs_utils.clean_dirs()
        # db.session.remove()
        # db.drop_all()
        self.app_context.pop()
        if os.path.exists(self.db_path):
            os.remove(self.db_path)
        self.driver.close()
        self.driver.quit()

    # noinspection PyMethodMayBeStatic
    def is_in_docker(self):
        """
        Test if in docker.
        :return: True if running in docker, False otherwise.
        """
        if os.path.exists('/proc/self/cgroup'):
            with open('/proc/self/cgroup') as f:
                content = f.read()
                return '/docker/' in content
        return False

    def create_chrome_driver(self):
        """
        Create then return the chrome driver.

        :return: the chrome driver.
        """
        from selenium.webdriver.chrome.options import Options
        options = Options()
        options.add_argument('--headless')
        # options.add_argument('--log-level=3')
        # options.add_experimental_option('excludeSwitches', ['enable-logging'])

        if self.is_in_docker():
            options.add_argument("--no-sandbox")
        return webdriver.Chrome(options=options)


class AccessTestCase(BaseFrontTestCase):
    def test_ping(self):
        self.assertEqual("http://localhost:8943", self.get_server_url())

    def test_selenium_access(self):
        # On ouvre le navigateur avec l'adresse du serveur.
        self.driver.get(self.get_server_url())
        # L'adresse dans l'url doit être celle que l'on attend.
        self.assertEqual(self.driver.current_url, 'http://localhost:8943/')

    def test_server_is_up_and_running(self):
        response = urllib.request.urlopen(self.get_server_url())
        self.assertEqual(response.code, 200)