244 lines
8.3 KiB
Python
244 lines
8.3 KiB
Python
"""Тесты работы с креативами."""
|
||
|
||
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
|