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


[tool.poetry]
name = "training"
version = "0.1.0"
description = ""
authors = ["Владимиров Никита Михайлович "]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.10"
python-dotenv = "^1.0.1"
black = "24.2.0"
isort = "5.13.2"
flake8 = "6.0.0"
structlog= "^23.2.0"
confluent-kafka = {extras = ["avro", "protobuf"], version = "2.9.0"}
cryptography = "45.0.2"
charset-normalizer = "3.4.0"
requests = "2.32.3"
websockets = "15.0.1"
allure-pytest = "2.13.5"
asyncio = "^3.4.3"
pytest-asyncio = "0.26.0"
protobuf = "6.30.2"
assertpy = "1.1"
websocket-client = "1.8.0"
msgpack = "1.0.2"
pydantic-core = "2.27.1"
pydantic = "2.10.1"
pyyaml = "6.0.2"
dacite = "1.9.2"
tzdata = "2025.2"
pygments = "2.19.1"
openpyxl = "3.1.5"

[tool.pytest.ini_options]
addopts = [
    "-v",
    "-s",
    "--alluredir=allure-results"
]
markers = [
    "test_suite_name(name): привязка теста к набору данных",
    "test_suite_data_id(id): id набора данных в TestOps для всей группы",
    "imitator_duration(minutes): длительность работы имитатора для группы тестов на определнных данных",
    "test_case_id(id): id тест кейса в TestOps",
    "test_data_name: название набора данных",
    "tu_id: id ТУ",
    "ost_name: Имя ОСТ",
    "offset(minutes): сколько ждать от старта имитатора перед проверкой"
]
asyncio_mode="auto"
norecursedirs = [".*", ".git", ".env", ".env.example", "poetry.lock", "pyproject.toml", "clients", "models", "utils"]

log_cli=true
log_cli_level="INFO"
log_cli_format="[%(levelname)s] %(asctime)s %(filename)s %(message)s"
log_cli_date_format="%Y-%m-%d %H:%M:%S.%f"


[tool.black]
line-length = 120
skip-string-normalization = true
exclude = '/(\.git|\.venv|__pycache__|build|dist|migrations)/'

[tool.isort]
profile = "black"
line_length = 120
skip = [".git", ".venv", "__pycache__", "build", "dist", "migrations"]

[tool.flake8]
max-line-length = 120
exclude = ".git,.venv,__pycache__,build,dist,*/migrations/*"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"






















case
"""
Конфигурация тестового набора данных Select_6_with_mask

Особенности набора:
- Режим стационара (StationaryStatus.STATIONARY)
- Маскирование и размаскирование ДУ НПС-2 Крымская - НПС Грушовая
- Маскирование и размаскирование датчиков
- Имитация и снятие имитации датчиков
- Одна утечка на координате 56 км
- Объём утечки 113.6 м³
"""

from dataclasses import asdict
from random import randint

from constants.enums import (
    TU,
    AdminTU,
    ConfirmationStatus,
    LdsStatus,
    MeasureConversionRule,
    MessagePriority,
    ReservedType,
    StationaryReason,
    StationaryStatus,
)
from constants.test_constants import BaseTN3Constants as TestConst
from models.subscribe_main_page_signals_info_model import SignalsInfo
from test_config.models_for_tests import CaseData, CaseMarkers, LeakTestConfig, SmokeSuiteConfig

# ===== Константы набора =====
SUITE_NAME = "Case_masking_du"
SUITE_DATA_ID = 15
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Параметры утечки
LEAK_COORDINATE_METERS = 56000.0
LEAK_VOLUME_M3 = 113.6
ALLOWED_TIME_DIFF_SECONDS = 1440  # 24 минуты
LEAK_START_INTERVAL_SECONDS = 2100  # 35 минут
LEAK_TECHNOLOGICAL_OBJECT = "НПС-5 Тихорецкая - НПС-3 Нововеличковская"
LEAK_DIAGNOSTIC_AREA_NAME = "Т-Н-3.НПС-5 «Тихорецкая».УЗР вых - Т-Н-3.НПС-3 «Нововеличковская».УЗР вых"

# ID диагностических участков
LEAK_DIAGNOSTIC_AREA_ID = 2
# ID труб для определения ДУ
DIAGNOSTIC_AREA_2_PIPE_ID = 1463  # Труба на ДУ с утечкой
DIAGNOSTIC_AREA_3_PIPE_ID = 1444  # OUT_NEIGHBOR_DIAGNOSTIC_AREA_PIPE_ID

# ID линейного участка
LINEAR_PART_ID = 407

# Данные при маскировании ДУ
LINEAR_PART_IDENTIFIER_FOR_MASK = 407
MASK_REASON = "Прохождение герметизаторов"
UNMASK_REASON = ""
MASK_ONE_DU = 1
NOT_MASK_DU = 0
TECHNOLOGICAL_SECTION = "Тихорецк-Новороссийск-3"
MASK_DU_EVENT = "Маскирование СОУ"
UNMASK_DU_EVENT = "Снятие маскирования СОУ"
MASK_DU_NAME = "НПС-5 Тихорецкая - НПС-3 Нововеличковская"
MAIN_PIPE_LINE = "МН Тихорецк-Новороссийск-3"

# ===== Значения сигналов для main page signals =====
MAIN_PAGE_SIGNALS = asdict(SignalsInfo())
SUCCESSFUL_STATUS = TestConst.JOURNAL_STATUS_SUCCESS
IMITATION_EVENT = TestConst.JOURNAL_EVENT_IMITATE
UNIMITATION_EVENT = TestConst.JOURNAL_EVENT_UNIMITATE

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"

# ===== Данные для имитации и маскирования датчиков =====
PRESSURE_SENSOR_ADDRESS = TestConst.PRESSURE_SENSOR_ADDRESS
FLOWMETER_ADDRESS = TestConst.FLOWMETER_ADDRESS
PRESSURE_SENSOR_VAL = randint(*TestConst.PRESSURE_IMITATION_RANGE) * TestConst.KGS_SM2
FLOWMETER_VAL = randint(*TestConst.VOLUME_IMITATION_RANGE) / TestConst.MASS_KG
SIGNAL_QUALITY_GOOD_VAL = TestConst.GOOD_QUALITY_VAL


# ===== Конфигурация набора =====
CASE_MASKING_DU_CONFIG = SmokeSuiteConfig(
    # ===== Метаданные =====
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    technological_section=TECHNOLOGICAL_SECTION,
    main_pipeline=MAIN_PIPELINE,
    mask_reason=MASK_REASON,
    unmask_reason=UNMASK_REASON,
    mask_one_du=MASK_ONE_DU,
    not_mask_du=NOT_MASK_DU,
    linear_part_identifier_for_mask=LINEAR_PART_IDENTIFIER_FOR_MASK,
    mask_du_name=MASK_DU_NAME,
    mask_du_event=MASK_DU_EVENT,
    unmask_du_event=UNMASK_DU_EVENT,
    main_pipe_line=MAIN_PIPE_LINE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST,
    # ----- Данные для проверки имитации -----
    exp_mode_mt_message=CaseData(
        expected_result=(
            StationaryStatus.report_text_by_value(2),
            StationaryReason.PRESSURE_AND_FLOW_MOVING_AVERAGES_MEET_CRITERIA.report_text,
            MessagePriority.MEDIUM,
        ),
    ),
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ----- Ожидаемый статус стационара -----
    expected_stationary_status=StationaryStatus.STATIONARY,
    # ----- Данные для проверки имитации -----
    imitate_flowmeter_signal_test_data=CaseData(
        params={"sensor_address": FLOWMETER_ADDRESS},
        expected_result=(FLOWMETER_VAL, SIGNAL_QUALITY_GOOD_VAL, IMITATION_EVENT, UNIMITATION_EVENT),
    ),
    imitate_pressure_sensor_signal_test_data=CaseData(
        params={"sensor_address": PRESSURE_SENSOR_ADDRESS},
        expected_result=(PRESSURE_SENSOR_VAL, SIGNAL_QUALITY_GOOD_VAL, IMITATION_EVENT, UNIMITATION_EVENT),
    ),
    # ----- Данные для проверки маскирования -----
    mask_signal_test_data=CaseData(
        params={"pressure_sensor_address": PRESSURE_SENSOR_ADDRESS, "flowmeter_address": FLOWMETER_ADDRESS}
    ),
    # ===== Ожидаемый статус сигналов =====
    expected_main_page_signals=MAIN_PAGE_SIGNALS,
    # ===== БАЗОВЫЕ ТЕСТЫ =====
    basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    journal_info_test=CaseMarkers(test_case_id="2", offset=5),
    lds_status_initialization_test=CaseMarkers(test_case_id="29", offset=5),
    main_page_info_test=CaseMarkers(test_case_id="3", offset=6),
    mode_mt_in_journal_test=CaseMarkers(test_case_id="236", offset=7),
    main_page_info_signals_test=CaseMarkers(test_case_id="120", offset=7),
    mask_signal_test=CaseMarkers(test_case_id="32", offset=8),
    mask_info_in_journal_test=CaseMarkers(test_case_id="213", offset=9),
    imitate_flowmeter_signal_test=CaseMarkers(test_case_id="216", offset=10),
    imitate_pressure_sensor_signal_test=CaseMarkers(test_case_id="216", offset=10.5),
    mask_du_on_mini_scheme_test=CaseMarkers(test_case_id="126", offset=11),
    lds_status_initialization_out_test=CaseMarkers(test_case_id="30", offset=30),
    unmask_du_on_mini_scheme_test=CaseMarkers(test_case_id="173", offset=35),
    # ===== КОНФИГУРАЦИЯ УТЕЧКИ =====
    leak=LeakTestConfig(
        # ----- Параметры утечки -----
        diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
        coordinate_meters=LEAK_COORDINATE_METERS,
        volume_m3=LEAK_VOLUME_M3,
        linear_part_id=LINEAR_PART_ID,
        technological_object=LEAK_TECHNOLOGICAL_OBJECT,
        # ----- Временные интервалы -----
        leak_start_interval_seconds=LEAK_START_INTERVAL_SECONDS,
        allowed_time_diff_seconds=ALLOWED_TIME_DIFF_SECONDS,
        # ----- Ожидаемые статусы -----
        expected_lds_status=LdsStatus.SERVICEABLE,
        expected_stationary_status=StationaryStatus.STATIONARY,
        expected_algorithm_type=ReservedType.STATIONARY_FLOW,
        expected_leak_status=ConfirmationStatus.CONFIRMED,
        # ----- Тест AllLeaksInfo -----
        all_leaks_info_test=CaseMarkers(test_case_id="15", offset=59),
        # ----- Тест LeaksContent -----
        leaks_content_test=CaseMarkers(test_case_id="97", offset=59),
        # ----- Тест MessageInfo -----
        leak_info_in_journal=CaseMarkers(test_case_id="119", offset=59),
        # ----- Тест TuLeaksInfo -----
        tu_leaks_info_test=CaseMarkers(test_case_id="5", offset=59),
        # ----- Тест AcknowledgeLeak -----
        acknowledge_leak_test=CaseMarkers(test_case_id="6", offset=60),
        #     # ----- Тест OutputSignals -----
        output_signals_test=CaseMarkers(test_case_id="33", offset=61),
    ),
)


































test_config/datasets/imitative_1.py
"""
Конфигурация тестового набора Imitative_1_tn3_56km_113 (режим остановленной перекачки)

Особенности набора:
- Режим МТ Остановленная перекачка (StationaryStatus.STOPPED)
- Одна утечка на координате 56 км
- Объём утечки 113.6 м³
- Интенсивность утечки 3,6%
- При перестройке путей течения, Режим СОУ может меняться
"""

from constants.enums import (
    TU,
    AdminTU,
    ConfirmationStatus,
    LdsStatus,
    MeasureConversionRule,
    ReservedType,
    StationaryStatus,
)
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseData, CaseMarkers, LeakTestConfig, SmokeSuiteConfig

# ===== Константы набора =====
SUITE_NAME = "Imitative_1_tn3_56km_113"
SUITE_DATA_ID = 20
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"

# Параметры утечки
LEAK_COORDINATE_METERS = 56000.0
LEAK_VOLUME_M3 = 113.6
ALLOWED_TIME_DIFF_SECONDS = 1440  # 24 минуты
LEAK_START_INTERVAL_SECONDS = 1800  # 30 минут
FLOW_RATE_SETTINGS_THRESHOLD = 7

# ID диагностических участков
LEAK_DIAGNOSTIC_AREA_ID = 2
LEAK_DIAGNOSTIC_AREA_NAME = "Т-Н-3.НПС-5 «Тихорецкая».УЗР вых - Т-Н-3.УЗР НПС-3 «Нововеличковская»."

# ID труб для определения ДУ
DIAGNOSTIC_AREA_2_PIPE_ID = 1463  # Труба на ДУ с утечкой
DIAGNOSTIC_AREA_3_PIPE_ID = 1444  # OUT_NEIGHBOR_DIAGNOSTIC_AREA_PIPE_ID

# ID линейного участка
LINEAR_PART_ID = 407

# ===== Конфигурация набора =====
IMITATIVE_1_CONFIG = SmokeSuiteConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    main_pipeline=MAIN_PIPELINE,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST,
    # ----- Ожидаемый статус стационара -----
    expected_stationary_status=StationaryStatus.STOPPED,
    expected_report_stationary_status=StationaryStatus.STOPPED.value,
    # ----- Ожидаемые статусы для проверки режимов на ЭФ Диагностика сигналов -----
    controlled_sites_with_segment=CaseData(
        expected_result={
            "exp_tixoreczkaya_novovelichkovskaya": (StationaryStatus.STOPPED, LdsStatus.SERVICEABLE),
            "exp_novovelichkovskaya_krymskaya": (StationaryStatus.STOPPED, LdsStatus.SERVICEABLE),
            "exp_krymskaya_grushovaya": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_bejsug": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_ponura": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_kuban": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_afipskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_ilinskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
        }
    ),
    # ===== БАЗОВЫЕ ТЕСТЫ =====
    basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    journal_info_test=CaseMarkers(test_case_id="2", offset=5),
    lds_status_initialization_test=CaseMarkers(test_case_id="86", offset=5),
    lds_status_init_in_journal_test=CaseMarkers(test_case_id="228", offset=5),
    main_page_info_test=CaseMarkers(test_case_id="3", offset=6),
    mask_signal_test=CaseMarkers(test_case_id="32", offset=8),
    mask_info_in_journal_test=CaseMarkers(test_case_id="213", offset=9),
    diagnostics_of_signals_after_initialization_test=CaseMarkers(test_case_id="210", offset=25),
    lds_status_initialization_out_test=CaseMarkers(test_case_id="30", offset=30),
    lds_status_init_out_in_journal_test=CaseMarkers(test_case_id="214", offset=31),
    export_lds_status_report_test=CaseMarkers(test_case_id="235", offset=58),
    export_mt_mode_report_test=CaseMarkers(test_case_id="240", offset=59),
    # ===== КОНФИГУРАЦИЯ УТЕЧКИ =====
    leak=LeakTestConfig(
        # ----- Параметры утечки -----
        coordinate_meters=LEAK_COORDINATE_METERS,
        volume_m3=LEAK_VOLUME_M3,
        linear_part_id=LINEAR_PART_ID,
        flow_rate_settings_threshold=FLOW_RATE_SETTINGS_THRESHOLD,
        diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
        # ----- Временные интервалы -----
        leak_start_interval_seconds=LEAK_START_INTERVAL_SECONDS,
        allowed_time_diff_seconds=ALLOWED_TIME_DIFF_SECONDS,
        # ----- Ожидаемые статусы -----
        expected_algorithm_type=ReservedType.STOP,
        expected_stationary_status=StationaryStatus.STOPPED,
        expected_lds_status=LdsStatus.SERVICEABLE,
        expected_leak_status=ConfirmationStatus.CONFIRMED,
        expected_lds_status_in_leaks_report=LdsStatus.SERVICEABLE.value,
        expected_report_stationary_status=StationaryStatus.STOPPED.value,
        # ----- Тест BalanceAlgorithmResultsContent -----
        balance_algorithm_leak_waiting_test=CaseMarkers(test_case_id="175", offset=41),  # Длительность теста 5 минут
        balance_algorithm_leak_detected_test=CaseMarkers(test_case_id="177", offset=54),
        # ----- Тест MessageInfo -----
        possible_leak_in_journal_test=CaseMarkers(test_case_id="211", offset=46),
        # ----- Тест AllLeaksInfo -----
        all_leaks_info_test=CaseMarkers(test_case_id="20", offset=54),
        # ----- Тест LeaksContent -----
        leaks_content_test=CaseMarkers(test_case_id="91", offset=54),
        # ----- Тест TuLeaksInfo -----
        tu_leaks_info_test=CaseMarkers(test_case_id="84", offset=54),
        # ----- Тест MessageInfo -----
        leak_info_in_journal=CaseMarkers(test_case_id="154", offset=54),
        # ----- Тест MainPageInfoContent -----
        leak_is_confirm_on_main_page_test=CaseMarkers(test_case_id="182", offset=55),
        # ----- Тест AcknowledgeLeak -----
        acknowledge_leak_test=CaseMarkers(test_case_id="6", offset=55),
        acknowledge_leak_in_journal_test=CaseMarkers(test_case_id="212", offset=55.5),
        # ----- Тест OutputSignals -----
        output_signals_test=CaseMarkers(test_case_id="158", offset=56),
        # ----- Тест ExportReports -----
        export_leaks_report_test=CaseMarkers(test_case_id="234", offset=57),
    ),
)





































2
"""
Конфигурация тестового набора Imitative_2_tn3_106km_113 (режим остановленной перекачки)

Особенности набора:
- Режим МТ Остановленная перекачка (StationaryStatus.STOPPED)
- Одна утечка на координате 106 км
- Объём утечки 113.6 м³
- Интенсивность утечки 3,6%
"""

from constants.enums import (
    TU,
    AdminTU,
    ConfirmationStatus,
    LdsStatus,
    MeasureConversionRule,
    ReservedType,
    StationaryStatus,
)
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseData, CaseMarkers, LeakTestConfig, SmokeSuiteConfig

# ===== Константы набора =====
SUITE_NAME = "Imitative_2_tn3_106km_113"
SUITE_DATA_ID = 21
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"

# Параметры утечки
LEAK_COORDINATE_METERS = 106000.0
LEAK_VOLUME_M3 = 113.6
ALLOWED_TIME_DIFF_SECONDS = 1440  # 24 минуты
LEAK_START_INTERVAL_SECONDS = 1800  # 30 минут
FLOW_RATE_SETTINGS_THRESHOLD = 7

# ID диагностических участков
LEAK_DIAGNOSTIC_AREA_ID = 2
LEAK_DIAGNOSTIC_AREA_NAME = "Т-Н-3.НПС-5 «Тихорецкая».УЗР вых - Т-Н-3.УЗР НПС-3 «Нововеличковская»."

# ID труб для определения ДУ
DIAGNOSTIC_AREA_2_PIPE_ID = 1463  # Труба на ДУ с утечкой
DIAGNOSTIC_AREA_3_PIPE_ID = 1444  # OUT_NEIGHBOR_DIAGNOSTIC_AREA_PIPE_ID

# ID линейного участка
LINEAR_PART_ID = 407

