discordBot/tests/test_commands_stats.py
deadzilla 91f34625a8 feat: команды !status и !stats
Добавлены 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
2026-06-12 16:19:21 +05:00

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"