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


на ревью возникли вопросы и змечание к коду.
На вопросы надо ответить простым языком, а замечания исправить
список:
1)
with _step(f"Сверка статуса СОУ: Администрирование vs Состояние МТ " f"(tuId={tu_id}, '{tu_name}')"):
        expected_enabled = sou_status == SouAdminStatus.RUNNING
        Требуется пояснение, несильно понятно что чему равно и зачем

2) везде обращаемся по точкам в объекте, это хрупко если там где то None
Пример
            tus = admin_reply.replyContent.basicInfo.tus if admin_reply.replyContent else []

Исправить в нашем новом коде

3)
def _is_configurator_flow_active() -> bool:
    from utils.helpers import lds_configurator_utils as lds_cfg

лучше избегать таких вариантов написания, используя стандартные импорты


4) не пойму разницу между if и else
Типа есть аллюр степ или нет, так его и вынести можно в этот блок

async def connect(ws_client: WebSocketClient, ws_invoke_type: str, ws_invoke_params: Any = None) -> None:
    """
    Подключение к заданной подписке
    """
    try:
        if _is_configurator_flow_active():
            await ws_client.invoke(ws_invoke_type, ws_invoke_params)
        else:
            with allure.step(f"Вызов {ws_invoke_type} c параметрами {ws_invoke_params}"):
                await ws_client.invoke(ws_invoke_type, ws_invoke_params)
    except (asyncio.TimeoutError, ConnectionError, ConnectionResetError, OSError) as error:
        if _is_configurator_flow_active():
            raise
        fail(f"Не удалось отправить сообщение типа: {ws_invoke_type} c параметрами {ws_invoke_params}. Ошибка: {error}")

Аналогично для connect_and_get_msg


5) разве autouse=True не на каждый тест распространяется?
@pytest.fixture(autouse=True)
def require_suite_infra(request):
    """
    Блокирует тесты набора, если 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.exit(
            "[SETUP] [ERROR] Инфраструктура набора не готова (suite_infra_ready=False). " "Тесты не запускаются."
        )


6) что такое coro_factory ? и в чем причинно-следственная связь использования ?
def _run_lds_configurator_ws(coro_factory) -> None:
    """Запускает async WS-сценарий lds-configurator"""
    lds_cfg_utils.set_configurator_flow_active(True)
    lds_ws_parser.suppress_recv_logging = True
    try:
        asyncio.run(coro_factory())
    finally:
        lds_ws_parser.suppress_recv_logging = False
        lds_cfg_utils.set_configurator_flow_active(False)

    про блок finally "Тут тоже пояснения, что происходит
Файнали такая вещь капризная, надо точно знать что туда кладем"


7)
здесь и ниже побольше пояснялок, конфтест все таки, потом сложно будет вспомнить


    async def _teardown() -> None:
        ws_host = get_ws_host()
        token = get_token()
        async with WebSocketClient(ws_host, token) as client:
            client.suppress_recv_logging = True
            await lds_configurator_scenarios.lds_configurator_teardown(client, tu_id, admin_tu_name)

    try:
        _run_lds_configurator_ws(_teardown)
    except BaseException as error:
        logger.warning(
            "[TEARDOWN] [ALERT] LDS Configurator teardown завершился с ошибкой для tuId=%s: %s",
            tu_id,
            error,
        )
    finally:
        cfg["resolved_tu_id"] = None
        cfg["use_lds_configurator"] = False
        cfg["admin_tu_name"] = None



8) Пояснения что происходит
    # 1) teardown стенда: LDS Configurator + остановка имитатора
    try:
        group_state = getattr(session.config, "group_state", {})
        _run_lds_configurator_teardown_if_needed(group_state)
        stand_manager = group_state.get("stand_manager")