# ===== Конфигурация набора =====
IMITATIVE_2_CONFIG = SmokeSuiteConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    main_pipeline=MAIN_PIPELINE,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST,
    # ----- Ожидаемый статус стационара -----
    expected_stationary_status=StationaryStatus.STOPPED,
    expected_report_stationary_status=StationaryStatus.STOPPED.value,
    # ----- Ожидаемые статусы для проверки режимов на ЭФ Диагностика сигналов -----
    controlled_sites_with_segment=CaseData(
        expected_result={
            "exp_tixoreczkaya_novovelichkovskaya": (StationaryStatus.STOPPED, LdsStatus.SERVICEABLE),
            "exp_novovelichkovskaya_krymskaya": (StationaryStatus.STOPPED, LdsStatus.SERVICEABLE),
            "exp_krymskaya_grushovaya": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_bejsug": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_ponura": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_kuban": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_afipskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_ilinskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
        }
    ),
    # ===== БАЗОВЫЕ ТЕСТЫ =====
    basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    journal_info_test=CaseMarkers(test_case_id="2", offset=5),
    lds_status_initialization_test=CaseMarkers(test_case_id="86", offset=5),
    lds_status_init_in_journal_test=CaseMarkers(test_case_id="228", offset=5),
    main_page_info_test=CaseMarkers(test_case_id="3", offset=6),
    mask_signal_test=CaseMarkers(test_case_id="32", offset=8),
    mask_info_in_journal_test=CaseMarkers(test_case_id="213", offset=9),
    diagnostics_of_signals_after_initialization_test=CaseMarkers(test_case_id="210", offset=25),
    lds_status_initialization_out_test=CaseMarkers(test_case_id="30", offset=30),
    lds_status_init_out_in_journal_test=CaseMarkers(test_case_id="214", offset=31),
    export_lds_status_report_test=CaseMarkers(test_case_id="235", offset=58),
    export_mt_mode_report_test=CaseMarkers(test_case_id="240", offset=59),
    # ===== КОНФИГУРАЦИЯ УТЕЧКИ =====
    leak=LeakTestConfig(
        # ----- Параметры утечки -----
        coordinate_meters=LEAK_COORDINATE_METERS,
        volume_m3=LEAK_VOLUME_M3,
        linear_part_id=LINEAR_PART_ID,
        flow_rate_settings_threshold=FLOW_RATE_SETTINGS_THRESHOLD,
        diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
        # ----- Временные интервалы -----
        leak_start_interval_seconds=LEAK_START_INTERVAL_SECONDS,
        allowed_time_diff_seconds=ALLOWED_TIME_DIFF_SECONDS,
        # ----- Ожидаемые статусы -----
        expected_algorithm_type=ReservedType.STOP,
        expected_stationary_status=StationaryStatus.STOPPED,
        expected_lds_status=LdsStatus.SERVICEABLE,
        expected_leak_status=ConfirmationStatus.CONFIRMED,
        expected_lds_status_in_leaks_report=LdsStatus.SERVICEABLE.value,
        expected_report_stationary_status=StationaryStatus.STOPPED.value,
        # ----- Тест BalanceAlgorithmResultsContent -----
        balance_algorithm_leak_waiting_test=CaseMarkers(test_case_id="175", offset=41),  # Длительность теста 5 минут
        balance_algorithm_leak_detected_test=CaseMarkers(test_case_id="177", offset=54),
        # ----- Тест MessageInfo -----
        possible_leak_in_journal_test=CaseMarkers(test_case_id="211", offset=46),
        # ----- Тест AllLeaksInfo -----
        all_leaks_info_test=CaseMarkers(test_case_id="21", offset=54),
        # ----- Тест LeaksContent -----
        leaks_content_test=CaseMarkers(test_case_id="91", offset=54),
        # ----- Тест TuLeaksInfo -----
        tu_leaks_info_test=CaseMarkers(test_case_id="84", offset=54),
        # ----- Тест MessageInfo -----
        leak_info_in_journal=CaseMarkers(test_case_id="154", offset=54),
        # ----- Тест MainPageInfoContent -----
        leak_is_confirm_on_main_page_test=CaseMarkers(test_case_id="182", offset=55),
        # ----- Тест AcknowledgeLeak -----
        acknowledge_leak_test=CaseMarkers(test_case_id="6", offset=55),
        acknowledge_leak_in_journal_test=CaseMarkers(test_case_id="212", offset=55.5),
        # ----- Тест OutputSignals -----
        output_signals_test=CaseMarkers(test_case_id="158", offset=56),
        # ----- Тест ExportReports -----
        export_leaks_report_test=CaseMarkers(test_case_id="234", offset=57),
    ),
)



































4
"""
Конфигурация тестового набора Imitative_4_tn3_129km_113 (режим остановленной перекачки)

Особенности набора:
- Режим МТ Остановленная перекачка (StationaryStatus.STOPPED)
- Одна утечка на координате 129 км
- Объём утечки 113.6 м³
- Интенсивность утечки 3,6%
- Отбор на НПС Нововеличковская
- При перестройке путей течения, Режим СОУ может меняться
"""

from constants.enums import (
    TU,
    AdminTU,
    ConfirmationStatus,
    LdsStatus,
    MeasureConversionRule,
    ReservedType,
    StationaryStatus,
)
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseData, CaseMarkers, LeakTestConfig, SmokeSuiteConfig

# ===== Константы набора =====
SUITE_NAME = "Imitative_4_tn3_129km_113"
SUITE_DATA_ID = 22
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"

# Параметры утечки
LEAK_COORDINATE_METERS = 129000.0
LEAK_VOLUME_M3 = 113.6
ALLOWED_TIME_DIFF_SECONDS = 1440  # 24 минуты
LEAK_START_INTERVAL_SECONDS = 1800  # 30 минут
FLOW_RATE_SETTINGS_THRESHOLD = 7

# ID диагностических участков
LEAK_DIAGNOSTIC_AREA_ID = 3
LEAK_DIAGNOSTIC_AREA_NAME = "Т-Н-3.НПС-5 «Тихорецкая».УЗР СИКН ТН-3 - НПЗ Афипский"

# ID линейного участка
LINEAR_PART_ID = 407

# ===== Конфигурация набора =====
IMITATIVE_4_CONFIG = SmokeSuiteConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    main_pipeline=MAIN_PIPELINE,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST,
    # ----- Ожидаемый статус стационара -----
    expected_stationary_status=StationaryStatus.STOPPED,
    expected_report_stationary_status=StationaryStatus.STOPPED.value,
    # ----- Ожидаемые статусы для проверки режимов на ЭФ Диагностика сигналов -----
    controlled_sites_with_segment=CaseData(
        expected_result={
            "exp_tixoreczkaya_novovelichkovskaya": (StationaryStatus.STOPPED, LdsStatus.SERVICEABLE),
            "exp_novovelichkovskaya_krymskaya": (StationaryStatus.STOPPED, LdsStatus.SERVICEABLE),
            "exp_krymskaya_grushovaya": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_bejsug": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_ponura": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_kuban": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_afipskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_ilinskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
        }
    ),
    # ===== БАЗОВЫЕ ТЕСТЫ =====
    basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    journal_info_test=CaseMarkers(test_case_id="2", offset=5),
    lds_status_initialization_test=CaseMarkers(test_case_id="86", offset=5),
    lds_status_init_in_journal_test=CaseMarkers(test_case_id="228", offset=5),
    main_page_info_test=CaseMarkers(test_case_id="3", offset=6),
    mask_signal_test=CaseMarkers(test_case_id="32", offset=8),
    mask_info_in_journal_test=CaseMarkers(test_case_id="213", offset=9),
    diagnostics_of_signals_after_initialization_test=CaseMarkers(test_case_id="210", offset=25),
    lds_status_initialization_out_test=CaseMarkers(test_case_id="30", offset=30),
    lds_status_init_out_in_journal_test=CaseMarkers(test_case_id="214", offset=31),
    export_lds_status_report_test=CaseMarkers(test_case_id="235", offset=58),
    export_mt_mode_report_test=CaseMarkers(test_case_id="240", offset=59),
    # ===== КОНФИГУРАЦИЯ УТЕЧКИ =====
    leak=LeakTestConfig(
        # ----- Параметры утечки -----
        coordinate_meters=LEAK_COORDINATE_METERS,
        volume_m3=LEAK_VOLUME_M3,
        linear_part_id=LINEAR_PART_ID,
        flow_rate_settings_threshold=FLOW_RATE_SETTINGS_THRESHOLD,
        diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
        # ----- Временные интервалы -----
        leak_start_interval_seconds=LEAK_START_INTERVAL_SECONDS,
        allowed_time_diff_seconds=ALLOWED_TIME_DIFF_SECONDS,
        # ----- Ожидаемые статусы -----
        expected_algorithm_type=ReservedType.STOP,
        expected_stationary_status=StationaryStatus.STOPPED,
        expected_lds_status=LdsStatus.SERVICEABLE,
        expected_leak_status=ConfirmationStatus.CONFIRMED,
        expected_lds_status_in_leaks_report=LdsStatus.SERVICEABLE.value,
        expected_report_stationary_status=StationaryStatus.STOPPED.value,
        # ----- Тест BalanceAlgorithmResultsContent -----
        balance_algorithm_leak_waiting_test=CaseMarkers(test_case_id="175", offset=41),  # Длительность теста 5 минут
        balance_algorithm_leak_detected_test=CaseMarkers(test_case_id="177", offset=54),
        # ----- Тест MessageInfo -----
        possible_leak_in_journal_test=CaseMarkers(test_case_id="211", offset=46),
        # ----- Тест AllLeaksInfo -----
        all_leaks_info_test=CaseMarkers(test_case_id="22", offset=54),
        # ----- Тест LeaksContent -----
        leaks_content_test=CaseMarkers(test_case_id="91", offset=54),
        # ----- Тест TuLeaksInfo -----
        tu_leaks_info_test=CaseMarkers(test_case_id="84", offset=54),
        # ----- Тест MessageInfo -----
        leak_info_in_journal=CaseMarkers(test_case_id="154", offset=54),
        # ----- Тест MainPageInfoContent -----
        leak_is_confirm_on_main_page_test=CaseMarkers(test_case_id="182", offset=55),
        # ----- Тест AcknowledgeLeak -----
        acknowledge_leak_test=CaseMarkers(test_case_id="6", offset=55),
        acknowledge_leak_in_journal_test=CaseMarkers(test_case_id="212", offset=55.5),
        # ----- Тест OutputSignals -----
        output_signals_test=CaseMarkers(test_case_id="158", offset=56),
        # ----- Тест ExportReports -----
        export_leaks_report_test=CaseMarkers(test_case_id="234", offset=57),
    ),
)



































7
"""
Конфигурация тестового набора Imitative_7_tn3_215km_50 (режим остановленной перекачки)

Особенности набора:
- Режим МТ Остановленная перекачка (StationaryStatus.STOPPED)
- Одна утечка на координате 215 км
- Объём утечки 50,0 м³
- Интенсивность утечки 1,8%
- При перестройке путей течения, Режим СОУ может меняться
"""

from constants.enums import (
    TU,
    AdminTU,
    ConfirmationStatus,
    LdsStatus,
    MeasureConversionRule,
    ReservedType,
    StationaryStatus,
)
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseData, CaseMarkers, LeakTestConfig, SmokeSuiteConfig

# ===== Константы набора =====
SUITE_NAME = "Imitative_7_tn3_215km_50"
SUITE_DATA_ID = 23
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"

# Параметры утечки
LEAK_COORDINATE_METERS = 215000.0
LEAK_VOLUME_M3 = 50.0
ALLOWED_TIME_DIFF_SECONDS = 1800  # 30 минут
LEAK_START_INTERVAL_SECONDS = 1800  # 30 минут
FLOW_RATE_SETTINGS_THRESHOLD = 7

# ID диагностических участков
LEAK_DIAGNOSTIC_AREA_ID = 3
LEAK_DIAGNOSTIC_AREA_NAME = "Т-Н-3.УЗР НПС-3 «Нововеличковская». - Т-Н-3.НПС-2 «Крымская».УЗР СИКН Т-К"

# ID линейного участка
LINEAR_PART_ID = 408


# ===== Конфигурация набора =====
IMITATIVE_7_CONFIG = SmokeSuiteConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    main_pipeline=MAIN_PIPELINE,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST,
    # ----- Ожидаемый статус стационара -----
    expected_stationary_status=StationaryStatus.STOPPED,
    expected_report_stationary_status=StationaryStatus.STOPPED.value,
    # ----- Ожидаемые статусы для проверки режимов на ЭФ Диагностика сигналов -----
    controlled_sites_with_segment=CaseData(
        expected_result={
            "exp_tixoreczkaya_novovelichkovskaya": (StationaryStatus.STOPPED, LdsStatus.SERVICEABLE),
            "exp_novovelichkovskaya_krymskaya": (StationaryStatus.STOPPED, LdsStatus.SERVICEABLE),
            "exp_krymskaya_grushovaya": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_bejsug": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_ponura": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_kuban": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_afipskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_ilinskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
        }
    ),
    # ===== БАЗОВЫЕ ТЕСТЫ =====
    basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    journal_info_test=CaseMarkers(test_case_id="2", offset=5),
    lds_status_initialization_test=CaseMarkers(test_case_id="86", offset=5),
    lds_status_init_in_journal_test=CaseMarkers(test_case_id="228", offset=5),
    main_page_info_test=CaseMarkers(test_case_id="3", offset=6),
    mask_signal_test=CaseMarkers(test_case_id="32", offset=8),
    mask_info_in_journal_test=CaseMarkers(test_case_id="213", offset=9),
    diagnostics_of_signals_after_initialization_test=CaseMarkers(test_case_id="210", offset=25),
    lds_status_initialization_out_test=CaseMarkers(test_case_id="30", offset=30),
    lds_status_init_out_in_journal_test=CaseMarkers(test_case_id="214", offset=31),
    export_lds_status_report_test=CaseMarkers(test_case_id="235", offset=64),
    export_mt_mode_report_test=CaseMarkers(test_case_id="240", offset=65),
    # ===== КОНФИГУРАЦИЯ УТЕЧКИ =====
    leak=LeakTestConfig(
        # ----- Параметры утечки -----
        coordinate_meters=LEAK_COORDINATE_METERS,
        volume_m3=LEAK_VOLUME_M3,
        linear_part_id=LINEAR_PART_ID,
        flow_rate_settings_threshold=FLOW_RATE_SETTINGS_THRESHOLD,
        diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
        # ----- Временные интервалы -----
        leak_start_interval_seconds=LEAK_START_INTERVAL_SECONDS,
        allowed_time_diff_seconds=ALLOWED_TIME_DIFF_SECONDS,
        # ----- Ожидаемые статусы -----
        expected_algorithm_type=ReservedType.STOP,
        expected_leak_status=ConfirmationStatus.CONFIRMED,
        expected_lds_status=LdsStatus.SERVICEABLE,  # При перестройке путей течения, Режим СОУ может меняться
        expected_stationary_status=StationaryStatus.STOPPED,
        expected_lds_status_in_leaks_report=LdsStatus.SERVICEABLE.value,
        expected_report_stationary_status=StationaryStatus.STOPPED.value,
        # ----- Тест BalanceAlgorithmResultsContent -----
        balance_algorithm_leak_waiting_test=CaseMarkers(test_case_id="175", offset=42),  # Длительность теста 5 минут
        balance_algorithm_leak_detected_test=CaseMarkers(test_case_id="177", offset=60),
        # ----- Тест MessageInfo -----
        possible_leak_in_journal_test=CaseMarkers(test_case_id="211", offset=42),
        # ----- Тест AllLeaksInfo -----
        all_leaks_info_test=CaseMarkers(test_case_id="23", offset=60),
        # ----- Тест LeaksContent -----
        leaks_content_test=CaseMarkers(test_case_id="91", offset=60),
        # ----- Тест TuLeaksInfo -----
        tu_leaks_info_test=CaseMarkers(test_case_id="84", offset=60),
        # ----- Тест MessageInfo -----
        leak_info_in_journal=CaseMarkers(test_case_id="154", offset=60),
        # ----- Тест MainPageInfoContent -----
        leak_is_confirm_on_main_page_test=CaseMarkers(test_case_id="182", offset=61),
        # ----- Тест AcknowledgeLeak -----
        acknowledge_leak_test=CaseMarkers(test_case_id="6", offset=61),
        acknowledge_leak_in_journal_test=CaseMarkers(test_case_id="212", offset=61.5),
        # ----- Тест OutputSignals -----
        output_signals_test=CaseMarkers(test_case_id="158", offset=62),
        # ----- Тест ExportReports -----
        export_leaks_report_test=CaseMarkers(test_case_id="234", offset=63),
    ),
)


























17
"""
Конфигурация тестового набора Imitative_17_tn3_5km_113
Особенности набора:
- Режим МТ стационар, минимальный
- Одна утечка на координате 5 км
- Объём утечки 113 м³
- Интенсивность утечки 3,6%
- Отбор на участке между СИ давления на выходе головной НПС и СИ давления на следующем КП на ЛЧ (на входе первой ЗА ЛЧ)
"""

from constants.enums import (
    TU,
    AdminTU,
    ConfirmationStatus,
    LdsStatus,
    LdsStatusInitialization,
    MeasureConversionRule,
    ReservedType,
    StationaryStatus,
)
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import (
    CaseData,
    CaseMarkers,
    DiagnosticAreaStatusConfig,
    LeakTestConfig,
    SmokeSuiteConfig,
)

# ===== Константы набора =====
SUITE_NAME = "Imitative_17_tn3_5km_113"
SUITE_DATA_ID = 24
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"

# Параметры утечки
LEAK_COORDINATE_METERS = 5400.0
LEAK_VOLUME_M3 = 113.0
ALLOWED_TIME_DIFF_SECONDS = 1440  # 24 минуты
LEAK_START_INTERVAL_SECONDS = 2100  # 35 минут
FLOW_RATE_SETTINGS_THRESHOLD = 17

# ID диагностических участков
LEAK_DIAGNOSTIC_AREA_ID = 2
LEAK_DIAGNOSTIC_AREA_NAME = "Т-Н-3.НПС-5 «Тихорецкая».УЗР вых - Т-Н-3.УЗР НПС-3 «Нововеличковская»."
# ID труб для определения ДУ
DIAGNOSTIC_AREA_2_PIPE_ID = 1463  # Труба на ДУ с утечкой
DIAGNOSTIC_AREA_3_PIPE_ID = 1444  # OUT_NEIGHBOR_DIAGNOSTIC_AREA_PIPE_ID
# ID линейного участка
LINEAR_PART_ID = 407

