From 73c36061c7e878a0e7a5a280ae9bb7cb4c6572da Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 2 Feb 2026 00:54:23 +0300 Subject: [PATCH] one more fix --- .github/workflows/ci.yml | 3 +- database/__init__.py | 16 +++++- database/async_db.py | 14 ++++- database/base.py | 1 + database/repositories/migration_repository.py | 1 + database/repository_factory.py | 5 +- helper_bot/handlers/admin/__init__.py | 18 ++++-- helper_bot/handlers/admin/admin_handlers.py | 32 +++++++---- helper_bot/handlers/admin/dependencies.py | 1 + .../handlers/admin/rate_limit_handlers.py | 15 +++-- helper_bot/handlers/admin/services.py | 15 +++-- helper_bot/handlers/admin/utils.py | 1 + helper_bot/handlers/callback/__init__.py | 19 +++++-- .../handlers/callback/callback_handlers.py | 49 +++++++++++----- .../handlers/callback/dependency_factory.py | 1 + helper_bot/handlers/callback/services.py | 57 +++++++++++++------ helper_bot/handlers/group/__init__.py | 1 + helper_bot/handlers/group/decorators.py | 6 +- helper_bot/handlers/group/group_handlers.py | 3 + helper_bot/handlers/group/services.py | 2 + helper_bot/handlers/private/__init__.py | 4 +- helper_bot/handlers/private/decorators.py | 6 +- .../handlers/private/private_handlers.py | 13 +++-- helper_bot/handlers/private/services.py | 32 ++++++++--- helper_bot/handlers/voice/services.py | 28 +++++---- helper_bot/handlers/voice/voice_handler.py | 35 ++++++++---- helper_bot/keyboards/keyboards.py | 1 + helper_bot/main.py | 13 +++-- .../middlewares/blacklist_middleware.py | 1 + .../middlewares/dependencies_middleware.py | 1 + helper_bot/middlewares/metrics_middleware.py | 16 +++--- .../middlewares/rate_limit_middleware.py | 4 +- helper_bot/services/scoring/__init__.py | 11 +++- .../services/scoring/deepseek_service.py | 1 + helper_bot/services/scoring/rag_client.py | 4 +- .../services/scoring/scoring_manager.py | 3 +- helper_bot/utils/auto_unban_scheduler.py | 1 + helper_bot/utils/base_dependency_factory.py | 10 +++- helper_bot/utils/helper_func.py | 25 ++++++-- helper_bot/utils/metrics.py | 9 ++- helper_bot/utils/rate_limiter.py | 4 +- helper_bot/utils/s3_storage.py | 1 + run_helper.py | 3 +- tests/conftest.py | 2 +- tests/conftest_message_repository.py | 1 + tests/conftest_post_repository.py | 1 + tests/test_admin_dependencies.py | 8 ++- tests/test_admin_handlers.py | 23 ++++---- tests/test_admin_repository.py | 1 + tests/test_admin_utils.py | 13 +++-- tests/test_album_middleware.py | 4 +- tests/test_async_db.py | 1 + tests/test_audio_file_service.py | 4 +- tests/test_audio_repository.py | 1 + tests/test_audio_repository_schema.py | 1 + tests/test_auto_unban_integration.py | 1 + tests/test_auto_unban_scheduler.py | 7 ++- tests/test_blacklist_history_repository.py | 6 +- tests/test_blacklist_middleware.py | 1 + tests/test_blacklist_repository.py | 1 + tests/test_callback_dependency_factory.py | 8 ++- tests/test_callback_handlers.py | 10 +++- tests/test_callback_services.py | 14 +++-- tests/test_decorators.py | 9 +-- tests/test_deepseek_service.py | 9 ++- tests/test_dependencies_middleware.py | 4 +- tests/test_improved_media_processing.py | 8 ++- tests/test_keyboards_and_filters.py | 21 ++++--- tests/test_main.py | 1 + tests/test_message_repository.py | 1 + tests/test_message_repository_integration.py | 1 + tests/test_metrics_middleware.py | 6 +- tests/test_post_repository.py | 1 + tests/test_post_repository_integration.py | 1 + tests/test_post_service.py | 1 + tests/test_rag_client.py | 9 ++- tests/test_rate_limit_middleware.py | 1 + tests/test_rate_limit_monitor.py | 11 ++-- tests/test_rate_limiter.py | 24 +++++--- tests/test_refactored_admin_handlers.py | 9 ++- tests/test_refactored_group_handlers.py | 13 +++-- tests/test_refactored_private_handlers.py | 5 +- tests/test_s3_storage.py | 1 + tests/test_scoring_services.py | 19 ++++--- tests/test_server_prometheus.py | 8 ++- tests/test_text_middleware.py | 1 + tests/test_utils.py | 44 ++++++++++---- tests/test_voice_bot_architecture.py | 12 ++-- tests/test_voice_constants.py | 28 +++++---- tests/test_voice_exceptions.py | 9 ++- tests/test_voice_handler.py | 4 +- tests/test_voice_services.py | 4 +- tests/test_voice_utils.py | 12 ++-- 93 files changed, 594 insertions(+), 277 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e23323..795ec38 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,8 @@ jobs: python -m black . echo "🔍 Checking that repo is already formatted (no diff after isort+black)..." git diff --exit-code || ( - echo "❌ Code style drift. Locally run: isort . && black . && git add -A && git commit -m 'style: isort + black'" + echo "❌ Code style drift. From THIS repo root (telegram-helper-bot) run:" + echo " python -m isort . && python -m black . && git add -A && git commit -m 'style: isort + black'" exit 1 ) diff --git a/database/__init__.py b/database/__init__.py index 766c4da..ae0cdc6 100644 --- a/database/__init__.py +++ b/database/__init__.py @@ -11,9 +11,19 @@ from .async_db import AsyncBotDB from .base import DatabaseConnection -from .models import (Admin, AudioListenRecord, AudioMessage, AudioModerate, - BlacklistUser, MessageContentLink, Migration, PostContent, - TelegramPost, User, UserMessage) +from .models import ( + Admin, + AudioListenRecord, + AudioMessage, + AudioModerate, + BlacklistUser, + MessageContentLink, + Migration, + PostContent, + TelegramPost, + User, + UserMessage, +) from .repository_factory import RepositoryFactory # Для обратной совместимости экспортируем старый интерфейс diff --git a/database/async_db.py b/database/async_db.py index 8767e4d..39bdf94 100644 --- a/database/async_db.py +++ b/database/async_db.py @@ -2,9 +2,17 @@ from datetime import datetime from typing import Any, Dict, List, Optional, Tuple import aiosqlite -from database.models import (Admin, AudioMessage, BlacklistHistoryRecord, - BlacklistUser, PostContent, TelegramPost, User, - UserMessage) + +from database.models import ( + Admin, + AudioMessage, + BlacklistHistoryRecord, + BlacklistUser, + PostContent, + TelegramPost, + User, + UserMessage, +) from database.repository_factory import RepositoryFactory diff --git a/database/base.py b/database/base.py index 4fb6fb0..ca32425 100644 --- a/database/base.py +++ b/database/base.py @@ -2,6 +2,7 @@ import os from typing import Optional import aiosqlite + from logs.custom_logger import logger diff --git a/database/repositories/migration_repository.py b/database/repositories/migration_repository.py index 628ecee..8c7a02b 100644 --- a/database/repositories/migration_repository.py +++ b/database/repositories/migration_repository.py @@ -1,6 +1,7 @@ """Репозиторий для работы с миграциями базы данных.""" import aiosqlite + from database.base import DatabaseConnection diff --git a/database/repository_factory.py b/database/repository_factory.py index e2c462f..d218f21 100644 --- a/database/repository_factory.py +++ b/database/repository_factory.py @@ -2,8 +2,9 @@ from typing import Optional from database.repositories.admin_repository import AdminRepository from database.repositories.audio_repository import AudioRepository -from database.repositories.blacklist_history_repository import \ - BlacklistHistoryRepository +from database.repositories.blacklist_history_repository import ( + BlacklistHistoryRepository, +) from database.repositories.blacklist_repository import BlacklistRepository from database.repositories.message_repository import MessageRepository from database.repositories.migration_repository import MigrationRepository diff --git a/helper_bot/handlers/admin/__init__.py b/helper_bot/handlers/admin/__init__.py index dbcf322..4b9d6f2 100644 --- a/helper_bot/handlers/admin/__init__.py +++ b/helper_bot/handlers/admin/__init__.py @@ -1,10 +1,20 @@ from .admin_handlers import admin_router from .dependencies import AdminAccessMiddleware, BotDB, Settings -from .exceptions import (AdminAccessDeniedError, AdminError, InvalidInputError, - UserAlreadyBannedError, UserNotFoundError) +from .exceptions import ( + AdminAccessDeniedError, + AdminError, + InvalidInputError, + UserAlreadyBannedError, + UserNotFoundError, +) from .services import AdminService, BannedUser, User -from .utils import (escape_html, format_ban_confirmation, format_user_info, - handle_admin_error, return_to_admin_menu) +from .utils import ( + escape_html, + format_ban_confirmation, + format_user_info, + handle_admin_error, + return_to_admin_menu, +) __all__ = [ "admin_router", diff --git a/helper_bot/handlers/admin/admin_handlers.py b/helper_bot/handlers/admin/admin_handlers.py index 063777e..66d0519 100644 --- a/helper_bot/handlers/admin/admin_handlers.py +++ b/helper_bot/handlers/admin/admin_handlers.py @@ -1,22 +1,30 @@ 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 (InvalidInputError, - UserAlreadyBannedError) +from helper_bot.handlers.admin.exceptions import ( + InvalidInputError, + UserAlreadyBannedError, +) from helper_bot.handlers.admin.services import AdminService -from helper_bot.handlers.admin.utils import (escape_html, - format_ban_confirmation, - format_user_info, - handle_admin_error, - return_to_admin_menu) -from helper_bot.keyboards.keyboards import (create_keyboard_for_approve_ban, - create_keyboard_for_ban_days, - create_keyboard_for_ban_reason, - create_keyboard_with_pagination, - get_reply_keyboard_admin) +from helper_bot.handlers.admin.utils import ( + escape_html, + format_ban_confirmation, + format_user_info, + handle_admin_error, + return_to_admin_menu, +) +from helper_bot.keyboards.keyboards import ( + create_keyboard_for_approve_ban, + create_keyboard_for_ban_days, + create_keyboard_for_ban_reason, + create_keyboard_with_pagination, + get_reply_keyboard_admin, +) from helper_bot.utils.base_dependency_factory import get_global_instance + # Local imports - metrics from helper_bot.utils.metrics import db_query_time, track_errors, track_time from logs.custom_logger import logger diff --git a/helper_bot/handlers/admin/dependencies.py b/helper_bot/handlers/admin/dependencies.py index 9774837..89a486f 100644 --- a/helper_bot/handlers/admin/dependencies.py +++ b/helper_bot/handlers/admin/dependencies.py @@ -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 diff --git a/helper_bot/handlers/admin/rate_limit_handlers.py b/helper_bot/handlers/admin/rate_limit_handlers.py index 8ec4e5c..2837121 100644 --- a/helper_bot/handlers/admin/rate_limit_handlers.py +++ b/helper_bot/handlers/admin/rate_limit_handlers.py @@ -6,15 +6,20 @@ 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 +from helper_bot.middlewares.dependencies_middleware import DependenciesMiddleware + # Local imports - metrics from helper_bot.utils.metrics import track_errors, track_time from helper_bot.utils.rate_limit_metrics import ( - get_rate_limit_metrics_summary, update_rate_limit_gauges) -from helper_bot.utils.rate_limit_monitor import (get_rate_limit_summary, - rate_limit_monitor) + get_rate_limit_metrics_summary, + update_rate_limit_gauges, +) +from helper_bot.utils.rate_limit_monitor import ( + get_rate_limit_summary, + rate_limit_monitor, +) from logs.custom_logger import logger diff --git a/helper_bot/handlers/admin/services.py b/helper_bot/handlers/admin/services.py index e8b760f..6eb625e 100644 --- a/helper_bot/handlers/admin/services.py +++ b/helper_bot/handlers/admin/services.py @@ -1,11 +1,16 @@ from datetime import datetime from typing import List, Optional -from helper_bot.handlers.admin.exceptions import (InvalidInputError, - UserAlreadyBannedError) -from helper_bot.utils.helper_func import (add_days_to_date, - get_banned_users_buttons, - get_banned_users_list) +from helper_bot.handlers.admin.exceptions import ( + InvalidInputError, + UserAlreadyBannedError, +) +from helper_bot.utils.helper_func import ( + add_days_to_date, + get_banned_users_buttons, + get_banned_users_list, +) + # Local imports - metrics from helper_bot.utils.metrics import track_errors, track_time from logs.custom_logger import logger diff --git a/helper_bot/handlers/admin/utils.py b/helper_bot/handlers/admin/utils.py index b9cf51c..74fea5c 100644 --- a/helper_bot/handlers/admin/utils.py +++ b/helper_bot/handlers/admin/utils.py @@ -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 diff --git a/helper_bot/handlers/callback/__init__.py b/helper_bot/handlers/callback/__init__.py index 0feae62..ccb7ddd 100644 --- a/helper_bot/handlers/callback/__init__.py +++ b/helper_bot/handlers/callback/__init__.py @@ -1,8 +1,19 @@ from .callback_handlers import callback_router -from .constants import (CALLBACK_BAN, CALLBACK_DECLINE, CALLBACK_PAGE, - CALLBACK_PUBLISH, CALLBACK_RETURN, CALLBACK_UNLOCK) -from .exceptions import (BanError, PostNotFoundError, PublishError, - UserBlockedBotError, UserNotFoundError) +from .constants import ( + CALLBACK_BAN, + CALLBACK_DECLINE, + CALLBACK_PAGE, + CALLBACK_PUBLISH, + CALLBACK_RETURN, + CALLBACK_UNLOCK, +) +from .exceptions import ( + BanError, + PostNotFoundError, + PublishError, + UserBlockedBotError, + UserNotFoundError, +) from .services import BanService, PostPublishService __all__ = [ diff --git a/helper_bot/handlers/callback/callback_handlers.py b/helper_bot/handlers/callback/callback_handlers.py index fdafe03..d156184 100644 --- a/helper_bot/handlers/callback/callback_handlers.py +++ b/helper_bot/handlers/callback/callback_handlers.py @@ -7,28 +7,49 @@ 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 -from helper_bot.keyboards.keyboards import (create_keyboard_for_ban_reason, - create_keyboard_with_pagination, - get_reply_keyboard_admin) +from helper_bot.keyboards.keyboards import ( + create_keyboard_for_ban_reason, + create_keyboard_with_pagination, + get_reply_keyboard_admin, +) from helper_bot.utils.base_dependency_factory import get_global_instance -from helper_bot.utils.helper_func import (get_banned_users_buttons, - get_banned_users_list) +from helper_bot.utils.helper_func import get_banned_users_buttons, get_banned_users_list + # Local imports - metrics -from helper_bot.utils.metrics import (db_query_time, track_errors, - track_file_operations, track_time) +from helper_bot.utils.metrics import ( + db_query_time, + track_errors, + track_file_operations, + track_time, +) from logs.custom_logger import logger -from .constants import (CALLBACK_BAN, CALLBACK_DECLINE, CALLBACK_PAGE, - CALLBACK_PUBLISH, CALLBACK_RETURN, CALLBACK_UNLOCK, - ERROR_BOT_BLOCKED, MESSAGE_DECLINED, MESSAGE_ERROR, - MESSAGE_PUBLISHED, MESSAGE_USER_BANNED, - MESSAGE_USER_UNLOCKED) +from .constants import ( + CALLBACK_BAN, + CALLBACK_DECLINE, + CALLBACK_PAGE, + CALLBACK_PUBLISH, + CALLBACK_RETURN, + CALLBACK_UNLOCK, + ERROR_BOT_BLOCKED, + MESSAGE_DECLINED, + MESSAGE_ERROR, + MESSAGE_PUBLISHED, + MESSAGE_USER_BANNED, + MESSAGE_USER_UNLOCKED, +) from .dependency_factory import get_ban_service, get_post_publish_service -from .exceptions import (BanError, PostNotFoundError, PublishError, - UserBlockedBotError, UserNotFoundError) +from .exceptions import ( + BanError, + PostNotFoundError, + PublishError, + UserBlockedBotError, + UserNotFoundError, +) callback_router = Router() diff --git a/helper_bot/handlers/callback/dependency_factory.py b/helper_bot/handlers/callback/dependency_factory.py index 3a4ca99..a8b376f 100644 --- a/helper_bot/handlers/callback/dependency_factory.py +++ b/helper_bot/handlers/callback/dependency_factory.py @@ -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 diff --git a/helper_bot/handlers/callback/services.py b/helper_bot/handlers/callback/services.py index 7088a5d..f9aff0d 100644 --- a/helper_bot/handlers/callback/services.py +++ b/helper_bot/handlers/callback/services.py @@ -4,28 +4,49 @@ 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, - get_text_message, send_audio_message, - send_media_group_to_channel, - send_photo_message, - send_text_message, - send_video_message, - send_video_note_message, - send_voice_message) +from helper_bot.utils.helper_func import ( + delete_user_blacklist, + get_text_message, + send_audio_message, + send_media_group_to_channel, + send_photo_message, + send_text_message, + send_video_message, + send_video_note_message, + send_voice_message, +) + # Local imports - metrics -from helper_bot.utils.metrics import (db_query_time, track_errors, - track_media_processing, track_time) +from helper_bot.utils.metrics import ( + db_query_time, + track_errors, + track_media_processing, + track_time, +) from logs.custom_logger import logger -from .constants import (CONTENT_TYPE_AUDIO, CONTENT_TYPE_MEDIA_GROUP, - CONTENT_TYPE_PHOTO, CONTENT_TYPE_TEXT, - CONTENT_TYPE_VIDEO, CONTENT_TYPE_VIDEO_NOTE, - CONTENT_TYPE_VOICE, ERROR_BOT_BLOCKED, - MESSAGE_POST_DECLINED, MESSAGE_POST_PUBLISHED, - MESSAGE_USER_BANNED_SPAM) -from .exceptions import (BanError, PostNotFoundError, PublishError, - UserBlockedBotError, UserNotFoundError) +from .constants import ( + CONTENT_TYPE_AUDIO, + CONTENT_TYPE_MEDIA_GROUP, + CONTENT_TYPE_PHOTO, + CONTENT_TYPE_TEXT, + CONTENT_TYPE_VIDEO, + CONTENT_TYPE_VIDEO_NOTE, + CONTENT_TYPE_VOICE, + ERROR_BOT_BLOCKED, + MESSAGE_POST_DECLINED, + MESSAGE_POST_PUBLISHED, + MESSAGE_USER_BANNED_SPAM, +) +from .exceptions import ( + BanError, + PostNotFoundError, + PublishError, + UserBlockedBotError, + UserNotFoundError, +) class PostPublishService: diff --git a/helper_bot/handlers/group/__init__.py b/helper_bot/handlers/group/__init__.py index e838c10..a060f32 100644 --- a/helper_bot/handlers/group/__init__.py +++ b/helper_bot/handlers/group/__init__.py @@ -6,6 +6,7 @@ from .constants import ERROR_MESSAGES, FSM_STATES from .decorators import error_handler from .exceptions import NoReplyToMessageError, UserNotFoundError from .group_handlers import GroupHandlers, create_group_handlers, group_router + # Local imports - services from .services import AdminReplyService, DatabaseProtocol diff --git a/helper_bot/handlers/group/decorators.py b/helper_bot/handlers/group/decorators.py index b451b43..b1511a0 100644 --- a/helper_bot/handlers/group/decorators.py +++ b/helper_bot/handlers/group/decorators.py @@ -6,6 +6,7 @@ from typing import Any, Callable # Third-party imports from aiogram import types + # Local imports from logs.custom_logger import logger @@ -24,8 +25,9 @@ def error_handler(func: Callable[..., Any]) -> Callable[..., Any]: (arg for arg in args if isinstance(arg, types.Message)), None ) if message and hasattr(message, "bot"): - from helper_bot.utils.base_dependency_factory import \ - get_global_instance + from helper_bot.utils.base_dependency_factory import ( + get_global_instance, + ) bdf = get_global_instance() important_logs = bdf.settings["Telegram"]["important_logs"] diff --git a/helper_bot/handlers/group/group_handlers.py b/helper_bot/handlers/group/group_handlers.py index 1ee2f70..c21fddc 100644 --- a/helper_bot/handlers/group/group_handlers.py +++ b/helper_bot/handlers/group/group_handlers.py @@ -3,11 +3,14 @@ # Third-party imports from aiogram import Router, types from aiogram.fsm.context import FSMContext + # Local imports - filters from database.async_db import AsyncBotDB from helper_bot.filters.main import ChatTypeFilter + # Local imports - metrics from helper_bot.utils.metrics import metrics, track_errors, track_time + # Local imports - utilities from logs.custom_logger import logger diff --git a/helper_bot/handlers/group/services.py b/helper_bot/handlers/group/services.py index 4600329..934887b 100644 --- a/helper_bot/handlers/group/services.py +++ b/helper_bot/handlers/group/services.py @@ -5,8 +5,10 @@ from typing import Optional, Protocol # Third-party imports from aiogram import types + # Local imports from helper_bot.utils.helper_func import send_text_message + # Local imports - metrics from helper_bot.utils.metrics import db_query_time, track_errors, track_time from logs.custom_logger import logger diff --git a/helper_bot/handlers/private/__init__.py b/helper_bot/handlers/private/__init__.py index e5c549b..0a8be50 100644 --- a/helper_bot/handlers/private/__init__.py +++ b/helper_bot/handlers/private/__init__.py @@ -4,8 +4,8 @@ # Local imports - constants and utilities from .constants import BUTTON_TEXTS, ERROR_MESSAGES, FSM_STATES from .decorators import error_handler -from .private_handlers import (PrivateHandlers, create_private_handlers, - private_router) +from .private_handlers import PrivateHandlers, create_private_handlers, private_router + # Local imports - services from .services import BotSettings, PostService, StickerService, UserService diff --git a/helper_bot/handlers/private/decorators.py b/helper_bot/handlers/private/decorators.py index 3629e24..1adabc0 100644 --- a/helper_bot/handlers/private/decorators.py +++ b/helper_bot/handlers/private/decorators.py @@ -6,6 +6,7 @@ from typing import Any, Callable # Third-party imports from aiogram import types + # Local imports from logs.custom_logger import logger @@ -24,8 +25,9 @@ def error_handler(func: Callable[..., Any]) -> Callable[..., Any]: (arg for arg in args if isinstance(arg, types.Message)), None ) if message and hasattr(message, "bot"): - from helper_bot.utils.base_dependency_factory import \ - get_global_instance + from helper_bot.utils.base_dependency_factory import ( + get_global_instance, + ) bdf = get_global_instance() important_logs = bdf.settings["Telegram"]["important_logs"] diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index b8a7d11..c8d0f8b 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -8,18 +8,23 @@ from datetime import datetime from aiogram import F, Router, types from aiogram.filters import Command, StateFilter from aiogram.fsm.context import FSMContext + # Local imports - filters and middlewares from database.async_db import AsyncBotDB from helper_bot.filters.main import ChatTypeFilter + # Local imports - utilities -from helper_bot.keyboards import (get_reply_keyboard, - get_reply_keyboard_for_post) +from helper_bot.keyboards import get_reply_keyboard, get_reply_keyboard_for_post from helper_bot.keyboards.keyboards import get_reply_keyboard_leave_chat from helper_bot.middlewares.album_middleware import AlbumMiddleware from helper_bot.middlewares.blacklist_middleware import BlacklistMiddleware from helper_bot.utils import messages -from helper_bot.utils.helper_func import (check_user_emoji, get_first_name, - update_user_info) +from helper_bot.utils.helper_func import ( + check_user_emoji, + get_first_name, + update_user_info, +) + # Local imports - metrics from helper_bot.utils.metrics import db_query_time, track_errors, track_time diff --git a/helper_bot/handlers/private/services.py b/helper_bot/handlers/private/services.py index 9aec98b..b369484 100644 --- a/helper_bot/handlers/private/services.py +++ b/helper_bot/handlers/private/services.py @@ -12,19 +12,35 @@ 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 + # Local imports - utilities from helper_bot.utils.helper_func import ( - add_in_db_media, check_username_and_full_name, determine_anonymity, - get_first_name, get_text_message, prepare_media_group_from_middlewares, - send_audio_message, send_media_group_message_to_private_chat, - send_photo_message, send_text_message, send_video_message, - send_video_note_message, send_voice_message) + add_in_db_media, + check_username_and_full_name, + determine_anonymity, + get_first_name, + get_text_message, + prepare_media_group_from_middlewares, + send_audio_message, + send_media_group_message_to_private_chat, + send_photo_message, + send_text_message, + send_video_message, + send_video_note_message, + send_voice_message, +) + # Local imports - metrics -from helper_bot.utils.metrics import (db_query_time, track_errors, - track_file_operations, - track_media_processing, track_time) +from helper_bot.utils.metrics import ( + db_query_time, + track_errors, + track_file_operations, + track_media_processing, + track_time, +) from logs.custom_logger import logger diff --git a/helper_bot/handlers/voice/services.py b/helper_bot/handlers/voice/services.py index 5ec8890..36808ee 100644 --- a/helper_bot/handlers/voice/services.py +++ b/helper_bot/handlers/voice/services.py @@ -7,16 +7,24 @@ 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, - MESSAGE_DELAY_3, - MESSAGE_DELAY_4, STICK_DIR, - STICK_PATTERN, STICKER_DELAY, - VOICE_USERS_DIR) -from helper_bot.handlers.voice.exceptions import (AudioProcessingError, - DatabaseError, - FileOperationError, - VoiceMessageError) + +from helper_bot.handlers.voice.constants import ( + MESSAGE_DELAY_1, + MESSAGE_DELAY_2, + MESSAGE_DELAY_3, + MESSAGE_DELAY_4, + STICK_DIR, + STICK_PATTERN, + STICKER_DELAY, + VOICE_USERS_DIR, +) +from helper_bot.handlers.voice.exceptions import ( + AudioProcessingError, + DatabaseError, + FileOperationError, + VoiceMessageError, +) + # Local imports - metrics from helper_bot.utils.metrics import db_query_time, track_errors, track_time from logs.custom_logger import logger diff --git a/helper_bot/handlers/voice/voice_handler.py b/helper_bot/handlers/voice/voice_handler.py index 5f2193e..3ea223e 100644 --- a/helper_bot/handlers/voice/voice_handler.py +++ b/helper_bot/handlers/voice/voice_handler.py @@ -6,25 +6,38 @@ 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 * from helper_bot.handlers.voice.services import VoiceBotService -from helper_bot.handlers.voice.utils import (get_last_message_text, - get_user_emoji_safe, - validate_voice_message) +from helper_bot.handlers.voice.utils import ( + get_last_message_text, + get_user_emoji_safe, + validate_voice_message, +) from helper_bot.keyboards import get_reply_keyboard -from helper_bot.keyboards.keyboards import (get_main_keyboard, - get_reply_keyboard_for_voice) +from helper_bot.keyboards.keyboards import ( + get_main_keyboard, + get_reply_keyboard_for_voice, +) from helper_bot.middlewares.blacklist_middleware import BlacklistMiddleware -from helper_bot.middlewares.dependencies_middleware import \ - DependenciesMiddleware +from helper_bot.middlewares.dependencies_middleware import DependenciesMiddleware from helper_bot.utils import messages -from helper_bot.utils.helper_func import (check_user_emoji, get_first_name, - send_voice_message, update_user_info) +from helper_bot.utils.helper_func import ( + check_user_emoji, + get_first_name, + send_voice_message, + update_user_info, +) + # Local imports - metrics -from helper_bot.utils.metrics import (db_query_time, track_errors, - track_file_operations, track_time) +from helper_bot.utils.metrics import ( + db_query_time, + track_errors, + track_file_operations, + track_time, +) from logs.custom_logger import logger diff --git a/helper_bot/keyboards/keyboards.py b/helper_bot/keyboards/keyboards.py index bb12f54..ed605ad 100644 --- a/helper_bot/keyboards/keyboards.py +++ b/helper_bot/keyboards/keyboards.py @@ -1,5 +1,6 @@ from aiogram import types from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardBuilder + # Local imports - metrics from helper_bot.utils.metrics import track_errors, track_time diff --git a/helper_bot/main.py b/helper_bot/main.py index 120d25d..f055db6 100644 --- a/helper_bot/main.py +++ b/helper_bot/main.py @@ -6,19 +6,20 @@ 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 from helper_bot.handlers.private import private_router from helper_bot.handlers.voice import VoiceHandlers from helper_bot.middlewares.blacklist_middleware import BlacklistMiddleware -from helper_bot.middlewares.dependencies_middleware import \ - DependenciesMiddleware -from helper_bot.middlewares.metrics_middleware import (ErrorMetricsMiddleware, - MetricsMiddleware) +from helper_bot.middlewares.dependencies_middleware import DependenciesMiddleware +from helper_bot.middlewares.metrics_middleware import ( + ErrorMetricsMiddleware, + MetricsMiddleware, +) from helper_bot.middlewares.rate_limit_middleware import RateLimitMiddleware -from helper_bot.server_prometheus import (start_metrics_server, - stop_metrics_server) +from helper_bot.server_prometheus import start_metrics_server, stop_metrics_server async def start_bot_with_retry( diff --git a/helper_bot/middlewares/blacklist_middleware.py b/helper_bot/middlewares/blacklist_middleware.py index 05bdd17..32279e2 100644 --- a/helper_bot/middlewares/blacklist_middleware.py +++ b/helper_bot/middlewares/blacklist_middleware.py @@ -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 diff --git a/helper_bot/middlewares/dependencies_middleware.py b/helper_bot/middlewares/dependencies_middleware.py index ce266c0..d18c28c 100644 --- a/helper_bot/middlewares/dependencies_middleware.py +++ b/helper_bot/middlewares/dependencies_middleware.py @@ -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 diff --git a/helper_bot/middlewares/metrics_middleware.py b/helper_bot/middlewares/metrics_middleware.py index b5465a9..2564b86 100644 --- a/helper_bot/middlewares/metrics_middleware.py +++ b/helper_bot/middlewares/metrics_middleware.py @@ -16,16 +16,16 @@ from ..utils.metrics import metrics # Import button command mapping try: - from ..handlers.admin.constants import (ADMIN_BUTTON_COMMAND_MAPPING, - ADMIN_COMMANDS) + from ..handlers.admin.constants import ADMIN_BUTTON_COMMAND_MAPPING, ADMIN_COMMANDS from ..handlers.callback.constants import CALLBACK_COMMAND_MAPPING from ..handlers.private.constants import BUTTON_COMMAND_MAPPING - from ..handlers.voice.constants import \ - BUTTON_COMMAND_MAPPING as VOICE_BUTTON_COMMAND_MAPPING - from ..handlers.voice.constants import \ - CALLBACK_COMMAND_MAPPING as VOICE_CALLBACK_COMMAND_MAPPING - from ..handlers.voice.constants import \ - COMMAND_MAPPING as VOICE_COMMAND_MAPPING + from ..handlers.voice.constants import ( + BUTTON_COMMAND_MAPPING as VOICE_BUTTON_COMMAND_MAPPING, + ) + from ..handlers.voice.constants import ( + CALLBACK_COMMAND_MAPPING as VOICE_CALLBACK_COMMAND_MAPPING, + ) + from ..handlers.voice.constants import COMMAND_MAPPING as VOICE_COMMAND_MAPPING except ImportError: # Fallback if constants not available BUTTON_COMMAND_MAPPING = {} diff --git a/helper_bot/middlewares/rate_limit_middleware.py b/helper_bot/middlewares/rate_limit_middleware.py index 8800e73..c50ef88 100644 --- a/helper_bot/middlewares/rate_limit_middleware.py +++ b/helper_bot/middlewares/rate_limit_middleware.py @@ -6,8 +6,8 @@ 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 aiogram.types import CallbackQuery, ChatMemberUpdated, InlineQuery, Message, Update + from helper_bot.utils.rate_limiter import telegram_rate_limiter from logs.custom_logger import logger diff --git a/helper_bot/services/scoring/__init__.py b/helper_bot/services/scoring/__init__.py index 6a1d156..33ee5f7 100644 --- a/helper_bot/services/scoring/__init__.py +++ b/helper_bot/services/scoring/__init__.py @@ -9,9 +9,14 @@ from .base import CombinedScore, ScoringResult, ScoringServiceProtocol from .deepseek_service import DeepSeekService -from .exceptions import (DeepSeekAPIError, InsufficientExamplesError, - ModelNotLoadedError, ScoringError, TextTooShortError, - VectorStoreError) +from .exceptions import ( + DeepSeekAPIError, + InsufficientExamplesError, + ModelNotLoadedError, + ScoringError, + TextTooShortError, + VectorStoreError, +) from .rag_client import RagApiClient from .scoring_manager import ScoringManager diff --git a/helper_bot/services/scoring/deepseek_service.py b/helper_bot/services/scoring/deepseek_service.py index a365323..4f9cc23 100644 --- a/helper_bot/services/scoring/deepseek_service.py +++ b/helper_bot/services/scoring/deepseek_service.py @@ -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 diff --git a/helper_bot/services/scoring/rag_client.py b/helper_bot/services/scoring/rag_client.py index b0f868f..513a929 100644 --- a/helper_bot/services/scoring/rag_client.py +++ b/helper_bot/services/scoring/rag_client.py @@ -7,12 +7,12 @@ HTTP клиент для взаимодействия с внешним RAG се from typing import Any, Dict, Optional import httpx + from helper_bot.utils.metrics import track_errors, track_time from logs.custom_logger import logger from .base import ScoringResult -from .exceptions import (InsufficientExamplesError, ScoringError, - TextTooShortError) +from .exceptions import InsufficientExamplesError, ScoringError, TextTooShortError class RagApiClient: diff --git a/helper_bot/services/scoring/scoring_manager.py b/helper_bot/services/scoring/scoring_manager.py index 3c0c968..6761176 100644 --- a/helper_bot/services/scoring/scoring_manager.py +++ b/helper_bot/services/scoring/scoring_manager.py @@ -13,8 +13,7 @@ from logs.custom_logger import logger from .base import CombinedScore, ScoringResult from .deepseek_service import DeepSeekService -from .exceptions import (InsufficientExamplesError, ScoringError, - TextTooShortError) +from .exceptions import InsufficientExamplesError, ScoringError, TextTooShortError from .rag_client import RagApiClient diff --git a/helper_bot/utils/auto_unban_scheduler.py b/helper_bot/utils/auto_unban_scheduler.py index d46a688..91550b5 100644 --- a/helper_bot/utils/auto_unban_scheduler.py +++ b/helper_bot/utils/auto_unban_scheduler.py @@ -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 diff --git a/helper_bot/utils/base_dependency_factory.py b/helper_bot/utils/base_dependency_factory.py index 2edb100..e3e1971 100644 --- a/helper_bot/utils/base_dependency_factory.py +++ b/helper_bot/utils/base_dependency_factory.py @@ -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 @@ -141,8 +142,11 @@ class BaseDependencyFactory: Вызывается лениво при первом обращении к get_scoring_manager(). """ - from helper_bot.services.scoring import (DeepSeekService, RagApiClient, - ScoringManager) + from helper_bot.services.scoring import ( + DeepSeekService, + RagApiClient, + ScoringManager, + ) scoring_config = self.settings["Scoring"] diff --git a/helper_bot/utils/helper_func.py b/helper_bot/utils/helper_func.py index 483672e..39aab76 100644 --- a/helper_bot/utils/helper_func.py +++ b/helper_bot/utils/helper_func.py @@ -17,16 +17,29 @@ except ImportError: _emoji_lib_available = False from aiogram import types -from aiogram.types import (FSInputFile, InputMediaAudio, InputMediaDocument, - InputMediaPhoto, InputMediaVideo) +from aiogram.types import ( + FSInputFile, + InputMediaAudio, + InputMediaDocument, + InputMediaPhoto, + InputMediaVideo, +) + from database.models import TelegramPost -from helper_bot.utils.base_dependency_factory import (BaseDependencyFactory, - get_global_instance) +from helper_bot.utils.base_dependency_factory import ( + BaseDependencyFactory, + get_global_instance, +) from logs.custom_logger import logger # Local imports - metrics -from .metrics import (db_query_time, track_errors, track_file_operations, - track_media_processing, track_time) +from .metrics import ( + db_query_time, + track_errors, + track_file_operations, + track_media_processing, + track_time, +) bdf = get_global_instance() # TODO: поменять архитектуру и подключить правильный BotDB diff --git a/helper_bot/utils/metrics.py b/helper_bot/utils/metrics.py index 18c2f42..b416b8c 100644 --- a/helper_bot/utils/metrics.py +++ b/helper_bot/utils/metrics.py @@ -10,8 +10,13 @@ from contextlib import asynccontextmanager from functools import wraps from typing import Any, Dict, Optional -from prometheus_client import (CONTENT_TYPE_LATEST, Counter, Gauge, Histogram, - generate_latest) +from prometheus_client import ( + CONTENT_TYPE_LATEST, + Counter, + Gauge, + Histogram, + generate_latest, +) from prometheus_client.core import CollectorRegistry # Метрики rate limiter теперь создаются в основном классе diff --git a/helper_bot/utils/rate_limiter.py b/helper_bot/utils/rate_limiter.py index 290f33b..78d891f 100644 --- a/helper_bot/utils/rate_limiter.py +++ b/helper_bot/utils/rate_limiter.py @@ -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 @@ -187,8 +188,7 @@ class TelegramRateLimiter: # Глобальный экземпляр rate limiter -from helper_bot.config.rate_limit_config import (RateLimitSettings, - get_rate_limit_config) +from helper_bot.config.rate_limit_config import RateLimitSettings, get_rate_limit_config def _create_rate_limit_config(settings: RateLimitSettings) -> RateLimitConfig: diff --git a/helper_bot/utils/s3_storage.py b/helper_bot/utils/s3_storage.py index 5b5dfc6..dbbf2d6 100644 --- a/helper_bot/utils/s3_storage.py +++ b/helper_bot/utils/s3_storage.py @@ -8,6 +8,7 @@ from pathlib import Path from typing import Optional import aioboto3 + from logs.custom_logger import logger diff --git a/run_helper.py b/run_helper.py index 98222fa..8715db1 100644 --- a/run_helper.py +++ b/run_helper.py @@ -68,8 +68,7 @@ async def main(): # Останавливаем планировщик метрик try: - from helper_bot.utils.metrics_scheduler import \ - stop_metrics_scheduler + from helper_bot.utils.metrics_scheduler import stop_metrics_scheduler stop_metrics_scheduler() logger.info("Планировщик метрик остановлен") diff --git a/tests/conftest.py b/tests/conftest.py index 041e950..96cb8d7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -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",) diff --git a/tests/conftest_message_repository.py b/tests/conftest_message_repository.py index 0793b59..90f7b8b 100644 --- a/tests/conftest_message_repository.py +++ b/tests/conftest_message_repository.py @@ -3,6 +3,7 @@ import tempfile from datetime import datetime import pytest + from database.models import UserMessage from database.repositories.message_repository import MessageRepository diff --git a/tests/conftest_post_repository.py b/tests/conftest_post_repository.py index 56c26b5..8c660ce 100644 --- a/tests/conftest_post_repository.py +++ b/tests/conftest_post_repository.py @@ -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 diff --git a/tests/test_admin_dependencies.py b/tests/test_admin_dependencies.py index 0ffb6f1..fda702c 100644 --- a/tests/test_admin_dependencies.py +++ b/tests/test_admin_dependencies.py @@ -5,8 +5,12 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest -from helper_bot.handlers.admin.dependencies import (AdminAccessMiddleware, - get_bot_db, get_settings) + +from helper_bot.handlers.admin.dependencies import ( + AdminAccessMiddleware, + get_bot_db, + get_settings, +) @pytest.mark.unit diff --git a/tests/test_admin_handlers.py b/tests/test_admin_handlers.py index f53ea65..2f807c4 100644 --- a/tests/test_admin_handlers.py +++ b/tests/test_admin_handlers.py @@ -7,16 +7,19 @@ 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, - confirm_ban, - get_banned_users, - get_last_users, - get_ml_stats, - process_ban_duration, - process_ban_reason, - process_ban_target, - start_ban_process) + +from helper_bot.handlers.admin.admin_handlers import ( + admin_panel, + cancel_ban_process, + confirm_ban, + get_banned_users, + get_last_users, + get_ml_stats, + process_ban_duration, + process_ban_reason, + process_ban_target, + start_ban_process, +) from helper_bot.handlers.admin.services import User as AdminUser diff --git a/tests/test_admin_repository.py b/tests/test_admin_repository.py index 5e9f5c9..1eee060 100644 --- a/tests/test_admin_repository.py +++ b/tests/test_admin_repository.py @@ -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 diff --git a/tests/test_admin_utils.py b/tests/test_admin_utils.py index 1509bb2..57e661d 100644 --- a/tests/test_admin_utils.py +++ b/tests/test_admin_utils.py @@ -5,12 +5,15 @@ 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, - format_ban_confirmation, - format_user_info, - handle_admin_error, - return_to_admin_menu) +from helper_bot.handlers.admin.utils import ( + escape_html, + format_ban_confirmation, + format_user_info, + handle_admin_error, + return_to_admin_menu, +) @pytest.mark.unit diff --git a/tests/test_album_middleware.py b/tests/test_album_middleware.py index 6213f79..adf7eae 100644 --- a/tests/test_album_middleware.py +++ b/tests/test_album_middleware.py @@ -6,8 +6,8 @@ import asyncio from unittest.mock import AsyncMock, MagicMock, patch import pytest -from helper_bot.middlewares.album_middleware import (AlbumGetter, - AlbumMiddleware) + +from helper_bot.middlewares.album_middleware import AlbumGetter, AlbumMiddleware @pytest.mark.unit diff --git a/tests/test_async_db.py b/tests/test_async_db.py index fdb2cab..02b9b3f 100644 --- a/tests/test_async_db.py +++ b/tests/test_async_db.py @@ -1,6 +1,7 @@ from unittest.mock import AsyncMock, Mock, patch import pytest + from database.async_db import AsyncBotDB diff --git a/tests/test_audio_file_service.py b/tests/test_audio_file_service.py index 5811683..7d298ed 100644 --- a/tests/test_audio_file_service.py +++ b/tests/test_audio_file_service.py @@ -3,8 +3,8 @@ 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.exceptions import DatabaseError, FileOperationError from helper_bot.handlers.voice.services import AudioFileService diff --git a/tests/test_audio_repository.py b/tests/test_audio_repository.py index 0ee248f..5ed86fe 100644 --- a/tests/test_audio_repository.py +++ b/tests/test_audio_repository.py @@ -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 diff --git a/tests/test_audio_repository_schema.py b/tests/test_audio_repository_schema.py index d084df3..ed57604 100644 --- a/tests/test_audio_repository_schema.py +++ b/tests/test_audio_repository_schema.py @@ -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 diff --git a/tests/test_auto_unban_integration.py b/tests/test_auto_unban_integration.py index 1b7bd99..1bb82b6 100644 --- a/tests/test_auto_unban_integration.py +++ b/tests/test_auto_unban_integration.py @@ -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 diff --git a/tests/test_auto_unban_scheduler.py b/tests/test_auto_unban_scheduler.py index 05d10d4..7f64bef 100644 --- a/tests/test_auto_unban_scheduler.py +++ b/tests/test_auto_unban_scheduler.py @@ -3,8 +3,11 @@ 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) + +from helper_bot.utils.auto_unban_scheduler import ( + AutoUnbanScheduler, + get_auto_unban_scheduler, +) class TestAutoUnbanScheduler: diff --git a/tests/test_blacklist_history_repository.py b/tests/test_blacklist_history_repository.py index 82c6493..828a222 100644 --- a/tests/test_blacklist_history_repository.py +++ b/tests/test_blacklist_history_repository.py @@ -3,9 +3,11 @@ 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 +from database.repositories.blacklist_history_repository import ( + BlacklistHistoryRepository, +) class TestBlacklistHistoryRepository: diff --git a/tests/test_blacklist_middleware.py b/tests/test_blacklist_middleware.py index 5bda9b6..e3b6a29 100644 --- a/tests/test_blacklist_middleware.py +++ b/tests/test_blacklist_middleware.py @@ -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 diff --git a/tests/test_blacklist_repository.py b/tests/test_blacklist_repository.py index f7133bd..97caf4f 100644 --- a/tests/test_blacklist_repository.py +++ b/tests/test_blacklist_repository.py @@ -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 diff --git a/tests/test_callback_dependency_factory.py b/tests/test_callback_dependency_factory.py index 5757157..8a36079 100644 --- a/tests/test_callback_dependency_factory.py +++ b/tests/test_callback_dependency_factory.py @@ -5,10 +5,12 @@ from unittest.mock import MagicMock, patch import pytest + from helper_bot.handlers.callback.dependency_factory import ( - get_ban_service, get_post_publish_service) -from helper_bot.handlers.callback.services import (BanService, - PostPublishService) + get_ban_service, + get_post_publish_service, +) +from helper_bot.handlers.callback.services import BanService, PostPublishService @pytest.mark.unit diff --git a/tests/test_callback_handlers.py b/tests/test_callback_handlers.py index 3196fba..7f85b78 100644 --- a/tests/test_callback_handlers.py +++ b/tests/test_callback_handlers.py @@ -3,9 +3,15 @@ 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, process_ban_user, process_unlock_user, - return_to_main_menu, save_voice_message) + change_page, + delete_voice_message, + process_ban_user, + process_unlock_user, + return_to_main_menu, + save_voice_message, +) from helper_bot.handlers.voice.constants import CALLBACK_DELETE, CALLBACK_SAVE diff --git a/tests/test_callback_services.py b/tests/test_callback_services.py index 2433b66..1bfea92 100644 --- a/tests/test_callback_services.py +++ b/tests/test_callback_services.py @@ -6,13 +6,15 @@ 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, - PublishError, - UserBlockedBotError, - UserNotFoundError) -from helper_bot.handlers.callback.services import (BanService, - PostPublishService) +from helper_bot.handlers.callback.exceptions import ( + PostNotFoundError, + PublishError, + UserBlockedBotError, + UserNotFoundError, +) +from helper_bot.handlers.callback.services import BanService, PostPublishService @pytest.mark.unit diff --git a/tests/test_decorators.py b/tests/test_decorators.py index c05c9aa..479f8c8 100644 --- a/tests/test_decorators.py +++ b/tests/test_decorators.py @@ -6,10 +6,11 @@ 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 + +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, +) class FakeMessage: diff --git a/tests/test_deepseek_service.py b/tests/test_deepseek_service.py index 54d42ca..6575cbd 100644 --- a/tests/test_deepseek_service.py +++ b/tests/test_deepseek_service.py @@ -5,10 +5,13 @@ 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, - ScoringError, - TextTooShortError) +from helper_bot.services.scoring.exceptions import ( + DeepSeekAPIError, + ScoringError, + TextTooShortError, +) @pytest.mark.unit diff --git a/tests/test_dependencies_middleware.py b/tests/test_dependencies_middleware.py index 4bc3369..c345b94 100644 --- a/tests/test_dependencies_middleware.py +++ b/tests/test_dependencies_middleware.py @@ -5,8 +5,8 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest -from helper_bot.middlewares.dependencies_middleware import \ - DependenciesMiddleware + +from helper_bot.middlewares.dependencies_middleware import DependenciesMiddleware @pytest.mark.unit diff --git a/tests/test_improved_media_processing.py b/tests/test_improved_media_processing.py index 99c9c38..05d78e7 100644 --- a/tests/test_improved_media_processing.py +++ b/tests/test_improved_media_processing.py @@ -8,9 +8,13 @@ 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, download_file, - send_media_group_message_to_private_chat) + add_in_db_media, + add_in_db_media_mediagroup, + download_file, + send_media_group_message_to_private_chat, +) class TestDownloadFile: diff --git a/tests/test_keyboards_and_filters.py b/tests/test_keyboards_and_filters.py index 975bc8f..48de3c1 100644 --- a/tests/test_keyboards_and_filters.py +++ b/tests/test_keyboards_and_filters.py @@ -1,15 +1,22 @@ from unittest.mock import AsyncMock, Mock, patch import pytest -from aiogram.types import (InlineKeyboardButton, InlineKeyboardMarkup, - KeyboardButton, ReplyKeyboardMarkup) +from aiogram.types import ( + InlineKeyboardButton, + InlineKeyboardMarkup, + KeyboardButton, + ReplyKeyboardMarkup, +) + from database.async_db import AsyncBotDB from helper_bot.filters.main import ChatTypeFilter -from helper_bot.keyboards.keyboards import (create_keyboard_with_pagination, - get_reply_keyboard, - get_reply_keyboard_admin, - get_reply_keyboard_for_post, - get_reply_keyboard_leave_chat) +from helper_bot.keyboards.keyboards import ( + create_keyboard_with_pagination, + get_reply_keyboard, + get_reply_keyboard_admin, + get_reply_keyboard_for_post, + get_reply_keyboard_leave_chat, +) class TestKeyboards: diff --git a/tests/test_main.py b/tests/test_main.py index 0a492c2..0991cbc 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -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 diff --git a/tests/test_message_repository.py b/tests/test_message_repository.py index 2fdbceb..b8f2557 100644 --- a/tests/test_message_repository.py +++ b/tests/test_message_repository.py @@ -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 diff --git a/tests/test_message_repository_integration.py b/tests/test_message_repository_integration.py index 8e129ab..84c3b3a 100644 --- a/tests/test_message_repository_integration.py +++ b/tests/test_message_repository_integration.py @@ -4,6 +4,7 @@ import tempfile from datetime import datetime import pytest + from database.models import UserMessage from database.repositories.message_repository import MessageRepository diff --git a/tests/test_metrics_middleware.py b/tests/test_metrics_middleware.py index c291286..80e1a4b 100644 --- a/tests/test_metrics_middleware.py +++ b/tests/test_metrics_middleware.py @@ -7,8 +7,12 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest from aiogram.types import Message + from helper_bot.middlewares.metrics_middleware import ( - DatabaseMetricsMiddleware, ErrorMetricsMiddleware, MetricsMiddleware) + DatabaseMetricsMiddleware, + ErrorMetricsMiddleware, + MetricsMiddleware, +) @pytest.mark.unit diff --git a/tests/test_post_repository.py b/tests/test_post_repository.py index dd982bd..797be28 100644 --- a/tests/test_post_repository.py +++ b/tests/test_post_repository.py @@ -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 diff --git a/tests/test_post_repository_integration.py b/tests/test_post_repository_integration.py index 43bb399..d485fec 100644 --- a/tests/test_post_repository_integration.py +++ b/tests/test_post_repository_integration.py @@ -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 diff --git a/tests/test_post_service.py b/tests/test_post_service.py index 591fb6b..ffabd2b 100644 --- a/tests/test_post_service.py +++ b/tests/test_post_service.py @@ -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 diff --git a/tests/test_rag_client.py b/tests/test_rag_client.py index 4870b08..241c4c6 100644 --- a/tests/test_rag_client.py +++ b/tests/test_rag_client.py @@ -5,9 +5,12 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest -from helper_bot.services.scoring.exceptions import (InsufficientExamplesError, - ScoringError, - TextTooShortError) + +from helper_bot.services.scoring.exceptions import ( + InsufficientExamplesError, + ScoringError, + TextTooShortError, +) from helper_bot.services.scoring.rag_client import RagApiClient diff --git a/tests/test_rate_limit_middleware.py b/tests/test_rate_limit_middleware.py index 640b52f..ebf0c83 100644 --- a/tests/test_rate_limit_middleware.py +++ b/tests/test_rate_limit_middleware.py @@ -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 diff --git a/tests/test_rate_limit_monitor.py b/tests/test_rate_limit_monitor.py index dfbbff8..ef55a23 100644 --- a/tests/test_rate_limit_monitor.py +++ b/tests/test_rate_limit_monitor.py @@ -7,10 +7,13 @@ from collections import deque from unittest.mock import patch import pytest -from helper_bot.utils.rate_limit_monitor import (RateLimitMonitor, - RateLimitStats, - get_rate_limit_summary, - record_rate_limit_request) + +from helper_bot.utils.rate_limit_monitor import ( + RateLimitMonitor, + RateLimitStats, + get_rate_limit_summary, + record_rate_limit_request, +) @pytest.mark.unit diff --git a/tests/test_rate_limiter.py b/tests/test_rate_limiter.py index fdac278..ed3e7bd 100644 --- a/tests/test_rate_limiter.py +++ b/tests/test_rate_limiter.py @@ -7,15 +7,21 @@ 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, - RateLimitStats, - record_rate_limit_request) -from helper_bot.utils.rate_limiter import (ChatRateLimiter, GlobalRateLimiter, - RateLimitConfig, RetryHandler, - TelegramRateLimiter, - send_with_rate_limit) + +from helper_bot.config.rate_limit_config import RateLimitSettings, get_rate_limit_config +from helper_bot.utils.rate_limit_monitor import ( + RateLimitMonitor, + RateLimitStats, + record_rate_limit_request, +) +from helper_bot.utils.rate_limiter import ( + ChatRateLimiter, + GlobalRateLimiter, + RateLimitConfig, + RetryHandler, + TelegramRateLimiter, + send_with_rate_limit, +) class TestRateLimitConfig: diff --git a/tests/test_refactored_admin_handlers.py b/tests/test_refactored_admin_handlers.py index f0aad6e..7633715 100644 --- a/tests/test_refactored_admin_handlers.py +++ b/tests/test_refactored_admin_handlers.py @@ -3,9 +3,12 @@ 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, - UserNotFoundError) + +from helper_bot.handlers.admin.exceptions import ( + InvalidInputError, + UserAlreadyBannedError, + UserNotFoundError, +) from helper_bot.handlers.admin.services import AdminService, BannedUser, User diff --git a/tests/test_refactored_group_handlers.py b/tests/test_refactored_group_handlers.py index 972b08f..464c95f 100644 --- a/tests/test_refactored_group_handlers.py +++ b/tests/test_refactored_group_handlers.py @@ -5,11 +5,16 @@ 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, - UserNotFoundError) -from helper_bot.handlers.group.group_handlers import (GroupHandlers, - create_group_handlers) +from helper_bot.handlers.group.exceptions import ( + NoReplyToMessageError, + UserNotFoundError, +) +from helper_bot.handlers.group.group_handlers import ( + GroupHandlers, + create_group_handlers, +) from helper_bot.handlers.group.services import AdminReplyService diff --git a/tests/test_refactored_private_handlers.py b/tests/test_refactored_private_handlers.py index 8062e8d..d36b4e3 100644 --- a/tests/test_refactored_private_handlers.py +++ b/tests/test_refactored_private_handlers.py @@ -5,9 +5,12 @@ 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, create_private_handlers) + PrivateHandlers, + create_private_handlers, +) from helper_bot.handlers.private.services import BotSettings diff --git a/tests/test_s3_storage.py b/tests/test_s3_storage.py index ac5bab8..214fc78 100644 --- a/tests/test_s3_storage.py +++ b/tests/test_s3_storage.py @@ -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 diff --git a/tests/test_scoring_services.py b/tests/test_scoring_services.py index 9065a4d..c7d427d 100644 --- a/tests/test_scoring_services.py +++ b/tests/test_scoring_services.py @@ -6,11 +6,14 @@ import json from unittest.mock import AsyncMock, MagicMock, patch import pytest + # Импорты для тестирования базовых классов from helper_bot.services.scoring.base import CombinedScore, ScoringResult -from helper_bot.services.scoring.exceptions import (InsufficientExamplesError, - ScoringError, - TextTooShortError) +from helper_bot.services.scoring.exceptions import ( + InsufficientExamplesError, + ScoringError, + TextTooShortError, +) class TestScoringResult: @@ -134,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) @@ -220,8 +224,7 @@ 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", @@ -231,8 +234,7 @@ 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) @@ -264,8 +266,7 @@ 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) diff --git a/tests/test_server_prometheus.py b/tests/test_server_prometheus.py index 1cb4311..42631a5 100644 --- a/tests/test_server_prometheus.py +++ b/tests/test_server_prometheus.py @@ -6,8 +6,12 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest from aiohttp import web -from helper_bot.server_prometheus import (MetricsServer, start_metrics_server, - stop_metrics_server) + +from helper_bot.server_prometheus import ( + MetricsServer, + start_metrics_server, + stop_metrics_server, +) @pytest.mark.unit diff --git a/tests/test_text_middleware.py b/tests/test_text_middleware.py index 6187382..63c64b1 100644 --- a/tests/test_text_middleware.py +++ b/tests/test_text_middleware.py @@ -5,6 +5,7 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest + from helper_bot.middlewares.text_middleware import BulkTextMiddleware diff --git a/tests/test_utils.py b/tests/test_utils.py index 72fcf51..d511122 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -2,21 +2,41 @@ 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, - get_global_instance) +from helper_bot.utils.base_dependency_factory import ( + BaseDependencyFactory, + get_global_instance, +) from helper_bot.utils.helper_func import ( - add_days_to_date, add_in_db_media, add_in_db_media_mediagroup, - check_access, check_user_emoji, check_username_and_full_name, - delete_user_blacklist, determine_anonymity, download_file, - get_banned_users_buttons, get_banned_users_list, get_first_name, - get_random_emoji, get_text_message, prepare_media_group_from_middlewares, - safe_html_escape, send_audio_message, - send_media_group_message_to_private_chat, send_media_group_to_channel, - send_photo_message, send_text_message, send_video_message, - send_video_note_message, send_voice_message, update_user_info) + add_days_to_date, + add_in_db_media, + add_in_db_media_mediagroup, + check_access, + check_user_emoji, + check_username_and_full_name, + delete_user_blacklist, + determine_anonymity, + download_file, + get_banned_users_buttons, + get_banned_users_list, + get_first_name, + get_random_emoji, + get_text_message, + prepare_media_group_from_middlewares, + safe_html_escape, + send_audio_message, + send_media_group_message_to_private_chat, + send_media_group_to_channel, + send_photo_message, + send_text_message, + send_video_message, + send_video_note_message, + send_voice_message, + update_user_info, +) from helper_bot.utils.messages import get_message diff --git a/tests/test_voice_bot_architecture.py b/tests/test_voice_bot_architecture.py index d8b3adb..9f7b7bc 100644 --- a/tests/test_voice_bot_architecture.py +++ b/tests/test_voice_bot_architecture.py @@ -3,12 +3,14 @@ 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.exceptions import AudioProcessingError, VoiceMessageError from helper_bot.handlers.voice.services import VoiceBotService -from helper_bot.handlers.voice.utils import (get_last_message_text, - get_user_emoji_safe, - validate_voice_message) +from helper_bot.handlers.voice.utils import ( + get_last_message_text, + get_user_emoji_safe, + validate_voice_message, +) class TestVoiceBotService: diff --git a/tests/test_voice_constants.py b/tests/test_voice_constants.py index 5215d1b..b6774ef 100644 --- a/tests/test_voice_constants.py +++ b/tests/test_voice_constants.py @@ -1,14 +1,22 @@ import pytest -from helper_bot.handlers.voice.constants import (BTN_LISTEN, BTN_SPEAK, - BUTTON_COMMAND_MAPPING, - CALLBACK_COMMAND_MAPPING, - CALLBACK_DELETE, - CALLBACK_SAVE, CMD_EMOJI, - CMD_HELP, CMD_REFRESH, - CMD_RESTART, CMD_START, - COMMAND_MAPPING, - STATE_STANDUP_WRITE, - STATE_START, VOICE_BOT_NAME) + +from helper_bot.handlers.voice.constants import ( + BTN_LISTEN, + BTN_SPEAK, + BUTTON_COMMAND_MAPPING, + CALLBACK_COMMAND_MAPPING, + CALLBACK_DELETE, + CALLBACK_SAVE, + CMD_EMOJI, + CMD_HELP, + CMD_REFRESH, + CMD_RESTART, + CMD_START, + COMMAND_MAPPING, + STATE_STANDUP_WRITE, + STATE_START, + VOICE_BOT_NAME, +) class TestVoiceConstants: diff --git a/tests/test_voice_exceptions.py b/tests/test_voice_exceptions.py index 2225d8a..38d8150 100644 --- a/tests/test_voice_exceptions.py +++ b/tests/test_voice_exceptions.py @@ -1,7 +1,10 @@ import pytest -from helper_bot.handlers.voice.exceptions import (AudioProcessingError, - VoiceBotError, - VoiceMessageError) + +from helper_bot.handlers.voice.exceptions import ( + AudioProcessingError, + VoiceBotError, + VoiceMessageError, +) class TestVoiceExceptions: diff --git a/tests/test_voice_handler.py b/tests/test_voice_handler.py index a880abb..af1fff9 100644 --- a/tests/test_voice_handler.py +++ b/tests/test_voice_handler.py @@ -3,8 +3,8 @@ 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.constants import STATE_STANDUP_WRITE, STATE_START from helper_bot.handlers.voice.voice_handler import VoiceHandlers diff --git a/tests/test_voice_services.py b/tests/test_voice_services.py index 4c14471..8448d82 100644 --- a/tests/test_voice_services.py +++ b/tests/test_voice_services.py @@ -3,8 +3,8 @@ 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.exceptions import AudioProcessingError, VoiceMessageError from helper_bot.handlers.voice.services import VoiceBotService diff --git a/tests/test_voice_utils.py b/tests/test_voice_utils.py index 165697e..50de559 100644 --- a/tests/test_voice_utils.py +++ b/tests/test_voice_utils.py @@ -3,10 +3,14 @@ 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, - get_user_emoji_safe, plural_time, - validate_voice_message) + +from helper_bot.handlers.voice.utils import ( + format_time_ago, + get_last_message_text, + get_user_emoji_safe, + plural_time, + validate_voice_message, +) class TestVoiceUtils: