Реализован функцоинал хранения сырых текстов поста в базе данных. Оформление поста происходит непосредственно перед его отправкой в канал.
- Реализованы методы `get_post_text_and_anonymity_by_message_id` и `get_post_text_and_anonymity_by_helper_id` в `PostRepository` для получения текста поста и флага анонимности. - Обновлена модель `TelegramPost`, добавлено поле `is_anonymous`. - Изменена схема базы данных для включения поля `is_anonymous` в таблицу `post_from_telegram_suggest`. - Обновлены функции публикации постов в `PostPublishService` для учета анонимности. - Добавлены тесты для проверки новых функций и корректности работы с анонимностью.
This commit is contained in:
@@ -77,6 +77,7 @@ class TestPostRepository:
|
||||
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 "is_anonymous INTEGER" in post_table_call
|
||||
assert "FOREIGN KEY (author_id) REFERENCES our_users (user_id) ON DELETE CASCADE" in post_table_call
|
||||
|
||||
# Проверяем создание таблицы контента
|
||||
@@ -104,14 +105,17 @@ class TestPostRepository:
|
||||
|
||||
assert "INSERT INTO post_from_telegram_suggest" 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.status,
|
||||
)
|
||||
assert "is_anonymous" in query
|
||||
assert "VALUES (?, ?, ?, ?, ?, ?)" in query
|
||||
# Проверяем параметры: message_id, text, author_id, created_at, status, is_anonymous
|
||||
assert params[0] == sample_post.message_id
|
||||
assert params[1] == sample_post.text
|
||||
assert params[2] == sample_post.author_id
|
||||
assert params[3] == sample_post.created_at
|
||||
assert params[4] == sample_post.status
|
||||
# is_anonymous преобразуется в int (None -> None, True -> 1, False -> 0)
|
||||
expected_is_anonymous = None if sample_post.is_anonymous is None else (1 if sample_post.is_anonymous else 0)
|
||||
assert params[5] == expected_is_anonymous
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_post_without_date(self, post_repository, sample_post_no_date):
|
||||
@@ -132,6 +136,8 @@ class TestPostRepository:
|
||||
|
||||
assert params[3] == sample_post_no_date.created_at # created_at
|
||||
assert params[4] == sample_post_no_date.status # status (default suggest)
|
||||
# Проверяем is_anonymous (должен быть в параметрах)
|
||||
assert len(params) == 6 # Всего 6 параметров включая is_anonymous
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_post_logs_correctly(self, post_repository, sample_post):
|
||||
@@ -476,6 +482,169 @@ class TestPostRepository:
|
||||
# Проверяем, что logger.info не вызывался
|
||||
post_repository.logger.info.assert_not_called()
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_post_text_and_anonymity_by_message_id_found(self, post_repository):
|
||||
"""Тест получения текста и is_anonymous по message_id (пост найден)."""
|
||||
# Мокаем _execute_query_with_result
|
||||
mock_result = [("Тестовый текст", 1)] # is_anonymous = 1 (True)
|
||||
post_repository._execute_query_with_result = AsyncMock(return_value=mock_result)
|
||||
post_repository.logger = MagicMock()
|
||||
|
||||
message_id = 12345
|
||||
|
||||
result = await post_repository.get_post_text_and_anonymity_by_message_id(message_id)
|
||||
|
||||
# Проверяем результат
|
||||
text, is_anonymous = result
|
||||
assert text == "Тестовый текст"
|
||||
assert is_anonymous is True
|
||||
|
||||
# Проверяем вызов _execute_query_with_result
|
||||
post_repository._execute_query_with_result.assert_called_once()
|
||||
call_args = post_repository._execute_query_with_result.call_args
|
||||
query = call_args[0][0]
|
||||
params = call_args[0][1]
|
||||
|
||||
assert "SELECT text, is_anonymous FROM post_from_telegram_suggest WHERE message_id = ?" in query
|
||||
assert params == (message_id,)
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_post_text_and_anonymity_by_message_id_with_false(self, post_repository):
|
||||
"""Тест получения текста и is_anonymous по message_id (is_anonymous = False)."""
|
||||
# Мокаем _execute_query_with_result
|
||||
mock_result = [("Тестовый текст", 0)] # is_anonymous = 0 (False)
|
||||
post_repository._execute_query_with_result = AsyncMock(return_value=mock_result)
|
||||
|
||||
message_id = 12345
|
||||
|
||||
result = await post_repository.get_post_text_and_anonymity_by_message_id(message_id)
|
||||
|
||||
# Проверяем результат
|
||||
text, is_anonymous = result
|
||||
assert text == "Тестовый текст"
|
||||
assert is_anonymous is False
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_post_text_and_anonymity_by_message_id_with_null(self, post_repository):
|
||||
"""Тест получения текста и is_anonymous по message_id (is_anonymous = NULL)."""
|
||||
# Мокаем _execute_query_with_result
|
||||
mock_result = [("Тестовый текст", None)] # is_anonymous = NULL
|
||||
post_repository._execute_query_with_result = AsyncMock(return_value=mock_result)
|
||||
|
||||
message_id = 12345
|
||||
|
||||
result = await post_repository.get_post_text_and_anonymity_by_message_id(message_id)
|
||||
|
||||
# Проверяем результат
|
||||
text, is_anonymous = result
|
||||
assert text == "Тестовый текст"
|
||||
assert is_anonymous is None
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_post_text_and_anonymity_by_message_id_not_found(self, post_repository):
|
||||
"""Тест получения текста и is_anonymous по message_id (пост не найден)."""
|
||||
# Мокаем _execute_query_with_result
|
||||
mock_result = []
|
||||
post_repository._execute_query_with_result = AsyncMock(return_value=mock_result)
|
||||
|
||||
message_id = 12345
|
||||
|
||||
result = await post_repository.get_post_text_and_anonymity_by_message_id(message_id)
|
||||
|
||||
# Проверяем результат
|
||||
text, is_anonymous = result
|
||||
assert text is None
|
||||
assert is_anonymous is None
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_post_text_and_anonymity_by_helper_id_found(self, post_repository):
|
||||
"""Тест получения текста и is_anonymous по helper_message_id (пост найден)."""
|
||||
# Мокаем _execute_query_with_result
|
||||
mock_result = [("Тестовый текст", 1)] # is_anonymous = 1 (True)
|
||||
post_repository._execute_query_with_result = AsyncMock(return_value=mock_result)
|
||||
post_repository.logger = MagicMock()
|
||||
|
||||
helper_message_id = 67890
|
||||
|
||||
result = await post_repository.get_post_text_and_anonymity_by_helper_id(helper_message_id)
|
||||
|
||||
# Проверяем результат
|
||||
text, is_anonymous = result
|
||||
assert text == "Тестовый текст"
|
||||
assert is_anonymous is True
|
||||
|
||||
# Проверяем вызов _execute_query_with_result
|
||||
post_repository._execute_query_with_result.assert_called_once()
|
||||
call_args = post_repository._execute_query_with_result.call_args
|
||||
query = call_args[0][0]
|
||||
params = call_args[0][1]
|
||||
|
||||
assert "SELECT text, is_anonymous FROM post_from_telegram_suggest WHERE helper_text_message_id = ?" in query
|
||||
assert params == (helper_message_id,)
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_post_with_is_anonymous_true(self, post_repository):
|
||||
"""Тест добавления поста с is_anonymous=True."""
|
||||
post = TelegramPost(
|
||||
message_id=12345,
|
||||
text="Тестовый пост анон",
|
||||
author_id=67890,
|
||||
created_at=int(datetime.now().timestamp()),
|
||||
is_anonymous=True
|
||||
)
|
||||
|
||||
post_repository._execute_query = AsyncMock()
|
||||
|
||||
await post_repository.add_post(post)
|
||||
|
||||
call_args = post_repository._execute_query.call_args
|
||||
params = call_args[0][1]
|
||||
|
||||
# Проверяем, что is_anonymous преобразован в 1
|
||||
assert params[5] == 1
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_post_with_is_anonymous_false(self, post_repository):
|
||||
"""Тест добавления поста с is_anonymous=False."""
|
||||
post = TelegramPost(
|
||||
message_id=12345,
|
||||
text="Тестовый пост неанон",
|
||||
author_id=67890,
|
||||
created_at=int(datetime.now().timestamp()),
|
||||
is_anonymous=False
|
||||
)
|
||||
|
||||
post_repository._execute_query = AsyncMock()
|
||||
|
||||
await post_repository.add_post(post)
|
||||
|
||||
call_args = post_repository._execute_query.call_args
|
||||
params = call_args[0][1]
|
||||
|
||||
# Проверяем, что is_anonymous преобразован в 0
|
||||
assert params[5] == 0
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_add_post_with_is_anonymous_none(self, post_repository):
|
||||
"""Тест добавления поста с is_anonymous=None."""
|
||||
post = TelegramPost(
|
||||
message_id=12345,
|
||||
text="Тестовый пост",
|
||||
author_id=67890,
|
||||
created_at=int(datetime.now().timestamp()),
|
||||
is_anonymous=None
|
||||
)
|
||||
|
||||
post_repository._execute_query = AsyncMock()
|
||||
|
||||
await post_repository.add_post(post)
|
||||
|
||||
call_args = post_repository._execute_query.call_args
|
||||
params = call_args[0][1]
|
||||
|
||||
# Проверяем, что is_anonymous остался None
|
||||
assert params[5] is None
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_create_tables_logs_success(self, post_repository):
|
||||
"""Тест логирования успешного создания таблиц."""
|
||||
|
||||
Reference in New Issue
Block a user