status-desktop/test/e2e/fixtures/aut.py

104 lines
2.9 KiB
Python

import allure
import os
import pytest
import logging
import configs
import constants
from configs import get_platform
from constants import UserAccount
from driver.aut import AUT
from gui.main_window import MainWindow
from scripts.utils import system_path
from scripts.utils.local_system import get_pid_by_process_name, kill_process
from scripts.utils.system_path import SystemPath
LOG = logging.getLogger(__name__)
@pytest.fixture
def options(request):
if hasattr(request, 'param'):
return request.param
return ''
@pytest.fixture
def keycard_controller(request):
if 'settings_keycard' in str(getattr(request, 'fspath')):
os.environ['STATUS_RUNTIME_USE_MOCKED_KEYCARD'] = 'True'
@pytest.fixture
def application_logs():
yield
if configs.testpath.STATUS_DATA.exists():
for app_data in configs.testpath.STATUS_DATA.iterdir():
for log_dir in ['logs', 'data']:
log_path = app_data / log_dir
for log in log_path.glob('*.log'):
allure.attach.file(log, name=str(log.name), attachment_type=allure.attachment_type.TEXT)
try:
log.unlink() # FIXME: it does not work on Windows, permission error
except PermissionError:
print(f"Permission error: {log} could not be deleted.")
@pytest.fixture
def user_data(request) -> system_path.SystemPath:
if hasattr(request, 'param'):
fp = request.param
assert fp.is_dir()
return fp
@pytest.fixture
def aut(user_data) -> AUT:
if not configs.AUT_PATH.exists():
pytest.exit(f"Application not found: {configs.AUT_PATH}")
_aut = AUT(user_data=user_data)
yield _aut
@pytest.fixture()
def multiple_instances(user_data):
def _aut(user_data: SystemPath = None) -> AUT:
if not configs.AUT_PATH.exists():
pytest.exit(f"Application not found: {configs.AUT_PATH}")
return AUT(user_data=user_data)
yield _aut
@pytest.fixture
def main_window(aut: AUT, user_data):
aut.launch()
LOG.debug('Waiting for main window...')
yield MainWindow().wait_until_appears().prepare()
aut.stop()
@pytest.fixture
def user_account(request) -> UserAccount:
if hasattr(request, 'param'):
user_account = request.param
assert isinstance(user_account, UserAccount)
else:
user_account = constants.user.user_account_one
yield user_account
@pytest.fixture
def main_screen(user_account: UserAccount, main_window: MainWindow) -> MainWindow:
main_window.authorize_user(user_account)
return main_window
@pytest.fixture(scope="session")
def close_apps_before_start():
if get_platform() == "Windows":
name = 'Status.exe'
else:
name = 'nim_status_client'
running_pids = get_pid_by_process_name(name)
if running_pids is not None:
for pid in running_pids:
kill_process(pid)