Обновлена ​​обработка статуса медиагрупп и улучшены интеграционные тесты

- Реализовано обновление статуса медиагрупп в `PostPublishService` при отклонении медиагрупп.

- Добавлены интеграционные тесты для обновления статусов постов и медиагрупп в `test_post_repository_integration.py

- Улучшен фиктивный репозиторий в `conftest_post_repository.py` для поддержки новых методов обновления статуса.

- Обновлены существующие тесты для проверки корректной обработки статуса постов и медиагрупп.
This commit is contained in:
2026-01-22 23:52:48 +03:00
parent 09e894e48f
commit 03ed2bcf4e
4 changed files with 113 additions and 8 deletions

View File

@@ -244,6 +244,8 @@ class PostPublishService:
"""Отклонение медиагруппы""" """Отклонение медиагруппы"""
logger.debug(f"Отклоняю медиагруппу. Helper message ID: {call.message.message_id}") 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) post_ids = await self.db.get_post_ids_from_telegram_by_last_id(call.message.message_id)
message_ids = post_ids.copy() message_ids = post_ids.copy()
message_ids.append(call.message.message_id) message_ids.append(call.message.message_id)

View File

@@ -22,6 +22,8 @@ def mock_post_repository():
mock_repo = Mock(spec=PostRepository) mock_repo = Mock(spec=PostRepository)
mock_repo._execute_query = AsyncMock() mock_repo._execute_query = AsyncMock()
mock_repo._execute_query_with_result = 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() mock_repo.logger = Mock()
return mock_repo return mock_repo
@@ -198,7 +200,9 @@ def mock_sql_queries():
"CREATE TABLE IF NOT EXISTS message_link_to_content" "CREATE TABLE IF NOT EXISTS message_link_to_content"
], ],
'add_post': "INSERT INTO post_from_telegram_suggest", '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_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_content': "INSERT OR IGNORE INTO content_post_from_telegram",
'add_link': "INSERT OR IGNORE INTO message_link_to_content", 'add_link': "INSERT OR IGNORE INTO message_link_to_content",
'get_content': "SELECT cpft.content_name, cpft.content_type", 'get_content': "SELECT cpft.content_name, cpft.content_type",

View File

@@ -38,7 +38,8 @@ class TestPostRepository:
text="Тестовый пост без даты", text="Тестовый пост без даты",
author_id=67890, author_id=67890,
helper_text_message_id=None, helper_text_message_id=None,
created_at=None created_at=None,
status="suggest",
) )
@pytest.fixture @pytest.fixture
@@ -75,6 +76,7 @@ class TestPostRepository:
assert "CREATE TABLE IF NOT EXISTS post_from_telegram_suggest" in post_table_call 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 "message_id INTEGER NOT NULL PRIMARY KEY" in post_table_call
assert "created_at INTEGER NOT NULL" 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 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] params = call_args[0][1]
assert "INSERT INTO post_from_telegram_suggest" in query assert "INSERT INTO post_from_telegram_suggest" in query
assert "VALUES (?, ?, ?, ?)" in query assert "status" in query
assert "VALUES (?, ?, ?, ?, ?)" in query
assert params == ( assert params == (
sample_post.message_id, sample_post.message_id,
sample_post.text, sample_post.text,
sample_post.author_id, sample_post.author_id,
sample_post.created_at sample_post.created_at,
sample_post.status,
) )
@pytest.mark.asyncio @pytest.mark.asyncio
@@ -126,7 +130,8 @@ class TestPostRepository:
call_args = post_repository._execute_query.call_args call_args = post_repository._execute_query.call_args
params = call_args[0][1] 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 @pytest.mark.asyncio
async def test_add_post_logs_correctly(self, post_repository, sample_post): async def test_add_post_logs_correctly(self, post_repository, sample_post):
@@ -160,6 +165,51 @@ class TestPostRepository:
assert "UPDATE post_from_telegram_suggest SET helper_text_message_id = ? WHERE message_id = ?" in query assert "UPDATE post_from_telegram_suggest SET helper_text_message_id = ? WHERE message_id = ?" in query
assert params == (helper_message_id, message_id) 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 @pytest.mark.asyncio
async def test_add_post_content_success(self, post_repository): async def test_add_post_content_success(self, post_repository):
"""Тест успешного добавления контента поста.""" """Тест успешного добавления контента поста."""

View File

@@ -495,3 +495,52 @@ class TestPostRepositoryIntegration:
expected_message_ids = [11111, 22222, 33333, 44444] expected_message_ids = [11111, 22222, 33333, 44444]
for expected_id in expected_message_ids: for expected_id in expected_message_ids:
assert expected_id in post_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"