fix quality code
This commit is contained in:
@@ -8,67 +8,81 @@ 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:
|
||||
"""Тесты для функции download_file"""
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_download_file_success_photo(self):
|
||||
"""Тест успешного скачивания фото"""
|
||||
# Создаем временную директорию
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
with patch('helper_bot.utils.helper_func.os.makedirs'), \
|
||||
patch('helper_bot.utils.helper_func.os.path.exists', return_value=True), \
|
||||
patch('helper_bot.utils.helper_func.os.path.getsize', return_value=1024), \
|
||||
patch('helper_bot.utils.helper_func.os.path.basename', return_value='photo.jpg'), \
|
||||
patch('helper_bot.utils.helper_func.os.path.splitext', return_value=('photo', '.jpg')):
|
||||
|
||||
with (
|
||||
patch("helper_bot.utils.helper_func.os.makedirs"),
|
||||
patch("helper_bot.utils.helper_func.os.path.exists", return_value=True),
|
||||
patch(
|
||||
"helper_bot.utils.helper_func.os.path.getsize", return_value=1024
|
||||
),
|
||||
patch(
|
||||
"helper_bot.utils.helper_func.os.path.basename",
|
||||
return_value="photo.jpg",
|
||||
),
|
||||
patch(
|
||||
"helper_bot.utils.helper_func.os.path.splitext",
|
||||
return_value=("photo", ".jpg"),
|
||||
),
|
||||
):
|
||||
|
||||
# Мокаем сообщение и бота
|
||||
mock_message = Mock()
|
||||
mock_message.bot = Mock()
|
||||
mock_file = Mock()
|
||||
mock_file.file_path = 'photos/photo.jpg'
|
||||
mock_file.file_path = "photos/photo.jpg"
|
||||
mock_message.bot.get_file = AsyncMock(return_value=mock_file)
|
||||
mock_message.bot.download_file = AsyncMock()
|
||||
|
||||
|
||||
# Вызываем функцию
|
||||
result = await download_file(mock_message, 'test_file_id', 'photo')
|
||||
|
||||
result = await download_file(mock_message, "test_file_id", "photo")
|
||||
|
||||
# Проверяем результат
|
||||
assert result is not None
|
||||
assert 'files/photos/test_file_id.jpg' in result
|
||||
mock_message.bot.get_file.assert_called_once_with('test_file_id')
|
||||
assert "files/photos/test_file_id.jpg" in result
|
||||
mock_message.bot.get_file.assert_called_once_with("test_file_id")
|
||||
mock_message.bot.download_file.assert_called_once()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_download_file_invalid_parameters(self):
|
||||
"""Тест с неверными параметрами"""
|
||||
result = await download_file(None, 'test_file_id', 'photo')
|
||||
result = await download_file(None, "test_file_id", "photo")
|
||||
assert result is None
|
||||
|
||||
|
||||
mock_message = Mock()
|
||||
mock_message.bot = None
|
||||
result = await download_file(mock_message, 'test_file_id', 'photo')
|
||||
result = await download_file(mock_message, "test_file_id", "photo")
|
||||
assert result is None
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_download_file_error(self):
|
||||
"""Тест обработки ошибки при скачивании"""
|
||||
mock_message = Mock()
|
||||
mock_message.bot = Mock()
|
||||
mock_message.bot.get_file = AsyncMock(side_effect=Exception("Network error"))
|
||||
|
||||
result = await download_file(mock_message, 'test_file_id', 'photo')
|
||||
|
||||
result = await download_file(mock_message, "test_file_id", "photo")
|
||||
assert result is None
|
||||
|
||||
|
||||
class TestAddInDbMedia:
|
||||
"""Тесты для функции add_in_db_media"""
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_in_db_media_success_photo(self):
|
||||
"""Тест успешного добавления фото в БД"""
|
||||
@@ -76,65 +90,75 @@ class TestAddInDbMedia:
|
||||
mock_message = Mock()
|
||||
mock_message.message_id = 123
|
||||
mock_message.photo = [Mock()]
|
||||
mock_message.photo[-1].file_id = 'photo_123'
|
||||
mock_message.photo[-1].file_id = "photo_123"
|
||||
mock_message.video = None
|
||||
mock_message.voice = None
|
||||
mock_message.audio = None
|
||||
mock_message.video_note = None
|
||||
|
||||
|
||||
# Мокаем БД
|
||||
mock_db = AsyncMock()
|
||||
mock_db.add_post_content = AsyncMock(return_value=True)
|
||||
|
||||
with patch('helper_bot.utils.helper_func.download_file', return_value='files/photos/photo_123.jpg'):
|
||||
|
||||
with patch(
|
||||
"helper_bot.utils.helper_func.download_file",
|
||||
return_value="files/photos/photo_123.jpg",
|
||||
):
|
||||
result = await add_in_db_media(mock_message, mock_db)
|
||||
|
||||
|
||||
assert result is True
|
||||
mock_db.add_post_content.assert_called_once_with(123, 123, 'files/photos/photo_123.jpg', 'photo')
|
||||
|
||||
mock_db.add_post_content.assert_called_once_with(
|
||||
123, 123, "files/photos/photo_123.jpg", "photo"
|
||||
)
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_in_db_media_download_fails(self):
|
||||
"""Тест когда скачивание файла не удается"""
|
||||
mock_message = Mock()
|
||||
mock_message.message_id = 123
|
||||
mock_message.photo = [Mock()]
|
||||
mock_message.photo[-1].file_id = 'photo_123'
|
||||
mock_message.photo[-1].file_id = "photo_123"
|
||||
mock_message.video = None
|
||||
mock_message.voice = None
|
||||
mock_message.audio = None
|
||||
mock_message.video_note = None
|
||||
|
||||
|
||||
mock_db = AsyncMock()
|
||||
|
||||
with patch('helper_bot.utils.helper_func.download_file', return_value=None):
|
||||
|
||||
with patch("helper_bot.utils.helper_func.download_file", return_value=None):
|
||||
result = await add_in_db_media(mock_message, mock_db)
|
||||
|
||||
|
||||
assert result is False
|
||||
mock_db.add_post_content.assert_not_called()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_in_db_media_db_fails(self):
|
||||
"""Тест когда добавление в БД не удается"""
|
||||
mock_message = Mock()
|
||||
mock_message.message_id = 123
|
||||
mock_message.photo = [Mock()]
|
||||
mock_message.photo[-1].file_id = 'photo_123'
|
||||
mock_message.photo[-1].file_id = "photo_123"
|
||||
mock_message.video = None
|
||||
mock_message.voice = None
|
||||
mock_message.audio = None
|
||||
mock_message.video_note = None
|
||||
|
||||
|
||||
mock_db = AsyncMock()
|
||||
mock_db.add_post_content = AsyncMock(return_value=False)
|
||||
|
||||
with patch('helper_bot.utils.helper_func.download_file', return_value='files/photos/photo_123.jpg'), \
|
||||
patch('helper_bot.utils.helper_func.os.remove'):
|
||||
|
||||
|
||||
with (
|
||||
patch(
|
||||
"helper_bot.utils.helper_func.download_file",
|
||||
return_value="files/photos/photo_123.jpg",
|
||||
),
|
||||
patch("helper_bot.utils.helper_func.os.remove"),
|
||||
):
|
||||
|
||||
result = await add_in_db_media(mock_message, mock_db)
|
||||
|
||||
|
||||
assert result is False
|
||||
mock_db.add_post_content.assert_called_once()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_in_db_media_unsupported_content(self):
|
||||
"""Тест с неподдерживаемым типом контента"""
|
||||
@@ -145,18 +169,18 @@ class TestAddInDbMedia:
|
||||
mock_message.voice = None
|
||||
mock_message.audio = None
|
||||
mock_message.video_note = None
|
||||
|
||||
|
||||
mock_db = AsyncMock()
|
||||
|
||||
|
||||
result = await add_in_db_media(mock_message, mock_db)
|
||||
|
||||
|
||||
assert result is False
|
||||
mock_db.add_post_content.assert_not_called()
|
||||
|
||||
|
||||
class TestAddInDbMediaMediagroup:
|
||||
"""Тесты для функции add_in_db_media_mediagroup"""
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_in_db_media_mediagroup_success(self):
|
||||
"""Тест успешного добавления медиагруппы в БД"""
|
||||
@@ -164,43 +188,47 @@ class TestAddInDbMediaMediagroup:
|
||||
mock_message1 = Mock()
|
||||
mock_message1.message_id = 1
|
||||
mock_message1.photo = [Mock()]
|
||||
mock_message1.photo[-1].file_id = 'photo_1'
|
||||
mock_message1.photo[-1].file_id = "photo_1"
|
||||
mock_message1.video = None
|
||||
mock_message1.voice = None
|
||||
mock_message1.audio = None
|
||||
mock_message1.video_note = None
|
||||
|
||||
|
||||
mock_message2 = Mock()
|
||||
mock_message2.message_id = 2
|
||||
mock_message2.photo = None
|
||||
mock_message2.video = Mock()
|
||||
mock_message2.video.file_id = 'video_1'
|
||||
mock_message2.video.file_id = "video_1"
|
||||
mock_message2.voice = None
|
||||
mock_message2.audio = None
|
||||
mock_message2.video_note = None
|
||||
|
||||
|
||||
sent_messages = [mock_message1, mock_message2]
|
||||
|
||||
|
||||
# Мокаем БД
|
||||
mock_db = AsyncMock()
|
||||
mock_db.add_post_content = AsyncMock(return_value=True)
|
||||
|
||||
with patch('helper_bot.utils.helper_func.download_file', return_value='files/test.jpg'):
|
||||
result = await add_in_db_media_mediagroup(sent_messages, mock_db, main_post_id=100)
|
||||
|
||||
|
||||
with patch(
|
||||
"helper_bot.utils.helper_func.download_file", return_value="files/test.jpg"
|
||||
):
|
||||
result = await add_in_db_media_mediagroup(
|
||||
sent_messages, mock_db, main_post_id=100
|
||||
)
|
||||
|
||||
assert result is True
|
||||
assert mock_db.add_post_content.call_count == 2
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_in_db_media_mediagroup_empty_list(self):
|
||||
"""Тест с пустым списком сообщений"""
|
||||
mock_db = AsyncMock()
|
||||
|
||||
|
||||
result = await add_in_db_media_mediagroup([], mock_db)
|
||||
|
||||
|
||||
assert result is False
|
||||
mock_db.add_post_content.assert_not_called()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_in_db_media_mediagroup_partial_failure(self):
|
||||
"""Тест когда часть сообщений обрабатывается успешно"""
|
||||
@@ -208,12 +236,12 @@ class TestAddInDbMediaMediagroup:
|
||||
mock_message1 = Mock()
|
||||
mock_message1.message_id = 1
|
||||
mock_message1.photo = [Mock()]
|
||||
mock_message1.photo[-1].file_id = 'photo_1'
|
||||
mock_message1.photo[-1].file_id = "photo_1"
|
||||
mock_message1.video = None
|
||||
mock_message1.voice = None
|
||||
mock_message1.audio = None
|
||||
mock_message1.video_note = None
|
||||
|
||||
|
||||
mock_message2 = Mock()
|
||||
mock_message2.message_id = 2
|
||||
mock_message2.photo = None
|
||||
@@ -221,16 +249,18 @@ class TestAddInDbMediaMediagroup:
|
||||
mock_message2.voice = None
|
||||
mock_message2.audio = None
|
||||
mock_message2.video_note = None # Неподдерживаемый тип
|
||||
|
||||
|
||||
sent_messages = [mock_message1, mock_message2]
|
||||
|
||||
|
||||
# Мокаем БД
|
||||
mock_db = AsyncMock()
|
||||
mock_db.add_post_content = AsyncMock(return_value=True)
|
||||
|
||||
with patch('helper_bot.utils.helper_func.download_file', return_value='files/test.jpg'):
|
||||
|
||||
with patch(
|
||||
"helper_bot.utils.helper_func.download_file", return_value="files/test.jpg"
|
||||
):
|
||||
result = await add_in_db_media_mediagroup(sent_messages, mock_db)
|
||||
|
||||
|
||||
# Должен вернуть False, так как есть ошибки (второе сообщение не поддерживается)
|
||||
assert result is False
|
||||
assert mock_db.add_post_content.call_count == 1
|
||||
@@ -238,7 +268,7 @@ class TestAddInDbMediaMediagroup:
|
||||
|
||||
class TestSendMediaGroupMessageToPrivateChat:
|
||||
"""Тесты для функции send_media_group_message_to_private_chat"""
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_send_media_group_message_success(self):
|
||||
"""Тест успешной отправки медиагруппы"""
|
||||
@@ -246,25 +276,29 @@ class TestSendMediaGroupMessageToPrivateChat:
|
||||
mock_message = Mock()
|
||||
mock_message.from_user.id = 123
|
||||
mock_message.bot = Mock()
|
||||
|
||||
|
||||
# Мокаем отправленное сообщение
|
||||
mock_sent_message = Mock()
|
||||
mock_sent_message.message_id = 456
|
||||
mock_sent_message.caption = "Test caption"
|
||||
mock_message.bot.send_media_group = AsyncMock(return_value=[mock_sent_message])
|
||||
|
||||
|
||||
# Мокаем БД
|
||||
mock_db = AsyncMock()
|
||||
|
||||
with patch('helper_bot.utils.helper_func.add_in_db_media_mediagroup', return_value=True):
|
||||
with patch('asyncio.create_task'): # Мокаем create_task, чтобы фоновая задача не выполнялась
|
||||
|
||||
with patch(
|
||||
"helper_bot.utils.helper_func.add_in_db_media_mediagroup", return_value=True
|
||||
):
|
||||
with patch(
|
||||
"asyncio.create_task"
|
||||
): # Мокаем create_task, чтобы фоновая задача не выполнялась
|
||||
result = await send_media_group_message_to_private_chat(
|
||||
100, mock_message, [], mock_db, main_post_id=789
|
||||
)
|
||||
|
||||
|
||||
assert result == [456] # Функция возвращает список message_id
|
||||
mock_message.bot.send_media_group.assert_called_once()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_send_media_group_message_media_processing_fails(self):
|
||||
"""Тест когда обработка медиа не удается"""
|
||||
@@ -272,22 +306,27 @@ class TestSendMediaGroupMessageToPrivateChat:
|
||||
mock_message = Mock()
|
||||
mock_message.from_user.id = 123
|
||||
mock_message.bot = Mock()
|
||||
|
||||
|
||||
# Мокаем отправленное сообщение
|
||||
mock_sent_message = Mock()
|
||||
mock_sent_message.message_id = 456
|
||||
mock_sent_message.caption = "Test caption"
|
||||
mock_message.bot.send_media_group = AsyncMock(return_value=[mock_sent_message])
|
||||
|
||||
|
||||
# Мокаем БД
|
||||
mock_db = AsyncMock()
|
||||
|
||||
with patch('helper_bot.utils.helper_func.add_in_db_media_mediagroup', return_value=False):
|
||||
with patch('asyncio.create_task'): # Мокаем create_task, чтобы фоновая задача не выполнялась
|
||||
|
||||
with patch(
|
||||
"helper_bot.utils.helper_func.add_in_db_media_mediagroup",
|
||||
return_value=False,
|
||||
):
|
||||
with patch(
|
||||
"asyncio.create_task"
|
||||
): # Мокаем create_task, чтобы фоновая задача не выполнялась
|
||||
result = await send_media_group_message_to_private_chat(
|
||||
100, mock_message, [], mock_db, main_post_id=789
|
||||
)
|
||||
|
||||
|
||||
assert result == [456] # Функция возвращает список message_id
|
||||
mock_message.bot.send_media_group.assert_called_once()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user