refactor: !hp собирает список команд из bot.commands вместо хардкода

- commands/help.py: список команд генерируется автоматически из
  ctx.bot.commands с описаниями из docstring
- tests/test_help_discord.py: добавлен _make_mock_command() и мок
  ctx.bot.commands для тестов
This commit is contained in:
deadzilla 2026-06-09 20:39:43 +05:00
parent d698380cd7
commit 2690ee72e3
2 changed files with 27 additions and 12 deletions

View File

@ -12,21 +12,20 @@ class Help(commands.Cog):
async def _show_help(self, ctx: commands.Context):
"""Вывести список команд в простом текстовом формате."""
commands_list = [
("!pg", "Прогноз погоды в Магнитогорске"),
("!nw", "Топ-5 статей и топ-5 новостей AI с Habr"),
("!morning", "Утренний дайджест: погода + новости + котик"),
("!cat", "Случайный котик"),
("!msg <текст>", "Повторить текст в чате"),
]
# Собираем команды автоматически из bot.commands
commands_list = []
for cmd in ctx.bot.commands:
name = cmd.name
# Описание из docstring первой команды (если есть дубликаты)
desc = (cmd.__doc__ or "".strip()).split("\n")[0].strip()
commands_list.append(f"!{name}{desc}")
commands_list.sort()
message = "Discord Bot — Доступные команды\n"
message += "=" * 40 + "\n\n"
for cmd_name, description in commands_list:
message += f"{cmd_name}{description}\n"
message += "\n" + "=" * 40
message += "\n".join(commands_list)
message += "\n\n" + "=" * 40
await ctx.send(message)

View File

@ -7,11 +7,20 @@ 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()
@ -30,6 +39,13 @@ class TestHelpCommandDiscord:
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()