diff --git a/gateway/platforms/telegram.py b/gateway/platforms/telegram.py index 833c95c8..790061ec 100644 --- a/gateway/platforms/telegram.py +++ b/gateway/platforms/telegram.py @@ -275,8 +275,11 @@ class TelegramAdapter(BasePlatformAdapter): if self._app: try: - await self._app.updater.stop() - await self._app.stop() + # Only stop the updater if it's running + if self._app.updater and self._app.updater.running: + await self._app.updater.stop() + if self._app.running: + await self._app.stop() await self._app.shutdown() except Exception as e: logger.warning("[%s] Error during Telegram disconnect: %s", self.name, e, exc_info=True) diff --git a/tests/gateway/test_telegram_conflict.py b/tests/gateway/test_telegram_conflict.py index f2e21281..86dc509d 100644 --- a/tests/gateway/test_telegram_conflict.py +++ b/tests/gateway/test_telegram_conflict.py @@ -98,3 +98,27 @@ async def test_polling_conflict_stops_polling_and_notifies_handler(monkeypatch): assert adapter.has_fatal_error is True updater.stop.assert_awaited() fatal_handler.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_disconnect_skips_inactive_updater_and_app(monkeypatch): + adapter = TelegramAdapter(PlatformConfig(enabled=True, token="***")) + + updater = SimpleNamespace(running=False, stop=AsyncMock()) + app = SimpleNamespace( + updater=updater, + running=False, + stop=AsyncMock(), + shutdown=AsyncMock(), + ) + adapter._app = app + + warning = MagicMock() + monkeypatch.setattr("gateway.platforms.telegram.logger.warning", warning) + + await adapter.disconnect() + + updater.stop.assert_not_awaited() + app.stop.assert_not_awaited() + app.shutdown.assert_awaited_once() + warning.assert_not_called()