feat: тесты

This commit is contained in:
Artem Tsyrulnikov
2025-11-10 16:21:14 +03:00
parent cd167fdb43
commit b43042c745
13 changed files with 949 additions and 6 deletions

View File

@@ -0,0 +1,177 @@
"""Тесты каталога внешних каналов."""
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