Skip to content

Comments

Исправление обработки неизвестных обновлений в webhook/polling#50

Open
Olegt0rr wants to merge 8 commits intolove-apples:mainfrom
Olegt0rr:bugfix/unknown-update-processing
Open

Исправление обработки неизвестных обновлений в webhook/polling#50
Olegt0rr wants to merge 8 commits intolove-apples:mainfrom
Olegt0rr:bugfix/unknown-update-processing

Conversation

@Olegt0rr
Copy link
Contributor

Closes #48

Кратко

  • Обеспечена корректная обработка неизвестных/неподдерживаемых типов обновлений — теперь они логируются и не ломают обработку.
  • Стандартизировано логирование с использованием UNKNOWN_UPDATE_DISCLAIMER.
  • Для вебхука всегда возвращается успешный ответ (200 OK) для неизвестных обновлений.
  • Добавлены тесты, проверяющие работу системы распознавания обновлений

Что изменилось

В maxapi/dispatcher.py:

  • При разборе полезности вебхука, если process_update_webhook возвращает None, формируется сообщение через UNKNOWN_UPDATE_DISCLAIMER и логируется предупреждение. Для таких случаев возвращается 200 OK (вебхук не должен вызывать ошибку при неизвестном типе).
  • Поведение polling приведено к аналогичному: неизвестные обновления пропускаются и логируются, не вызывая падения.

Причина доработки

Новые или повреждённые типы обновлений не должны останавливать работу бота или блокировать дальнейшую обработку. Единое логирование и стабильные ответы повышают наблюдаемость и надёжность.

Риски и совместимость

Обратная совместимость сохранена; изменяется только обработка ошибок для неизвестных обновлений.
Нет изменений в публичном API или механике регистрации обработчиков.

Тестирование

  • Ручная проверка webhook с неизвестным update_type: предупреждение логируется через UNKNOWN_UPDATE_DISCLAIMER, сервер отвечает 200 OK.
  • Polling с неожиданными записями: такие обновления пропускаются и логируются без исключений.
  • Тесты могут параметризовать фикстуры, итерируя dispatcher.events.

…обработке неизвестных обновлений, добавлено покрытие
Copilot AI review requested due to automatic review settings February 19, 2026 09:20
@codecov-commenter
Copy link

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 96.61017% with 4 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
maxapi/dispatcher.py 33.33% 4 Missing ⚠️

📢 Thoughts on this report? Let us know!

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

PR повышает отказоустойчивость обработки входящих обновлений MAX API: неизвестные/неподдерживаемые типы обновлений больше не должны ломать polling/webhook, а должны корректно логироваться и пропускаться.

Changes:

  • Перевод построения моделей обновлений на discriminated union (UpdateUnion + TypeAdapter) и пропуск неизвестных обновлений с warning-логированием.
  • Для webhook добавлено гарантированное 200 OK при неизвестном обновлении (без падения обработки).
  • Добавлены фикстуры и тесты на распознавание/покрытие типов обновлений, а также проверка соответствия фикстур UpdateUnion.

Reviewed changes

Copilot reviewed 25 out of 26 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
maxapi/dispatcher.py Возврат 200 OK и warning-лог при None из process_update_webhook (неизвестное обновление).
maxapi/methods/types/getted_updates.py Парсинг обновлений через UpdateUnionAdapter, пропуск/логирование неизвестных событий в polling.
maxapi/types/updates/init.py Введены UNKNOWN_UPDATE_DISCLAIMER, UpdateUnion (discriminator по update_type) и UpdateUnionAdapter.
maxapi/types/updates/base_update.py Переименование базовой модели обновления на BaseUpdate.
maxapi/types/updates/bot_added.py Переход на BaseUpdate, добавлен update_type: Literal[...] для discriminator union.
maxapi/types/updates/bot_removed.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/bot_started.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/bot_stopped.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/chat_title_changed.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/dialog_cleared.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/dialog_muted.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/dialog_removed.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/dialog_unmuted.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/message_callback.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/message_chat_created.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/message_created.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/message_edited.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/message_removed.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/user_added.py Переход на BaseUpdate, добавлен update_type: Literal[...].
maxapi/types/updates/user_removed.py Переход на BaseUpdate, добавлен update_type: Literal[...].
pyproject.toml Обновлён список игнорируемых правил Ruff (добавлен G004).
tests/conftest.py Подключение плагина фикстур обновлений и параметризованная фикстура update.
tests/fixtures/updates.py Добавлены фикстуры pydantic-моделей для всех типов обновлений из UpdateUnion.
tests/test_fixtures_update_mapping.py Тест на полноту покрытия UpdateUnion фикстурами.
tests/test_getted_updates.py Тесты для get_update_model/process_update_request/process_update_webhook.
Comments suppressed due to low confidence (1)

maxapi/types/updates/base_update.py:16

  • Переименование базового класса обновления с Update на BaseUpdate (и отсутствие maxapi/types/updates/update.py в текущем дереве) выглядит как потенциально ломающая смена публичного API: документация в репозитории ссылается на модуль maxapi.types.updates.update. Чтобы сохранить обратную совместимость, стоит оставить алиас Update = BaseUpdate и/или вернуть модуль-обёртку update.py, реэкспортирующий класс.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Olegt0rr and others added 5 commits February 19, 2026 13:18
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Имя теста test_process_update_request_propagates_errors не соответствует проверяемому поведению: тест ожидает, что неизвестное обновление будет пропущено и залогировано, а не что ошибка «пробрасывается». Лучше переименовать тест (и при необходимости докстринг), чтобы он отражал фактическое требование.

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Имя теста test_get_update_model_raises_value_error_for_unknown_type вводит в заблуждение: по новой логике функция не должна бросать ValueError, а возвращает None. Переименуйте тест (например, в ...returns_none...) чтобы он не противоречил ожиданиям и докстрингу.

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@Olegt0rr
Copy link
Contributor Author

@codecov-commenter update

@Olegt0rr
Copy link
Contributor Author

@love-apples, обрати внимание, что codecov ругается на интеграцию по токену и просит интегрироваться через новый способ - приложение: https://github.com/apps/codecov

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Предусмотреть отказоустойчивость при обновлении типов Update в API

2 participants