Files
fckbot/tests/test_extract_metrics.py
2026-06-30 10:35:26 +00:00

63 lines
2.5 KiB
Python

# -*- 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 == []