Проблема: _start_time хранился в Status Cog, но консольная команда искала его на объекте bot — всегда получала fallback time.time() и показывала 0с. Решение: _start_time устанавливается в BotRunner.__init__ на объекте bot. Cog и console_command читают getattr(bot, '_start_time'). Изменено: bot.py, commands/status.py, console_commands/status.py, tests/test_commands_status.py
82 lines
2.5 KiB
Python
82 lines
2.5 KiB
Python
"""Тесты для команды !status."""
|
||
import time
|
||
|
||
import pytest
|
||
from unittest.mock import AsyncMock, MagicMock, patch
|
||
|
||
|
||
class TestStatusCommand:
|
||
"""Тесты Discord-команды status."""
|
||
|
||
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.bot._start_time = time.time()
|
||
mock_ctx.send = AsyncMock(return_value=None)
|
||
|
||
cog = Status()
|
||
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.bot._start_time = time.time() - 90061 # 1д 1ч 1м 1с
|
||
mock_ctx.send = AsyncMock(return_value=None)
|
||
|
||
cog = Status()
|
||
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
|