diff --git a/helper_bot/handlers/callback/services.py b/helper_bot/handlers/callback/services.py index 2338ca9..4c7f471 100644 --- a/helper_bot/handlers/callback/services.py +++ b/helper_bot/handlers/callback/services.py @@ -243,15 +243,17 @@ class PostPublishService: async def _decline_media_group(self, call: CallbackQuery) -> None: """Отклонение медиагруппы""" logger.debug(f"Отклоняю медиагруппу. Helper message ID: {call.message.message_id}") - + + await self.db.update_status_for_media_group_by_helper_id(call.message.message_id, "declined") + post_ids = await self.db.get_post_ids_from_telegram_by_last_id(call.message.message_id) message_ids = post_ids.copy() message_ids.append(call.message.message_id) logger.debug(f"Получены ID сообщений для удаления: {message_ids}") - + author_id = await self._get_author_id_for_media_group(call.message.message_id) logger.debug(f"ID автора медиагруппы получен: {author_id}") - + logger.debug(f"Удаляю {len(message_ids)} сообщений из группы {self.group_for_posts}") await self._get_bot(call.message).delete_messages(chat_id=self.group_for_posts, message_ids=message_ids) diff --git a/tests/conftest_post_repository.py b/tests/conftest_post_repository.py index e8d6ad0..3fcfec0 100644 --- a/tests/conftest_post_repository.py +++ b/tests/conftest_post_repository.py @@ -22,6 +22,8 @@ def mock_post_repository(): mock_repo = Mock(spec=PostRepository) mock_repo._execute_query = AsyncMock() mock_repo._execute_query_with_result = AsyncMock() + mock_repo.update_status_by_message_id = AsyncMock() + mock_repo.update_status_for_media_group_by_helper_id = AsyncMock() mock_repo.logger = Mock() return mock_repo @@ -198,7 +200,9 @@ def mock_sql_queries(): "CREATE TABLE IF NOT EXISTS message_link_to_content" ], 'add_post': "INSERT INTO post_from_telegram_suggest", + 'add_post_status': "status", 'update_helper': "UPDATE post_from_telegram_suggest SET helper_text_message_id", + 'update_status': "UPDATE post_from_telegram_suggest SET status = ?", 'add_content': "INSERT OR IGNORE INTO content_post_from_telegram", 'add_link': "INSERT OR IGNORE INTO message_link_to_content", 'get_content': "SELECT cpft.content_name, cpft.content_type", diff --git a/tests/test_post_repository.py b/tests/test_post_repository.py index 43136f6..0a1bbd6 100644 --- a/tests/test_post_repository.py +++ b/tests/test_post_repository.py @@ -38,7 +38,8 @@ class TestPostRepository: text="Тестовый пост без даты", author_id=67890, helper_text_message_id=None, - created_at=None + created_at=None, + status="suggest", ) @pytest.fixture @@ -75,6 +76,7 @@ class TestPostRepository: assert "CREATE TABLE IF NOT EXISTS post_from_telegram_suggest" in post_table_call assert "message_id INTEGER NOT NULL PRIMARY KEY" in post_table_call assert "created_at INTEGER NOT NULL" in post_table_call + assert "status TEXT NOT NULL DEFAULT 'suggest'" in post_table_call assert "FOREIGN KEY (author_id) REFERENCES our_users (user_id) ON DELETE CASCADE" in post_table_call # Проверяем создание таблицы контента @@ -101,12 +103,14 @@ class TestPostRepository: params = call_args[0][1] assert "INSERT INTO post_from_telegram_suggest" in query - assert "VALUES (?, ?, ?, ?)" in query + assert "status" in query + assert "VALUES (?, ?, ?, ?, ?)" in query assert params == ( sample_post.message_id, sample_post.text, sample_post.author_id, - sample_post.created_at + sample_post.created_at, + sample_post.status, ) @pytest.mark.asyncio @@ -126,7 +130,8 @@ class TestPostRepository: call_args = post_repository._execute_query.call_args params = call_args[0][1] - assert params[3] == sample_post_no_date.created_at # created_at field + assert params[3] == sample_post_no_date.created_at # created_at + assert params[4] == sample_post_no_date.status # status (default suggest) @pytest.mark.asyncio async def test_add_post_logs_correctly(self, post_repository, sample_post): @@ -159,7 +164,52 @@ class TestPostRepository: assert "UPDATE post_from_telegram_suggest SET helper_text_message_id = ? WHERE message_id = ?" in query assert params == (helper_message_id, message_id) - + + @pytest.mark.asyncio + async def test_update_status_by_message_id(self, post_repository): + """Тест обновления статуса поста по message_id.""" + post_repository._execute_query = AsyncMock() + post_repository.logger = MagicMock() + + message_id = 12345 + status = "approved" + + await post_repository.update_status_by_message_id(message_id, status) + + post_repository._execute_query.assert_called_once() + call_args = post_repository._execute_query.call_args + query = call_args[0][0] + params = call_args[0][1] + + assert "UPDATE post_from_telegram_suggest" in query + assert "SET status = ? WHERE message_id = ?" in query + assert params == (status, message_id) + post_repository.logger.info.assert_called_once() + + @pytest.mark.asyncio + async def test_update_status_for_media_group_by_helper_id(self, post_repository): + """Тест обновления статуса медиагруппы по helper_message_id.""" + post_repository._execute_query = AsyncMock() + post_repository.logger = MagicMock() + + helper_message_id = 99999 + status = "declined" + + await post_repository.update_status_for_media_group_by_helper_id( + helper_message_id, status + ) + + post_repository._execute_query.assert_called_once() + call_args = post_repository._execute_query.call_args + query = call_args[0][0] + params = call_args[0][1] + + assert "UPDATE post_from_telegram_suggest" in query + assert "SET status = ?" in query + assert "message_id = ? OR helper_text_message_id = ?" in query + assert params == (status, helper_message_id, helper_message_id) + post_repository.logger.info.assert_called_once() + @pytest.mark.asyncio async def test_add_post_content_success(self, post_repository): """Тест успешного добавления контента поста.""" diff --git a/tests/test_post_repository_integration.py b/tests/test_post_repository_integration.py index 9601aea..5b6139b 100644 --- a/tests/test_post_repository_integration.py +++ b/tests/test_post_repository_integration.py @@ -495,3 +495,52 @@ class TestPostRepositoryIntegration: expected_message_ids = [11111, 22222, 33333, 44444] for expected_id in expected_message_ids: assert expected_id in post_ids + + @pytest.mark.asyncio + async def test_update_status_by_message_id_integration(self, post_repository, sample_post): + """Интеграционный тест обновления статуса одиночного поста.""" + await self._setup_test_database(post_repository) + await post_repository.add_post(sample_post) + + await post_repository.update_status_by_message_id(sample_post.message_id, "approved") + + rows = await post_repository._execute_query_with_result( + "SELECT status FROM post_from_telegram_suggest WHERE message_id = ?", + (sample_post.message_id,), + ) + assert len(rows) == 1 + assert rows[0][0] == "approved" + + @pytest.mark.asyncio + async def test_update_status_for_media_group_by_helper_id_integration( + self, post_repository, sample_post_with_helper + ): + """Интеграционный тест обновления статуса медиагруппы по helper_message_id.""" + await self._setup_test_database(post_repository) + await post_repository.add_post(sample_post_with_helper) + helper_message_id = 99999 + helper_post = TelegramPost( + message_id=helper_message_id, + text="^", + author_id=67890, + helper_text_message_id=sample_post_with_helper.message_id, + created_at=int(datetime.now().timestamp()), + status="suggest", + ) + await post_repository.add_post(helper_post) + await post_repository.update_helper_message( + sample_post_with_helper.message_id, helper_message_id + ) + + await post_repository.update_status_for_media_group_by_helper_id( + helper_message_id, "declined" + ) + + rows = await post_repository._execute_query_with_result( + "SELECT status FROM post_from_telegram_suggest " + "WHERE message_id = ? OR helper_text_message_id = ?", + (helper_message_id, helper_message_id), + ) + assert len(rows) == 2 + for row in rows: + assert row[0] == "declined"