Files
fckbot/tests/test_intent_classify.py
2026-06-30 10:35:43 +00:00

121 lines
4.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""
Тесты для модуля классификации намерений.
Проверяем, что функция корректно распознаёт разные типы запросов.
"""
import pytest
from core.functions.intent_classify import classify_intent, _intent_cache, _CACHE_TTL
import time
@pytest.mark.asyncio
async def test_classify_fact(mock_giga, mock_bot_config, sample_prompt_intent):
"""
Тест: запрос с конкретным фактом должен возвращать 'FACT'.
"""
# Настраиваем мок: при вызове chat вернём 'FACT'
mock_giga.chat.return_value = "FACT"
result = await classify_intent(
giga=mock_giga,
query="Какое тактовое время установлено на линии?",
prompt_text=sample_prompt_intent,
bot_config=mock_bot_config
)
assert result == "FACT"
# Проверяем, что chat был вызван один раз
mock_giga.chat.assert_called_once()
@pytest.mark.asyncio
async def test_classify_greeting(mock_giga, mock_bot_config, sample_prompt_intent):
"""
Тест: приветствие должно возвращать 'GREETING'.
"""
mock_giga.chat.return_value = "GREETING"
result = await classify_intent(
giga=mock_giga,
query="Привет!",
prompt_text=sample_prompt_intent,
bot_config=mock_bot_config
)
assert result == "GREETING"
@pytest.mark.asyncio
async def test_classify_unknown(mock_giga, mock_bot_config, sample_prompt_intent):
"""
Тест: если модель вернула неизвестный код, возвращается 'GENERAL'.
"""
mock_giga.chat.return_value = "UNKNOWN_CODE"
result = await classify_intent(
giga=mock_giga,
query="Что-то непонятное",
prompt_text=sample_prompt_intent,
bot_config=mock_bot_config
)
assert result == "GENERAL"
@pytest.mark.asyncio
async def test_classify_cache(mock_giga, mock_bot_config, sample_prompt_intent):
"""
Тест: проверка работы кэша при повторном запросе результат берётся из кэша,
и chat вызывается только один раз.
"""
mock_giga.chat.return_value = "METRICS"
# Первый вызов должен вызвать chat
result1 = await classify_intent(
giga=mock_giga,
query="Выведи все KPI из отчёта",
prompt_text=sample_prompt_intent,
bot_config=mock_bot_config
)
assert result1 == "METRICS"
assert mock_giga.chat.call_count == 1
# Второй вызов с тем же запросом chat не должен вызываться (кэш)
result2 = await classify_intent(
giga=mock_giga,
query="Выведи все KPI из отчёта",
prompt_text=sample_prompt_intent,
bot_config=mock_bot_config
)
assert result2 == "METRICS"
assert mock_giga.chat.call_count == 1 # всё ещё 1
@pytest.mark.asyncio
async def test_classify_cache_expiry(mock_giga, mock_bot_config, sample_prompt_intent):
"""
Тест: проверка, что кэш истекает после TTL.
"""
mock_giga.chat.return_value = "FACT"
# Первый вызов
result1 = await classify_intent(
giga=mock_giga,
query="Какая длительность переналадки?",
prompt_text=sample_prompt_intent,
bot_config=mock_bot_config
)
assert result1 == "FACT"
assert mock_giga.chat.call_count == 1
# Искусственно ставим время в кэше так, чтобы оно было старше TTL
key = "какая длительность переналадки?"
_intent_cache[key] = (time.time() - _CACHE_TTL - 10, "FACT")
# Второй вызов должен снова вызвать chat
result2 = await classify_intent(
giga=mock_giga,
query="Какая длительность переналадки?",
prompt_text=sample_prompt_intent,
bot_config=mock_bot_config
)
assert result2 == "FACT"
assert mock_giga.chat.call_count == 2