feat: тесты
This commit is contained in:
168
tests/test_target_channels.py
Normal file
168
tests/test_target_channels.py
Normal 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
|
||||
Reference in New Issue
Block a user