mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-01-21 07:55:00 +00:00
- Splinter/selenium have implicit and explicit waiting time. Implicit wait time will make every negative lookup wait for about 3 seconds before it actually fails. Because we ensure missing elements in quite a few places, this introduces many 3 seconds wait periods during testing. Remove it instead rely on explicit waiting whenever needed. - Explicit wait time is only used during explicitly requests waiting conditions. In a loop the API waits for a maximum of timeout period until a given condition is satisfied. Each time the condition is checked, it goes into sleep for explicit wait period amount of time. This is typically a second or so. Since we are impatient, make it 0.1 instead. - Also make sure that whenever a page is visit()ed, we automatically wait until the page is fully loaded by overriding the splinter wait condition. Otherwise, we will need to introduce waiting code in a lot of places. - Using document.readyState == complete is a better check to ensure that a page is fully loaded. If we proceed with the page 'loading' or 'interactive' state, we will have to change a lot of code to make it wait. - Handle Apache restarts when waiting for page load. The error page apparently is never reaches document.readyState == 'complete'. So, if an error page is encountered, always reload. - While waiting for installation, ensure that we atomically check that page has loaded fully and the installation progress is not being shown. Otherwise, there would be race condition due to installation page refreshing itself. Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org> Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
114 lines
3.0 KiB
Python
114 lines
3.0 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
"""
|
|
pytest configuration for all tests.
|
|
"""
|
|
|
|
import importlib
|
|
import os
|
|
import pathlib
|
|
|
|
import pytest
|
|
|
|
try:
|
|
importlib.import_module('pytest_bdd')
|
|
_bdd_available = True
|
|
except ImportError:
|
|
_bdd_available = False
|
|
else:
|
|
from plinth.tests.functional.step_definitions import *
|
|
|
|
|
|
def pytest_ignore_collect(path, config):
|
|
"""Return True to ignore functional tests."""
|
|
if path.basename == 'test_functional.py':
|
|
return not _bdd_available
|
|
|
|
|
|
def pytest_addoption(parser):
|
|
"""Add a command line option to run functional tests."""
|
|
parser.addoption('--include-functional', action='store_true',
|
|
default=False, help='Run functional tests also')
|
|
|
|
|
|
def pytest_collection_modifyitems(config, items):
|
|
"""Filter out functional tests unless --include-functional is passed."""
|
|
if config.getoption('--include-functional'):
|
|
# Option provided on command line, no filtering
|
|
return
|
|
|
|
skip_functional = pytest.mark.skip(
|
|
reason='--include-functional not provided')
|
|
for item in items:
|
|
if 'functional' in item.keywords or (
|
|
item.parent.fspath.basename
|
|
and item.parent.fspath.basename == 'test_functional.py'):
|
|
item.add_marker(skip_functional)
|
|
|
|
|
|
@pytest.fixture(name='load_cfg')
|
|
def fixture_load_cfg():
|
|
"""Load test configuration."""
|
|
from plinth import cfg
|
|
|
|
root_dir = pathlib.Path(__file__).resolve().parent
|
|
test_data_dir = root_dir / 'plinth' / 'tests' / 'data'
|
|
cfg_file = test_data_dir / 'etc' / 'plinth' / 'plinth.config'
|
|
cfg.read(str(cfg_file), str(root_dir))
|
|
yield cfg
|
|
cfg.read()
|
|
|
|
|
|
@pytest.fixture(name='develop_mode')
|
|
def fixture_develop_mode(load_cfg):
|
|
"""Turn on development mode for a test."""
|
|
load_cfg.develop = True
|
|
yield
|
|
load_cfg.develop = False
|
|
|
|
|
|
@pytest.fixture(name='needs_root', scope='session')
|
|
def fixture_needs_root():
|
|
"""Skip test if not running in root mode."""
|
|
if os.geteuid() != 0:
|
|
pytest.skip('Needs to be root')
|
|
|
|
|
|
@pytest.fixture(name='needs_not_root', scope='session')
|
|
def fixture_needs_not_root():
|
|
"""Skip test if running in root mode."""
|
|
if os.geteuid() == 0:
|
|
pytest.skip('Needs not to be root')
|
|
|
|
|
|
@pytest.fixture(name='needs_sudo')
|
|
def fixture_needs_sudo():
|
|
"""Skip test if sudo command is not available."""
|
|
if not os.path.isfile('/usr/bin/sudo'):
|
|
pytest.skip('Needs sudo command installed.')
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def splinter_selenium_implicit_wait():
|
|
"""Disable implicit waiting."""
|
|
return 0
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def splinter_wait_time():
|
|
"""Disable explicit waiting."""
|
|
return 0.01
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def splinter_browser_load_condition():
|
|
"""When a page it loaded, wait until <body> is available."""
|
|
|
|
def _load_condition(browser):
|
|
if browser.url == 'about:blank':
|
|
return True
|
|
|
|
ready_state = browser.execute_script('return document.readyState;')
|
|
return ready_state == 'complete'
|
|
|
|
return _load_condition
|