# -*- coding: utf-8 -*- """ Тесты для модуля извлечения метрик. Проверяем, что функция корректно парсит JSON и делает fallback. """ import json import pytest from core.functions.extract_metrics import extract_metrics @pytest.mark.asyncio async def test_metrics_json_success(mock_giga, mock_bot_config): """ Тест: успешное извлечение метрик из JSON-ответа. """ expected_metrics = [ {"metric_name": "OEE линии", "value": "85,2", "unit": "%", "period": "первый квартал 2025", "source_fragment": "OEE линии составил 85,2%"} ] mock_giga.chat.return_value = json.dumps(expected_metrics, ensure_ascii=False) result = await extract_metrics( giga=mock_giga, context="OEE линии составил 85,2% в первом квартале 2025 года.", prompt_text="Ты — аналитик... ВЫВЕДИ ТОЛЬКО JSON.", bot_config=mock_bot_config ) assert result == expected_metrics @pytest.mark.asyncio async def test_metrics_fallback(mock_giga, mock_bot_config): """ Тест: если JSON невалидный, выполняется fallback-парсинг строк вида 'ключ: значение'. Контекст должен быть длиннее 20 символов, чтобы функция не вернула пустой список раньше времени. """ # Убеждаемся, что контекст имеет длину > 20 символов mock_giga.chat.return_value = "OEE: 85.2%\nТакт: 120 сек" result = await extract_metrics( giga=mock_giga, context="Длинный контекст для извлечения метрик: OEE: 85.2%\nТакт: 120 сек", prompt_text="Ты — аналитик...", bot_config=mock_bot_config ) assert len(result) == 2 assert result[0]["metric_name"] == "OEE" assert result[0]["value"] == "85.2%" assert result[1]["metric_name"] == "Такт" @pytest.mark.asyncio async def test_metrics_empty_context(mock_giga, mock_bot_config): """ Тест: при пустом контексте возвращается пустой список. """ result = await extract_metrics( giga=mock_giga, context="", prompt_text="Ты — аналитик...", bot_config=mock_bot_config ) assert result == []