Добавлены Discord-команды: - !status — пинг к gateway, uptime, статус (embed) - !stats — серверы, каналы, пользователи (embed) Добавлены консольные команды: - status — статус бота в терминале - stats — статистика серверов в терминале Тесты: - test_commands_status.py (6 тестов) - test_commands_stats.py (4 теста) - всего: 233 теста Обновления: - README.md — новые команды в таблицах и архитектуре - ISSUES.md — высокий приоритет закрыт - admin.py — hint на !status и !stats
94 lines
3.4 KiB
Python
94 lines
3.4 KiB
Python
"""Тесты для команды !stats."""
|
|
import pytest
|
|
from unittest.mock import AsyncMock, MagicMock
|
|
|
|
|
|
class TestStatsCommand:
|
|
"""Тесты Discord-команды stats."""
|
|
|
|
def _make_mock_guild(self, channel_count=5, member_count=100):
|
|
"""Создать mock-сервер."""
|
|
guild = MagicMock()
|
|
guild.channels = [MagicMock() for _ in range(channel_count)]
|
|
guild.member_count = member_count
|
|
return guild
|
|
|
|
async def test_stats_sends_embed(self):
|
|
"""Команда stats отправляет embed-сообщение."""
|
|
from commands.stats import Stats
|
|
|
|
mock_ctx = MagicMock()
|
|
mock_ctx.bot.latency = 0.035
|
|
mock_ctx.bot.guilds = []
|
|
mock_ctx.send = AsyncMock(return_value=None)
|
|
|
|
cog = Stats()
|
|
await cog.stats(cog, mock_ctx)
|
|
|
|
mock_ctx.send.assert_awaited_once()
|
|
call_args = mock_ctx.send.call_args
|
|
embed = call_args[1]["embed"] if call_args[1] else call_args[0][0]
|
|
assert embed.title == "Статистика серверов"
|
|
|
|
async def test_stats_correct_values(self):
|
|
"""Значения серверов, каналов и пользователей считаются верно."""
|
|
from commands.stats import Stats
|
|
|
|
guild1 = self._make_mock_guild(channel_count=10, member_count=200)
|
|
guild2 = self._make_mock_guild(channel_count=5, member_count=50)
|
|
|
|
mock_ctx = MagicMock()
|
|
mock_ctx.bot.latency = 0.035
|
|
mock_ctx.bot.guilds = [guild1, guild2]
|
|
mock_ctx.send = AsyncMock(return_value=None)
|
|
|
|
cog = Stats()
|
|
await cog.stats(cog, mock_ctx)
|
|
|
|
call_args = mock_ctx.send.call_args
|
|
embed = call_args[1]["embed"] if call_args[1] else call_args[0][0]
|
|
|
|
fields = {f.name: f.value for f in embed.fields}
|
|
assert fields["Серверов"] == "2"
|
|
assert fields["Каналов"] == "15"
|
|
assert fields["Пользователей"] == "250"
|
|
assert "35.0 мс" in fields["Пинг"]
|
|
|
|
async def test_stats_empty_guilds(self):
|
|
"""Пустой список серверов не вызывает ошибок."""
|
|
from commands.stats import Stats
|
|
|
|
mock_ctx = MagicMock()
|
|
mock_ctx.bot.latency = 0.050
|
|
mock_ctx.bot.guilds = []
|
|
mock_ctx.send = AsyncMock(return_value=None)
|
|
|
|
cog = Stats()
|
|
await cog.stats(cog, mock_ctx)
|
|
|
|
call_args = mock_ctx.send.call_args
|
|
embed = call_args[1]["embed"] if call_args[1] else call_args[0][0]
|
|
fields = {f.name: f.value for f in embed.fields}
|
|
assert fields["Серверов"] == "0"
|
|
assert fields["Каналов"] == "0"
|
|
assert fields["Пользователей"] == "0"
|
|
|
|
async def test_stats_none_member_count(self):
|
|
"""member_count=None не вызывает ошибок."""
|
|
from commands.stats import Stats
|
|
|
|
guild = self._make_mock_guild(channel_count=3, member_count=None)
|
|
|
|
mock_ctx = MagicMock()
|
|
mock_ctx.bot.latency = 0.040
|
|
mock_ctx.bot.guilds = [guild]
|
|
mock_ctx.send = AsyncMock(return_value=None)
|
|
|
|
cog = Stats()
|
|
await cog.stats(cog, mock_ctx)
|
|
|
|
call_args = mock_ctx.send.call_args
|
|
embed = call_args[1]["embed"] if call_args[1] else call_args[0][0]
|
|
fields = {f.name: f.value for f in embed.fields}
|
|
assert fields["Пользователей"] == "0"
|