""" Корневой conftest.py — конфигурация на уровне всей сессии. Здесь размещены хуки, которые должны работать глобально. """ import os # pyrefly: ignore [missing-import] import pytest # pyrefly: ignore [missing-import] from dotenv import load_dotenv from tests.utils.tls import detect_tls_mode, tls_info_key, find_gost_browser_executable load_dotenv() BASE_URL = os.getenv("BASE_URL", "https://vet.goznak.ru") # --------------------------------------------------------------------------- # Регистрация CLI аргументов запуска # --------------------------------------------------------------------------- def pytest_addoption(parser): """Регистрирует дополнительные флаги командной строки для pytest.""" parser.addoption( "--tls-mode", action="store", default="auto", choices=["auto", "gost", "standard"], help="Режим TLS: auto (по умолчанию — автоопределение), gost (принудительно ГОСТ TLS), standard (обычный TLS).", ) parser.addoption( "--ignore-https-errors", action="store_true", default=True, help="Игнорировать ошибки SSL сертификатов в браузере (по умолчанию: True).", ) # --------------------------------------------------------------------------- # Настройка блока Environment и заголовка HTML-отчёта # --------------------------------------------------------------------------- def pytest_sessionstart(session): """ Заменяет технические данные в блоке Environment отчёта на значимые. pytest-html 4.x читает данные через config.stash[metadata_key] (API pytest-metadata 3.x). Наш хук изменяет именно этот stash. """ config = session.config # Получаем режим TLS из CLI аргумента или .env cli_tls_mode = config.getoption("--tls-mode", default="auto") force_mode = None if cli_tls_mode == "auto" else cli_tls_mode # Определяем режим TLS с кэшированием и сохраняем в stash сессии is_gost, tls_desc = detect_tls_mode(BASE_URL, force_mode=force_mode) config.stash[tls_info_key] = (is_gost, tls_desc) if is_gost: gost_exec = find_gost_browser_executable() if gost_exec and "yandex" in gost_exec.lower(): browser_name = "Яндекс.Браузер (ГОСТ)" else: browser_name = "Chromium GOST" else: browser_name = "Chromium (Playwright)" try: from pytest_metadata.plugin import metadata_key metadata = config.stash[metadata_key] except (ImportError, KeyError): metadata = getattr(config, "_metadata", None) if metadata is None: return # Сбрасываем технические данные от pytest-metadata metadata.clear() # Заполняем значимыми данными для отчёта руководителю metadata["Проект"] = "e2e_Pets — Учёт домашних животных" metadata["Портал"] = BASE_URL metadata["TLS Режим"] = tls_desc metadata["Браузер"] = browser_name metadata["Окружение"] = os.getenv("TEST_ENV", "Production") metadata["Тестировщик"] = os.getenv("TESTER_NAME", "QA Team") def pytest_html_report_title(report): """Задаёт заголовок HTML-отчёта.""" report.title = "Отчёт E2E тестирования — Портал учёта животных"