Files
core/tests/test_draft_publish_fix.py

149 lines
5.7 KiB
Python
Raw Normal View History

2025-08-21 12:16:30 +03:00
"""
Тест исправления публикации черновиков.
Проверяет что:
1. Убран недопустимый аргумент 'draft' из создания Shout
2. Draft.shout корректно обновляется после публикации
3. Draft.shout очищается при снятии с публикации
"""
import pytest
from unittest.mock import AsyncMock, MagicMock, patch
from orm.draft import Draft
from orm.shout import Shout
from resolvers.draft import create_shout_from_draft
class TestDraftPublishFix:
"""Тесты исправления публикации черновиков."""
def test_create_shout_from_draft_no_draft_argument(self):
"""Тест что create_shout_from_draft не передает недопустимый аргумент 'draft'."""
# Arrange
mock_draft = MagicMock(spec=Draft)
mock_draft.body = "Test body"
mock_draft.slug = "test-slug"
mock_draft.cover = "test-cover.jpg"
mock_draft.cover_caption = "Test caption"
mock_draft.lead = "Test lead"
mock_draft.title = "Test title"
mock_draft.subtitle = "Test subtitle"
mock_draft.layout = "article"
mock_draft.media = []
mock_draft.lang = "ru"
mock_draft.seo = "test-seo"
mock_draft.community = 1
# Act
shout = create_shout_from_draft(None, mock_draft, 1)
# Assert
assert isinstance(shout, Shout)
assert shout.body == "Test body"
assert shout.slug == "test-slug"
assert shout.cover == "test-cover.jpg"
assert shout.cover_caption == "Test caption"
assert shout.lead == "Test lead"
assert shout.title == "Test title"
assert shout.subtitle == "Test subtitle"
assert shout.layout == "article"
assert shout.media == []
assert shout.lang == "ru"
assert shout.seo == "test-seo"
assert shout.created_by == 1
assert shout.community == 1
assert shout.deleted_at is None
# Проверяем что нет поля draft
assert not hasattr(shout, 'draft')
def test_draft_model_has_shout_field(self):
"""Тест что модель Draft имеет поле shout."""
# Arrange & Act
draft = Draft()
# Assert
assert hasattr(draft, 'shout')
assert draft.shout is None
def test_shout_model_does_not_have_draft_field(self):
"""Тест что модель Shout не имеет поля draft."""
# Arrange & Act
shout = Shout()
# Assert
assert not hasattr(shout, 'draft')
2025-08-23 11:56:40 +03:00
"""
Тест для проверки исправления возвращаемого значения в publish_draft.
"""
import pytest
from unittest.mock import patch, MagicMock, AsyncMock
from resolvers.draft import publish_draft
@pytest.mark.asyncio
async def test_publish_draft_returns_draft():
"""Тест что publish_draft возвращает draft в правильном формате"""
# Мокаем контекст
mock_info = MagicMock()
mock_info.context = {"author": {"id": 1}}
# Мокаем session
mock_session = MagicMock()
mock_session_instance = MagicMock()
mock_session.return_value.__enter__.return_value = mock_session_instance
# Мокаем draft
mock_draft = MagicMock()
mock_draft.id = 1
mock_draft.body = "<p>Test content</p>"
mock_draft.shout = None
mock_draft.authors = []
mock_draft.topics = []
mock_draft.dict.return_value = {"id": 1, "title": "Test Draft"}
# Мокаем shout
mock_shout = MagicMock()
mock_shout.id = 100
mock_shout.slug = "test-shout"
mock_shout.published_at = 1234567890
mock_shout.dict.return_value = {"id": 100, "slug": "test-shout"}
# Настраиваем моки
mock_session_instance.query.return_value.options.return_value.where.return_value.first.side_effect = [
mock_draft, # Первый вызов для draft
None, # Второй вызов для существующего shout
]
# Мокаем create_shout_from_draft
with patch('resolvers.draft.create_shout_from_draft', return_value=mock_shout):
with patch('resolvers.draft.validate_html_content', return_value=(True, None)):
with patch('resolvers.draft.invalidate_shouts_cache', new_callable=AsyncMock):
with patch('resolvers.draft.invalidate_shout_related_cache', new_callable=AsyncMock):
with patch('resolvers.draft.notify_shout', new_callable=AsyncMock):
with patch('resolvers.draft.search_service.index'):
with patch('resolvers.draft.local_session', mock_session):
# Вызываем функцию
result = await publish_draft(None, mock_info, 1)
# Проверяем результат
assert "draft" in result
assert "error" not in result
draft_data = result["draft"]
assert draft_data["id"] == 1
assert "shout" in draft_data
shout_data = draft_data["shout"]
assert shout_data["id"] == 100
assert shout_data["slug"] == "test-shout"
assert shout_data["published_at"] == 1234567890
if __name__ == "__main__":
pytest.main([__file__])