# ===== Конфигурация набора =====
IMITATIVE_17_CONFIG = SmokeSuiteConfig(
    # ===== Метаданные =====
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    main_pipeline=MAIN_PIPELINE,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST,
    # ----- Ожидаемый статус стационара -----
    expected_stationary_status=StationaryStatus.STATIONARY,
    expected_report_stationary_status=StationaryStatus.STATIONARY.value,
    # ----- Ожидаемые статусы для проверки режимов на ЭФ Диагностика сигналов -----
    controlled_sites_with_segment=CaseData(
        expected_result={
            "exp_tixoreczkaya_novovelichkovskaya": (StationaryStatus.STATIONARY, LdsStatus.SERVICEABLE),
            "exp_novovelichkovskaya_krymskaya": (StationaryStatus.STATIONARY, LdsStatus.SERVICEABLE),
            "exp_krymskaya_grushovaya": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_bejsug": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_ponura": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_kuban": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_afipskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_ilinskij": (StationaryStatus.STATIONARY, LdsStatus.FAULTY),
        }
    ),
    # ===== БАЗОВЫЕ ТЕСТЫ =====
    basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    journal_info_test=CaseMarkers(test_case_id="2", offset=5),
    lds_status_initialization_test=CaseMarkers(test_case_id="86", offset=5),
    lds_status_init_in_journal_test=CaseMarkers(test_case_id="228", offset=5),
    main_page_info_test=CaseMarkers(test_case_id="3", offset=6),
    mask_signal_test=CaseMarkers(test_case_id="32", offset=8),
    mask_info_in_journal_test=CaseMarkers(test_case_id="213", offset=9),
    diagnostics_of_signals_after_initialization_test=CaseMarkers(test_case_id="210", offset=25),
    lds_status_initialization_out_test=CaseMarkers(test_case_id="30", offset=30),
    lds_status_init_out_in_journal_test=CaseMarkers(test_case_id="214", offset=31),
    export_lds_status_report_test=CaseMarkers(test_case_id="235", offset=64),
    export_mt_mode_report_test=CaseMarkers(test_case_id="240", offset=65),
    # # ===== КОНФИГУРАЦИЯ УТЕЧКИ =====
    leak=LeakTestConfig(
        # ----- Конфигурация статусов СОУ во время утечки -----
        lds_status_during_leak_config=DiagnosticAreaStatusConfig(
            leak_diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
            leak_du_expected_lds_status=LdsStatus.INITIALIZATION,
            neighbors_du_expected_lds_status=LdsStatus.DEGRADATION,
        ),
        # ----- Ожидаемый статус СОУ -----
        lds_status_after_confirming_leak_data=CaseData(
            params={"pipe_id": DIAGNOSTIC_AREA_2_PIPE_ID},
            expected_result=(
                LdsStatus.INITIALIZATION,
                LdsStatusInitialization.ACCUMULATION_DATA.value,
            ),
        ),
        # ----- Параметры утечки -----
        coordinate_meters=LEAK_COORDINATE_METERS,
        volume_m3=LEAK_VOLUME_M3,
        linear_part_id=LINEAR_PART_ID,
        flow_rate_settings_threshold=FLOW_RATE_SETTINGS_THRESHOLD,
        diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
        # ----- Временные интервалы -----
        leak_start_interval_seconds=LEAK_START_INTERVAL_SECONDS,
        allowed_time_diff_seconds=ALLOWED_TIME_DIFF_SECONDS,
        # ----- Ожидаемые статусы -----
        expected_lds_status=LdsStatus.SERVICEABLE,
        expected_stationary_status=StationaryStatus.STATIONARY,
        expected_algorithm_type=ReservedType.STATIONARY_FLOW,
        expected_leak_status=ConfirmationStatus.CONFIRMED,
        expected_lds_status_in_leaks_report=LdsStatus.SERVICEABLE.value,
        expected_report_stationary_status=StationaryStatus.STATIONARY.value,
        # ----- Тест BalanceAlgorithmResultsContent -----
        balance_algorithm_leak_waiting_test=CaseMarkers(test_case_id="175", offset=47),  # Длительность теста 5 минут
        balance_algorithm_leak_detected_test=CaseMarkers(test_case_id="177", offset=58),
        possible_leak_in_journal_test=CaseMarkers(test_case_id="211", offset=52),
        # ----- Тест AllLeaksInfo -----
        all_leaks_info_test=CaseMarkers(test_case_id="24", offset=58),
        # ----- Тест LeakContent -----
        leaks_content_test=CaseMarkers(test_case_id="91", offset=58),
        # ----- Тест TuLeaksInfo -----
        tu_leaks_info_test=CaseMarkers(test_case_id="84", offset=58),
        # ----- Тест MessageInfo -----
        leak_info_in_journal=CaseMarkers(test_case_id="154", offset=58),
        # ----- Тест CommonSchemeContent -----
        lds_status_during_leak_test=CaseMarkers(test_case_id="31", offset=58.5),
        # ----- Тест MainPageInfoContent -----
        leak_is_confirm_on_main_page_test=CaseMarkers(test_case_id="182", offset=60),
        lds_status_after_confirming_leak_test=CaseMarkers(test_case_id="201", offset=60),
        # ----- Тест AcknowledgeLeak -----
        acknowledge_leak_test=CaseMarkers(test_case_id="6", offset=60.5),
        acknowledge_leak_in_journal_test=CaseMarkers(test_case_id="212", offset=61),
        # ----- Тест OutputSignals -----
        output_signals_test=CaseMarkers(test_case_id="158", offset=62),
        # ----- Тест ExportReports -----
        export_leaks_report_test=CaseMarkers(test_case_id="234", offset=63),
    ),
)
































20
"""
Конфигурация тестового набора Imitative_20_tn3_129km_113

Особенности набора:
- Режим МТ стационар, минимальный
- Одна утечка на координате 129 км
- Объём утечки 113.6 м³
- Интенсивность утечки 3,6%
- Отбор на НПС Нововеличковская (до МНС)
"""

from constants.enums import (
    TU,
    AdminTU,
    ConfirmationStatus,
    LdsStatus,
    MeasureConversionRule,
    ReservedType,
    StationaryStatus,
)
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import (
    CaseData,
    CaseMarkers,
    DiagnosticAreaStatusConfig,
    LeakTestConfig,
    SmokeSuiteConfig,
)

# ===== Константы набора =====
SUITE_NAME = "Imitative_20_tn3_129km_113"
SUITE_DATA_ID = 25
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"

# Параметры утечки
LEAK_COORDINATE_METERS = 129000
LEAK_VOLUME_M3 = 113.6
ALLOWED_TIME_DIFF_SECONDS = 1440  # 24 минуты
LEAK_START_INTERVAL_SECONDS = 2100  # 35 минут
LEAK_TECHNOLOGICAL_OBJECT = "НПС-5 Тихорецкая - НПС-3 Нововеличковская"
FLOW_RATE_SETTINGS_THRESHOLD = 17

# ID диагностических участков
LEAK_DIAGNOSTIC_AREA_ID = 3
LEAK_DIAGNOSTIC_AREA_NAME = "Т-Н-3.НПС-5 «Тихорецкая».УЗР вых - Т-Н-3.УЗР НПС-3 «Нововеличковская»."

# ID труб для определения ДУ
DIAGNOSTIC_AREA_3_PIPE_ID = 474  # Труба на ДУ с утечкой
DIAGNOSTIC_AREA_2_PIPE_ID = 1463  # IN_NEIGHBOR_DIAGNOSTIC_AREA_PIPE_ID
DIAGNOSTIC_AREA_6_PIPE_ID = 999205440  # OUT_NEIGHBOR_DIAGNOSTIC_AREA_PIPE_ID

# ID линейного участка
LINEAR_PART_ID = 407

# ===== Конфигурация набора =====
IMITATIVE_20_CONFIG = SmokeSuiteConfig(
    # ===== Метаданные =====
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    main_pipeline=MAIN_PIPELINE,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST,
    # ----- Ожидаемый статус стационара -----
    expected_stationary_status=StationaryStatus.STATIONARY,
    expected_report_stationary_status=StationaryStatus.STATIONARY.value,
    # ----- Ожидаемые статусы для проверки режимов на ЭФ Диагностика сигналов -----
    controlled_sites_with_segment=CaseData(
        expected_result={
            "exp_tixoreczkaya_novovelichkovskaya": (StationaryStatus.STATIONARY, LdsStatus.SERVICEABLE),
            "exp_novovelichkovskaya_krymskaya": (StationaryStatus.STATIONARY, LdsStatus.SERVICEABLE),
            "exp_krymskaya_grushovaya": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_bejsug": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_ponura": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_kuban": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_afipskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_ilinskij": (StationaryStatus.STATIONARY, LdsStatus.FAULTY),
        }
    ),
    # ===== БАЗОВЫЕ ТЕСТЫ =====
    basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    journal_info_test=CaseMarkers(test_case_id="2", offset=5),
    lds_status_initialization_test=CaseMarkers(test_case_id="86", offset=5),
    lds_status_init_in_journal_test=CaseMarkers(test_case_id="228", offset=5),
    main_page_info_test=CaseMarkers(test_case_id="3", offset=6),
    mask_signal_test=CaseMarkers(test_case_id="32", offset=8),
    mask_info_in_journal_test=CaseMarkers(test_case_id="213", offset=9),
    diagnostics_of_signals_after_initialization_test=CaseMarkers(test_case_id="210", offset=25),
    lds_status_initialization_out_test=CaseMarkers(test_case_id="30", offset=30),
    lds_status_init_out_in_journal_test=CaseMarkers(test_case_id="214", offset=31),
    export_lds_status_report_test=CaseMarkers(test_case_id="235", offset=63),
    export_mt_mode_report_test=CaseMarkers(test_case_id="240", offset=64),
    # ===== КОНФИГУРАЦИЯ УТЕЧКИ =====
    leak=LeakTestConfig(
        # ----- Конфигурация статусов СОУ во время утечки -----
        lds_status_during_leak_config=DiagnosticAreaStatusConfig(
            leak_diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
            leak_du_expected_lds_status=LdsStatus.INITIALIZATION,
            neighbors_du_expected_lds_status=LdsStatus.DEGRADATION,
        ),
        # ----- Параметры утечки -----
        coordinate_meters=LEAK_COORDINATE_METERS,
        volume_m3=LEAK_VOLUME_M3,
        linear_part_id=LINEAR_PART_ID,
        technological_object=LEAK_TECHNOLOGICAL_OBJECT,
        flow_rate_settings_threshold=FLOW_RATE_SETTINGS_THRESHOLD,
        diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
        # ----- Временные интервалы -----
        leak_start_interval_seconds=LEAK_START_INTERVAL_SECONDS,
        allowed_time_diff_seconds=ALLOWED_TIME_DIFF_SECONDS,
        # ----- Ожидаемые статусы -----
        expected_lds_status=LdsStatus.SERVICEABLE,
        expected_stationary_status=StationaryStatus.STATIONARY,
        expected_algorithm_type=ReservedType.STATIONARY_FLOW,
        expected_leak_status=ConfirmationStatus.CONFIRMED,
        expected_lds_status_in_leaks_report=LdsStatus.SERVICEABLE.value,
        expected_report_stationary_status=StationaryStatus.STATIONARY.value,
        # ----- Тест BalanceAlgorithmResultsContent -----
        balance_algorithm_leak_waiting_test=CaseMarkers(test_case_id="175", offset=46),  # Длительность теста 5 минут
        balance_algorithm_leak_detected_test=CaseMarkers(test_case_id="177", offset=59),
        possible_leak_in_journal_test=CaseMarkers(test_case_id="211", offset=51),
        # ----- Тест AllLeaksInfo -----
        all_leaks_info_test=CaseMarkers(test_case_id="25", offset=59),
        # ----- Тест LeaksContent -----
        leaks_content_test=CaseMarkers(test_case_id="91", offset=59),
        # ----- Тест MessageInfo -----
        leak_info_in_journal=CaseMarkers(test_case_id="154", offset=59),
        # ----- Тест TuLeaksInfo -----
        tu_leaks_info_test=CaseMarkers(test_case_id="84", offset=59),
        # ----- Тест CommonSchemeContent -----
        lds_status_during_leak_test=CaseMarkers(test_case_id="31", offset=59.5),
        # ----- Тест MainPageInfoContent -----
        leak_is_confirm_on_main_page_test=CaseMarkers(test_case_id="182", offset=60),
        # ----- Тест AcknowledgeLeak -----
        acknowledge_leak_test=CaseMarkers(test_case_id="6", offset=60.5),
        acknowledge_leak_in_journal_test=CaseMarkers(test_case_id="212", offset=61),
        # ----- Тест OutputSignals -----
        output_signals_test=CaseMarkers(test_case_id="158", offset=61.5),
        # ----- Тест ExportReports -----
        export_leaks_report_test=CaseMarkers(test_case_id="234", offset=62),
    ),
)
































29
"""
Конфигурация тестового набора Imitative_29_tn3_56km_3156

Особенности набора:
- Режим МТ стационар, минимальный
- Одна утечка на координате 56 км
- Объём утечки 3156 м³
- Интенсивность утечки 100%
"""

from constants.enums import (
    TU,
    AdminTU,
    ConfirmationStatus,
    LdsStatus,
    LdsStatusInitialization,
    MeasureConversionRule,
    ReservedType,
    StationaryStatus,
)
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import (
    CaseData,
    CaseMarkers,
    DiagnosticAreaStatusConfig,
    LeakTestConfig,
    SmokeSuiteConfig,
)

# ===== Константы набора =====
SUITE_NAME = "Imitative_29_tn3_56km_3156"
SUITE_DATA_ID = 33
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"

# Параметры утечки
LEAK_COORDINATE_METERS = 56000.0
LEAK_VOLUME_M3 = 3156.0
ALLOWED_TIME_DIFF_SECONDS = 360  # 6 мин
LEAK_START_INTERVAL_SECONDS = 1800  # 30 минут
FLOW_RATE_SETTINGS_THRESHOLD = 17

# ID диагностических участков
LEAK_DIAGNOSTIC_AREA_ID = 2
LEAK_DIAGNOSTIC_AREA_NAME = "Т-Н-3.НПС-5 «Тихорецкая».УЗР вых - Т-Н-3.УЗР НПС-3 «Нововеличковская»."
# ID труб для определения ДУ
DIAGNOSTIC_AREA_2_PIPE_ID = 1463  # Труба на ДУ с утечкой
DIAGNOSTIC_AREA_3_PIPE_ID = 1444  # OUT_NEIGHBOR_DIAGNOSTIC_AREA_PIPE_ID
# ID линейного участка
LINEAR_PART_ID = 407

# ===== Конфигурация набора =====
IMITATIVE_29_CONFIG = SmokeSuiteConfig(
    # ===== Метаданные =====
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    main_pipeline=MAIN_PIPELINE,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST,
    # ----- Ожидаемый статус стационара -----
    expected_stationary_status=StationaryStatus.STATIONARY,
    expected_report_stationary_status=StationaryStatus.STATIONARY.value,
    # ----- Ожидаемые статусы для проверки режимов на ЭФ Диагностика сигналов -----
    controlled_sites_with_segment=CaseData(
        expected_result={
            "exp_tixoreczkaya_novovelichkovskaya": (StationaryStatus.STATIONARY, LdsStatus.SERVICEABLE),
            "exp_novovelichkovskaya_krymskaya": (StationaryStatus.STATIONARY, LdsStatus.DEGRADATION),
            "exp_krymskaya_grushovaya": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_bejsug": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_ponura": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_kuban": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_afipskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_ilinskij": (StationaryStatus.STATIONARY, LdsStatus.FAULTY),
        }
    ),
    # ===== БАЗОВЫЕ ТЕСТЫ =====
    basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    journal_info_test=CaseMarkers(test_case_id="2", offset=5),
    lds_status_initialization_test=CaseMarkers(test_case_id="86", offset=5),
    lds_status_init_in_journal_test=CaseMarkers(test_case_id="228", offset=5),
    main_page_info_test=CaseMarkers(test_case_id="3", offset=6),
    mask_signal_test=CaseMarkers(test_case_id="32", offset=8),
    mask_info_in_journal_test=CaseMarkers(test_case_id="213", offset=9),
    diagnostics_of_signals_after_initialization_test=CaseMarkers(test_case_id="210", offset=25),
    lds_status_initialization_out_test=CaseMarkers(test_case_id="30", offset=30),
    lds_status_init_out_in_journal_test=CaseMarkers(test_case_id="214", offset=30),
    export_lds_status_report_test=CaseMarkers(test_case_id="235", offset=42),
    export_mt_mode_report_test=CaseMarkers(test_case_id="240", offset=43),
    # ===== КОНФИГУРАЦИЯ УТЕЧКИ =====
    leak=LeakTestConfig(
        # ----- Конфигурация статусов СОУ во время утечки -----
        lds_status_during_leak_config=DiagnosticAreaStatusConfig(
            leak_diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
            leak_du_expected_lds_status=LdsStatus.INITIALIZATION,
            neighbors_du_expected_lds_status=LdsStatus.DEGRADATION,
        ),
        # ----- Ожидаемый статус СОУ -----
        lds_status_after_confirming_leak_data=CaseData(
            params={"pipe_id": DIAGNOSTIC_AREA_2_PIPE_ID},
            expected_result=(
                LdsStatus.INITIALIZATION,
                LdsStatusInitialization.ACCUMULATION_DATA.value,
            ),
        ),
        # ----- Параметры утечки -----
        coordinate_meters=LEAK_COORDINATE_METERS,
        volume_m3=LEAK_VOLUME_M3,
        linear_part_id=LINEAR_PART_ID,
        flow_rate_settings_threshold=FLOW_RATE_SETTINGS_THRESHOLD,
        diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
        # ----- Временные интервалы -----
        leak_start_interval_seconds=LEAK_START_INTERVAL_SECONDS,
        allowed_time_diff_seconds=ALLOWED_TIME_DIFF_SECONDS,
        # ----- Ожидаемые статусы -----
        expected_lds_status=LdsStatus.DEGRADATION,
        expected_stationary_status=StationaryStatus.STATIONARY,
        expected_algorithm_type=ReservedType.STATIONARY_FLOW,
        expected_leak_status=ConfirmationStatus.CONFIRMED,
        expected_lds_status_in_leaks_report=LdsStatus.DEGRADATION.value,
        expected_report_stationary_status=StationaryStatus.STATIONARY.value,
        # ----- Тест BalanceAlgorithmResultsContent -----
        balance_algorithm_leak_waiting_test=CaseMarkers(test_case_id="175", offset=30),  # Длительность теста 5 минут
        balance_algorithm_leak_detected_test=CaseMarkers(test_case_id="177", offset=36),
        possible_leak_in_journal_test=CaseMarkers(test_case_id="211", offset=32),
        # ----- Тест AllLeaksInfo -----
        all_leaks_info_test=CaseMarkers(test_case_id="33", offset=36),
        # ----- Тест LeakContent -----
        leaks_content_test=CaseMarkers(test_case_id="91", offset=36),
        # ----- Тест TuLeaksInfo -----
        tu_leaks_info_test=CaseMarkers(test_case_id="84", offset=36),
        # ----- Тест MessageInfo -----
        leak_info_in_journal=CaseMarkers(test_case_id="154", offset=36),
        # ----- Тест CommonSchemeContent -----
        lds_status_during_leak_test=CaseMarkers(test_case_id="31", offset=36.5),
        # ----- Тест MainPageInfoContent -----
        leak_is_confirm_on_main_page_test=CaseMarkers(test_case_id="182", offset=38),
        lds_status_after_confirming_leak_test=CaseMarkers(test_case_id="201", offset=38),
        # ----- Тест AcknowledgeLeak -----
        acknowledge_leak_test=CaseMarkers(test_case_id="6", offset=38.5),
        acknowledge_leak_in_journal_test=CaseMarkers(test_case_id="212", offset=39),
        # ----- Тест OutputSignals -----
        output_signals_test=CaseMarkers(test_case_id="158", offset=40),
        # ----- Тест ExportReports -----
        export_leaks_report_test=CaseMarkers(test_case_id="234", offset=41),
    ),
)
























31

"""
Конфигурация тестового набора Imitative_31_tn3_215km_284
Особенности набора:
- Режим МТ стационар, минимальный
- Одна утечка на координате 215 км
- Объём утечки 284 м³
- Интенсивность утечки 9%
"""

from constants.enums import (
    TU,
    AdminTU,
    ConfirmationStatus,
    LdsStatus,
    LdsStatusInitialization,
    MeasureConversionRule,
    ReservedType,
    StationaryStatus,
)
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import (
    CaseData,
    CaseMarkers,
    DiagnosticAreaStatusConfig,
    LeakTestConfig,
    SmokeSuiteConfig,
)

# ===== Константы набора =====
SUITE_NAME = "Imitative_31_tn3_215km_284"
SUITE_DATA_ID = 26
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"

# Параметры утечки
LEAK_COORDINATE_METERS = 215000.0
LEAK_VOLUME_M3 = 284.0
ALLOWED_TIME_DIFF_SECONDS = 1440  # 24 минуты
LEAK_START_INTERVAL_SECONDS = 1800  # 30 минут
FLOW_RATE_SETTINGS_THRESHOLD = 17

# ID диагностических участков (2 соседних ДУ)
LEAK_DIAGNOSTIC_AREA_ID = 3
LEAK_DIAGNOSTIC_AREA_NAME = "Т-Н-3.УЗР НПС-3 «Нововеличковская». - Т-Н-3.НПС-2 «Крымская».УЗР СИКН Т-К"
# ID труб для определения ДУ
DIAGNOSTIC_AREA_3_PIPE_ID = 474  # Труба на ДУ с утечкой
DIAGNOSTIC_AREA_2_PIPE_ID = 1463  # IN_NEIGHBOR_DIAGNOSTIC_AREA_PIPE_ID
DIAGNOSTIC_AREA_6_PIPE_ID = 999205440  # OUT_NEIGHBOR_DIAGNOSTIC_AREA_PIPE_ID

# ID линейного участка
LINEAR_PART_ID = 408

