feat: добавлен функционал для извлечения и отправки описания PR в Telegram

- Реализована возможность получения тела последнего объединенного PR по коммиту в GitHub Actions.
- Добавлен шаг для отправки описания PR в важные логи через Telegram.
- Обновлены тесты для проверки нового функционала и улучшения логики обработки сообщений.
This commit is contained in:
2026-01-26 22:40:05 +03:00
parent feee7f010c
commit be8af704ba
10 changed files with 100 additions and 47 deletions

View File

@@ -3,16 +3,14 @@
"""
import json
import pytest
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
# Импорты для тестирования базовых классов
from helper_bot.services.scoring.base import ScoringResult, CombinedScore
from helper_bot.services.scoring.exceptions import (
ScoringError,
InsufficientExamplesError,
TextTooShortError,
)
from helper_bot.services.scoring.base import CombinedScore, ScoringResult
from helper_bot.services.scoring.exceptions import (InsufficientExamplesError,
ScoringError,
TextTooShortError)
class TestScoringResult:
@@ -159,7 +157,7 @@ class TestVectorStore:
def test_max_examples_limit(self, vector_store):
"""Тест ограничения максимального количества примеров."""
import numpy as np
# Добавляем больше чем max_examples
for i in range(150):
vector = np.random.randn(768).astype(np.float32)
@@ -179,7 +177,7 @@ class TestVectorStore:
def test_calculate_similarity_with_examples(self, vector_store):
"""Тест расчета скора с примерами."""
import numpy as np
# Добавляем положительные примеры
for i in range(10):
vector = np.random.randn(768).astype(np.float32)
@@ -215,7 +213,8 @@ class TestDeepSeekService:
@pytest.fixture
def deepseek_service(self):
"""Создает DeepSeekService для тестов."""
from helper_bot.services.scoring.deepseek_service import DeepSeekService
from helper_bot.services.scoring.deepseek_service import \
DeepSeekService
return DeepSeekService(
api_key="test_key",
enabled=True,
@@ -224,7 +223,8 @@ class TestDeepSeekService:
def test_service_disabled_without_key(self):
"""Тест отключения сервиса без API ключа."""
from helper_bot.services.scoring.deepseek_service import DeepSeekService
from helper_bot.services.scoring.deepseek_service import \
DeepSeekService
service = DeepSeekService(api_key=None, enabled=True)
assert service.is_enabled is False
@@ -255,7 +255,8 @@ class TestDeepSeekService:
@pytest.mark.asyncio
async def test_calculate_score_disabled(self):
"""Тест расчета скора при отключенном сервисе."""
from helper_bot.services.scoring.deepseek_service import DeepSeekService
from helper_bot.services.scoring.deepseek_service import \
DeepSeekService
service = DeepSeekService(api_key=None, enabled=False)
with pytest.raises(ScoringError):
@@ -281,6 +282,8 @@ class TestScoringManager:
source="rag",
model="rubert",
))
mock.add_positive_example = AsyncMock()
mock.add_negative_example = AsyncMock()
return mock
@pytest.fixture
@@ -293,6 +296,8 @@ class TestScoringManager:
source="deepseek",
model="deepseek-chat",
))
mock.add_positive_example = AsyncMock()
mock.add_negative_example = AsyncMock()
return mock
@pytest.mark.asyncio
@@ -301,7 +306,7 @@ class TestScoringManager:
from helper_bot.services.scoring.scoring_manager import ScoringManager
manager = ScoringManager(
rag_service=mock_rag_service,
rag_client=mock_rag_service,
deepseek_service=mock_deepseek_service,
)
@@ -317,7 +322,7 @@ class TestScoringManager:
from helper_bot.services.scoring.scoring_manager import ScoringManager
manager = ScoringManager(
rag_service=mock_rag_service,
rag_client=mock_rag_service,
deepseek_service=None,
)
@@ -331,7 +336,7 @@ class TestScoringManager:
"""Тест скоринга пустого текста."""
from helper_bot.services.scoring.scoring_manager import ScoringManager
manager = ScoringManager(rag_service=mock_rag_service)
manager = ScoringManager(rag_client=mock_rag_service)
result = await manager.score_post("")
@@ -342,12 +347,12 @@ class TestScoringManager:
async def test_score_post_service_error(self, mock_rag_service, mock_deepseek_service):
"""Тест обработки ошибки сервиса."""
from helper_bot.services.scoring.scoring_manager import ScoringManager
# RAG выбрасывает ошибку
mock_rag_service.calculate_score = AsyncMock(side_effect=Exception("Test error"))
manager = ScoringManager(
rag_service=mock_rag_service,
rag_client=mock_rag_service,
deepseek_service=mock_deepseek_service,
)
@@ -365,7 +370,7 @@ class TestScoringManager:
from helper_bot.services.scoring.scoring_manager import ScoringManager
manager = ScoringManager(
rag_service=mock_rag_service,
rag_client=mock_rag_service,
deepseek_service=mock_deepseek_service,
)
@@ -380,7 +385,7 @@ class TestScoringManager:
from helper_bot.services.scoring.scoring_manager import ScoringManager
manager = ScoringManager(
rag_service=mock_rag_service,
rag_client=mock_rag_service,
deepseek_service=mock_deepseek_service,
)