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


енам
class TU(Enum):
    """Legacy-идентификация ТУ: имитатор (tn{id}_tags.txt), tags и конфигурация стенда."""






        raise ValueError(f"ТУ с id = {target_id} не найден")


class AdminTU(Enum):
    """ТУ в Администрировании и WS-подписках (не legacy имитатор)."""

    TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST = (
        "Тихорецк-Новороссийск-3-Автотест",
        TU.TIKHORETSK_NOVOROSSIYSK_3,
    )

    def __init__(self, admin_name: str, legacy_tu: TU) -> None:
        self.admin_name = admin_name
        self.legacy_tu = legacy_tu
















мод фо тест
    TU,
    AdminTU,






    use_lds_configurator: bool = False
    admin_tu: Optional[AdminTU] = None




    unmask_du_event: Optional[str] = None

    def __post_init__(self) -> None:
        self.validate_lds_configurator_config()

    def validate_lds_configurator_config(self) -> None:
        """Проверяет согласованность полей LDS Configurator в датасете."""
        if not self.use_lds_configurator:
            return
        if self.admin_tu is None:
            raise ValueError(
                f"Набор '{self.suite_name}': admin_tu обязателен при use_lds_configurator=True"
            )
        if self.admin_tu.legacy_tu != self.technological_unit:
            raise ValueError(
                f"Набор '{self.suite_name}': admin_tu.legacy_tu ({self.admin_tu.legacy_tu}) "
                f"не совпадает с technological_unit ({self.technological_unit})"
            )









    # ===== Свойства для удобства =====
    @property
    def admin_tu_name(self) -> str:
        """tuName для поиска ТУ в Администрировании."""
        if self.admin_tu is None:
            return ""
        return self.admin_tu.admin_name

    @property
    def legacy_tu_id(self) -> int:
        """Legacy id ТУ для имитатора, tags.txt и конфигурации стенда."""
        return self.technological_unit.id

    @property
    def legacy_tu_name(self) -> str:
        """Legacy имя ТУ из enum TU."""
        return self.technological_unit.description






    def tu_name(self) -> str:
        """Имя ТУ для WS-тестов и отчётов: admin при configurator, иначе legacy."""
        if self.use_lds_configurator:
            return self.admin_tu_name
        return self.legacy_tu_name








    def tu_id(self) -> int:
        """ID ТУ для WS-тестов: resolved из Администрирования при configurator, иначе legacy."""
        if self.use_lds_configurator:
            return self.configurator_tu_id
        return self.legacy_tu_id








    def infra_tu_id(self) -> int:
        """Алиас legacy_tu_id (обратная совместимость)."""
        return self.legacy_tu_id

























датасет
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST,






















конфтест
        if suite_config is not None and suite_config.use_lds_configurator:
            if suite_config.admin_tu is None:
                pytest.exit(
                    f"[SETUP] [ERROR] Набор '{suite_config.suite_name}': admin_tu обязателен "
                    "при use_lds_configurator=True"
                )




















лдс конф тест

    4. Сверка статуса СОУ: Администрирование vs Состояние МТ.
    """
    tu_id = cfg.tu_id
    tu_name = cfg.tu_name

































смок сцен
        actual_report_state.expected_lds_status_text = LdsStatus.report_text_by_value(
            leak.expected_lds_status_in_leaks_report
        )
        actual_report_state.tu_description_lower = cfg.tu_name.lower()






            name_substring=ReportConst.LEAKS_REPORT_NAME_PART,
            tu_name_substring=cfg.tu_name,








        actual_report_state.report_file_name = report_utils.build_export_report_file_name(
            cfg.tu_name,












           actual_report_state.target_row = report_utils.find_row_with_object(
                actual_report_state.data_rows, cfg.tu_name








        with allure.step("Проверка содержимого строки утечки"):
            StepCheck("В отчёте есть хотя бы одна строка с данными", "data_rows").actual(
                actual_report_state.data_rows
            ).is_not_empty()
            StepCheck(
                f"Строка с объектом, содержащим '{cfg.tu_name}'",








                ).actual(leak_datetime_value).is_between(period_start_lo, period_end_hi)

                StepCheck(
                    f"Колонка '{ReportConst.COL_OBJECT}' содержит '{cfg.tu_name}'",












                f"Имя файла содержит '{ReportConst.LEAKS_REPORT_NAME_PART}'", "file_name", soft_failures
            ).contains(report_file_name_lower, leaks_report_name_part_lower)
            StepCheck(
                f"Имя файла содержит описание ТУ '{cfg.tu_name}'", "file_name", soft_failures








        report_state.period_end_naive = report_utils.normalize_report_period_naive(report_state.period_end)
        report_state.tu_description_lower = cfg.tu_name.lower()








            name_substring=LdsReportConst.LDS_STATUS_REPORT_NAME_PART,
            tu_name_substring=cfg.tu_name,










        report_state.report_file_name = report_utils.build_export_report_file_name(
            cfg.tu_name,





                ).contains(report_file_name_lower, lds_report_name_part_lower)
                StepCheck(
                    f"Имя файла содержит описание ТУ '{cfg.tu_name}'",








        report_state.expected_period_end_naive = report_utils.normalize_report_period_naive(
            report_state.expected_period_end
        )
        report_state.expected_tu_description_lower = cfg.tu_name.lower()









        report_state.expected_file_name = report_utils.build_export_report_file_name(
            cfg.tu_name,






            expected_data_type=ExportedDataType.STATIONARY_STATUS_REPORT,
            name_substring=MtReportConst.MT_MODE_REPORT_NAME_PART,
            tu_name_substring=cfg.tu_name,








                ).contains(report_file_name_lower, mt_report_name_part_lower)
                StepCheck(
                    f"Имя файла содержит описание ТУ '{cfg.tu_name}'",
































test lds status везде заменить config.technological_unit.description на config.tu_name





в смоках также





в реджектах также