Files
tgex-backend/tests/test_creatives.py
2025-12-08 22:53:31 +03:00

245 lines
8.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Тесты работы с креативами."""
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,
status=domain.TargetChannelStatus.ACTIVE,
)
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.placements_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,
status=domain.TargetChannelStatus.ACTIVE,
)
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,
status=domain.TargetChannelStatus.ACTIVE,
)
target2 = domain.TargetChannel(
telegram_id=-1001234567891,
title='Target 2',
username='target2',
user_id=user.id,
status=domain.TargetChannelStatus.ACTIVE,
)
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
# TODO: Implement archive_creative method
# @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,
# status=domain.TargetChannelStatus.ACTIVE,
# )
# 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,
status=domain.TargetChannelStatus.ACTIVE,
)
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,
status=domain.TargetChannelStatus.ACTIVE,
)
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