# ===== Конфигурация набора =====
IMITATIVE_31_CONFIG = SmokeSuiteConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    main_pipeline=MAIN_PIPELINE,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST,
    # ----- Ожидаемый статус стационара -----
    expected_stationary_status=StationaryStatus.STATIONARY,
    expected_report_stationary_status=StationaryStatus.STATIONARY.value,
    # ----- Ожидаемые статусы для проверки режимов на ЭФ Диагностика сигналов -----
    controlled_sites_with_segment=CaseData(
        expected_result={
            "exp_tixoreczkaya_novovelichkovskaya": (StationaryStatus.STATIONARY, LdsStatus.SERVICEABLE),
            "exp_novovelichkovskaya_krymskaya": (StationaryStatus.STATIONARY, LdsStatus.SERVICEABLE),
            "exp_krymskaya_grushovaya": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_bejsug": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_ponura": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_kuban": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_afipskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_ilinskij": (StationaryStatus.STATIONARY, LdsStatus.FAULTY),
        }
    ),
    # ===== БАЗОВЫЕ ТЕСТЫ =====
    basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    journal_info_test=CaseMarkers(test_case_id="2", offset=5),
    lds_status_initialization_test=CaseMarkers(test_case_id="86", offset=5),
    lds_status_init_in_journal_test=CaseMarkers(test_case_id="228", offset=5),
    main_page_info_test=CaseMarkers(test_case_id="3", offset=6),
    mask_signal_test=CaseMarkers(test_case_id="32", offset=8),
    mask_info_in_journal_test=CaseMarkers(test_case_id="213", offset=9),
    diagnostics_of_signals_after_initialization_test=CaseMarkers(test_case_id="210", offset=25),
    lds_status_initialization_out_test=CaseMarkers(test_case_id="30", offset=30),
    lds_status_init_out_in_journal_test=CaseMarkers(test_case_id="214", offset=31),
    export_lds_status_report_test=CaseMarkers(test_case_id="235", offset=59),
    export_mt_mode_report_test=CaseMarkers(test_case_id="240", offset=60),
    # ===== КОНФИГУРАЦИЯ УТЕЧКИ =====
    leak=LeakTestConfig(
        # ----- Конфигурация статусов СОУ во время утечки -----
        lds_status_during_leak_config=DiagnosticAreaStatusConfig(
            leak_diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
            leak_du_expected_lds_status=LdsStatus.INITIALIZATION,
            neighbors_du_expected_lds_status=LdsStatus.DEGRADATION,
        ),
        # ----- Ожидаемый статус СОУ -----
        lds_status_after_confirming_leak_data=CaseData(
            params={"pipe_id": DIAGNOSTIC_AREA_2_PIPE_ID},
            expected_result=(
                LdsStatus.INITIALIZATION,
                LdsStatusInitialization.ACCUMULATION_DATA,
            ),
        ),
        # ----- Параметры утечки -----
        coordinate_meters=LEAK_COORDINATE_METERS,
        volume_m3=LEAK_VOLUME_M3,
        linear_part_id=LINEAR_PART_ID,
        flow_rate_settings_threshold=FLOW_RATE_SETTINGS_THRESHOLD,
        diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
        # ----- Временные интервалы -----
        leak_start_interval_seconds=LEAK_START_INTERVAL_SECONDS,
        allowed_time_diff_seconds=ALLOWED_TIME_DIFF_SECONDS,
        # ----- Ожидаемые статусы -----
        expected_lds_status=LdsStatus.SERVICEABLE,
        expected_stationary_status=StationaryStatus.STATIONARY,
        expected_algorithm_type=ReservedType.STATIONARY_FLOW,
        expected_leak_status=ConfirmationStatus.CONFIRMED,
        expected_report_stationary_status=StationaryStatus.STATIONARY.value,
        expected_lds_status_in_leaks_report=LdsStatus.SERVICEABLE.value,
        # ----- Тест BalanceAlgorithmResultsContent -----
        balance_algorithm_leak_waiting_test=CaseMarkers(test_case_id="175", offset=41),  # Длительность теста 5 минут
        balance_algorithm_leak_detected_test=CaseMarkers(test_case_id="177", offset=54),
        possible_leak_in_journal_test=CaseMarkers(test_case_id="211", offset=37),
        # ----- Тест AllLeaksInfo -----
        all_leaks_info_test=CaseMarkers(test_case_id="26", offset=54),
        # ----- Тест LeaksContent -----
        leaks_content_test=CaseMarkers(test_case_id="91", offset=54),
        # ----- Тест TuLeaksInfo -----
        tu_leaks_info_test=CaseMarkers(test_case_id="84", offset=54),
        # ----- Тест MessageInfo -----
        leak_info_in_journal=CaseMarkers(test_case_id="154", offset=54),
        # ----- Тест CommonSchemeContent -----
        lds_status_during_leak_test=CaseMarkers(test_case_id="31", offset=54.5),
        # ----- Тест MainPageInfoContent -----
        leak_is_confirm_on_main_page_test=CaseMarkers(test_case_id="182", offset=55),
        lds_status_after_confirming_leak_test=CaseMarkers(test_case_id="201", offset=55),
        # ----- Тест AcknowledgeLeak -----
        acknowledge_leak_test=CaseMarkers(test_case_id="6", offset=56),
        acknowledge_leak_in_journal_test=CaseMarkers(test_case_id="212", offset=56.5),
        # ----- Тест OutputSignals -----
        output_signals_test=CaseMarkers(test_case_id="158", offset=57),
        # ----- Тесты на факт завершения утечки -----
        the_leak_is_complete_on_kg_test=CaseMarkers(test_case_id="180", offset=86),
        leak_is_complete_on_main_page_test=CaseMarkers(test_case_id="199", offset=86),
        leak_is_complete_in_output_signals_test=CaseMarkers(test_case_id="180", offset=86),
        complete_tu_leaks_info_content_test=CaseMarkers(test_case_id="180", offset=86),
        completed_leak_info_in_journal_test=CaseMarkers(test_case_id="215", offset=86),
        lds_status_completed_leak_test=CaseMarkers(test_case_id="202", offset=94),
        all_leaks_is_empty_test=CaseMarkers(test_case_id="187", offset=96),
        # ----- Тест ExportReports -----
        export_leaks_report_test=CaseMarkers(test_case_id="234", offset=58),
    ),
)



























rejected


"""
Конфигурация тестового набора is_rejected_regress

Особенности набора:
- Проверка отбраковки сигналов с датчиков давления и расходомеров
- Типы отбраковки: empty, quality, VTOR, nearbySensors,
  diagnosticInfo, constantSignal, range
- Для каждого типа - отдельный RejectionTestCase на снятие отбраковки

Запуск:
pytest tests/test_is_rejected_regress.py --suites=is_rejected_regress
"""

from constants.enums import TU, AdminTU, MeasureConversionRule, RejectionCriteria, RejectionSensorTag
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseMarkers, IsRejectedConfig, RejectionTestCase

# ===== Константы набора =====
SUITE_NAME = "is_rejected_regress"
SUITE_DATA_ID = 16
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"

# ===== Тегированные датчики =====
FLOW_KRIM = RejectionSensorTag.NPS_KRIM_P_Vmom
PRESSURE_VELKRIM = RejectionSensorTag.KP_209_1_Pin
FLOW_TIH = RejectionSensorTag.NPS_TIH_5_Vmom
PRESSURE_KP7 = RejectionSensorTag.KP_7_Pin
PRESSURE_KP8_PIN = RejectionSensorTag.KP_8_Pin
PRESSURE_KP8_POUT = RejectionSensorTag.KP_8_Pout

# ===== Ожидаемые signalName =====
SIGNAL_FLOW = "СИ расхода. Расход"
SIGNAL_PRESSURE = "СИ давления"

# ===== Конфигурация набора =====
IS_REJECTED_REGRESS_CONFIG = IsRejectedConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    main_pipeline=MAIN_PIPELINE,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST_REJECT,
    # ===== Vault settings =====
    requires_process_empty_values_rejection=True,
    # ===== Tests =====
    # rejection_report_test=CaseMarkers(test_case_id="210", offset=72),
    rejection_cases=[
        # ===== emptyFilterSettings =====
        RejectionTestCase(
            name="empty_flow",
            sensor=FLOW_KRIM,
            expected_event="Отбраковка по отсутствию значения",
            expected_signal_name=SIGNAL_FLOW,
            expected_criteria_names=RejectionCriteria.EMPTY,
            time_range_start_s=0,
            time_range_end_s=240,
            rejection_input_signals_test=CaseMarkers(test_case_id="189", offset=3),
            rejection_main_page_test=CaseMarkers(test_case_id="189", offset=3),
            rejection_scheme_signals_state_test=CaseMarkers(test_case_id="189", offset=3),
        ),
        RejectionTestCase(
            name="empty_pressure",
            sensor=PRESSURE_VELKRIM,
            expected_event="Отбраковка по отсутствию значения",
            expected_signal_name=SIGNAL_PRESSURE,
            expected_criteria_names=RejectionCriteria.EMPTY,
            time_range_start_s=0,
            time_range_end_s=540,
            rejection_input_signals_test=CaseMarkers(test_case_id="190", offset=4),
            rejection_main_page_test=CaseMarkers(test_case_id="190", offset=6),
            rejection_scheme_signals_state_test=CaseMarkers(test_case_id="190", offset=5),
        ),
        # ===== qualityFilterSettings =====
        RejectionTestCase(
            name="quality_flow",
            sensor=FLOW_KRIM,
            expected_event="Отбраковка по качеству",
            expected_signal_name=SIGNAL_FLOW,
            expected_criteria_names=RejectionCriteria.QUALITY,
            time_range_start_s=600,
            time_range_end_s=840,
            rejection_input_signals_test=CaseMarkers(test_case_id="191", offset=13),
            rejection_journal_test=CaseMarkers(test_case_id="191", offset=14),
            rejection_main_page_test=CaseMarkers(test_case_id="191", offset=11),
            rejection_scheme_signals_state_test=CaseMarkers(test_case_id="191", offset=12),
        ),
        RejectionTestCase(
            name="quality_flow_clearance",
            sensor=FLOW_KRIM,
            expected_event="Отбраковка по качеству снята",
            expected_signal_name=SIGNAL_FLOW,
            expected_is_rejected=False,
            time_range_start_s=600,
            time_range_end_s=840,
            # rejection_input_signals_test=CaseMarkers(test_case_id="191", offset=16), blocked by DEVOPS-95
            rejection_journal_test=CaseMarkers(test_case_id="191", offset=16),
            rejection_scheme_signals_state_test=CaseMarkers(test_case_id="191", offset=16),
        ),
        # RejectionTestCase(
        #     name="quality_pressure",
        #     sensor=PRESSURE_VELKRIM,
        #     expected_event="Отбраковка по качеству",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_criteria_names=RejectionCriteria.QUALITY,
        #     time_range_start_s=900,
        #     time_range_end_s=1140,
        #     rejection_input_signals_test=CaseMarkers(test_case_id="205", offset=18),
        #     rejection_journal_test=CaseMarkers(test_case_id="205", offset=19),
        #     rejection_main_page_test=CaseMarkers(test_case_id="205", offset=16.5),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="205", offset=17),
        # ),
        # RejectionTestCase(
        #     name="quality_pressure_clearance",
        #     sensor=PRESSURE_VELKRIM,
        #     expected_event="Отбраковка по качеству снята",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_is_rejected=False,
        #     time_range_start_s=900,
        #     time_range_end_s=1140,
        #     # rejection_input_signals_test=CaseMarkers(test_case_id="205", offset=21), blocked by DEVOPS-95
        #     rejection_journal_test=CaseMarkers(test_case_id="205", offset=21),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="205", offset=21),
        # ),
        # # ===== vtorFilterSettings =====
        # RejectionTestCase(
        #     name="vtor_flow",
        #     sensor=FLOW_TIH,
        #     expected_event="Отбраковка по сигналу ВТОР",
        #     expected_signal_name=SIGNAL_FLOW,
        #     expected_criteria_names=RejectionCriteria.VTOR,
        #     time_range_start_s=1200,
        #     time_range_end_s=1440,
        #     rejection_input_signals_test=CaseMarkers(test_case_id="206", offset=23),
        #     rejection_journal_test=CaseMarkers(test_case_id="206", offset=24),
        #     rejection_main_page_test=CaseMarkers(test_case_id="206", offset=21.5),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="206", offset=22),
        # ),
        # RejectionTestCase(
        #     name="vtor_flow_clearance",
        #     sensor=FLOW_TIH,
        #     expected_event="Отбраковка по сигналу ВТОР снята",
        #     expected_signal_name=SIGNAL_FLOW,
        #     expected_is_rejected=False,
        #     time_range_start_s=1200,
        #     time_range_end_s=1440,
        #     # rejection_input_signals_test=CaseMarkers(test_case_id="206", offset=26), blocked by DEVOPS-95
        #     rejection_journal_test=CaseMarkers(test_case_id="206", offset=26),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="206", offset=26),
        # ),
        # RejectionTestCase(
        #     name="vtor_pressure",
        #     sensor=PRESSURE_KP7,
        #     expected_event="Отбраковка по сигналу ВТОР",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_criteria_names=RejectionCriteria.VTOR,
        #     time_range_start_s=1500,
        #     time_range_end_s=1740,
        #     rejection_input_signals_test=CaseMarkers(test_case_id="207", offset=28),
        #     rejection_journal_test=CaseMarkers(test_case_id="207", offset=29),
        #     rejection_main_page_test=CaseMarkers(test_case_id="207", offset=26.5),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="207", offset=27),
        # ),
        # RejectionTestCase(
        #     name="vtor_pressure_clearance",
        #     sensor=PRESSURE_KP7,
        #     expected_event="Отбраковка по сигналу ВТОР снята",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_is_rejected=False,
        #     time_range_start_s=1500,
        #     time_range_end_s=1740,
        #     # rejection_input_signals_test=CaseMarkers(test_case_id="207", offset=30.5), blocked by DEVOPS-95
        #     rejection_journal_test=CaseMarkers(test_case_id="207", offset=30.5),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="207", offset=30.5),
        # ),
        # # ===== nearbySensorsFilterSettings =====
        # RejectionTestCase(
        #     name="nearby_pressure_pin",
        #     sensor=PRESSURE_KP8_PIN,
        #     expected_event="Отбраковка по разнице показаний СИ давления на КП",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_criteria_names=RejectionCriteria.NEARBY,
        #     time_range_start_s=1800,
        #     time_range_end_s=2040,
        #     rejection_input_signals_test=CaseMarkers(test_case_id="192", offset=32),
        #     rejection_journal_test=CaseMarkers(test_case_id="192", offset=32.5),
        #     rejection_main_page_test=CaseMarkers(test_case_id="192", offset=31),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="192", offset=31.5),
        # ),
        # RejectionTestCase(
        #     name="nearby_pressure_pout",
        #     sensor=PRESSURE_KP8_POUT,
        #     expected_event="Отбраковка по разнице показаний СИ давления на КП",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_criteria_names=RejectionCriteria.NEARBY,
        #     time_range_start_s=1800,
        #     time_range_end_s=2040,
        #     rejection_input_signals_test=CaseMarkers(test_case_id="193", offset=34),
        #     rejection_journal_test=CaseMarkers(test_case_id="193", offset=34.5),
        #     rejection_main_page_test=CaseMarkers(test_case_id="193", offset=33),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="193", offset=33.5),
        # ),
        # RejectionTestCase(
        #     name="nearby_pressure_pin_clearance",
        #     sensor=PRESSURE_KP8_PIN,
        #     expected_event="Отбраковка по разнице показаний СИ давления на КП снята",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_is_rejected=False,
        #     time_range_start_s=1800,
        #     time_range_end_s=2040,
        #     # rejection_input_signals_test=CaseMarkers(test_case_id="192", offset=35.5), blocked by DEVOPS-95
        #     rejection_journal_test=CaseMarkers(test_case_id="192", offset=35.5),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="192", offset=35.5),
        # ),
        # RejectionTestCase(
        #     name="nearby_pressure_pout_clearance",
        #     sensor=PRESSURE_KP8_POUT,
        #     expected_event="Отбраковка по разнице показаний СИ давления на КП снята",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_is_rejected=False,
        #     time_range_start_s=1800,
        #     time_range_end_s=2040,
        #     # rejection_input_signals_test=CaseMarkers(test_case_id="193", offset=35.5), blocked by DEVOPS-95
        #     rejection_journal_test=CaseMarkers(test_case_id="193", offset=35.5),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="193", offset=35.5),
        # ),
        # # ===== diagnosticInfoFilterSettings =====
        # RejectionTestCase(
        #     name="diagnostic_info_flow",
        #     sensor=FLOW_TIH,
        #     expected_event="Отбраковка по диагностической информации",
        #     expected_signal_name=SIGNAL_FLOW,
        #     expected_criteria_names=RejectionCriteria.DIAGNOSTIC_INFO,
        #     time_range_start_s=2100,
        #     time_range_end_s=2340,
        #     rejection_input_signals_test=CaseMarkers(test_case_id="194", offset=38),
        #     # rejection_journal_test=CaseMarkers(test_case_id="194", offset=39),  # blocked by LDS-12394
        #     rejection_main_page_test=CaseMarkers(test_case_id="194", offset=36),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="194", offset=37),
        # ),
        # RejectionTestCase(
        #     name="diagnostic_info_flow_clearance",
        #     sensor=FLOW_TIH,
        #     expected_event="Отбраковка по диагностической информации снята",
        #     expected_signal_name=SIGNAL_FLOW,
        #     expected_is_rejected=False,
        #     time_range_start_s=2100,
        #     time_range_end_s=2340,
        #     # rejection_input_signals_test=CaseMarkers(test_case_id="194", offset=40.5), blocked by DEVOPS-95
        #     # rejection_journal_test=CaseMarkers(test_case_id="194", offset=40.5),  # blocked by LDS-12394
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="194", offset=40.5),
        # ),
        # # ===== constantSignalFilter =====
        # # RejectionTestCase( blocked by DEVOPS-95
        # #     name="constant_signal_flow",
        # #     sensor=FLOW_TIH,
        # #     expected_event="Отбраковка по постоянному сигналу",
        # #     expected_signal_name=SIGNAL_FLOW,
        # #     expected_criteria_names=RejectionCriteria.CONSTANT_SIGNAL,
        # #     time_range_start_s=2400,
        # #     time_range_end_s=2640,
        # #     rejection_input_signals_test=CaseMarkers(test_case_id="208", offset=43),
        # #     rejection_journal_test=CaseMarkers(test_case_id="208", offset=44),
        # #     rejection_main_page_test=CaseMarkers(test_case_id="208", offset=41),
        # #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="208", offset=42),
        # # ),
        # # RejectionTestCase( blocked by DEVOPS-95
        # #     name="constant_signal_flow_clearance",
        # #     sensor=FLOW_TIH,
        # #     expected_event="Отбраковка по постоянному сигналу снята",
        # #     expected_signal_name=SIGNAL_FLOW,
        # #     expected_is_rejected=False,
        # #     time_range_start_s=2400,
        # #     time_range_end_s=2640,
        # #     rejection_input_signals_test=CaseMarkers(test_case_id="208", offset=45),
        # #     rejection_journal_test=CaseMarkers(test_case_id="208", offset=45),
        # #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="208", offset=45),
        # # ),
        # # RejectionTestCase( blocked by DEVOPS-95
        # #     name="constant_signal_pressure",
        # #     sensor=PRESSURE_KP8_PIN,
        # #     expected_event="Отбраковка по постоянному сигналу",
        # #     expected_signal_name=SIGNAL_PRESSURE,
        # #     expected_criteria_names=RejectionCriteria.CONSTANT_SIGNAL,
        # #     time_range_start_s=2700,
        # #     time_range_end_s=2940,
        # #     rejection_input_signals_test=CaseMarkers(test_case_id="209", offset=48),
        # #     rejection_journal_test=CaseMarkers(test_case_id="209", offset=49),
        # #     rejection_main_page_test=CaseMarkers(test_case_id="209", offset=46),
        # #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="209", offset=47),
        # # ),
        # # RejectionTestCase( blocked by DEVOPS-95
        # #     name="constant_signal_pressure_clearance",
        # #     sensor=PRESSURE_KP8_PIN,
        # #     expected_event="Отбраковка по постоянному сигналу снята",
        # #     expected_signal_name=SIGNAL_PRESSURE,
        # #     expected_is_rejected=False,
        # #     time_range_start_s=2700,
        # #     time_range_end_s=2940,
        # #     rejection_input_signals_test=CaseMarkers(test_case_id="209", offset=50),
        # #     rejection_journal_test=CaseMarkers(test_case_id="209", offset=50),
        # #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="209", offset=50),
        # # ),
        # # ===== rangeFilterSettings =====
        # RejectionTestCase(
        #     name="range_upper_flow",
        #     sensor=FLOW_TIH,
        #     expected_event="Отбраковка по допустимому диапазону",
        #     expected_signal_name=SIGNAL_FLOW,
        #     expected_criteria_names=RejectionCriteria.RANGE,
        #     time_range_start_s=3000,
        #     time_range_end_s=3240,
        #     rejection_input_signals_test=CaseMarkers(test_case_id="195", offset=53),
        #     rejection_journal_test=CaseMarkers(test_case_id="195", offset=54),
        #     rejection_main_page_test=CaseMarkers(test_case_id="195", offset=51),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="195", offset=52),
        # ),
        # RejectionTestCase(
        #     name="range_upper_flow_clearance",
        #     sensor=FLOW_TIH,
        #     expected_event="Отбраковка по допустимому диапазону снята",
        #     expected_signal_name=SIGNAL_FLOW,
        #     expected_is_rejected=False,
        #     time_range_start_s=3000,
        #     time_range_end_s=3240,
        #     # rejection_input_signals_test=CaseMarkers(test_case_id="195", offset=55.8), blocked by DEVOPS-95
        #     rejection_journal_test=CaseMarkers(test_case_id="195", offset=55.8),
        #     # rejection_scheme_signals_state_test=CaseMarkers(test_case_id="195", offset=55.8), blocked by DEVOPS-95
        # ),
        # RejectionTestCase(
        #     name="range_lower_flow",
        #     sensor=FLOW_TIH,
        #     expected_event="Отбраковка по допустимому диапазону",
        #     expected_signal_name=SIGNAL_FLOW,
        #     expected_criteria_names=RejectionCriteria.RANGE,
        #     time_range_start_s=3300,
        #     time_range_end_s=3540,
        #     rejection_input_signals_test=CaseMarkers(test_case_id="197", offset=58),
        #     rejection_journal_test=CaseMarkers(test_case_id="197", offset=59),
        #     rejection_main_page_test=CaseMarkers(test_case_id="197", offset=56),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="197", offset=57),
        # ),
        # RejectionTestCase(
        #     name="range_lower_flow_clearance",
        #     sensor=FLOW_TIH,
        #     expected_event="Отбраковка по допустимому диапазону снята",
        #     expected_signal_name=SIGNAL_FLOW,
        #     expected_is_rejected=False,
        #     time_range_start_s=3300,
        #     time_range_end_s=3540,
        #     # rejection_input_signals_test=CaseMarkers(test_case_id="197", offset=60.8), blocked by DEVOPS-95
        #     rejection_journal_test=CaseMarkers(test_case_id="197", offset=60.8),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="197", offset=60.8),
        # ),
        # RejectionTestCase(
        #     name="range_upper_pressure",
        #     sensor=PRESSURE_KP8_PIN,
        #     expected_event="Отбраковка по допустимому диапазону",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_criteria_names=RejectionCriteria.RANGE,
        #     time_range_start_s=3600,
        #     time_range_end_s=3840,
        #     rejection_input_signals_test=CaseMarkers(test_case_id="196", offset=63),
        #     rejection_journal_test=CaseMarkers(test_case_id="196", offset=64),
        #     rejection_main_page_test=CaseMarkers(test_case_id="196", offset=61),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="196", offset=62),
        # ),
        # RejectionTestCase(
        #     name="range_upper_pressure_clearance",
        #     sensor=PRESSURE_KP8_PIN,
        #     expected_event="Отбраковка по допустимому диапазону снята",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_is_rejected=False,
        #     time_range_start_s=3600,
        #     time_range_end_s=3840,
        #     # rejection_input_signals_test=CaseMarkers(test_case_id="196", offset=65.8), blocked by DEVOPS-95
        #     rejection_journal_test=CaseMarkers(test_case_id="196", offset=65.8),
        #     # rejection_scheme_signals_state_test=CaseMarkers(test_case_id="196", offset=65.8), blocked by DEVOPS-95
        # ),
        # RejectionTestCase(
        #     name="range_lower_pressure",
        #     sensor=PRESSURE_KP8_PIN,
        #     expected_event="Отбраковка по допустимому диапазону",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_criteria_names=RejectionCriteria.RANGE,
        #     time_range_start_s=3900,
        #     time_range_end_s=4140,
        #     rejection_input_signals_test=CaseMarkers(test_case_id="198", offset=68),
        #     rejection_journal_test=CaseMarkers(test_case_id="198", offset=69),
        #     rejection_main_page_test=CaseMarkers(test_case_id="198", offset=66),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="198", offset=67),
        # ),
        # RejectionTestCase(
        #     name="range_lower_pressure_clearance",
        #     sensor=PRESSURE_KP8_PIN,
        #     expected_event="Отбраковка по допустимому диапазону снята",
        #     expected_signal_name=SIGNAL_PRESSURE,
        #     expected_is_rejected=False,
        #     time_range_start_s=3900,
        #     time_range_end_s=4140,
        #     # rejection_input_signals_test=CaseMarkers(test_case_id="198", offset=71), blocked by DEVOPS-95
        #     rejection_journal_test=CaseMarkers(test_case_id="198", offset=71),
        #     rejection_scheme_signals_state_test=CaseMarkers(test_case_id="198", offset=71),
        # ),
    ],
)





































