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


async def imitate_sensor_signal(ws_client, cfg: SmokeSuiteConfig, test_data: CaseData, imitator_start_time):
    """
    Проверка имитации сигнала датчика.
    """
    # Распаковка данных для теста
    sensor_address = test_data.params.get("sensor_address")
    sensor_val, sensor_quality, imitation_event, unimitation_event = test_data.expected_result
    # Получение актуального id датчика
    sensor_id = TestConst.SENSOR_IDS_BY_ADDRESS.get(sensor_address)

    with allure.step(f"Отправка сообщения и обработка ответа об имитации сигнала датчика с id: {sensor_id}"):
        payload = await t_utils.connect_and_get_msg(
            ws_client,
            "ImitateSignalRequest",
            {
                'id': sensor_id,
                'tuId': cfg.tu_id,
                'imitateInfo': {
                    'value': str(sensor_val),
                    'quality': sensor_quality,
                    'additionalProperties': None,
                },
                'additionalProperties': None,
            },
        )
        parsed_payload = parser.parse_imitate_signal_msg(payload)
        sensor_imitate_reply_status = parsed_payload.replyStatus

        StepCheck("Проверка кода ответа на запрос об имитации", "replyStatus").actual(
            sensor_imitate_reply_status
        ).expected(ReplyStatus.OK.value).equal_to()

    with allure.step(
        "Получение данных для проверки имитации.Тип сообщения: InputSignalsContent. ЭФ Диагностика Сигналов."
    ):
        time.sleep(cfg.basic_message_timeout)
        payload = await t_utils.connect_and_subscribe_msg(
            ws_client,
            "InputSignalsContent",
            "SubscribeInputSignalsRequest",
            {
                'signalIds': [sensor_id],
                'tuId': cfg.tu_id,
                'additionalProperties': None,
            },
        )
        parsed_payload = parser.parse_input_signals_info_msg(payload)
    with allure.step("Подготовка данных для проверки имитации. ЭФ Диагностика Сигналов."):
        sensor_data = getattr(parsed_payload.replyContent, 'inputSignals', [])
        sensor_imitate_data = t_utils.find_object_by_field(sensor_data, "id", sensor_id)
        if sensor_imitate_data:
            value_imitate_data = sensor_imitate_data.imitation.value
        else:
            value_imitate_data = None

    with allure.step("Подготовка данных для проверки имитации.Тип сообщения: SchemeSignalsStateContent. ЭФ Схема."):
        payload = await t_utils.connect_and_subscribe_msg(
            ws_client,
            "SchemeSignalsStateContent",
            "SubscribeSchemeSignalsStateRequest",
            {'tuId': cfg.tu_id},
        )
        parsed_payload = parser.parse_scheme_signals_state_msg(payload)
        signal_state_list = parsed_payload.signalsStates
        sensor_imitate_data = t_utils.find_object_by_field(signal_state_list, "id", sensor_id)
        status_imitate_sensor = sensor_imitate_data.isImitated

    with allure.step(f"Отправка сообщения и обработка ответа о снятии имитации датчика с id: {sensor_id}"):
        payload = await t_utils.connect_and_get_msg(
            ws_client,
            "UnimitateSignalRequest",
            {'id': sensor_id, 'tuId': cfg.tu_id, 'additionalProperties': None},
        )
        parsed_payload = parser.parse_unimitate_signal_msg(payload)
        sensor_unimitate_reply_status = parsed_payload.replyStatus

        StepCheck("Проверка кода ответа на запрос о снятии имитации", "replyStatus").actual(
            sensor_unimitate_reply_status
        ).expected(ReplyStatus.OK.value).equal_to()

    with allure.step(
        "Подключение по ws, получение и обработка данных о статусе датчика из сообщения типа: InputSignalsContent"
    ):
        time.sleep(cfg.basic_message_timeout)
        payload = await t_utils.connect_and_subscribe_msg(
            ws_client,
            "InputSignalsContent",
            "SubscribeInputSignalsRequest",
            {
                'signalIds': [sensor_id],
                'tuId': cfg.tu_id,
                'additionalProperties': None,
            },
        )
        parsed_payload = parser.parse_input_signals_info_msg(payload)

    with allure.step("Извлечение и подготовка данных для проверки снятия имитации"):
        sensor_data = getattr(parsed_payload.replyContent, 'inputSignals', [])
        sensor_unimitate_data = t_utils.find_object_by_field(sensor_data, "id", sensor_id)
        StepCheck("Проверка наличия данных для проверки снятия имитации", "inputSignals").actual(
            sensor_unimitate_data
        ).is_not_none()

    with allure.step(
        "Получение данных для проверки снятия имитации. Тип сообщения: SchemeSignalsStateContent. ЭФ Схема"
    ):
        payload = await t_utils.connect_and_subscribe_msg(
            ws_client,
            "SchemeSignalsStateContent",
            "SubscribeSchemeSignalsStateRequest",
            {'tuId': cfg.tu_id},
        )
        parsed_payload = parser.parse_scheme_signals_state_msg(payload)
        signal_state_list = parsed_payload.signalsStates
        sensor_unimitate_data = t_utils.find_object_by_field(signal_state_list, "id", sensor_id)
        status_unimitate_sensor = sensor_unimitate_data.isImitated

    with allure.step("Запрос сообщений журнала с фильтром по времени и действию пользователя"):

        # Запрос сообщений по типу действий пользователя маскирование и имитация сигналов
        request_body = t_utils.create_journal_req_body(
            pagination=Pagination(limit=TestConst.JOURNAL_PAGINATION_LIMIT, direction=Direction.FIRST.value),
            filtering=Filtering(userActions=int(UserActions.SIGNAL_MASK_SIM), 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 = getattr(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)
        filter_time_messages = [
            msg
            for msg in messages_info
            if filter_start_msk <= t_utils.ensure_moscow_timezone(msg.time) <= filter_end_msk
        ]
        if filter_time_messages:
            event_list = [msg.event for msg in filter_time_messages]
            tag_list = [msg.tag for msg in filter_time_messages]
        else:
            event_list = []
            tag_list = []

    with SoftAssertions() as soft_failures:
        StepCheck(
            f"Проверка имитации датчика с id: {sensor_id}. ЭФ Диагностика Сигналов", "isImitated", soft_failures
        ).actual(sensor_imitate_data.isImitated).expected(True).equal_to()
        StepCheck(f"Проверка имитации датчика с id: {sensor_id}. ЭФ Схема", "isImitated", soft_failures).actual(
            status_imitate_sensor
        ).expected(True).equal_to()
        StepCheck(
            f"Проверка показаний датчика с id: {sensor_id}. ЭФ Диагностика Сигналов", "value", soft_failures
        ).actual(value_imitate_data).expected(sensor_val).equal_to()
        StepCheck(
            f"Проверка качества сигнала датчика с id: {sensor_id}. ЭФ Диагностика Сигналов", "quality", soft_failures
        ).actual(sensor_imitate_data.quality).expected(sensor_quality).equal_to()
        StepCheck("Проверка события сообщения об имитации. ЭФ Журнал", "event", soft_failures).contains(
            event_list, imitation_event
        )
        StepCheck(
            f"Проверка снятия имитации датчика с id: {sensor_id}. ЭФ Диагностика Сигналов.", "isImitated", soft_failures
        ).actual(sensor_unimitate_data.isImitated).expected(False).equal_to()
        StepCheck(f"Проверка снятия имитации датчика с id: {sensor_id}. ЭФ Схема", "isImitated", soft_failures).actual(
            status_unimitate_sensor
        ).expected(False).equal_to()
        StepCheck("Проверка события сообщения о снятии имитации. ЭФ Журнал", "event", soft_failures).contains(
            event_list, unimitation_event
        )
        StepCheck("Проверка наличия тега в сообщении об имитации. ЭФ Журнал", "event", soft_failures).contains(
            tag_list, sensor_address
        )