Добавлены 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
90 lines
2.7 KiB
Python
90 lines
2.7 KiB
Python
"""Тесты для команды !status."""
|
||
import time
|
||
|
||
import pytest
|
||
from unittest.mock import AsyncMock, MagicMock, patch
|
||
|
||
|
||
class TestStatusCommand:
|
||
"""Тесты Discord-команды status."""
|
||
|
||
def _make_cog(self, start_time=None):
|
||
"""Создать Status cog с моком времени."""
|
||
from commands.status import Status
|
||
|
||
cog = Status()
|
||
if start_time is not None:
|
||
cog._start_time = start_time
|
||
return cog
|
||
|
||
async def test_status_sends_embed(self):
|
||
"""Команда status отправляет embed-сообщение."""
|
||
from commands.status import Status
|
||
|
||
mock_ctx = MagicMock()
|
||
mock_ctx.bot.latency = 0.042
|
||
mock_ctx.send = AsyncMock(return_value=None)
|
||
|
||
cog = self._make_cog()
|
||
await cog.status(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 == "Статус бота"
|
||
assert "42.0 мс" in embed.fields[0].value
|
||
|
||
async def test_status_uptime_format(self):
|
||
"""Uptime форматируется корректно."""
|
||
from commands.status import Status
|
||
|
||
mock_ctx = MagicMock()
|
||
mock_ctx.bot.latency = 0.050
|
||
mock_ctx.send = AsyncMock(return_value=None)
|
||
|
||
start = time.time() - 90061 # 1д 1ч 1м 1с
|
||
cog = self._make_cog(start_time=start)
|
||
await cog.status(cog, mock_ctx)
|
||
|
||
call_args = mock_ctx.send.call_args
|
||
embed = call_args[1]["embed"] if call_args[1] else call_args[0][0]
|
||
uptime = embed.fields[1].value
|
||
assert "1д" in uptime
|
||
assert "1ч" in uptime
|
||
assert "1м" in uptime
|
||
assert "1с" in uptime
|
||
|
||
|
||
class TestFormatUptime:
|
||
"""Тесты форматирования uptime."""
|
||
|
||
def test_zero_seconds(self):
|
||
from commands.status import Status
|
||
|
||
result = Status._format_uptime(0)
|
||
assert result == "0с"
|
||
|
||
def test_minutes_and_seconds(self):
|
||
from commands.status import Status
|
||
|
||
result = Status._format_uptime(125) # 2м 5с
|
||
assert "2м" in result
|
||
assert "5с" in result
|
||
|
||
def test_hours_minutes_seconds(self):
|
||
from commands.status import Status
|
||
|
||
result = Status._format_uptime(3661) # 1ч 1м 1с
|
||
assert "1ч" in result
|
||
assert "1м" in result
|
||
assert "1с" in result
|
||
|
||
def test_full_day(self):
|
||
from commands.status import Status
|
||
|
||
result = Status._format_uptime(90061) # 1д 1ч 1м 1с
|
||
assert "1д" in result
|
||
assert "1ч" in result
|
||
assert "1м" in result
|
||
assert "1с" in result
|