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,168 @@
"""Тесты подключения целевых каналов."""
import pytest
from fastapi import HTTPException
from src import domain, dto, usecase
from tests.conftest import MockDatabase, MockTelegramWriter
@pytest.mark.asyncio
async def test_connect_new_channel_success(usecases: usecase.Usecase, mock_database: MockDatabase) -> None:
"""Подключение нового канала с правами администратора."""
user = domain.User(telegram_id=123456, username='testuser')
await mock_database.create_user(user)
input_data = dto.ConnectTargetChanInput(
telegram_id=-1001234567890,
title='Test Channel',
username='testchannel',
user_telegram_id=123456,
bot_permissions=dto.ChannelBotPermissions(
is_admin=True,
can_invite_users=True,
can_restrict_members=True,
),
)
result = await usecases.connect_target_chan(input_data)
assert result.telegram_id == -1001234567890
assert result.title == 'Test Channel'
assert result.is_active is True
# Проверяем, что канал сохранён
channel = await mock_database.get_target_channel(user.id, telegram_id=-1001234567890)
assert channel is not None
@pytest.mark.asyncio
async def test_connect_channel_without_admin_rights(
usecases: usecase.Usecase, mock_database: MockDatabase, mock_telegram: MockTelegramWriter
) -> None:
"""Канал без прав администратора не подключается."""
user = domain.User(telegram_id=123456, username='testuser')
await mock_database.create_user(user)
input_data = dto.ConnectTargetChanInput(
telegram_id=-1001234567890,
title='Test Channel',
username='testchannel',
user_telegram_id=123456,
bot_permissions=dto.ChannelBotPermissions(
is_admin=False,
can_invite_users=False,
can_restrict_members=False,
),
)
with pytest.raises(HTTPException) as exc_info:
await usecases.connect_target_chan(input_data)
assert exc_info.value.status_code == 403
# Проверяем, что бот отправил предупреждение
assert len(mock_telegram.sent_messages) == 1
assert 'не является админом' in mock_telegram.sent_messages[0]['text']
@pytest.mark.asyncio
async def test_connect_channel_without_required_permissions(
usecases: usecase.Usecase, mock_database: MockDatabase, mock_telegram: MockTelegramWriter
) -> None:
"""Канал без необходимых прав не подключается."""
user = domain.User(telegram_id=123456, username='testuser')
await mock_database.create_user(user)
input_data = dto.ConnectTargetChanInput(
telegram_id=-1001234567890,
title='Test Channel',
username='testchannel',
user_telegram_id=123456,
bot_permissions=dto.ChannelBotPermissions(
is_admin=True,
can_invite_users=False, # Отсутствует необходимое право
can_restrict_members=True,
),
)
with pytest.raises(HTTPException) as exc_info:
await usecases.connect_target_chan(input_data)
assert exc_info.value.status_code == 403
assert len(mock_telegram.sent_messages) == 1
assert 'не имеет необходимых прав' in mock_telegram.sent_messages[0]['text']
@pytest.mark.asyncio
async def test_connect_channel_user_not_found(usecases: usecase.Usecase, mock_telegram: MockTelegramWriter) -> None:
"""Подключение канала неавторизованным пользователем вызывает ошибку."""
input_data = dto.ConnectTargetChanInput(
telegram_id=-1001234567890,
title='Test Channel',
username='testchannel',
user_telegram_id=999999, # Несуществующий пользователь
bot_permissions=dto.ChannelBotPermissions(
is_admin=True,
can_invite_users=True,
can_restrict_members=True,
),
)
with pytest.raises(HTTPException) as exc_info:
await usecases.connect_target_chan(input_data)
assert exc_info.value.status_code == 404
assert 'not found' in str(exc_info.value.detail).lower()
assert len(mock_telegram.sent_messages) == 1
assert 'авторизоваться' in mock_telegram.sent_messages[0]['text']
@pytest.mark.asyncio
async def test_get_user_target_channels(usecases: usecase.Usecase, mock_database: MockDatabase) -> None:
"""Получение списка каналов пользователя."""
user = domain.User(telegram_id=123456, username='testuser')
await mock_database.create_user(user)
channel1 = domain.TargetChannel(
telegram_id=-1001234567890,
title='Channel 1',
username='channel1',
user_id=user.id,
is_active=True,
)
channel2 = domain.TargetChannel(
telegram_id=-1001234567891,
title='Channel 2',
username='channel2',
user_id=user.id,
is_active=True,
)
await mock_database.upsert_target_channel(channel1)
await mock_database.upsert_target_channel(channel2)
result = await usecases.get_user_target_chans(dto.GetUserTargetChansInput(user_id=user.id))
assert len(result.target_channels) == 2
@pytest.mark.asyncio
async def test_disconnect_target_channel(usecases: usecase.Usecase, mock_database: MockDatabase) -> None:
"""Отключение целевого канала."""
user = domain.User(telegram_id=123456, username='testuser')
await mock_database.create_user(user)
channel = domain.TargetChannel(
telegram_id=-1001234567890,
title='Test Channel',
username='testchannel',
user_id=user.id,
is_active=True,
)
await mock_database.upsert_target_channel(channel)
await usecases.disconnect_target_chan(dto.DisconnectTargetChanInput(channel_id=channel.id, user_id=user.id))
# Проверяем, что канал стал неактивным
updated_channel = await mock_database.get_target_channel(user.id, channel_id=channel.id)
assert updated_channel is not None
assert updated_channel.is_active is False