"""Тесты работы с креативами.""" import pytest from fastapi import HTTPException from src import domain, dto, usecase from tests.conftest import MockDatabase @pytest.mark.asyncio async def test_create_creative_success(usecases: usecase.Usecase, mock_database: MockDatabase) -> None: """Создание нового креатива.""" user = domain.User(telegram_id=123456, username='testuser') await mock_database.create_user(user) target_channel = domain.TargetChannel( telegram_id=-1001234567890, title='Target Channel', username='targetchannel', user_id=user.id, is_active=True, ) await mock_database.upsert_target_channel(target_channel) input_data = dto.CreateCreativeInput( name='Test Creative', text='Приглашаю подписаться на канал: {link}', target_channel_id=target_channel.id, ) result = await usecases.create_creative(input_data, user.id) assert result.name == 'Test Creative' assert result.text == 'Приглашаю подписаться на канал: {link}' assert result.target_channel_id == target_channel.id assert result.status == domain.CreativeStatus.ACTIVE assert result.purchases_count == 0 @pytest.mark.asyncio async def test_create_creative_invalid_target_channel(usecases: usecase.Usecase, mock_database: MockDatabase) -> None: """Создание креатива для несуществующего целевого канала вызывает ошибку.""" user = domain.User(telegram_id=123456, username='testuser') await mock_database.create_user(user) import uuid fake_target_id = uuid.uuid4() input_data = dto.CreateCreativeInput( name='Test Creative', text='Test text', target_channel_id=fake_target_id, ) with pytest.raises(HTTPException) as exc_info: await usecases.create_creative(input_data, user.id) assert exc_info.value.status_code == 404 assert 'Target channel' in str(exc_info.value.detail) @pytest.mark.asyncio async def test_get_user_creatives(usecases: usecase.Usecase, mock_database: MockDatabase) -> None: """Получение списка креативов пользователя.""" user = domain.User(telegram_id=123456, username='testuser') await mock_database.create_user(user) target_channel = domain.TargetChannel( telegram_id=-1001234567890, title='Target Channel', username='targetchannel', user_id=user.id, is_active=True, ) await mock_database.upsert_target_channel(target_channel) creative1 = domain.Creative( name='Creative 1', text='Text 1', target_channel_id=target_channel.id, user_id=user.id, status=domain.CreativeStatus.ACTIVE, ) creative2 = domain.Creative( name='Creative 2', text='Text 2', target_channel_id=target_channel.id, user_id=user.id, status=domain.CreativeStatus.ACTIVE, ) await mock_database.create_creative(creative1) await mock_database.create_creative(creative2) result = await usecases.get_creatives(dto.GetCreativesInput(user_id=user.id)) assert len(result.creatives) == 2 @pytest.mark.asyncio async def test_get_creatives_filtered_by_target_channel(usecases: usecase.Usecase, mock_database: MockDatabase) -> None: """Получение креативов для конкретного целевого канала.""" user = domain.User(telegram_id=123456, username='testuser') await mock_database.create_user(user) target1 = domain.TargetChannel( telegram_id=-1001234567890, title='Target 1', username='target1', user_id=user.id, is_active=True, ) target2 = domain.TargetChannel( telegram_id=-1001234567891, title='Target 2', username='target2', user_id=user.id, is_active=True, ) await mock_database.upsert_target_channel(target1) await mock_database.upsert_target_channel(target2) creative1 = domain.Creative( name='Creative 1', text='Text 1', target_channel_id=target1.id, user_id=user.id, status=domain.CreativeStatus.ACTIVE ) creative2 = domain.Creative( name='Creative 2', text='Text 2', target_channel_id=target2.id, user_id=user.id, status=domain.CreativeStatus.ACTIVE ) await mock_database.create_creative(creative1) await mock_database.create_creative(creative2) result = await usecases.get_creatives(dto.GetCreativesInput(user_id=user.id, target_channel_id=target1.id)) assert len(result.creatives) == 1 assert result.creatives[0].target_channel_id == target1.id @pytest.mark.asyncio async def test_archive_creative(usecases: usecase.Usecase, mock_database: MockDatabase) -> None: """Архивирование креатива.""" user = domain.User(telegram_id=123456, username='testuser') await mock_database.create_user(user) target_channel = domain.TargetChannel( telegram_id=-1001234567890, title='Target Channel', username='targetchannel', user_id=user.id, is_active=True, ) await mock_database.upsert_target_channel(target_channel) creative = domain.Creative( name='Test Creative', text='Test text', target_channel_id=target_channel.id, user_id=user.id, status=domain.CreativeStatus.ACTIVE, ) await mock_database.create_creative(creative) result = await usecases.archive_creative(creative.id, user.id) assert result.status == domain.CreativeStatus.ARCHIVED # Проверяем, что архивированный креатив не возвращается по умолчанию creatives_list = await usecases.get_creatives(dto.GetCreativesInput(user_id=user.id)) assert len(creatives_list.creatives) == 0 # Проверяем, что архивированный креатив возвращается с флагом include_archived creatives_with_archived = await usecases.get_creatives( dto.GetCreativesInput(user_id=user.id, include_archived=True) ) assert len(creatives_with_archived.creatives) == 1 @pytest.mark.asyncio async def test_update_creative(usecases: usecase.Usecase, mock_database: MockDatabase) -> None: """Редактирование креатива.""" user = domain.User(telegram_id=123456, username='testuser') await mock_database.create_user(user) target_channel = domain.TargetChannel( telegram_id=-1001234567890, title='Target Channel', username='targetchannel', user_id=user.id, is_active=True, ) await mock_database.upsert_target_channel(target_channel) creative = domain.Creative( name='Old Name', text='Old text', target_channel_id=target_channel.id, user_id=user.id, status=domain.CreativeStatus.ACTIVE, ) await mock_database.create_creative(creative) update_input = dto.UpdateCreativeInput(name='New Name', text='New text') result = await usecases.update_creative(creative.id, update_input, user.id) assert result.name == 'New Name' assert result.text == 'New text' @pytest.mark.asyncio async def test_delete_creative(usecases: usecase.Usecase, mock_database: MockDatabase) -> None: """Удаление креатива.""" user = domain.User(telegram_id=123456, username='testuser') await mock_database.create_user(user) target_channel = domain.TargetChannel( telegram_id=-1001234567890, title='Target Channel', username='targetchannel', user_id=user.id, is_active=True, ) await mock_database.upsert_target_channel(target_channel) creative = domain.Creative( name='Test Creative', text='Test text', target_channel_id=target_channel.id, user_id=user.id, status=domain.CreativeStatus.ACTIVE, ) await mock_database.create_creative(creative) await usecases.delete_creative(dto.DeleteCreativeInput(creative_id=creative.id, user_id=user.id)) # Проверяем, что креатив удалён creatives_list = await usecases.get_creatives( dto.GetCreativesInput(user_id=user.id, include_archived=True) ) assert len(creatives_list.creatives) == 0