Перейти к содержанию

Live smoke-test 0.1.0

Автоматические tests проверяют parsing, Dispatcher и Webhook round-trip без реального MAX. Эта страница описывает отдельную ручную проверку на настоящем боте. Ни один пункт таблиц ниже не считается пройденным самим code pass.

Запуск harness

Используйте отдельного тестового бота, тестовую группу/канал и отдельные учётные записи участников. Не используйте production chat.

export MAX_BOT_TOKEN="..."
export MAX_WEBHOOK_BASE_URL="https://bot.example.ru"
export MAX_WEBHOOK_SECRET="replace-with-random-secret"

# Необязательно для upload-команд:
export MAX_TEST_IMAGE="/path/to/image.png"
export MAX_TEST_FILE="/path/to/file.pdf"
export MAX_TEST_AUDIO="/path/to/audio.mp3"
export MAX_TEST_VIDEO="/path/to/video.mp4"

uvicorn examples.live_updates:app --host 127.0.0.1 --port 8000

Публичный reverse proxy должен направлять https://bot.example.ru/webhook на 127.0.0.1:8000/webhook и иметь сертификат, которому доверяет MAX. Harness подписывается на все известные update types в FastAPI lifespan. Для multi-worker запуска регистрацию подписки вынесите в отдельный setup step: каждый worker выполняет lifespan.

В stdout для каждого события выводятся:

  • update_type;
  • имя Pydantic-класса;
  • ключевые chat_id, user_id, message_id, callback_id;
  • payload с удалёнными token/secret/authorization и обрезанными длинными строками.

Bot token и Webhook secret в лог не выводятся.

Проверка update types

Во всех сценариях ожидается HTTP 200 от Webhook, одна JSON-запись в stdout и вызов указанного observer. FAIL: запросы повторяются из-за 5xx, отсутствует лог, выбран другой observer, payload не парсится либо ключевые ID неверны.

update_type Prerequisite и действие Ожидаемый handler Live в этом pass
message_created Написать боту или отправить сообщение/пост в тестовом чате router.message, объект Message Не проверено
message_callback Выполнить /buttons, нажать Callback router.callback_query, объект CallbackQuery Не проверено
message_edited Другому пользователю изменить своё сообщение/пост router.message_edited, объект Message Не проверено
message_removed Другому пользователю удалить своё сообщение/пост router.message_removed, MessageRemovedUpdate Не проверено
comment_created В канале с комментариями другому пользователю создать комментарий; действия самого бота update не дают router.comment_created, schema payload Message Не проверено
comment_edited Другому пользователю изменить комментарий router.comment_edited, schema payload Message Не проверено
comment_removed Другому пользователю удалить комментарий router.comment_removed, CommentRemovedUpdate Не проверено
bot_added Добавить тестового бота в тестовую группу/канал router.bot_added, BotAddedToChatUpdate Не проверено
bot_removed Удалить тестового бота из тестовой группы/канала router.bot_removed, BotRemovedFromChatUpdate Не проверено
user_added Добавить отдельного тестового пользователя или войти по ссылке router.user_added, UserAddedToChatUpdate Не проверено
user_removed Удалить тестового пользователя либо выйти им самостоятельно router.user_removed, UserRemovedFromChatUpdate Не проверено
bot_started Пользователю впервые запустить или возобновить бота router.bot_started, BotStartedUpdate Не проверено
bot_stopped Пользователю остановить/удалить бота в настройках router.bot_stopped, BotStoppedUpdate Не проверено
dialog_cleared Пользователю очистить историю диалога с ботом router.dialog_cleared, DialogClearedUpdate Не проверено
dialog_removed Пользователю удалить диалог с ботом; MAX также может прислать bot_stopped router.dialog_removed, DialogRemovedUpdate Не проверено
dialog_muted Пользователю отключить уведомления диалога router.dialog_muted, DialogMutedUpdate Не проверено
dialog_unmuted Пользователю включить уведомления диалога router.dialog_unmuted, DialogUnmutedUpdate Не проверено
chat_title_changed Изменить название тестовой группы/канала router.chat_title_changed, ChatTitleChangedUpdate Не проверено
bot_admin_permissions_changed В Webhook-подписке изменить права бота-администратора router.bot_admin_permissions_changed, BotAdminPermissionsChangedUpdate Не проверено; Long Polling пока не поддерживается MAX

Removed events намеренно не содержат полноценный Message. Проверяйте их ID не через message shortcuts, а непосредственно в соответствующем Update.

Безопасные API-команды

Команда Prerequisite / действие Pass
/start, /reply, /edit, /delete Диалог или тестовый чат Ответ, reply, изменение и удаление только сообщения самого бота
/buttons, /builder Клиент с inline keyboard Отображаются callback и семь типов кнопок; callback приходит в stdout
/fsm, затем текст Любой диалог Второе сообщение получает сохранённое состояние, затем state очищается
/me Валидный token Возвращаются ID и имя бота
/subscriptions Webhook уже зарегистрирован Видна текущая подписка и её update types
/image, /file, /audio, /video_upload Соответствующий MAX_TEST_* path Upload завершается, attachment приходит в чат; token не попадает в stdout
/ratelimit Любой чат Три ответа доставлены, клиентский target limiter не превышает 2 ops/sec
/request_contact, /clipboard Клиент с поддержкой кнопок Контактное действие/копирование работают
/send_contact <user_id> Валидный numeric MAX ID Приходит contact attachment
/sticker <code> Валидный sticker code Приходит sticker attachment
/html, /markdown Любой чат MAX отображает форматирование без переписывания aiomax2
/chat, /action Бот в группе/канале Возвращается Chat; typing_on принимается API
/members, /admins Бот-администратор Возвращаются ChatMember из поля members
/comments <post_id> Канал, comments включены, нужные admin permissions Возвращается список CommentMessage
/video <video_token> Token существующего video attachment Возвращаются dimensions и duration

Изменяющие состояние команды

Запускайте только в отдельной тестовой группе. Они требуют точное слово CONFIRM; без него выполняется только подсказка:

/pin <message_id> CONFIRM
/unpin CONFIRM
/remove_member <user_id> CONFIRM
/revoke_admin <user_id> CONFIRM
/leave_chat CONFIRM

Перед /remove_member подготовьте отдельного тестового участника. Перед /revoke_admin — отдельного тестового администратора. /leave_chat удаляет бота из текущего чата и должен выполняться последним. Назначение администратора не автоматизировано: первого bot-admin MAX требует назначать через клиент, а набор допустимых прав зависит от типа чата и субъекта.

Что ранее проверено пользователем

По предоставленному ранее live-отчёту уже проверялись Webhook, send/reply/edit/delete, FSM, get_my_info, subscriptions, image/file, callbacks, keyboard, request_contact, clipboard, contacts, sticker, HTML, Markdown и TLS system/custom CA setup. Этот code pass их автоматически не переобъявляет live-проверенными; перед релизом рекомендуется короткая регрессия соответствующих команд.

Notification-only callback отдельно остаётся runtime peculiarity: MAX API возвращал success=true, message=null, но уведомление не отображалось в Web, Android и iOS. Это не считается ошибкой сериализации aiomax2 и не заменяется автоматически на message update.