discordBot/tests/test_help_discord.py
deadzilla 2690ee72e3 refactor: !hp собирает список команд из bot.commands вместо хардкода
- commands/help.py: список команд генерируется автоматически из
  ctx.bot.commands с описаниями из docstring
- tests/test_help_discord.py: добавлен _make_mock_command() и мок
  ctx.bot.commands для тестов
2026-06-09 20:39:43 +05:00

73 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Тесты для команды !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"])