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:
parent
d698380cd7
commit
2690ee72e3
@ -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)
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user