178 lines
6.3 KiB
Python
178 lines
6.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_external_channel_with_targets(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.CreateExternalChannelInput(
|
||
telegram_id=-1009876543210,
|
||
title='External Channel',
|
||
username='externalchannel',
|
||
description='Test external channel',
|
||
subscribers_count=10000,
|
||
target_channel_ids=[target_channel.id],
|
||
)
|
||
|
||
result = await usecases.create_external_channel(input_data, user.id)
|
||
|
||
assert result.telegram_id == -1009876543210
|
||
assert result.title == 'External Channel'
|
||
assert result.subscribers_count == 10000
|
||
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_create_external_channel_invalid_target(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.CreateExternalChannelInput(
|
||
telegram_id=-1009876543210,
|
||
title='External Channel',
|
||
username='externalchannel',
|
||
target_channel_ids=[fake_target_id],
|
||
)
|
||
|
||
with pytest.raises(HTTPException) as exc_info:
|
||
await usecases.create_external_channel(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_external_channels_for_target(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)
|
||
|
||
ext_channel = domain.ExternalChannel(
|
||
telegram_id=-1009876543210,
|
||
title='External Channel',
|
||
username='externalchannel',
|
||
description=None,
|
||
subscribers_count=10000,
|
||
user_id=user.id,
|
||
)
|
||
await mock_database.create_external_channel(ext_channel)
|
||
await mock_database.add_external_channel_to_targets(ext_channel.id, [target_channel.id])
|
||
|
||
result = await usecases.get_external_channels(
|
||
dto.GetExternalChannelsInput(target_channel_id=target_channel.id, user_id=user.id)
|
||
)
|
||
|
||
assert len(result.external_channels) == 1
|
||
assert result.external_channels[0].telegram_id == -1009876543210
|
||
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_delete_external_channel(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)
|
||
|
||
ext_channel = domain.ExternalChannel(
|
||
telegram_id=-1009876543210,
|
||
title='External Channel',
|
||
username='externalchannel',
|
||
description=None,
|
||
subscribers_count=10000,
|
||
user_id=user.id,
|
||
)
|
||
await mock_database.create_external_channel(ext_channel)
|
||
await mock_database.add_external_channel_to_targets(ext_channel.id, [target_channel.id])
|
||
|
||
await usecases.delete_external_channel(dto.DeleteExternalChannelInput(channel_id=ext_channel.id, user_id=user.id))
|
||
|
||
# Проверяем, что канал удалён
|
||
channels = await mock_database.get_external_channels_for_target(target_channel.id)
|
||
assert len(channels) == 0
|
||
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_update_external_channel_links(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)
|
||
|
||
ext_channel = domain.ExternalChannel(
|
||
telegram_id=-1009876543210,
|
||
title='External Channel',
|
||
username='externalchannel',
|
||
description=None,
|
||
subscribers_count=10000,
|
||
user_id=user.id,
|
||
)
|
||
await mock_database.create_external_channel(ext_channel)
|
||
await mock_database.add_external_channel_to_targets(ext_channel.id, [target1.id])
|
||
|
||
# Добавляем связь с target2
|
||
await usecases.update_external_channel_links(
|
||
ext_channel.id,
|
||
dto.UpdateExternalChannelLinksInput(
|
||
add_target_channel_ids=[target2.id],
|
||
remove_target_channel_ids=[],
|
||
),
|
||
user.id,
|
||
)
|
||
|
||
# Проверяем, что канал теперь привязан к обоим целевым каналам
|
||
channels_for_target2 = await mock_database.get_external_channels_for_target(target2.id)
|
||
assert len(channels_for_target2) == 1
|