# -*- 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