Refactor imports across multiple files to improve code organization and readability.
All checks were successful
CI pipeline / Test & Code Quality (push) Successful in 34s

This commit is contained in:
2026-02-28 23:24:25 +03:00
parent d0c8dab24a
commit 3d6b4353f9
78 changed files with 141 additions and 53 deletions

View File

@@ -2,6 +2,7 @@ from datetime import datetime
from typing import Any, Dict, List, Optional, Tuple
import aiosqlite
from database.models import (
Admin,
AudioMessage,

View File

@@ -2,6 +2,7 @@ import os
from typing import Optional
import aiosqlite
from logs.custom_logger import logger

View File

@@ -1,6 +1,7 @@
"""Репозиторий для работы с миграциями базы данных."""
import aiosqlite
from database.base import DatabaseConnection

View File

@@ -1,6 +1,7 @@
from aiogram import F, Router, types
from aiogram.filters import Command, MagicData, StateFilter
from aiogram.fsm.context import FSMContext
from helper_bot.filters.main import ChatTypeFilter
from helper_bot.handlers.admin.dependencies import AdminAccessMiddleware
from helper_bot.handlers.admin.exceptions import (
@@ -138,7 +139,9 @@ async def get_banned_users(
keyboard = create_keyboard_with_pagination(
1, len(buttons_list), buttons_list, "unlock"
)
await message.answer(text=message_text, reply_markup=keyboard, parse_mode="HTML")
await message.answer(
text=message_text, reply_markup=keyboard, parse_mode="HTML"
)
else:
await message.answer(
text="В списке заблокированных пользователей никого нет"
@@ -217,12 +220,8 @@ async def get_ml_stats(message: types.Message, state: FSMContext, **kwargs):
lines.append(f" • API URL: {rag.get('api_url', 'N/A')}")
if "enabled" in rag:
if rag.get("enabled"):
lines.append(
f" • Статус: ⚠️ Включен, но API не отвечает"
)
lines.append(
f" • Проверьте доступность сервиса и API ключ"
)
lines.append(f" • Статус: ⚠️ Включен, но API не отвечает")
lines.append(f" • Проверьте доступность сервиса и API ключ")
else:
lines.append(f" • Статус: ❌ Отключен")
@@ -460,8 +459,7 @@ async def process_publish_threshold(
except ValueError as e:
await message.answer(
f"❌ Неверное значение: {e}\n"
"Введите число от 0.0 до 1.0 (например: 0.8)"
f"❌ Неверное значение: {e}\n" "Введите число от 0.0 до 1.0 (например: 0.8)"
)
except Exception as e:
logger.error(f"Ошибка изменения порога публикации: {e}")
@@ -503,8 +501,7 @@ async def process_decline_threshold(
except ValueError as e:
await message.answer(
f"❌ Неверное значение: {e}\n"
"Введите число от 0.0 до 1.0 (например: 0.4)"
f"❌ Неверное значение: {e}\n" "Введите число от 0.0 до 1.0 (например: 0.4)"
)
except Exception as e:
logger.error(f"Ошибка изменения порога отклонения: {e}")

View File

@@ -7,6 +7,7 @@ except ImportError:
from aiogram import BaseMiddleware
from aiogram.types import TelegramObject
from helper_bot.utils.base_dependency_factory import get_global_instance
from helper_bot.utils.helper_func import check_access
from logs.custom_logger import logger

View File

@@ -6,6 +6,7 @@ from aiogram import F, Router, types
from aiogram.filters import Command, MagicData
from aiogram.fsm.context import FSMContext
from aiogram.types import FSInputFile
from helper_bot.filters.main import ChatTypeFilter
from helper_bot.middlewares.dependencies_middleware import DependenciesMiddleware

View File

@@ -3,6 +3,7 @@ from typing import Optional
from aiogram import types
from aiogram.fsm.context import FSMContext
from helper_bot.handlers.admin.exceptions import AdminError
from helper_bot.keyboards.keyboards import get_reply_keyboard_admin
from logs.custom_logger import logger

View File

@@ -7,6 +7,7 @@ from aiogram import F, Router
from aiogram.filters import MagicData
from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery
from helper_bot.handlers.admin.utils import format_user_info
from helper_bot.handlers.voice.constants import CALLBACK_DELETE, CALLBACK_SAVE
from helper_bot.handlers.voice.services import AudioFileService

View File

@@ -3,6 +3,7 @@ from typing import Callable
from aiogram import Bot
from aiogram.client.default import DefaultBotProperties
from aiogram.fsm.context import FSMContext
from helper_bot.utils.base_dependency_factory import get_global_instance
from .services import BanService, PostPublishService

View File

@@ -4,6 +4,7 @@ from typing import Any, Dict
from aiogram import Bot, types
from aiogram.types import CallbackQuery
from helper_bot.keyboards.keyboards import create_keyboard_for_ban_reason
from helper_bot.utils.helper_func import (
delete_user_blacklist,

View File

@@ -12,6 +12,7 @@ from typing import Any, Callable, Dict, Protocol, Union
# Third-party imports
from aiogram import types
from aiogram.types import FSInputFile
from database.models import TelegramPost, User
from helper_bot.keyboards import get_reply_keyboard_for_post
@@ -171,7 +172,9 @@ class UserService:
Returns:
Отформатированное сообщение для админов
"""
safe_full_name = html.escape(full_name) if full_name else "Неизвестный пользователь"
safe_full_name = (
html.escape(full_name) if full_name else "Неизвестный пользователь"
)
safe_username = html.escape(username) if username else None
safe_message_text = html.escape(message_text) if message_text else ""
@@ -198,7 +201,9 @@ class UserService:
# Получаем дату регистрации
user_info = await self.db.get_user_by_id(user_id)
if user_info and user_info.date_added:
date_added = datetime.fromtimestamp(user_info.date_added).strftime("%d.%m.%Y")
date_added = datetime.fromtimestamp(user_info.date_added).strftime(
"%d.%m.%Y"
)
else:
date_added = "Неизвестно"
@@ -332,9 +337,7 @@ class PostService:
if self.scoring_manager:
await self.scoring_manager.add_submitted_post(text, post_id, rag_score)
except Exception as e:
logger.warning(
f"PostService: Ошибка добавления поста в submitted: {e}"
)
logger.warning(f"PostService: Ошибка добавления поста в submitted: {e}")
async def _get_scores_with_error_handling(self, text: str) -> tuple:
"""
@@ -526,7 +529,9 @@ class PostService:
# Сохраняем скоры если есть
if ml_scores_json:
asyncio.create_task(
self._save_scores_background(sent_message.message_id, ml_scores_json)
self._save_scores_background(
sent_message.message_id, ml_scores_json
)
)
# Индексируем пост в RAG
@@ -544,7 +549,9 @@ class PostService:
text="Твой пост был выложен🥰",
)
except Exception as e:
logger.warning(f"PostService: Не удалось уведомить автора {author_id}: {e}")
logger.warning(
f"PostService: Не удалось уведомить автора {author_id}: {e}"
)
logger.info(
f"PostService: Пост авто-опубликован в {self.settings.main_public}, "
@@ -562,7 +569,9 @@ class PostService:
try:
await self.scoring_manager.on_post_declined(original_text)
except Exception as e:
logger.warning(f"PostService: Ошибка обучения RAG на отклоненном посте: {e}")
logger.warning(
f"PostService: Ошибка обучения RAG на отклоненном посте: {e}"
)
# Уведомляем автора
try:
@@ -1471,8 +1480,6 @@ class AutoModerationService:
text=message_text,
parse_mode="HTML",
)
logger.info(
f"AutoModeration: Лог отправлен в IMPORTANT_LOGS ({action})"
)
logger.info(f"AutoModeration: Лог отправлен в IMPORTANT_LOGS ({action})")
except Exception as e:
logger.error(f"AutoModeration: Ошибка отправки лога: {e}")

View File

@@ -7,6 +7,7 @@ from pathlib import Path
from typing import List, Optional, Tuple
from aiogram.types import FSInputFile
from helper_bot.handlers.voice.constants import (
MESSAGE_DELAY_1,
MESSAGE_DELAY_2,

View File

@@ -6,6 +6,7 @@ from aiogram import F, Router, types
from aiogram.filters import Command, MagicData, StateFilter
from aiogram.fsm.context import FSMContext
from aiogram.types import FSInputFile
from helper_bot.filters.main import ChatTypeFilter
from helper_bot.handlers.private.constants import BUTTON_TEXTS, FSM_STATES
from helper_bot.handlers.voice.constants import *

View File

@@ -6,6 +6,7 @@ from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.fsm.strategy import FSMStrategy
from helper_bot.handlers.admin import admin_router
from helper_bot.handlers.callback import callback_router
from helper_bot.handlers.group import group_router

View File

@@ -4,6 +4,7 @@ from typing import Any, Dict
from aiogram import BaseMiddleware, types
from aiogram.types import CallbackQuery, Message, TelegramObject
from helper_bot.utils.base_dependency_factory import get_global_instance
from logs.custom_logger import logger

View File

@@ -2,6 +2,7 @@ from typing import Any, Dict
from aiogram import BaseMiddleware
from aiogram.types import TelegramObject
from helper_bot.utils.base_dependency_factory import get_global_instance
from logs.custom_logger import logger

View File

@@ -7,6 +7,7 @@ from typing import Any, Awaitable, Callable, Dict, Union
from aiogram import BaseMiddleware
from aiogram.exceptions import TelegramAPIError, TelegramRetryAfter
from aiogram.types import CallbackQuery, ChatMemberUpdated, InlineQuery, Message, Update
from helper_bot.utils.rate_limiter import telegram_rate_limiter
from logs.custom_logger import logger

View File

@@ -9,6 +9,7 @@ import json
from typing import List, Optional
import httpx
from helper_bot.utils.metrics import track_errors, track_time
from logs.custom_logger import logger

View File

@@ -8,6 +8,7 @@ from dataclasses import dataclass
from typing import Any, Dict, List, Optional
import httpx
from helper_bot.utils.metrics import track_errors, track_time
from logs.custom_logger import logger
@@ -483,7 +484,10 @@ class RagApiClient:
@track_time("add_submitted_post", "rag_client")
async def add_submitted_post(
self, text: str, post_id: Optional[int] = None, rag_score: Optional[float] = None
self,
text: str,
post_id: Optional[int] = None,
rag_score: Optional[float] = None,
) -> bool:
"""
Добавляет пост в коллекцию submitted для поиска похожих.

View File

@@ -244,7 +244,10 @@ class ScoringManager:
@track_time("add_submitted_post", "scoring_manager")
async def add_submitted_post(
self, text: str, post_id: Optional[int] = None, rag_score: Optional[float] = None
self,
text: str,
post_id: Optional[int] = None,
rag_score: Optional[float] = None,
) -> bool:
"""
Добавляет пост в коллекцию submitted для поиска похожих.

View File

@@ -4,6 +4,7 @@ from typing import Optional
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger
from helper_bot.utils.base_dependency_factory import get_global_instance
from logs.custom_logger import logger

View File

@@ -2,8 +2,9 @@ import os
import sys
from typing import Optional
from database.async_db import AsyncBotDB
from dotenv import load_dotenv
from database.async_db import AsyncBotDB
from helper_bot.utils.s3_storage import S3StorageService
from logs.custom_logger import logger

View File

@@ -24,6 +24,7 @@ from aiogram.types import (
InputMediaPhoto,
InputMediaVideo,
)
from database.models import TelegramPost
from helper_bot.utils.base_dependency_factory import (
BaseDependencyFactory,
@@ -1065,7 +1066,9 @@ async def get_banned_users_list(offset: int, bot_db):
user_ids - лист кортежей [(user_name: user_id)]
"""
items_per_page = 9
users = await bot_db.get_banned_users_from_db_with_limits(limit=items_per_page, offset=offset)
users = await bot_db.get_banned_users_from_db_with_limits(
limit=items_per_page, offset=offset
)
message = "Список заблокированных пользователей:\n"
for user in users:

View File

@@ -8,6 +8,7 @@ from dataclasses import dataclass
from typing import Any, Callable, Dict, Optional
from aiogram.exceptions import TelegramAPIError, TelegramRetryAfter
from logs.custom_logger import logger
from .metrics import metrics

View File

@@ -8,6 +8,7 @@ from pathlib import Path
from typing import Optional
import aioboto3
from logs.custom_logger import logger

View File

@@ -67,16 +67,14 @@ async def main(db_path: str) -> None:
await conn.execute("PRAGMA foreign_keys = ON")
if not await table_exists(conn, "bot_settings"):
await conn.execute(
"""
await conn.execute("""
CREATE TABLE bot_settings (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
key TEXT NOT NULL UNIQUE,
value TEXT NOT NULL,
updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
)
"""
)
""")
logger.info("Таблица bot_settings создана")
for key, value in DEFAULT_SETTINGS:

View File

@@ -13,10 +13,10 @@ if str(_project_root) not in sys.path:
import pytest
from aiogram.fsm.context import FSMContext
from aiogram.types import Chat, Message, User
from database.async_db import AsyncBotDB
# Импортируем моки в самом начале
import tests.mocks
from database.async_db import AsyncBotDB
# Настройка pytest-asyncio
pytest_plugins = ("pytest_asyncio",)

View File

@@ -3,6 +3,7 @@ import tempfile
from datetime import datetime
import pytest
from database.models import UserMessage
from database.repositories.message_repository import MessageRepository

View File

@@ -5,6 +5,7 @@ from datetime import datetime
from unittest.mock import AsyncMock, Mock
import pytest
from database.models import MessageContentLink, PostContent, TelegramPost
from database.repositories.post_repository import PostRepository

View File

@@ -5,6 +5,7 @@
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from helper_bot.handlers.admin.dependencies import (
AdminAccessMiddleware,
get_bot_db,

View File

@@ -7,6 +7,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from aiogram import types
from aiogram.fsm.context import FSMContext
from helper_bot.handlers.admin.admin_handlers import (
admin_panel,
cancel_ban_process,

View File

@@ -3,6 +3,7 @@ from datetime import datetime
from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from database.models import Admin
from database.repositories.admin_repository import AdminRepository

View File

@@ -5,6 +5,7 @@
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from helper_bot.handlers.admin.exceptions import AdminError
from helper_bot.handlers.admin.utils import (
escape_html,

View File

@@ -6,6 +6,7 @@ import asyncio
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from helper_bot.middlewares.album_middleware import AlbumGetter, AlbumMiddleware

View File

@@ -1,6 +1,7 @@
from unittest.mock import AsyncMock, Mock, patch
import pytest
from database.async_db import AsyncBotDB

View File

@@ -3,6 +3,7 @@ from datetime import datetime
from unittest.mock import AsyncMock, MagicMock, Mock, mock_open, patch
import pytest
from helper_bot.handlers.voice.exceptions import DatabaseError, FileOperationError
from helper_bot.handlers.voice.services import AudioFileService

View File

@@ -3,6 +3,7 @@ from datetime import datetime, timezone
from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from database.models import AudioListenRecord, AudioMessage, AudioModerate
from database.repositories.audio_repository import AudioRepository

View File

@@ -3,6 +3,7 @@ from datetime import datetime, timezone
from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from database.repositories.audio_repository import AudioRepository

View File

@@ -3,6 +3,7 @@
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from helper_bot.handlers.private.services import AutoModerationService, BotSettings
@@ -108,9 +109,7 @@ class TestAutoModerationService:
assert result == "manual"
@pytest.mark.asyncio
async def test_check_auto_action_publish_at_exact_threshold(
self, service, mock_db
):
async def test_check_auto_action_publish_at_exact_threshold(self, service, mock_db):
"""Тест: возвращает publish когда score равен порогу."""
mock_db.get_auto_moderation_settings.return_value = {
"auto_publish_enabled": True,
@@ -124,9 +123,7 @@ class TestAutoModerationService:
assert result == "publish"
@pytest.mark.asyncio
async def test_check_auto_action_decline_at_exact_threshold(
self, service, mock_db
):
async def test_check_auto_action_decline_at_exact_threshold(self, service, mock_db):
"""Тест: возвращает decline когда score равен порогу."""
mock_db.get_auto_moderation_settings.return_value = {
"auto_publish_enabled": False,

View File

@@ -4,6 +4,7 @@ from datetime import datetime, timedelta, timezone
from unittest.mock import AsyncMock, Mock, patch
import pytest
from helper_bot.utils.auto_unban_scheduler import AutoUnbanScheduler

View File

@@ -3,6 +3,7 @@ from datetime import datetime, timedelta, timezone
from unittest.mock import AsyncMock, Mock, patch
import pytest
from helper_bot.utils.auto_unban_scheduler import (
AutoUnbanScheduler,
get_auto_unban_scheduler,

View File

@@ -3,6 +3,7 @@ from datetime import datetime
from unittest.mock import AsyncMock, Mock, patch
import pytest
from database.models import BlacklistHistoryRecord
from database.repositories.blacklist_history_repository import (
BlacklistHistoryRepository,

View File

@@ -6,6 +6,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from aiogram.types import CallbackQuery, Message
from helper_bot.middlewares.blacklist_middleware import BlacklistMiddleware

View File

@@ -3,6 +3,7 @@ from datetime import datetime
from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from database.models import BlacklistUser
from database.repositories.blacklist_repository import BlacklistRepository

View File

@@ -3,6 +3,7 @@
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from database.repositories.bot_settings_repository import BotSettingsRepository
@@ -115,11 +116,14 @@ class TestBotSettingsRepository:
@pytest.mark.asyncio
async def test_get_auto_moderation_settings(self, repository):
"""Тест получения всех настроек авто-модерации."""
with patch.object(
repository, "get_bool_setting", new_callable=AsyncMock
) as mock_bool, patch.object(
repository, "get_float_setting", new_callable=AsyncMock
) as mock_float:
with (
patch.object(
repository, "get_bool_setting", new_callable=AsyncMock
) as mock_bool,
patch.object(
repository, "get_float_setting", new_callable=AsyncMock
) as mock_float,
):
mock_bool.side_effect = [True, False]
mock_float.side_effect = [0.8, 0.4]
@@ -133,11 +137,14 @@ class TestBotSettingsRepository:
@pytest.mark.asyncio
async def test_toggle_auto_publish(self, repository):
"""Тест переключения авто-публикации."""
with patch.object(
repository, "get_bool_setting", new_callable=AsyncMock
) as mock_get, patch.object(
repository, "set_bool_setting", new_callable=AsyncMock
) as mock_set:
with (
patch.object(
repository, "get_bool_setting", new_callable=AsyncMock
) as mock_get,
patch.object(
repository, "set_bool_setting", new_callable=AsyncMock
) as mock_set,
):
mock_get.return_value = False
result = await repository.toggle_auto_publish()
@@ -148,11 +155,14 @@ class TestBotSettingsRepository:
@pytest.mark.asyncio
async def test_toggle_auto_decline(self, repository):
"""Тест переключения авто-отклонения."""
with patch.object(
repository, "get_bool_setting", new_callable=AsyncMock
) as mock_get, patch.object(
repository, "set_bool_setting", new_callable=AsyncMock
) as mock_set:
with (
patch.object(
repository, "get_bool_setting", new_callable=AsyncMock
) as mock_get,
patch.object(
repository, "set_bool_setting", new_callable=AsyncMock
) as mock_set,
):
mock_get.return_value = True
result = await repository.toggle_auto_decline()

View File

@@ -5,6 +5,7 @@
from unittest.mock import MagicMock, patch
import pytest
from helper_bot.handlers.callback.dependency_factory import (
get_ban_service,
get_post_publish_service,

View File

@@ -3,6 +3,7 @@ from datetime import datetime
from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from helper_bot.handlers.callback.callback_handlers import (
change_page,
delete_voice_message,

View File

@@ -6,6 +6,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from aiogram.types import CallbackQuery, Message
from helper_bot.handlers.callback.constants import CONTENT_TYPE_MEDIA_GROUP
from helper_bot.handlers.callback.exceptions import (
PostNotFoundError,

View File

@@ -6,6 +6,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from aiogram import types
from helper_bot.handlers.group.decorators import error_handler as group_error_handler
from helper_bot.handlers.private.decorators import (
error_handler as private_error_handler,

View File

@@ -5,6 +5,7 @@
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from helper_bot.services.scoring.deepseek_service import DeepSeekService
from helper_bot.services.scoring.exceptions import (
DeepSeekAPIError,

View File

@@ -5,6 +5,7 @@
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from helper_bot.middlewares.dependencies_middleware import DependenciesMiddleware

View File

@@ -8,6 +8,7 @@ from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from aiogram import types
from helper_bot.utils.helper_func import (
add_in_db_media,
add_in_db_media_mediagroup,

View File

@@ -7,6 +7,7 @@ from aiogram.types import (
KeyboardButton,
ReplyKeyboardMarkup,
)
from database.async_db import AsyncBotDB
from helper_bot.filters.main import ChatTypeFilter
from helper_bot.keyboards.keyboards import (

View File

@@ -6,6 +6,7 @@ import asyncio
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from helper_bot.main import start_bot, start_bot_with_retry

View File

@@ -3,6 +3,7 @@ from datetime import datetime
from unittest.mock import AsyncMock, MagicMock
import pytest
from database.models import UserMessage
from database.repositories.message_repository import MessageRepository

View File

@@ -4,6 +4,7 @@ import tempfile
from datetime import datetime
import pytest
from database.models import UserMessage
from database.repositories.message_repository import MessageRepository

View File

@@ -7,6 +7,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from aiogram.types import Message
from helper_bot.middlewares.metrics_middleware import (
DatabaseMetricsMiddleware,
ErrorMetricsMiddleware,

View File

@@ -3,6 +3,7 @@ from datetime import datetime
from unittest.mock import AsyncMock, MagicMock
import pytest
from database.models import MessageContentLink, PostContent, TelegramPost
from database.repositories.post_repository import PostRepository

View File

@@ -4,6 +4,7 @@ import tempfile
from datetime import datetime
import pytest
from database.models import MessageContentLink, PostContent, TelegramPost
from database.repositories.post_repository import PostRepository

View File

@@ -5,6 +5,7 @@ from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from aiogram import types
from database.models import TelegramPost, User
from helper_bot.handlers.private.services import BotSettings, PostService

View File

@@ -5,6 +5,7 @@
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from helper_bot.services.scoring.exceptions import (
InsufficientExamplesError,
ScoringError,

View File

@@ -6,6 +6,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from aiogram.types import CallbackQuery, Message, Update
from helper_bot.middlewares.rate_limit_middleware import RateLimitMiddleware

View File

@@ -7,6 +7,7 @@ from collections import deque
from unittest.mock import patch
import pytest
from helper_bot.utils.rate_limit_monitor import (
RateLimitMonitor,
RateLimitStats,

View File

@@ -7,6 +7,7 @@ import time
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from helper_bot.config.rate_limit_config import RateLimitSettings, get_rate_limit_config
from helper_bot.utils.rate_limit_monitor import (
RateLimitMonitor,

View File

@@ -3,6 +3,7 @@ from unittest.mock import AsyncMock, Mock, patch
import pytest
from aiogram import types
from aiogram.fsm.context import FSMContext
from helper_bot.handlers.admin.exceptions import (
InvalidInputError,
UserAlreadyBannedError,

View File

@@ -5,6 +5,7 @@ from unittest.mock import AsyncMock, MagicMock, Mock
import pytest
from aiogram import types
from aiogram.fsm.context import FSMContext
from helper_bot.handlers.group.constants import ERROR_MESSAGES, FSM_STATES
from helper_bot.handlers.group.exceptions import (
NoReplyToMessageError,

View File

@@ -5,6 +5,7 @@ from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from aiogram import types
from aiogram.fsm.context import FSMContext
from helper_bot.handlers.private.constants import BUTTON_TEXTS, FSM_STATES
from helper_bot.handlers.private.private_handlers import (
PrivateHandlers,

View File

@@ -7,6 +7,7 @@ from pathlib import Path
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from helper_bot.utils.s3_storage import S3StorageService

View File

@@ -137,6 +137,7 @@ class TestVectorStore:
"""Создает VectorStore для тестов."""
try:
import numpy as np
from helper_bot.services.scoring.vector_store import VectorStore
return VectorStore(vector_dim=768, max_examples=100)

View File

@@ -6,6 +6,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from aiohttp import web
from helper_bot.server_prometheus import (
MetricsServer,
start_metrics_server,

View File

@@ -5,6 +5,7 @@
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from helper_bot.middlewares.text_middleware import BulkTextMiddleware

View File

@@ -2,8 +2,9 @@ import os
from datetime import datetime
from unittest.mock import AsyncMock, Mock, patch
import helper_bot.utils.messages as messages # Import for patching constants
import pytest
import helper_bot.utils.messages as messages # Import for patching constants
from database.async_db import AsyncBotDB
from helper_bot.utils.base_dependency_factory import (
BaseDependencyFactory,

View File

@@ -3,6 +3,7 @@ from pathlib import Path
from unittest.mock import AsyncMock, Mock, patch
import pytest
from helper_bot.handlers.voice.exceptions import AudioProcessingError, VoiceMessageError
from helper_bot.handlers.voice.services import VoiceBotService
from helper_bot.handlers.voice.utils import (

View File

@@ -1,4 +1,5 @@
import pytest
from helper_bot.handlers.voice.constants import (
BTN_LISTEN,
BTN_SPEAK,

View File

@@ -1,4 +1,5 @@
import pytest
from helper_bot.handlers.voice.exceptions import (
AudioProcessingError,
VoiceBotError,

View File

@@ -3,6 +3,7 @@ from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from aiogram import types
from aiogram.fsm.context import FSMContext
from helper_bot.handlers.voice.constants import STATE_STANDUP_WRITE, STATE_START
from helper_bot.handlers.voice.voice_handler import VoiceHandlers

View File

@@ -3,6 +3,7 @@ from pathlib import Path
from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from helper_bot.handlers.voice.exceptions import AudioProcessingError, VoiceMessageError
from helper_bot.handlers.voice.services import VoiceBotService

View File

@@ -3,6 +3,7 @@ from unittest.mock import Mock, patch
import pytest
from aiogram import types
from helper_bot.handlers.voice.utils import (
format_time_ago,
get_last_message_text,