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