lds_status_bik
"""
Конфигурация тестового набора Lds_status_regress_in_flow

Особенности набора:
- В течении
- Проверка режимов работы СОУ
- Проверка группы причин режимов работы СОУ, связанных с БИК
"""

from constants.enums import TU, AdminTU, LdsStatus, LdsStatusDegradation, LdsStatusInitialization, MeasureConversionRule
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseData, CaseMarkers, LDSStatusConfig

# ===== Константы набора =====
SUITE_NAME = "Lds_status_regress_bik"
SUITE_DATA_ID = 18
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

DIAGNOSTIC_AREA_2_PIPE_ID = 1463
DIAGNOSTIC_AREA_3_PIPE_ID = 474
DIAGNOSTIC_AREA_5_PIPE_ID = 1474
DIAGNOSTIC_AREA_2_CONTROL_POINT = "ЗА 105-3 - ЗА 129-3"
DIAGNOSTIC_AREA_3_CONTROL_POINT = "ЗА 180-3 - ЗА 207-3"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"


# ===== Конфигурация набора =====
LDS_STATUS_BIK_CONFIG = LDSStatusConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST_DATA_ABSENCE_FALSE_BIK,
    main_pipeline=MAIN_PIPELINE,
    init_cold_start_test_data=CaseData(
        expected_result=(LdsStatus.INITIALIZATION, LdsStatusInitialization.COLD_START_OF_SERVERS),
    ),
    deg_rejection_temperature_sensor_on_du_2_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_2_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.REJECTION_TEMPERATURE_SENSOR,
        ),
    ),
    deg_rejection_temperature_sensor_on_du_3_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_3_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.REJECTION_TEMPERATURE_SENSOR,
        ),
    ),
    deg_rejection_temperature_sensor_on_du_5_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_5_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.REJECTION_TEMPERATURE_SENSOR,
        ),
    ),
    deg_rejection_density_and_viscosity_on_du_2_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_2_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.REJECTION_DENSITY_SENSOR,
            LdsStatusDegradation.REJECTION_VISCOSITY_SENSOR,
        ),
    ),
    deg_rejection_density_and_viscosity_on_du_3_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_3_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.REJECTION_DENSITY_SENSOR,
            LdsStatusDegradation.REJECTION_VISCOSITY_SENSOR,
        ),
    ),
    deg_rejection_density_and_viscosity_on_du_5_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_5_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.REJECTION_DENSITY_SENSOR,
            LdsStatusDegradation.REJECTION_VISCOSITY_SENSOR,
        ),
    ),
    degradation_temperature_du_2_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.REJECTION_TEMPERATURE_SENSOR.report_text,
        ),
    ),
    degradation_density_du_2_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.REJECTION_DENSITY_SENSOR.report_text,
        ),
    ),
    degradation_viscosity_du_2_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.REJECTION_VISCOSITY_SENSOR.report_text,
        ),
    ),
    degradation_temperature_sensor_du_3_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_3_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.REJECTION_TEMPERATURE_SENSOR.report_text,
        ),
    ),
    degradation_density_du_3_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_3_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.REJECTION_DENSITY_SENSOR.report_text,
        ),
    ),
    degradation_viscosity_du_3_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_3_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.REJECTION_VISCOSITY_SENSOR.report_text,
        ),
    ),
    # ===== Базовые ТЕСТЫ ====
    lds_status_basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    init_cold_start_test=CaseMarkers(test_case_id="18", offset=7),
    init_cold_start_in_journal_test=CaseMarkers(test_case_id="228", offset=7),
    # ===== ТЕСТЫ состония СОУ на схеме =====
    deg_rejection_temperature_sensor_on_du_2_test=CaseMarkers(test_case_id="179", offset=25),
    deg_rejection_density_and_viscosity_on_du_2_test=CaseMarkers(test_case_id="181", offset=35),
    deg_rejection_temperature_sensor_on_du_3_test=CaseMarkers(test_case_id="179", offset=46),
    deg_rejection_density_and_viscosity_on_du_3_test=CaseMarkers(test_case_id="181", offset=53),
    # ===== ТЕСТЫ в журнале для ДУ2 =====
    degradation_temperature_du_2_in_journal_test=CaseMarkers(test_case_id="179", offset=23),
    degradation_density_du_2_in_journal_test=CaseMarkers(test_case_id="181", offset=32),
    degradation_viscosity_du_2_in_journal_test=CaseMarkers(test_case_id="181", offset=32),
    # ===== ТЕСТЫ в журнале для ДУ3 =====
    degradation_temperature_du_3_in_journal_test=CaseMarkers(test_case_id="179", offset=46),
    degradation_density_du_3_in_journal_test=CaseMarkers(test_case_id="181", offset=53),
    degradation_viscosity_du_3_in_journal_test=CaseMarkers(test_case_id="181", offset=53),
)




































lds_status_regress_flow
"""
Конфигурация тестового набора Lds_status_regress_in_flow

Особенности набора:
- В течении
- Проверка режимов работы СОУ
- Проверка причин режимов работы СОУ
"""

from constants.enums import (
    TU,
    AdminTU,
    LdsStatus,
    LdsStatusDegradation,
    LdsStatusFaulty,
    LdsStatusInitialization,
    MeasureConversionRule,
    StationaryStatus,
    UnStationaryReason,
)
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseData, CaseMarkers, LDSStatusConfig

# ===== Константы набора =====
SUITE_NAME = "Lds_status_regress_in_flow"
SUITE_DATA_ID = 17
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

DIAGNOSTIC_AREA_2_PIPE_ID = 1463
DIAGNOSTIC_AREA_3_PIPE_ID = 474
DIAGNOSTIC_AREA_5_PIPE_ID = 1478
PIG_TRAP_ID = 344
DIAGNOSTIC_AREA_2_CONTROL_POINT = "ЗА 105-3 - ЗА 129-3"
DIAGNOSTIC_AREA_3_CONTROL_POINT = "ЗА 180-3 - ЗА 207-3"
DIAGNOSTIC_AREA_5_CONTROL_POINT = "ЗА 235-3-1 - ЗА 246-3-2"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"


# ===== Конфигурация набора =====
LDS_STATUS_INFLOW_CONFIG = LDSStatusConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    main_pipeline=MAIN_PIPELINE,
    technological_unit=TECHNOLOGICAL_UNIT,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST_DATA_ABSENCE_FALSE,
    # ===== Ожидания для сообщений о состоянии СОУ. ЭФ Схема =====
    init_cold_start_test_data=CaseData(
        expected_result=(LdsStatus.INITIALIZATION, LdsStatusInitialization.COLD_START_OF_SERVERS),
    ),
    serviceable_all_in_journal_test_data=CaseData(
        expected_result=(LdsStatus.INITIALIZATION, LdsStatusInitialization.COLD_START_OF_SERVERS),
    ),
    serviceable_all_test_data=CaseData(
        params={"pipe_ids": [DIAGNOSTIC_AREA_2_PIPE_ID, DIAGNOSTIC_AREA_3_PIPE_ID]},
        expected_result=LdsStatus.SERVICEABLE,
    ),
    deg_additive_injectors_operation_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_3_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.ADDITIVE_INJECTORS_OPERATION,
        ),
    ),
    deg_exceeding_distance_between_pressure_sensors_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_3_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.EXCEEDING_DISTANCE_BETWEEN_SERVICEABLE_PRESSURE_SENSORS,
        ),
    ),
    deg_absence_min_pressure_sensors_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_5_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.ABSENCE_MIN_PRESSURE_SENSORS_REQUIRED_NUMBER,
        ),
    ),
    deg_faulty_pressure_sensors_at_pump_station_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_2_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.FAULTY_PRESSURE_SENSORS_AT_PUMP_STATION_NODES,
        ),
    ),
    deg_gravity_section_pumping_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_5_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.GRAVITY_SECTION_IN_PUMPING_MODE,
        ),
    ),
    deg_pig_sensor_passage_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_2_PIPE_ID, "pig_trap_id": PIG_TRAP_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.PIG_SENSOR_PASSAGE,
        ),
    ),
    deg_starting_pumping_out_pumps_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_2_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.STARTING_PUMPING_OUT_PUMPS,
            StationaryStatus.UNSTATIONARY,
            UnStationaryReason.CHANGING_WORKING_OF_PUMPING_OUT_PUMPS,
        ),
    ),
    faulty_absence_min_flow_meters_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_5_PIPE_ID},
        expected_result=(
            LdsStatus.FAULTY,
            LdsStatusFaulty.ABSENCE_MIN_FLOW_METERS_REQUIRED_NUMBER,
        ),
    ),
    deg_exceeding_distance_between_flow_meters_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_3_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.EXCEEDING_DISTANCE_BETWEEN_FLOW_METERS,
        ),
    ),
    # ===== Ожидания для сообщений о состоянии СОУ. ЭФ Журнал =====
    between_si_pressure_more_50_km_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_3_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.EXCEEDING_DISTANCE_BETWEEN_SERVICEABLE_PRESSURE_SENSORS.report_text,
        ),
    ),
    deg_gravity_section_pumping_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_5_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.GRAVITY_SECTION_IN_PUMPING_MODE.report_text,
        ),
    ),
    deg_absence_min_pressure_sensors_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_5_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.ABSENCE_MIN_PRESSURE_SENSORS_REQUIRED_NUMBER.report_text,
        ),
    ),
    serviceable_after_deg_absence_min_pressure_sensors_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_5_CONTROL_POINT]},
        expected_result=(LdsStatus.SERVICEABLE.report_text,),
    ),
    deg_starting_pumping_out_pumps_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.STARTING_PUMPING_OUT_PUMPS.report_text,
        ),
    ),
    serviceable_after_deg_starting_pumping_out_pumps_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(LdsStatus.SERVICEABLE.report_text,),
    ),
    faulty_absence_min_flow_meters_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_5_CONTROL_POINT]},
        expected_result=(
            LdsStatus.FAULTY.report_text,
            LdsStatusFaulty.ABSENCE_MIN_FLOW_METERS_REQUIRED_NUMBER.report_text,
        ),
    ),
    serviceable_after_faulty_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(LdsStatus.SERVICEABLE.report_text,),
    ),
    deg_exceeding_distance_between_flow_meters_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_3_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.EXCEEDING_DISTANCE_BETWEEN_FLOW_METERS.report_text,
        ),
    ),
    deg_faulty_pressure_sensors_at_pump_station_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.FAULTY_PRESSURE_SENSORS_AT_PUMP_STATION_NODES.report_text,
        ),
    ),
    serviceable_after_deg_faulty_pressure_sensors_at_pump_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(LdsStatus.SERVICEABLE.report_text,),
    ),
    deg_additive_injectors_operation_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_3_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.ADDITIVE_INJECTORS_OPERATION.report_text,
        ),
    ),
    deg_pig_sensor_passage_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.PIG_SENSOR_PASSAGE.report_text,
        ),
    ),
    # ===== ТЕСТЫ состояния СОУ на схеме =====
    lds_status_basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    init_cold_start_test=CaseMarkers(test_case_id="160", offset=7),
    serviceable_after_cold_start_test=CaseMarkers(test_case_id="186", offset=22),
    deg_exceeding_distance_between_pressure_sensors_test=CaseMarkers(test_case_id="164", offset=32),
    deg_gravity_section_pumping_test=CaseMarkers(test_case_id="167", offset=34),
    deg_absence_min_pressure_sensors_test=CaseMarkers(test_case_id="166", offset=38),
    serviceable_after_deg_absence_min_pressure_sensors_test=CaseMarkers(test_case_id="186", offset=43),
    deg_starting_pumping_out_pumps_test=CaseMarkers(test_case_id="174", offset=46),
    serviceable_after_deg_starting_pumping_out_pumps_test=CaseMarkers(test_case_id="186", offset=52.5),
    faulty_absence_min_flow_meters_test=CaseMarkers(test_case_id="170", offset=60),
    faulty_absence_min_flow_meters_continuous_test=CaseMarkers(test_case_id="170", offset=73),
    serviceable_after_faulty_test=CaseMarkers(test_case_id="186", offset=76),
    deg_exceeding_distance_between_flow_meters_test=CaseMarkers(test_case_id="169", offset=107),
    # serviceable_after_deg_exceeding_distance_between_flow_meters_test=CaseMarkers(test_case_id="186", offset=114.5),
    # TODO разобраться в LDS-14444
    deg_faulty_pressure_sensors_at_pump_station_test=CaseMarkers(test_case_id="184", offset=122),
    serviceable_after_deg_faulty_pressure_sensors_at_pump_test=CaseMarkers(test_case_id="186", offset=126),
    deg_additive_injectors_operation_test=CaseMarkers(test_case_id="188", offset=132),
    deg_pig_sensor_passage_test=CaseMarkers(test_case_id="165", offset=140),
    # ===== ТЕСТЫ состояния СОУ на схеме =====
    init_cold_start_in_journal_test=CaseMarkers(test_case_id="228", offset=7),
    between_si_pressure_more_50_km_in_journal_test=CaseMarkers(test_case_id="228", offset=35),
    deg_gravity_section_pumping_in_journal_test=CaseMarkers(test_case_id="167", offset=34),
    deg_absence_min_pressure_sensors_in_journal_test=CaseMarkers(test_case_id="166", offset=36),
    serviceable_after_deg_absence_min_pressure_sensors_in_journal_test=CaseMarkers(test_case_id="186", offset=43),
    deg_starting_pumping_out_pumps_in_journal_test=CaseMarkers(test_case_id="174", offset=46),
    serviceable_after_deg_starting_pumping_out_pumps_in_journal_test=CaseMarkers(test_case_id="186", offset=53),
    faulty_absence_min_flow_meters_in_journal_test=CaseMarkers(test_case_id="170", offset=57),
    serviceable_after_faulty_in_journal_test=CaseMarkers(test_case_id="186", offset=76),
    deg_exceeding_distance_between_flow_meters_in_journal_test=CaseMarkers(test_case_id="169", offset=107),  # 106
    deg_faulty_pressure_sensors_at_pump_station_in_journal_test=CaseMarkers(test_case_id="184", offset=120),
    deg_additive_injectors_operation_in_journal_test=CaseMarkers(test_case_id="188", offset=132),
    deg_pig_sensor_passage_in_journal_test=CaseMarkers(test_case_id="165", offset=140),
)


































lds_status_regress_stopping

