Задачи Sprint 1 (Critical Fixes): - [1.1] Fallback в пустом embed (!morning) — добавлена проверка has_real_data и fallback сообщение при отключении внешних API - [1.2] Обработка ошибок токена/сети в bot.run() — raise_exception=True + логирование LoginFailure, HTTPException, Exception - [1.3] Рефакторинг парсинга погоды — вынесено в format_weather_data_for_console(), убран дублирующий код из 2 файлов Изменения: • utils/morning_runner.py — добавлена проверка has_real_data после формирования description_lines • bot.py — обработчики исключений для запуска бота с детализированным логированием и пользовательскими сообщениями • utils/pogoda.py — новая функция format_weather_data_for_console() для центрального форматирования погодных данных • console_commands/pogoda.py — замена 15 строк дублирующейся логики на вызов единой функции (24→8 строк) • console_commands/morning.py — аналогичные изменения для команды morning (19→13 строк с погодой) • tests/test_morning_runner.py — +2 теста для fallback сценариев empty embed и only weather data • tests/test_bot.py — новый файл с 2 тестами на проверку кода обработки ошибок • tests/test_pogoda.py — +6 тестов для format_weather_data_for_console() Статистика тестирования: • Общее количество тестов: 200 (было 190) • Новые тесты: 10 • Все тесты проходят успешно Примечания: - Сообщения без восклицательных знаков согласно preferencem
55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
"""
|
||
Тесты для bot.py — проверка обработки ошибок запуска бота.
|
||
|
||
Покрывают пункт 1.2 из PLAN_OF_WORKS.md:
|
||
- raise_exception=True в bot.run()
|
||
- Логирование и обработка исключений (LoginFailure, HTTPException)
|
||
"""
|
||
|
||
import sys
|
||
from pathlib import Path
|
||
from unittest.mock import MagicMock, patch
|
||
|
||
# Добавляем корень проекта в путь импорта
|
||
ROOT_DIR = Path(__file__).resolve().parent.parent
|
||
sys.path.insert(0, str(ROOT_DIR))
|
||
|
||
|
||
class TestBotInit:
|
||
"""Тесты для инициализации бота."""
|
||
|
||
def test_bot_created_with_default_prefix(self):
|
||
"""Проверка, что бот создан с правильным префиксом команд."""
|
||
import bot
|
||
|
||
assert bot.bot.command_prefix == "!", (
|
||
f"Команда должна быть с префиксом '!', а не '{bot.bot.command_prefix}'"
|
||
)
|
||
|
||
|
||
class TestBotErrorHandlingCodeExists:
|
||
"""Тесты для проверки наличия кода обработки ошибок в bot.py."""
|
||
|
||
def test_error_handling_code_exists(self):
|
||
"""Проверка, что код обработки ошибок существует в файле bot.py."""
|
||
with open(ROOT_DIR / "bot.py", encoding="utf-8") as f:
|
||
content = f.read()
|
||
|
||
# Проверяем наличие raise_exception=True
|
||
assert "raise_exception=True" in content, (
|
||
"В bot.py должен присутствовать параметр raise_exception=True"
|
||
)
|
||
|
||
# Проверяем наличие обработки LoginFailure
|
||
assert "LoginFailure" in content, "В bot.py должна быть обработка LoginFailure"
|
||
|
||
# Проверяем наличие обработки HTTPException
|
||
assert "HTTPException" in content, "В bot.py должна быть обработка HTTPException"
|
||
|
||
# Проверяем наличие логирования ошибок
|
||
assert "logger.critical" in content, "В bot.py должно быть критическое логирование"
|
||
|
||
|
||
if __name__ == "__main__":
|
||
pytest.main([__file__, "-v"])
|