feat: тесты
This commit is contained in:
237
tests/test_creatives.py
Normal file
237
tests/test_creatives.py
Normal file
@@ -0,0 +1,237 @@
|
||||
"""Тесты работы с креативами."""
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user