"""
Конфигурация тестового набора Lds_status_regress_in_flow

Особенности набора:
- В режиме МТ: Режим остановленной перекачки
- Проверка режимов работы СОУ
- Проверка причин режимов работы СОУ
"""

from constants.enums import (
    TU,
    AdminTU,
    LdsStatus,
    LdsStatusDegradation,
    LdsStatusFaulty,
    LdsStatusInitialization,
    MeasureConversionRule,
)
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseData, CaseMarkers, LDSStatusConfig

# ===== Константы набора =====
SUITE_NAME = "Lds_status_regress_stopping"
SUITE_DATA_ID = 19
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

DIAGNOSTIC_AREA_2_PIPE_ID = 1463
DIAGNOSTIC_AREA_3_PIPE_ID = 474
DIAGNOSTIC_AREA_5_PIPE_ID = 1474
DIAGNOSTIC_AREA_2_CONTROL_POINT = "ЗА 105-3 - ЗА 129-3"
DIAGNOSTIC_AREA_3_CONTROL_POINT = "ЗА 180-3 - ЗА 207-3"
DIAGNOSTIC_AREA_5_CONTROL_POINT = "ЗА 235-3-1 - ЗА 246-3-2"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"


# ===== Конфигурация набора =====
LDS_STATUS_STOPPING_CONFIG = LDSStatusConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST_DATA_ABSENCE_FALSE,
    main_pipeline=MAIN_PIPELINE,
    init_accumulation_data_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_2_PIPE_ID},
        expected_result=(
            LdsStatus.INITIALIZATION,
            LdsStatusInitialization.ACCUMULATION_DATA,
        ),
    ),
    init_accumulation_data_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(
            LdsStatus.INITIALIZATION.report_text,
            LdsStatusInitialization.ACCUMULATION_DATA.report_text,
        ),
    ),
    init_cold_start_test_data=CaseData(
        expected_result=(LdsStatus.INITIALIZATION, LdsStatusInitialization.COLD_START_OF_SERVERS),
    ),
    init_switching_shut_off_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_3_PIPE_ID},
        expected_result=(
            LdsStatus.INITIALIZATION,
            LdsStatusInitialization.SWITCHING_SHUT_OFF_IN_STOPPED_PUMPING_MODE,
        ),
    ),
    init_switching_shut_off_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_3_CONTROL_POINT]},
        expected_result=(
            LdsStatus.INITIALIZATION.report_text,
            LdsStatusInitialization.SWITCHING_SHUT_OFF_IN_STOPPED_PUMPING_MODE.report_text,
        ),
    ),
    serviceable_all_test_data=CaseData(
        params={"pipe_ids": [DIAGNOSTIC_AREA_3_PIPE_ID]},
        expected_result=LdsStatus.SERVICEABLE,
    ),
    serviceable_all_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_3_CONTROL_POINT]},
        expected_result=LdsStatus.SERVICEABLE.report_text,
    ),
    deg_gravity_section_pumping_in_stopping_test_data=CaseData(
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.GRAVITY_SECTION_IN_STOPPED_PUMPING_MODE,
        ),
    ),
    deg_gravity_section_pumping_in_stopping_in_journal_test_data=CaseData(
        params={
            "control_points": [
                DIAGNOSTIC_AREA_2_CONTROL_POINT,
                DIAGNOSTIC_AREA_3_CONTROL_POINT,
                DIAGNOSTIC_AREA_5_CONTROL_POINT,
            ]
        },
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.GRAVITY_SECTION_IN_STOPPED_PUMPING_MODE.report_text,
        ),
    ),
    deg_exceeding_distance_between_pressure_sensors_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_2_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.EXCEEDING_DISTANCE_BETWEEN_SERVICEABLE_PRESSURE_SENSORS,
        ),
    ),
    deg_exceeding_distance_between_pressure_sensors_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.EXCEEDING_DISTANCE_BETWEEN_SERVICEABLE_PRESSURE_SENSORS.report_text,
        ),
    ),
    deg_faulty_pressure_sensors_at_pump_station_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_2_PIPE_ID},
        expected_result=(
            LdsStatus.DEGRADATION,
            LdsStatusDegradation.FAULTY_PRESSURE_SENSORS_AT_PUMP_STATION_NODES,
        ),
    ),
    deg_faulty_pressure_sensors_at_pump_station_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_2_CONTROL_POINT]},
        expected_result=(
            LdsStatus.DEGRADATION.report_text,
            LdsStatusDegradation.FAULTY_PRESSURE_SENSORS_AT_PUMP_STATION_NODES.report_text,
        ),
    ),
    faulty_absence_min_pressure_sensors_test_data=CaseData(
        params={"pipe_id": DIAGNOSTIC_AREA_5_PIPE_ID},
        expected_result=(
            LdsStatus.FAULTY,
            LdsStatusFaulty.ABSENCE_MIN_PRESSURE_SENSORS_REQUIRED_NUMBER,
        ),
    ),
    faulty_absence_min_pressure_sensors_in_journal_test_data=CaseData(
        params={"control_points": [DIAGNOSTIC_AREA_5_CONTROL_POINT]},
        expected_result=(
            LdsStatus.FAULTY.report_text,
            LdsStatusFaulty.ABSENCE_MIN_PRESSURE_SENSORS_REQUIRED_NUMBER.report_text,
        ),
    ),
    # ===== ТЕСТЫ =====
    lds_status_basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    init_cold_start_test=CaseMarkers(test_case_id="19", offset=7),
    init_cold_start_in_journal_test=CaseMarkers(test_case_id="228", offset=7),
    deg_gravity_section_pumping_in_stopping_test=CaseMarkers(test_case_id="167", offset=22),
    deg_gravity_section_pumping_in_stopping_in_journal_test=CaseMarkers(test_case_id="239", offset=22),
    init_switching_shut_off_test=CaseMarkers(test_case_id="204", offset=32),
    init_switching_shut_off_in_journal_test=CaseMarkers(test_case_id="239", offset=32),
    serviceable_after_switching_shut_off_test=CaseMarkers(test_case_id="162", offset=35),
    serviceable_after_switching_shut_off_in_journal_test=CaseMarkers(test_case_id="239", offset=35),
    deg_faulty_pressure_sensors_at_pump_station_test=CaseMarkers(test_case_id="184", offset=37.5),
    deg_faulty_pressure_sensors_at_pump_station_in_journal_test=CaseMarkers(test_case_id="239", offset=37.5),
    serviceable_after_deg_faulty_pressure_sensors_at_pump_test=CaseMarkers(test_case_id="162", offset=42),
    serviceable_after_deg_faulty_pressure_sensors_at_pump_in_journal_test=CaseMarkers(test_case_id="239", offset=42),
    deg_exceeding_distance_between_pressure_sensors_test=CaseMarkers(test_case_id="164", offset=49),
    deg_exceeding_distance_between_pressure_sensors_in_journal_test=CaseMarkers(test_case_id="239", offset=49),
    init_accumulation_data_test=CaseMarkers(test_case_id="203", offset=70),
    init_accumulation_data_in_journal_test=CaseMarkers(test_case_id="239", offset=70),
    faulty_absence_min_pressure_sensors_test=CaseMarkers(test_case_id="170", offset=85),
    faulty_absence_min_pressure_sensors_in_journal_test=CaseMarkers(test_case_id="239", offset=85),
)





























real_70
"""
Конфигурация тестового набора Real_70_tn3_216km_56 (режим остановленной перекачки)

Особенности набора:
- Режим МТ стационар
- Режим МТ Остановленная перекачка (StationaryStatus.STOPPED) на участке, где ожидаем утечку
- Одна утечка на координате 216 км
- Объём утечки 56,8 м³
- Интенсивность утечки 1,8%
- Запускать с dataAbsence false в конфигурации
"""

from constants.enums import (
    TU,
    AdminTU,
    ConfirmationStatus,
    LdsStatus,
    MeasureConversionRule,
    ReservedType,
    StationaryStatus,
)
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseData, CaseMarkers, LeakTestConfig, SmokeSuiteConfig

# ===== Константы набора =====
SUITE_NAME = "Real_70_tn3_216km_56"
SUITE_DATA_ID = 13
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"

# Параметры утечки
LEAK_COORDINATE_METERS = 216000
LEAK_VOLUME_M3 = 56
ALLOWED_TIME_DIFF_SECONDS = 1440  # 24 минуты
LEAK_START_INTERVAL_SECONDS = 2100  # 35 минут
FLOW_RATE_SETTINGS_THRESHOLD = 7

# ID диагностических участков
LEAK_DIAGNOSTIC_AREA_ID = 3
LEAK_DIAGNOSTIC_AREA_NAME = "Т-Н-3.УЗР НПС-3 «Нововеличковская». - Т-Н-3.НПС-2 «Крымская».УЗР СИКН Т-К"

# ID линейного участка
LINEAR_PART_ID = 408

# ===== Конфигурация набора =====
REAL_70_CONFIG = SmokeSuiteConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    technological_unit=TECHNOLOGICAL_UNIT,
    main_pipeline=MAIN_PIPELINE,
    measure_conversion_rules=MeasureConversionRule.MPA_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST_DATA_ABSENCE_FALSE,
    # ----- Ожидаемый статус стационара -----
    expected_stationary_status=StationaryStatus.STATIONARY,
    expected_report_stationary_status=StationaryStatus.STATIONARY.value,
    # ----- Ожидаемые статусы для проверки режимов на ЭФ Диагностика сигналов -----
    controlled_sites_with_segment=CaseData(
        expected_result={
            "exp_tixoreczkaya_novovelichkovskaya": (StationaryStatus.STATIONARY, LdsStatus.SERVICEABLE),
            "exp_novovelichkovskaya_krymskaya": (StationaryStatus.STATIONARY, LdsStatus.SERVICEABLE),
            "exp_krymskaya_grushovaya": (StationaryStatus.STOPPED, LdsStatus.DEGRADATION),
            "exp_backup_route_bejsug": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_backup_route_ponura": (StationaryStatus.STATIONARY, LdsStatus.SERVICEABLE),
            "exp_backup_route_kuban": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_afipskij": (StationaryStatus.STOPPED, LdsStatus.FAULTY),
            "exp_npz_ilinskij": (StationaryStatus.STATIONARY, LdsStatus.DEGRADATION),
        }
    ),
    # ===== БАЗОВЫЕ ТЕСТЫ ==
    basic_info_test=CaseMarkers(test_case_id="1", offset=5),
    journal_info_test=CaseMarkers(test_case_id="2", offset=5),
    lds_status_initialization_test=CaseMarkers(test_case_id="86", offset=5),
    lds_status_init_in_journal_test=CaseMarkers(test_case_id="228", offset=5),
    main_page_info_test=CaseMarkers(test_case_id="3", offset=6),
    mask_signal_test=CaseMarkers(test_case_id="32", offset=8),
    mask_info_in_journal_test=CaseMarkers(test_case_id="213", offset=9),
    # diagnostics_of_signals_after_initialization_test=CaseMarkers(test_case_id="210", offset=25), TODO решить LDS-14255
    lds_status_initialization_out_test=CaseMarkers(test_case_id="30", offset=30),
    lds_status_init_out_in_journal_test=CaseMarkers(test_case_id="214", offset=31),
    export_lds_status_report_test=CaseMarkers(test_case_id="235", offset=63),
    export_mt_mode_report_test=CaseMarkers(test_case_id="240", offset=64),
    # ===== КОНФИГУРАЦИЯ УТЕЧКИ =====
    leak=LeakTestConfig(
        # ----- Параметры утечки -----
        coordinate_meters=LEAK_COORDINATE_METERS,
        volume_m3=LEAK_VOLUME_M3,
        linear_part_id=LINEAR_PART_ID,
        flow_rate_settings_threshold=FLOW_RATE_SETTINGS_THRESHOLD,
        diagnostic_area_name=LEAK_DIAGNOSTIC_AREA_NAME,
        # ----- Временные интервалы -----
        leak_start_interval_seconds=LEAK_START_INTERVAL_SECONDS,
        allowed_time_diff_seconds=ALLOWED_TIME_DIFF_SECONDS,
        # ----- Ожидаемые статусы -----
        expected_algorithm_type=ReservedType.STOP,
        expected_leak_status=ConfirmationStatus.CONFIRMED,
        expected_lds_status=LdsStatus.DEGRADATION,
        expected_stationary_status=StationaryStatus.STOPPED,
        expected_lds_status_in_leaks_report=LdsStatus.DEGRADATION.value,
        expected_report_stationary_status=StationaryStatus.STOPPED.value,
        # ----- Тест BalanceAlgorithmResultsContent -----
        balance_algorithm_leak_waiting_test=CaseMarkers(test_case_id="175", offset=42),  # Длительность теста 5 минут
        balance_algorithm_leak_detected_test=CaseMarkers(test_case_id="177", offset=59),
        # ----- Тест MessageInfo -----
        possible_leak_in_journal_test=CaseMarkers(test_case_id="211", offset=47),
        # ----- Тест AllLeaksInfo -----
        all_leaks_info_test=CaseMarkers(test_case_id="13", offset=59),
        # ----- Тест LeaksContent -----
        leaks_content_test=CaseMarkers(test_case_id="91", offset=59),
        # ----- Тест TuLeaksInfo -----
        tu_leaks_info_test=CaseMarkers(test_case_id="84", offset=59),
        # ----- Тест MessageInfo -----
        leak_info_in_journal=CaseMarkers(test_case_id="154", offset=59),
        # ----- Тест MainPageInfoContent -----
        leak_is_confirm_on_main_page_test=CaseMarkers(test_case_id="182", offset=60),
        # ----- Тест AcknowledgeLeak -----
        acknowledge_leak_test=CaseMarkers(test_case_id="6", offset=60),
        acknowledge_leak_in_journal_test=CaseMarkers(test_case_id="212", offset=60.5),
        # ----- Тест OutputSignals -----
        output_signals_test=CaseMarkers(test_case_id="158", offset=61),
        # ----- Тест ExportReports -----
        export_leaks_report_test=CaseMarkers(test_case_id="234", offset=62),
    ),
)


































stationary_status_regress_stationary.py
"""
Конфигурация тестового набора Stationary_status_regress_stationary

Особенности набора:
- Режим МТ Стационар
- Проверка режимов работы МТ
- Проверка причин режимов работы МТ
"""

from constants.enums import TU, AdminTU, MeasureConversionRule, StationaryReason, StationaryStatus, UnStationaryReason
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseData, CaseMarkers, StationaryStatusConfig

# ===== Константы набора =====
SUITE_NAME = "Stationary_status_regress_stationary"
SUITE_DATA_ID = 32
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

DIAGNOSTIC_AREA_2_PIPE_ID = 1463
DIAGNOSTIC_AREA_3_PIPE_ID = 474
DIAGNOSTIC_AREA_5_PIPE_ID = 1478
CONTROL_POINTS = [
    "ЗА 105-3 - ЗА 129-3",
    "ЗА 180-3 - ЗА 207-3",
]

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"


# ===== Конфигурация набора =====
STATIONARY_STATUS_REGRESS_STATIONARY_CONFIG = StationaryStatusConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    main_pipeline=MAIN_PIPELINE,
    technological_unit=TECHNOLOGICAL_UNIT,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST_DATA_ABSENCE_FALSE,
    status_unstationary_cold_start_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(StationaryStatus.UNSTATIONARY, UnStationaryReason.COLD_START),
    ),
    status_stationary_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(StationaryStatus.STATIONARY, StationaryReason.PRESSURE_AND_FLOW_MOVING_AVERAGES_MEET_CRITERIA),
    ),
    journal_unstationary_cold_start_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(
            StationaryStatus.UNSTATIONARY.report_text,
            UnStationaryReason.COLD_START.report_text,
        ),
    ),
    journal_stationary_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(
            StationaryStatus.STATIONARY.report_text,
            StationaryReason.PRESSURE_AND_FLOW_MOVING_AVERAGES_MEET_CRITERIA.report_text,
        ),
    ),
    # ===== ТЕСТЫ =====
    stationary_status_basic_info_test=CaseMarkers(test_case_id="44", offset=2),
    common_scheme_cold_start_test=CaseMarkers(test_case_id="42", offset=2),
    journal_cold_start_test=CaseMarkers(test_case_id="43", offset=2),
    main_page_info_cold_start_test=CaseMarkers(test_case_id="39", offset=2),
    output_signals_cold_start_test=CaseMarkers(test_case_id="41", offset=2),
    common_scheme_stationary_after_cold_test=CaseMarkers(test_case_id="32", offset=7),
    journal_stationary_after_cold_test=CaseMarkers(test_case_id="43", offset=7),
    main_page_info_stationary_after_cold_test=CaseMarkers(test_case_id="38", offset=7),
    output_signals_stationary_after_cold_test=CaseMarkers(test_case_id="41", offset=7),
)


































status_regress_unstationary_block_valves_status.py
"""
Конфигурация тестового набора Status_regress_unstationary_block_valves_status

Особенности набора:
- Режим МТ Нестационар
- Причина МТ: Полное или частичное открытие/закрытие задвижки
- Проверка режимов работы МТ
- Проверка причин режимов работы МТ
- Старт данных 19.03.2026 13:14:00.000
- Частичное открытие задвижек AK.CHTN.NPS_TIH_5.SW_0-3-3.Status ~ 13:24
- Начало нестационара примерно в 13:24, окончание примерно 13:31
- Частичное закрытие задвижек AK.CHTN.NPS_TIH_5.SW_0-1-3.Status ~ 13:34
- Начало нестационара примерно в 13:34, окончание примерно 13:41
"""

from constants.enums import TU, AdminTU, MeasureConversionRule, StationaryReason, StationaryStatus, UnStationaryReason
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseData, CaseMarkers, StationaryStatusConfig

# ===== Константы набора =====
SUITE_NAME = "Status_regress_unstationary_block_valves_status"
SUITE_DATA_ID = 35
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

DIAGNOSTIC_AREA_2_PIPE_ID = 1463
DIAGNOSTIC_AREA_3_PIPE_ID = 474
DIAGNOSTIC_AREA_5_PIPE_ID = 1478
CONTROL_POINTS = [
    "ЗА 105-3 - ЗА 129-3",
    "ЗА 180-3 - ЗА 207-3",
]

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"


# ===== Конфигурация набора =====
STATUS_REGRESS_UNSTATIONARY_BLOCK_VALVES_STATUS_CONFIG = StationaryStatusConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    main_pipeline=MAIN_PIPELINE,
    technological_unit=TECHNOLOGICAL_UNIT,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST,
    status_unstationary_cold_start_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(StationaryStatus.UNSTATIONARY, UnStationaryReason.COLD_START),
    ),
    status_unstationary_switch_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(StationaryStatus.UNSTATIONARY, UnStationaryReason.CHANGING_BLOCK_VALVES_STATUS),
    ),
    status_stationary_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(StationaryStatus.STATIONARY, StationaryReason.PRESSURE_AND_FLOW_MOVING_AVERAGES_MEET_CRITERIA),
    ),
    journal_unstationary_cold_start_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(
            StationaryStatus.UNSTATIONARY.report_text,
            UnStationaryReason.COLD_START.report_text,
        ),
    ),
    journal_unstationary_switch_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(
            StationaryStatus.UNSTATIONARY.report_text,
            UnStationaryReason.CHANGING_BLOCK_VALVES_STATUS.report_text,
        ),
    ),
    journal_stationary_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(
            StationaryStatus.STATIONARY.report_text,
            StationaryReason.PRESSURE_AND_FLOW_MOVING_AVERAGES_MEET_CRITERIA.report_text,
        ),
    ),
    # ===== ТЕСТЫ =====
    stationary_status_basic_info_test=CaseMarkers(test_case_id="44", offset=2),
    common_scheme_cold_start_test=CaseMarkers(test_case_id="42", offset=2),
    journal_cold_start_test=CaseMarkers(test_case_id="43", offset=2),
    main_page_info_cold_start_test=CaseMarkers(test_case_id="39", offset=2),
    output_signals_cold_start_test=CaseMarkers(test_case_id="41", offset=2),
    common_scheme_stationary_after_cold_test=CaseMarkers(test_case_id="42", offset=7),
    journal_stationary_after_cold_test=CaseMarkers(test_case_id="43", offset=7),
    main_page_info_stationary_after_cold_test=CaseMarkers(test_case_id="39", offset=7),
    output_signals_stationary_after_cold_test=CaseMarkers(test_case_id="41", offset=7),
    common_scheme_switch_on_test=CaseMarkers(test_case_id="35", offset=14),
    journal_switch_on_test=CaseMarkers(test_case_id="43", offset=14),
    main_page_info_switch_on_test=CaseMarkers(test_case_id="39", offset=14),
    output_signals_switch_on_test=CaseMarkers(test_case_id="41", offset=14),
    common_scheme_stationary_after_switch_on_test=CaseMarkers(test_case_id="42", offset=29),
    journal_stationary_after_switch_on_test=CaseMarkers(test_case_id="43", offset=29),
    main_page_info_stationary_after_switch_on_test=CaseMarkers(test_case_id="39", offset=29),
    output_signals_stationary_after_switch_on_test=CaseMarkers(test_case_id="41", offset=29),
    common_scheme_switch_off_test=CaseMarkers(test_case_id="35", offset=24),
    journal_switch_off_test=CaseMarkers(test_case_id="43", offset=24),
    main_page_info_switch_off_test=CaseMarkers(test_case_id="39", offset=24),
    output_signals_switch_off_test=CaseMarkers(test_case_id="41", offset=24),
    common_scheme_stationary_after_switch_off_test=CaseMarkers(test_case_id="42", offset=36),
    journal_stationary_after_switch_off_test=CaseMarkers(test_case_id="43", offset=36),
    main_page_info_stationary_after_switch_off_test=CaseMarkers(test_case_id="39", offset=36),
    output_signals_stationary_after_switch_off_test=CaseMarkers(test_case_id="41", offset=36),
)









































