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


async def mode_mt_in_journal(ws_client, cfg: SmokeSuiteConfig, imitator_start_time, test_data: CaseData):
    """
    Проверка записей журнала о режиме мт
    """
    exp_mode_part_message, exp_reason_part_message, exp_priority_message = test_data.expected_result

    with allure.step(
        "Подключение по ws, получение и обработка сообщения типа: MessagesInfoContent" "Фильтр MessageType. ЭФ Журнал"
    ):
        request_body = t_utils.create_journal_req_body(
            pagination=Pagination(limit=TestConst.LIMIT_CONTROLLED_SITES),
            filtering=Filtering(messageTypes=int(MessageType.PUMPING_STATUS), objects=FilteringObjects(tuId=cfg.tu_id)),
        )
        payload = await t_utils.connect_and_get_msg(ws_client, "GetMessagesRequest", request_body)
        parsed_payload = parser.parse_journal_msg(payload)
        messages_info = parsed_payload.replyContent.messagesInfo

        # Фильтрация сообщений по времени
        end_time = datetime.now()

        filter_start_msk = t_utils.localize_as_moscow(imitator_start_time)
        filter_end_msk = t_utils.localize_as_moscow(end_time)

        messages_time_filtered = [
            msg
            for msg in messages_info
            if filter_start_msk <= t_utils.ensure_moscow_timezone(msg.time) <= filter_end_msk
        ]
        messages_time_filtered.sort(key=lambda msg: t_utils.ensure_moscow_timezone(msg.time), reverse=True)
        # Сортирую по времени сообщения
        sorted_messages = sorted(messages_time_filtered, key=lambda msg: msg.time, reverse=True)

        # Фильтрация уникальных наименований участков КП-КП
        control_points_list = []

        for msg in sorted_messages:
            control_points_list.append(msg.controlPoint)

        unique_control_points_list = set(control_points_list)
        count_unique_control_points = len(unique_control_points_list)

        # Собираю список сообщений с уникальными наименованиями участков КП_КП
        already_been = set()
        filter_messages_with_unique_control_points = [
            msg
            for msg in sorted_messages
            if msg.controlPoint in unique_control_points_list
            and msg.controlPoint not in already_been
            and not already_been.add(msg.controlPoint)
        ]
        allure.attach(
            f" Список: {filter_messages_with_unique_control_points}",
            name="Результат фильтрации сообщений журнала",
            attachment_type=allure.attachment_type.TEXT,
        )

        # Создание и наполнение списков сообщений с фильтром по 'event'

        containers = defaultdict(list)

        for msg in filter_messages_with_unique_control_points:
            event = msg.event
            if event in (
                TestConst.JOURNAL_MESSAGE_EVENT_STATIONARY,
                TestConst.JOURNAL_MESSAGE_EVENT_NOT_STATIONARY,
                TestConst.JOURNAL_MESSAGE_EVENT_STOP,
            ):
                containers[event].append(msg)
            else:
                containers["another"].append(msg)

        stationary_status_list = list(containers[TestConst.JOURNAL_MESSAGE_EVENT_STATIONARY])
        unstationary_status_list = list(containers[TestConst.JOURNAL_MESSAGE_EVENT_NOT_STATIONARY])
        stopped_status_list = list(containers[TestConst.JOURNAL_MESSAGE_EVENT_STOP])
        another_event_list = list(containers["another"])
        most_long_event_list = max(
            [unstationary_status_list, stationary_status_list, stopped_status_list, another_event_list], key=len
        )

        first_message = next(iter(most_long_event_list)) if most_long_event_list else None
        if first_message:
            priority_message = MessagePriority(first_message.priority) if first_message.priority else None
            mode_part, reason_part = t_utils.parse_event(first_message.event)
        else:
            priority_message = None
            mode_part, reason_part = None, None

    with SoftAssertions() as soft_failures:
        StepCheck(
            "Проверка результата фильтрации сообщений о режиме МТ",
            "Кол-во сообщений о режиме МТ с уникальными наименованиями участков КП-КП",
            soft_failures,
        ).actual(count_unique_control_points).expected(TestConst.COUNT_CONTROLLED_SITES).equal_to()
        StepCheck(
            "Проверка режима МТ на ЛЧ в наибольшей области связности.",
            "Режим МТ",
            soft_failures,
        ).actual(
            mode_part
        ).expected(exp_mode_part_message).equal_to()
        StepCheck(
            "Проверка причины режима МТ на ЛЧ в наибольшей области связности.", "Причина режима МТ", soft_failures
        ).contains(reason_part, exp_reason_part_message)
        StepCheck("Проверка значимости сообщения", "Важность", soft_failures).actual(priority_message).expected(
            exp_priority_message
        ).equal_to()