121 lines
4.3 KiB
Python
121 lines
4.3 KiB
Python
# -*- 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 |