status_regress_unstationary_equipment_status.py
"""
Конфигурация тестового набора Status_regress_unstationary_equipment_status

Особенности набора:
- Режим МТ Нестационар
- Причина МТ: Пуск/остановка трубопровода; включение/отключение магистрального насоса; включение/отключение НПС
- Проверка режимов работы МТ
- Проверка причин режимов работы МТ
- Старт данных 19.03.2026 13:14:00.000
- Включение насоса AK.CHTN.NPS_VEL_3.MNA_4.ON ~ 13:24
- Начало нестационара примерно в 13:24, окончание примерно 13:31
- Выключение насоса AK.CHTN.NPS_VEL_3.MNA_4.ON ~ 13:34
- Начало нестационара примерно в 13:34, окончание примерно 13:41
"""

from constants.enums import TU, AdminTU, MeasureConversionRule, StationaryReason, StationaryStatus, UnStationaryReason
from constants.test_constants import BaseTN3Constants as TestConst
from test_config.models_for_tests import CaseData, CaseMarkers, StationaryStatusConfig

# ===== Константы набора =====
SUITE_NAME = "Status_regress_unstationary_equipment_status"
SUITE_DATA_ID = 34
ARCHIVE_NAME = f"{SUITE_NAME}.tar.gz"

DIAGNOSTIC_AREA_2_PIPE_ID = 1463
DIAGNOSTIC_AREA_3_PIPE_ID = 474
DIAGNOSTIC_AREA_5_PIPE_ID = 1478
CONTROL_POINTS = [
    "ЗА 105-3 - ЗА 129-3",
    "ЗА 180-3 - ЗА 207-3",
]

# Технологический участок
TECHNOLOGICAL_UNIT = TU.TIKHORETSK_NOVOROSSIYSK_3

# Название МН
MAIN_PIPELINE = "МН Тихорецк-Новороссийск-3"


# ===== Конфигурация набора =====
STATUS_REGRESS_UNSTATIONARY_EQUIPMENT_STATUS_CONFIG = StationaryStatusConfig(
    # ----- Метаданные -----
    ost_name=TestConst.CHTN_OST_NAME,
    suite_name=SUITE_NAME,
    suite_data_id=SUITE_DATA_ID,
    archive_name=ARCHIVE_NAME,
    main_pipeline=MAIN_PIPELINE,
    technological_unit=TECHNOLOGICAL_UNIT,
    measure_conversion_rules=MeasureConversionRule.KG_CM_MEASURE,
    # ===== LDS Configurator =====
    use_lds_configurator=True,
    admin_tu=AdminTU.TIKHORETSK_NOVOROSSIYSK_3_AUTOTEST_DATA_ABSENCE_FALSE,
    status_unstationary_cold_start_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(StationaryStatus.UNSTATIONARY, UnStationaryReason.COLD_START),
    ),
    status_unstationary_switch_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(StationaryStatus.UNSTATIONARY, UnStationaryReason.CHANGING_EQUIPMENT_STATUS),
    ),
    status_stationary_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(StationaryStatus.STATIONARY, StationaryReason.PRESSURE_AND_FLOW_MOVING_AVERAGES_MEET_CRITERIA),
    ),
    journal_unstationary_cold_start_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(
            StationaryStatus.UNSTATIONARY.report_text,
            UnStationaryReason.COLD_START.report_text,
        ),
    ),
    journal_unstationary_switch_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(
            StationaryStatus.UNSTATIONARY.report_text,
            UnStationaryReason.CHANGING_EQUIPMENT_STATUS.report_text,
        ),
    ),
    journal_stationary_test_data=CaseData(
        params={TestConst.CONTROL_POINTS_KEY: CONTROL_POINTS},
        expected_result=(
            StationaryStatus.STATIONARY.report_text,
            StationaryReason.PRESSURE_AND_FLOW_MOVING_AVERAGES_MEET_CRITERIA.report_text,
        ),
    ),
    # ===== ТЕСТЫ =====
    stationary_status_basic_info_test=CaseMarkers(test_case_id="44", offset=2),
    common_scheme_cold_start_test=CaseMarkers(test_case_id="42", offset=2),
    journal_cold_start_test=CaseMarkers(test_case_id="43", offset=2),
    main_page_info_cold_start_test=CaseMarkers(test_case_id="39", offset=2),
    output_signals_cold_start_test=CaseMarkers(test_case_id="41", offset=2),
    common_scheme_stationary_after_cold_test=CaseMarkers(test_case_id="42", offset=7),
    journal_stationary_after_cold_test=CaseMarkers(test_case_id="43", offset=7),
    main_page_info_stationary_after_cold_test=CaseMarkers(test_case_id="39", offset=7),
    output_signals_stationary_after_cold_test=CaseMarkers(test_case_id="41", offset=7),
    common_scheme_switch_on_test=CaseMarkers(test_case_id="34", offset=14),
    journal_switch_on_test=CaseMarkers(test_case_id="43", offset=14),
    main_page_info_switch_on_test=CaseMarkers(test_case_id="39", offset=14),
    output_signals_switch_on_test=CaseMarkers(test_case_id="41", offset=14),
    common_scheme_stationary_after_switch_on_test=CaseMarkers(test_case_id="42", offset=29),
    journal_stationary_after_switch_on_test=CaseMarkers(test_case_id="43", offset=29),
    main_page_info_stationary_after_switch_on_test=CaseMarkers(test_case_id="39", offset=29),
    output_signals_stationary_after_switch_on_test=CaseMarkers(test_case_id="41", offset=29),
)











































models for
"""
Датаклассы для конфигурации тестовых наборов.

Архитектура:
- TestSuiteConfig - главный конфиг набора, содержит всё для запуска тестов
- LeakTestConfig - конфиг утечки с параметрами и тест-кейсами
- TestCaseMarkers - маркеры для allure и pytest

Принцип: один файл конфига select_xx.py в папке datasets = один набор данных.
"""

from dataclasses import asdict, dataclass, field
from datetime import datetime
from pathlib import Path
from typing import Any, Dict, Optional

from constants.enums import (
    TU,
    AdminTU,
    ConfirmationStatus,
    LdsStatus,
    MeasureConversionRule,
    RejectionCriteria,
    RejectionSensorTag,
    ReservedType,
    StationaryStatus,
)
from constants.test_constants import BaseTN3Constants
from models.export_reports_model import ReportDataExportedNotification
from models.get_exported_files_list_model import ExportedDataItem
from models.subscribe_main_page_signals_info_model import SignalsInfo
from models.upload_exported_file_model import DownloadExportedDataReply
from utils.helpers.report_xlsx_utils import LeakReportRow, ReportTitleInfo


@dataclass
class CaseMarkers:
    """
    Маркеры тест-кейса для pytest и allure.
    """

    test_case_id: str
    offset: float


class SuiteTuIdentityMixin:
    """
    Идентификация ТУ для WS-тестов и legacy-стенда.
    Поля technological_unit, use_lds_configurator, admin_tu, resolved_tu_id
    объявляются в BaseSuiteConfig.
    """

    technological_unit: TU
    use_lds_configurator: bool
    admin_tu: Optional[AdminTU]
    resolved_tu_id: Optional[int]

    @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

    @property
    def tu_name(self) -> str:
        """Имя ТУ для WS-тестов и отчётов: admin при configurator, иначе legacy."""
        if self.use_lds_configurator:
            if self.admin_tu is None:
                return ""
            return self.admin_tu.admin_name
        return self.technological_unit.description

    @property
    def tu_id(self) -> int:
        """ID ТУ для WS-тестов: resolved из Администрирования при configurator, иначе legacy."""
        if self.use_lds_configurator:
            if self.resolved_tu_id is None:
                raise RuntimeError(
                    "resolved_tu_id не установлен - выполнить lds_configurator_admin_setup "
                    "перед операциями Администрирования"
                )
            return self.resolved_tu_id
        return self.technological_unit.id

    @property
    def configurator_tu_id(self) -> int:
        """tuId из Администрирования после configurator setup (LaunchLds/StopLds)."""
        if self.resolved_tu_id is None:
            raise RuntimeError(
                "resolved_tu_id не установлен - выполнить lds_configurator_admin_setup "
                "перед операциями Администрирования"
            )
        return self.resolved_tu_id

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


@dataclass
class BaseSuiteConfig(SuiteTuIdentityMixin):
    """
    Структура:
    1. Метаданные набора (имя, id, архив)
    2. Технологический участок (из enum TU)
    """

    # ===== Метаданные набора =====
    ost_name: str
    suite_name: str
    suite_data_id: int
    archive_name: str = ""  # Автоматически вычисляется из suite_name

    # ===== Технологический участок =====
    technological_unit: TU = TU.TIKHORETSK_NOVOROSSIYSK_3

    # ===== LDS Configurator (Администрирование) =====
    use_lds_configurator: bool = False
    admin_tu: Optional[AdminTU] = None
    resolved_tu_id: Optional[int] = None

    # ===== Название Магистрального Нефтепровода =====
    main_pipeline: Optional[str] = None

    # ===== Правила конвертации единиц измерения давления на стенде =====
    measure_conversion_rules: Optional[MeasureConversionRule] = None

    # ===== Общие константы (можно переопределить) =====
    allowed_distance_diff_meters: int = BaseTN3Constants.ALLOWED_DISTANCE_DIFF_METERS
    precision: int = BaseTN3Constants.PRECISION
    basic_message_timeout: float = BaseTN3Constants.BASIC_MESSAGE_TIMEOUT
    mask_message_timeout: float = BaseTN3Constants.MASK_MESSAGE_TIMEOUT
    mask_du_name: Optional[str] = None
    main_pipe_line: Optional[str] = None
    mask_du_event: Optional[str] = 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 has_multiple_leaks(self) -> bool:
        return False


@dataclass
class CaseData:
    """
    Данные тест-кейса.
    """

    name: str = ""
    params: Optional[Dict[str, Any]] = None
    expected_result: Optional[Any] = None
    description: str = ""


@dataclass
class DiagnosticAreaStatusConfig:
    """
    Конфигурация ожидаемых статусов СОУ для диагностического участка.
    Используется в тесте lds_status_during_leak.
    """

    leak_diagnostic_area_name: str
    leak_du_expected_lds_status: Any
    neighbors_du_expected_lds_status: Any
    leak_diagnostic_area_id: Optional[int] = None


@dataclass
class LeakTestConfig:
    """
    Полная конфигурация утечки со всеми параметрами и тест-кейсами.

    Все данные для тестов утечки:
    - Параметры утечки (координата, объём)
    - Временные интервалы
    - Ожидаемые значения
    - Маркеры тестов (AllLeaksInfo, TuLeaksInfo, и т.д.)
    """

    # ===== Идентификаторы =====
    control_site_id: Optional[int] = None
    diagnostic_area_id: Optional[int] = None
    diagnostic_area_name: Optional[str] = None
    linear_part_id: Optional[int] = None
    technological_object: Optional[str] = None
    message_event_leak_completion: Optional[str] = None

    # ===== Параметры утечки =====
    coordinate_meters: float = None
    volume_m3: float = None
    max_pumping_m3: int = 2500  # Производительность(максимальная перекачка)
    flow_rate_settings_threshold: Optional[float] = None  # Порог объема дебаланса для текущего ДУ в текущем режиме

    # ===== Временные интервалы (секунды) =====
    leak_start_interval_seconds: int = BaseTN3Constants.LEAK_START_INTERVAL
    allowed_time_diff_seconds: int = 0  # Допустимое время обнаружения
    output_test_delay_seconds: int = BaseTN3Constants.OUTPUT_TEST_DELAY

    # ===== Ожидаемые статусы =====
    expected_lds_status: Any = LdsStatus.SERVICEABLE
    # Режим СОУ в xlsx export_leaks_report (колонка 'Режим работы СОУ')
    expected_lds_status_in_leaks_report: Optional[int] = None
    expected_report_stationary_status: int = StationaryStatus.STATIONARY.value
    expected_stationary_status: Any = StationaryStatus.STATIONARY
    expected_algorithm_type: Any = ReservedType.STATIONARY_FLOW
    expected_leak_status: Any = ConfirmationStatus.CONFIRMED
    expected_complete_leak_status: Any = ConfirmationStatus.CONFIRMED_AND_LEAK_CLOSED

    # ===== Конфигурация статусов СОУ во время утечки =====
    lds_status_during_leak_config: Optional[DiagnosticAreaStatusConfig] = None

    # ===== Данные тест-кейсов =====
    lds_status_after_confirming_leak_data: Optional[CaseData] = None
    lds_status_after_completed_leak_data: Optional[CaseData] = None

    # ===== Тест-кейсы для этой утечки =====
    balance_algorithm_leak_waiting_test: Optional[CaseMarkers] = None
    balance_algorithm_leak_detected_test: Optional[CaseMarkers] = None
    leaks_content_test: Optional[CaseMarkers] = None
    all_leaks_info_test: Optional[CaseMarkers] = None
    all_leaks_is_empty_test: Optional[CaseMarkers] = None
    tu_leaks_info_test: Optional[CaseMarkers] = None
    leak_info_in_journal: Optional[CaseMarkers] = None
    possible_leak_in_journal_test: Optional[CaseMarkers] = None
    acknowledge_leak_test: Optional[CaseMarkers] = None
    acknowledge_leak_in_journal_test: Optional[CaseMarkers] = None
    output_signals_test: Optional[CaseMarkers] = None
    lds_status_during_leak_test: Optional[CaseMarkers] = None
    lds_status_after_confirming_leak_test: Optional[CaseMarkers] = None
    lds_status_completed_leak_test: Optional[CaseMarkers] = None
    the_leak_is_complete_on_kg_test: Optional[CaseMarkers] = None
    leak_is_complete_in_output_signals_test: Optional[CaseMarkers] = None
    leak_is_complete_on_main_page_test: Optional[CaseMarkers] = None
    leak_is_confirm_on_main_page_test: Optional[CaseMarkers] = None
    complete_tu_leaks_info_content_test: Optional[CaseMarkers] = None
    completed_leak_info_in_journal_test: Optional[CaseMarkers] = None
    balance_algorithm_leak_completed_test: Optional[CaseMarkers] = None
    export_leaks_report_test: Optional[CaseMarkers] = None

    @property
    def leak_diagnostic_area_id(self) -> Optional[int]:
        """ID диагностического участка с утечкой из lds_status_during_leak_config"""
        if self.lds_status_during_leak_config is not None:
            return self.lds_status_during_leak_config.leak_diagnostic_area_id
        return None

    @property
    def allowed_volume_m3(self) -> float:
        """Допустимая погрешность объёма"""
        return self.volume_m3 * BaseTN3Constants.ALLOWED_VOLUME_DIFF

    @property
    def leak_rate_percentages(self) -> float:
        """Интенсивность утечки в процентах"""
        return round((self.volume_m3 / self.max_pumping_m3) * 100, 2)

    @property
    def allowed_time_diff_minutes(self) -> float:
        """Допустимое время обнаружения утечки в минутах"""
        return round(self.allowed_time_diff_seconds / 60, 2)

    @property
    def output_allowed_time_diff_seconds(self) -> int:
        """Допустимое время для теста выходных сигналов"""
        return self.allowed_time_diff_seconds + self.output_test_delay_seconds


@dataclass
class SmokeSuiteConfig(BaseSuiteConfig):
    """
    Полная конфигурация тестового набора.

    Один конфиг = один набор данных = один файл в test_config/datasets/

    Структура:
    1. Базовые тесты с маркерами
    2. Конфигурации утечек (LeakTestConfig)
    """

    # ===== Ожидаемый статусы для main_page_info =====
    expected_stationary_status: Any = StationaryStatus.STATIONARY
    expected_main_page_signals: dict = field(default_factory=lambda: asdict(SignalsInfo()))

    # ===== Ожидаемые переменные при маскировании ДУ =====
    mask_reason: Optional[str] = None
    unmask_reason: Optional[str] = None
    mask_one_du: Optional[int] = None
    not_mask_du: Optional[int] = None
    linear_part_identifier_for_mask: Optional[int] = None

    technological_section: Optional[str] = None
    imitate_flowmeter_signal_test_data: Optional[CaseData] = None
    imitate_pressure_sensor_signal_test_data: Optional[CaseData] = None
    exp_mode_mt_message: Optional[CaseData] = None

    # Режим МТ в xlsx export_leaks_report
    expected_report_stationary_status: int = StationaryStatus.STATIONARY.value

    # ===== Данные участков КП-КП =====
    controlled_sites_with_segment: Optional[CaseData] = None

    # дефолтные значения для датчиков маскирования
    mask_signal_test_data: Optional[CaseData] = CaseData(
        params={
            "pressure_sensor_address": BaseTN3Constants.PRESSURE_SENSOR_ADDRESS,
            "flowmeter_address": BaseTN3Constants.FLOWMETER_ADDRESS,
        }
    )

    # ===== Базовые тесты =====
    basic_info_test: Optional[CaseMarkers] = None
    imitate_flowmeter_signal_test: Optional[CaseMarkers] = None
    imitate_pressure_sensor_signal_test: Optional[CaseMarkers] = None
    journal_info_test: Optional[CaseMarkers] = None
    lds_status_initialization_test: Optional[CaseMarkers] = None
    lds_status_init_in_journal_test: Optional[CaseMarkers] = None
    main_page_info_test: Optional[CaseMarkers] = None
    main_page_info_signals_test: Optional[CaseMarkers] = None
    mask_signal_test: Optional[CaseMarkers] = None
    mask_info_in_journal_test: Optional[CaseMarkers] = None
    lds_status_initialization_out_test: Optional[CaseMarkers] = None
    lds_status_init_out_in_journal_test: Optional[CaseMarkers] = None
    mask_du_on_mini_scheme_test: Optional[CaseMarkers] = None
    unmask_du_on_mini_scheme_test: Optional[CaseMarkers] = None
    diagnostics_of_signals_after_initialization_test: Optional[CaseMarkers] = None
    mode_mt_in_journal_test: Optional[CaseMarkers] = None
    export_lds_status_report_test: Optional[CaseMarkers] = None
    export_mt_mode_report_test: Optional[CaseMarkers] = None

    # ===== Конфигурации утечек =====
    # Для наборов с одной утечкой
    leak: Optional[LeakTestConfig] = None

    # Для наборов с несколькими утечками (select_19_20)
    leaks: list[LeakTestConfig] = field(default_factory=list)

    # Участки в xlsx-отчёте о режиме работы СОУ (export_lds_status_report)
    lds_status_report_section_names: list[str] = field(default_factory=list)

    # ===== Дополнительные тесты для двух утечек =====
    main_page_info_unstationary_test: Optional[CaseMarkers] = None

    def get_leak(self, index: int = 0) -> Optional[LeakTestConfig]:
        """Получить конфигурацию утечки по индексу"""
        if self.leak and index == 0:
            return self.leak
        if self.leaks and index < len(self.leaks):
            return self.leaks[index]
        return None

    @property
    def has_multiple_leaks(self) -> bool:
        """Проверить, есть ли несколько утечек"""
        return len(self.leaks) > 1

    @property
    def allowed_volume_diff(self) -> float:
        """Относительная погрешность по объёму"""
        return BaseTN3Constants.ALLOWED_VOLUME_DIFF


