Загрузка данных


from utils.helpers.pytest_auth import (
    clear_suite_auth,
    ensure_auth_for_fixture,
    ensure_suite_auth,
    init_http_stand_client,
    init_ws_stand_client,
)
from utils.helpers.pytest_skip_utils import (
    decorate_skipped_test_in_allure,
    get_skip_reason_marker,
    is_marked_as_skipped,
    resolve_skip_reason,
)















    4. Сортирует тесты по test_suite_name для группировки по наборам данных
    5. Помечает маркером skip_reason тесты, у которых в конфигурации теста задан skip_reason (CaseMarkers.skip_reason)







            # Конфиг теста = None - исключаем тест из прогона
            deselected_items.append(item)
            continue

        # Скип по причине из конфигурации теста: тест остаётся в прогоне, но будет пропущен
        # фикстурой skip_reason_guard и попадёт в отчёт как skipped с причиной
        if skip_reason := resolve_skip_reason(test_config):
            item.add_marker(pytest.mark.skip_reason(reason=skip_reason))
            logger.info("[SKIP] %s: %s", item.nodeid, skip_reason)









            link_type="tms",
        )


@pytest.fixture(autouse=True)
def skip_reason_guard(request, allure_suite_hierarchy, allure_tms_link):
    """
    Скипает тест, если для него задан skip_reason в конфигурации теста (CaseMarkers.skip_reason).

    Порядок фикстур важен, поэтому зависимости запрошены явно:
    - allure_suite_hierarchy и allure_tms_link должны отработать ДО скипа, иначе в отчёте
      потеряются группировка по набору данных и линк на тест-кейс TestOps;
    - require_suite_infra и offset_wait зависят от этой фикстуры, чтобы скипнутый тест
      не ждал свой offset и не подменял причину скипа сообщением об инфраструктуре.
    """
    if skip_reason := get_skip_reason_marker(request.node):
        decorate_skipped_test_in_allure(request.node, skip_reason)
        pytest.skip(skip_reason)


# skip_reason_guard в аргументах require_suite_infra/offset_wait нужен только для порядка фикстур:
# скип теста должен сработать до проверки готовности инфраструктуры
@pytest.fixture(autouse=True)
def require_suite_infra(request, skip_reason_guard):
    """
    Пропускает тесты набора, если infra-setup не завершился успешно.
    """
    if not request.node.get_closest_marker("test_suite_name"):
        return
    cfg = request.config.group_state
    if cfg.get("current_suite") and not cfg.get("suite_infra_ready"):
        pytest.skip("[SETUP] [ERROR] Набор пропущен: инфраструктура не готова")


# skip_reason_guard в аргументах offset_wait нужен только для порядка фикстур:
# скипнутый тест не должен ждать свой offset
@pytest.fixture(autouse=True)
def offset_wait(request, skip_reason_guard):









      - Извлекает все значения @pytest.mark.offset(...) (в минутах)
      - Offset скипнутых тестов (маркер skip_reason) не учитывается: они не выполняются
      - Если offsets найдены: возвращает max(offsets) + IMITATOR_FINISH_DELAY задержка остановки имитатора
      - Иначе: если у текущего item есть @pytest.mark.imitator_duration — используется как fallback и логируется
      - Если ничего не найдено — pytest.fail с понятным текстом
    """

    suite_items = [
        suite_item
        for suite_item in item.session.items
        if (marker := suite_item.get_closest_marker("test_suite_name")) and marker.args[0] == current_test_suite
    ]

    offsets = []
    for suite_item in suite_items:
        # Скипнутый тест не выполняется - ждать его offset не нужно
        if is_marked_as_skipped(suite_item):
            continue
        offset_marker = suite_item.get_closest_marker("offset")