- commands/help.py: список команд генерируется автоматически из ctx.bot.commands с описаниями из docstring - tests/test_help_discord.py: добавлен _make_mock_command() и мок ctx.bot.commands для тестов
73 lines
2.7 KiB
Python
73 lines
2.7 KiB
Python
"""Тесты для команды !hp (help)."""
|
||
|
||
import pytest
|
||
from unittest.mock import AsyncMock, MagicMock
|
||
|
||
|
||
class TestHelpCommandDiscord:
|
||
"""Тесты для команды help на Discord."""
|
||
|
||
@staticmethod
|
||
def _make_mock_command(name, doc):
|
||
"""Создать mock-объект команды с name и docstring."""
|
||
cmd = MagicMock(spec=[])
|
||
cmd.name = name
|
||
cmd.__doc__ = doc
|
||
return cmd
|
||
|
||
async def test_show_help_sends_simple_text(self):
|
||
"""Проверка, что команда отправляет простое текстовое сообщение."""
|
||
from commands.help import Help
|
||
|
||
mock_ctx = MagicMock()
|
||
mock_ctx.bot.commands = []
|
||
mock_ctx.send = AsyncMock(return_value=None)
|
||
|
||
helper = Help()
|
||
await helper._show_help(mock_ctx)
|
||
|
||
mock_ctx.send.assert_awaited_once()
|
||
|
||
async def test_show_help_message_content(self):
|
||
"""Проверка содержания отправленного сообщения."""
|
||
from commands.help import Help
|
||
|
||
message_calls = []
|
||
|
||
def send_side_effect(text: str, *args, **kwargs):
|
||
message_calls.append(text)
|
||
return MagicMock()
|
||
|
||
mock_ctx = MagicMock()
|
||
mock_ctx.bot.commands = [
|
||
self._make_mock_command("pg", "Прогноз погоды в Магнитогорске"),
|
||
self._make_mock_command("nw", "Топ-5 статей и топ-5 новостей AI с Habr"),
|
||
self._make_mock_command("morning", "Утренний дайджест: погода + новости + котик"),
|
||
self._make_mock_command("cat", "Случайный котик"),
|
||
self._make_mock_command("msg", "Повторить текст в чате"),
|
||
]
|
||
mock_ctx.send = AsyncMock(side_effect=send_side_effect)
|
||
|
||
helper = Help()
|
||
await helper._show_help(mock_ctx)
|
||
|
||
assert len(message_calls) == 1
|
||
message = message_calls[0]
|
||
|
||
# Проверка структуры сообщения
|
||
assert "Discord Bot — Доступные команды" in message
|
||
assert "=" * 40 in message
|
||
|
||
# Проверяем наличие всех команд без кавычек
|
||
commands = ["!pg", "!nw", "!morning", "!cat", "!msg"]
|
||
for cmd in commands:
|
||
assert cmd in message, f"Команда {cmd} не найдена"
|
||
|
||
# Проверяем разделение тире между командой и описанием
|
||
lines = [l.strip() for l in message.split("\n") if "—" in l]
|
||
assert len(lines) >= 5
|
||
|
||
|
||
if __name__ == "__main__":
|
||
pytest.main([__file__, "-v"])
|