@dataclass
class LDSStatusConfig(BaseSuiteConfig):
    """
    Полная конфигурация тестового набора.

    Один конфиг = один набор данных = один файл в test_config/datasets/

    Структура:
    1. Данные для тестов(параметры и ожидаемый результат)
    2. Тесты с маркерами
    """

    # ===== Данные для тестов на схеме=====
    init_accumulation_data_test_data: Optional[CaseData] = None
    init_accumulation_data_in_journal_test_data: Optional[CaseData] = None
    init_cold_start_test_data: Optional[CaseData] = None
    init_exiting_faulty_test_data: Optional[CaseData] = None
    init_switching_shut_off_test_data: Optional[CaseData] = None
    init_switching_shut_off_in_journal_test_data: Optional[CaseData] = None
    serviceable_all_test_data: Optional[CaseData] = None
    serviceable_all_in_journal_test_data: Optional[CaseData] = None
    serviceable_after_switching_shut_off_test_data: Optional[CaseData] = None
    serviceable_after_switching_shut_off_in_journal_test_data: Optional[CaseData] = None
    serviceable_after_deg_faulty_pressure_sensors_at_pump_test_data: Optional[CaseData] = None
    serviceable_after_deg_faulty_pressure_sensors_at_pump_in_journal_test_data: Optional[CaseData] = None
    deg_faulty_pressure_sensors_at_pump_station_test_data: Optional[CaseData] = None
    deg_faulty_pressure_sensors_at_pump_station_in_journal_test_data: Optional[CaseData] = None
    deg_additive_injectors_operation_test_data: Optional[CaseData] = None
    deg_absence_min_pressure_sensors_test_data: Optional[CaseData] = None
    deg_exceeding_distance_between_pressure_sensors_test_data: Optional[CaseData] = None
    deg_exceeding_distance_between_pressure_sensors_in_journal_test_data: Optional[CaseData] = None
    deg_gravity_section_pumping_test_data: Optional[CaseData] = None
    deg_gravity_section_pumping_in_stopping_test_data: Optional[CaseData] = None
    deg_gravity_section_pumping_in_stopping_in_journal_test_data: Optional[CaseData] = None
    deg_pig_sensor_passage_test_data: Optional[CaseData] = None
    deg_starting_pumping_out_pumps_test_data: Optional[CaseData] = None
    deg_exceeding_distance_between_flow_meters_test_data: Optional[CaseData] = None
    deg_rejection_temperature_sensor_on_du_2_test_data: Optional[CaseData] = None
    deg_rejection_temperature_sensor_on_du_3_test_data: Optional[CaseData] = None
    deg_rejection_temperature_sensor_on_du_5_test_data: Optional[CaseData] = None
    deg_rejection_density_and_viscosity_on_du_2_test_data: Optional[CaseData] = None
    deg_rejection_density_and_viscosity_on_du_3_test_data: Optional[CaseData] = None
    deg_rejection_density_and_viscosity_on_du_5_test_data: Optional[CaseData] = None
    faulty_absence_min_flow_meters_test_data: Optional[CaseData] = None
    faulty_absence_min_pressure_sensors_test_data: Optional[CaseData] = None

    # ===== Данные для тестов  в журнале бики ДУ2=====
    degradation_temperature_du_2_in_journal_test_data: Optional[CaseData] = None
    degradation_density_du_2_in_journal_test_data: Optional[CaseData] = None
    degradation_viscosity_du_2_in_journal_test_data: Optional[CaseData] = None

    # ===== Данные для тестов  в журнале бики ДУ3=====
    degradation_temperature_sensor_du_3_in_journal_test_data: Optional[CaseData] = None
    degradation_density_du_3_in_journal_test_data: Optional[CaseData] = None
    degradation_viscosity_du_3_in_journal_test_data: Optional[CaseData] = None

    # ===== Данные для тестов  в журнале для набора данных "В течении"=====
    between_si_pressure_more_50_km_in_journal_test_data: Optional[CaseData] = None
    deg_gravity_section_pumping_in_journal_test_data: Optional[CaseData] = None
    deg_absence_min_pressure_sensors_in_journal_test_data: Optional[CaseData] = None
    serviceable_after_deg_absence_min_pressure_sensors_in_journal_test_data: Optional[CaseData] = None
    deg_starting_pumping_out_pumps_in_journal_test_data: Optional[CaseData] = None
    serviceable_after_faulty_in_journal_test_data: Optional[CaseData] = None
    deg_additive_injectors_operation_in_journal_test_data: Optional[CaseData] = None
    deg_pig_sensor_passage_in_journal_test_data: Optional[CaseData] = None
    deg_exceeding_distance_between_flow_meters_in_journal_test_data: Optional[CaseData] = None
    serviceable_after_deg_starting_pumping_out_pumps_in_journal_test_data: Optional[CaseData] = None
    faulty_absence_min_flow_meters_in_journal_test_data: Optional[CaseData] = None
    faulty_absence_min_pressure_sensors_in_journal_test_data: Optional[CaseData] = None

    # ===== Тесты =====
    lds_status_basic_info_test: Optional[CaseMarkers] = None
    init_accumulation_data_test: Optional[CaseMarkers] = None
    init_accumulation_data_in_journal_test: Optional[CaseMarkers] = None
    init_cold_start_test: Optional[CaseMarkers] = None
    init_cold_start_in_journal_test: Optional[CaseMarkers] = None
    init_exiting_faulty_test: Optional[CaseMarkers] = None
    init_switching_shut_off_test: Optional[CaseMarkers] = None
    init_switching_shut_off_in_journal_test: Optional[CaseMarkers] = None
    serviceable_after_cold_start_test: Optional[CaseMarkers] = None
    serviceable_after_cold_start_in_journal_test: Optional[CaseMarkers] = None
    serviceable_after_switching_shut_off_test: Optional[CaseMarkers] = None
    serviceable_after_switching_shut_off_in_journal_test: Optional[CaseMarkers] = None
    serviceable_after_deg_absence_min_pressure_sensors_test: Optional[CaseMarkers] = None
    serviceable_after_deg_additive_injectors_operation_test: Optional[CaseMarkers] = None
    serviceable_after_deg_starting_pumping_out_pumps_test: Optional[CaseMarkers] = None
    serviceable_after_deg_faulty_pressure_sensors_at_pump_test: Optional[CaseMarkers] = None
    serviceable_after_deg_faulty_pressure_sensors_at_pump_in_journal_test: Optional[CaseMarkers] = None
    serviceable_after_deg_exceeding_distance_between_flow_meters_test: Optional[CaseMarkers] = None
    serviceable_after_faulty_test: Optional[CaseMarkers] = None
    deg_additive_injectors_operation_test: Optional[CaseMarkers] = None
    deg_exceeding_distance_between_pressure_sensors_test: Optional[CaseMarkers] = None
    deg_exceeding_distance_between_pressure_sensors_in_journal_test: Optional[CaseMarkers] = None
    deg_absence_min_pressure_sensors_test: Optional[CaseMarkers] = None
    deg_faulty_pressure_sensors_at_pump_station_test: Optional[CaseMarkers] = None
    deg_faulty_pressure_sensors_at_pump_station_in_journal_test: Optional[CaseMarkers] = None
    deg_gravity_section_pumping_test: Optional[CaseMarkers] = None
    deg_gravity_section_pumping_in_stopping_test: Optional[CaseMarkers] = None
    deg_gravity_section_pumping_in_stopping_in_journal_test: Optional[CaseMarkers] = None
    deg_pig_sensor_passage_test: Optional[CaseMarkers] = None
    deg_starting_pumping_out_pumps_test: Optional[CaseMarkers] = None
    deg_exceeding_distance_between_flow_meters_test: Optional[CaseMarkers] = None

    # ===== ТЕСТЫ на схеме бики=====
    deg_rejection_temperature_sensor_on_du_2_test: Optional[CaseMarkers] = None
    deg_rejection_temperature_sensor_on_du_3_test: Optional[CaseMarkers] = None
    deg_rejection_temperature_sensor_on_du_5_test: Optional[CaseMarkers] = None
    deg_rejection_density_and_viscosity_on_du_2_test: Optional[CaseMarkers] = None
    deg_rejection_density_and_viscosity_on_du_3_test: Optional[CaseMarkers] = None
    deg_rejection_density_and_viscosity_on_du_5_test: Optional[CaseMarkers] = None
    faulty_absence_min_flow_meters_test: Optional[CaseMarkers] = None
    faulty_absence_min_flow_meters_continuous_test: Optional[CaseMarkers] = None
    faulty_absence_min_pressure_sensors_test: Optional[CaseMarkers] = None
    faulty_absence_min_pressure_sensors_in_journal_test: Optional[CaseMarkers] = None
    # ===== ТЕСТЫ в журнале бики ДУ2=====
    degradation_temperature_du_2_in_journal_test: Optional[CaseMarkers] = None
    degradation_density_du_2_in_journal_test: Optional[CaseMarkers] = None
    degradation_viscosity_du_2_in_journal_test: Optional[CaseMarkers] = None
    # ===== ТЕСТЫ в журнале бики ДУ3=====
    degradation_temperature_du_3_in_journal_test: Optional[CaseMarkers] = None
    degradation_density_du_3_in_journal_test: Optional[CaseMarkers] = None
    degradation_viscosity_du_3_in_journal_test: Optional[CaseMarkers] = None
    # ===== ТЕСТЫ в журнале для набора данных "В течении"=====
    between_si_pressure_more_50_km_in_journal_test: Optional[CaseMarkers] = None
    deg_gravity_section_pumping_in_journal_test: Optional[CaseMarkers] = None
    deg_absence_min_pressure_sensors_in_journal_test: Optional[CaseMarkers] = None
    serviceable_after_deg_absence_min_pressure_sensors_in_journal_test: Optional[CaseMarkers] = None
    deg_starting_pumping_out_pumps_in_journal_test: Optional[CaseMarkers] = None
    serviceable_after_deg_starting_pumping_out_pumps_in_journal_test: Optional[CaseMarkers] = None
    faulty_absence_min_flow_meters_in_journal_test: Optional[CaseMarkers] = None
    serviceable_after_faulty_in_journal_test: Optional[CaseMarkers] = None
    deg_exceeding_distance_between_flow_meters_in_journal_test: Optional[CaseMarkers] = None
    deg_additive_injectors_operation_in_journal_test: Optional[CaseMarkers] = None
    deg_pig_sensor_passage_in_journal_test: Optional[CaseMarkers] = None


@dataclass
class StationaryStatusConfig(BaseSuiteConfig):
    # ===== Данные для тестов =====
    status_unstationary_cold_start_test_data: Optional[CaseData] = None
    status_stationary_test_data: Optional[CaseData] = None
    status_unstationary_switch_test_data: Optional[CaseData] = None
    journal_unstationary_cold_start_test_data: Optional[CaseData] = None
    journal_stationary_test_data: Optional[CaseData] = None
    journal_unstationary_switch_test_data: Optional[CaseData] = None

    # ===== Тесты =====
    stationary_status_basic_info_test: Optional[CaseMarkers] = None

    common_scheme_cold_start_test: Optional[CaseMarkers] = None
    journal_cold_start_test: Optional[CaseMarkers] = None
    main_page_info_cold_start_test: Optional[CaseMarkers] = None
    output_signals_cold_start_test: Optional[CaseMarkers] = None

    common_scheme_stationary_after_cold_test: Optional[CaseMarkers] = None
    journal_stationary_after_cold_test: Optional[CaseMarkers] = None
    main_page_info_stationary_after_cold_test: Optional[CaseMarkers] = None
    output_signals_stationary_after_cold_test: Optional[CaseMarkers] = None

    common_scheme_switch_on_test: Optional[CaseMarkers] = None
    journal_switch_on_test: Optional[CaseMarkers] = None
    main_page_info_switch_on_test: Optional[CaseMarkers] = None
    output_signals_switch_on_test: Optional[CaseMarkers] = None

    common_scheme_stationary_after_switch_on_test: Optional[CaseMarkers] = None
    journal_stationary_after_switch_on_test: Optional[CaseMarkers] = None
    main_page_info_stationary_after_switch_on_test: Optional[CaseMarkers] = None
    output_signals_stationary_after_switch_on_test: Optional[CaseMarkers] = None

    common_scheme_switch_off_test: Optional[CaseMarkers] = None
    journal_switch_off_test: Optional[CaseMarkers] = None
    main_page_info_switch_off_test: Optional[CaseMarkers] = None
    output_signals_switch_off_test: Optional[CaseMarkers] = None

    common_scheme_stationary_after_switch_off_test: Optional[CaseMarkers] = None
    journal_stationary_after_switch_off_test: Optional[CaseMarkers] = None
    main_page_info_stationary_after_switch_off_test: Optional[CaseMarkers] = None
    output_signals_stationary_after_switch_off_test: Optional[CaseMarkers] = None


@dataclass
class RejectionTestCase:
    """
    Описание одного события отбраковки для тестирования.

    Содержит:
    - Тег и id датчика (из RejectionSensorTag)
    - Ожидаемые значения для проверок журнала и схемы
    - Маркеры (offset и test_case_id)
    """

    name: str = ""
    sensor: RejectionSensorTag = ""
    expected_event: str = ""
    expected_signal_name: str = ""
    expected_criteria_names: Optional[RejectionCriteria] = None
    expected_is_rejected: bool = True
    time_range_start_s: float = 0
    time_range_end_s: float = 0
    rejection_input_signals_test: Optional[CaseMarkers] = None
    rejection_journal_test: Optional[CaseMarkers] = None
    rejection_main_page_test: Optional[CaseMarkers] = None
    rejection_scheme_signals_state_test: Optional[CaseMarkers] = None


@dataclass
class RejectionReportRow:
    """Разобранная строка отчёта об отбракованных входных данных."""

    row_index: int
    datetime_value: Optional[datetime] = None
    object_value: str = ""
    event_value: str = ""
    value_text: str = ""
    duration_seconds: int = 0
    tag_value: str = ""


@dataclass
class IsRejectedConfig(BaseSuiteConfig):
    """
    Конфигурация тестового набора отбраковки сигналов.

    Структура:
    1. Название МН
    2. Список случаев отбраковки (RejectionTestCase)
    """

    rejection_cases: list[RejectionTestCase] = field(default_factory=list)
    rejection_report_test: Optional[CaseMarkers] = None
    requires_process_empty_values_rejection: bool = False


@dataclass
class ExportLeaksReportState:
    """
    Состояние сценария формирования xlsx-отчёта об утечках между allure-шагами.
    Заполняется по ходу export_leaks_report в smoke_scenarios.
    """

    report_test: Optional[CaseMarkers] = None
    period_start: Optional[datetime] = None
    period_end: Optional[datetime] = None
    period_start_naive: Optional[datetime] = None
    period_end_naive: Optional[datetime] = None
    expected_mt_mode: Optional[str] = None
    expected_lds_status_text: Optional[str] = None
    time_offset_hours: Optional[int] = None
    tu_description_lower: str = ""
    notification: Optional[ReportDataExportedNotification] = None
    report_item: Optional[ExportedDataItem] = None
    report_file_name: str = ""
    download_invocation_id: Optional[str] = None
    download_payload: Optional[list] = None
    download_reply: Optional[DownloadExportedDataReply] = None
    file_bytes: Optional[bytes] = None
    temp_file_path: Optional[Path] = None
    worksheet: Any = None
    title_info: Optional[ReportTitleInfo] = None
    data_rows: list[LeakReportRow] = field(default_factory=list)
    target_row: Optional[LeakReportRow] = None


@dataclass
class ExportLdsStatusReportState:
    """Состояние сценария формирования xlsx-отчёта о режиме работы СОУ."""

    report_test: Optional[CaseMarkers] = None
    period_start: Optional[datetime] = None
    period_end: Optional[datetime] = None
    period_start_naive: Optional[datetime] = None
    period_end_naive: Optional[datetime] = None
    time_offset_hours: Optional[int] = None
    tu_description_lower: str = ""
    notification: Optional[ReportDataExportedNotification] = None
    report_item: Optional[ExportedDataItem] = None
    report_file_name: str = ""
    download_invocation_id: Optional[str] = None
    download_reply: Optional[DownloadExportedDataReply] = None
    file_bytes: Optional[bytes] = None
    temp_file_path: Optional[Path] = None
    worksheet: Any = None
    parsed_report: Any = None


@dataclass
class ExportRejectedReportState:
    """
    Состояние сценария формирования xlsx-отчёта об отбракованных входных данных.
    Поля с префиксом expected_ - из конфигурации теста, actual_ - из ответов бэка и разбора xlsx.
    """

    # --- expected: конфигурация теста и расчётные ожидания ---
    expected_report_test: Optional[CaseMarkers] = None
    expected_period_start: Optional[datetime] = None
    expected_period_end: Optional[datetime] = None
    expected_period_start_naive: Optional[datetime] = None
    expected_period_end_naive: Optional[datetime] = None
    expected_tu_description_lower: str = ""
    expected_file_name: str = ""

    # --- actual: ответы бэка ---
    actual_time_offset_hours: Optional[int] = None
    actual_notification: Optional[ReportDataExportedNotification] = None
    actual_report_item: Optional[ExportedDataItem] = None
    actual_download_invocation_id: Optional[str] = None
    actual_download_reply: Optional[DownloadExportedDataReply] = None
    actual_file_bytes: Optional[bytes] = None

    # --- actual: разбор xlsx ---
    actual_temp_file_path: Optional[Path] = None
    actual_worksheet: Any = None
    actual_title_info: Optional[ReportTitleInfo] = None
    actual_data_rows: list[RejectionReportRow] = field(default_factory=list)
    actual_monitored_tag_rows: list[RejectionReportRow] = field(default_factory=list)
    actual_header_column_headers: list[str] = field(default_factory=list)
    actual_header_period_start: Optional[datetime] = None
    actual_header_period_end: Optional[datetime] = None
    actual_header_contains_expected_title: bool = False
    actual_case_checks: list = field(default_factory=list)


@dataclass
class ExportMtModeReportState:
    """
    Состояние сценария формирования xlsx-отчёта о режиме работы МТ.
    Поля с префиксом expected_ - из конфигурации теста, actual_ - из ответов бэка и разбора xlsx.
    """

    # --- expected: конфигурация теста и расчётные ожидания ---
    expected_report_test: Optional[CaseMarkers] = None
    expected_period_start: Optional[datetime] = None
    expected_period_end: Optional[datetime] = None
    expected_period_start_naive: Optional[datetime] = None
    expected_period_end_naive: Optional[datetime] = None
    expected_tu_description_lower: str = ""
    expected_file_name: str = ""
    expected_section_names: list[str] = field(default_factory=list)
    expected_dominant_mode_column: str = ""

    # --- actual: ответы бэка ---
    actual_time_offset_hours: Optional[int] = None
    actual_notification: Optional[ReportDataExportedNotification] = None
    actual_report_item: Optional[ExportedDataItem] = None
    actual_download_invocation_id: Optional[str] = None
    actual_download_reply: Optional[DownloadExportedDataReply] = None
    actual_file_bytes: Optional[bytes] = None

    # --- actual: разбор xlsx ---
    actual_temp_file_path: Optional[Path] = None
    actual_worksheet: Any = None
    actual_parsed_report: Any = None