Skip to content

Commit 12be69d

Browse files
iodoneMeta42
andauthored
fix(telegram): avoid conflicting get_updates proxy config (#200)
* fix(telegram): avoid conflicting get_updates proxy config * test(telegram): simplify proxy startup regression fixture --------- Co-authored-by: Meta42 <mi@mideMacBook-Pro.local>
1 parent 7d3113f commit 12be69d

2 files changed

Lines changed: 75 additions & 2 deletions

File tree

src/bub/channels/telegram.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,10 @@ async def start(self, stop_event: asyncio.Event) -> None:
173173
len(self._allow_chats),
174174
bool(proxy),
175175
)
176-
get_updates_request = HTTPXRequest(read_timeout=30)
176+
get_updates_request = HTTPXRequest(read_timeout=30, proxy=proxy)
177177
builder = Application.builder().token(self._settings.token).get_updates_request(get_updates_request)
178178
if proxy:
179-
builder = builder.proxy(proxy).get_updates_proxy(proxy)
179+
builder = builder.proxy(proxy)
180180
self._app = builder.build()
181181
self._app.add_handler(CommandHandler("start", self._on_start))
182182
self._app.add_handler(CommandHandler("bub", self._on_message, has_args=True, block=False))

tests/test_channels.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,63 @@ def _message(
111111
)
112112

113113

114+
class _FakeTelegramUpdater:
115+
def __init__(self) -> None:
116+
self.kwargs: dict[str, object] | None = None
117+
118+
async def start_polling(self, **kwargs) -> None:
119+
self.kwargs = kwargs
120+
121+
122+
class _FakeTelegramApp:
123+
def __init__(self) -> None:
124+
self.updater = _FakeTelegramUpdater()
125+
self.handlers: list[object] = []
126+
127+
def add_handler(self, handler: object) -> None:
128+
self.handlers.append(handler)
129+
130+
async def initialize(self) -> None:
131+
return
132+
133+
async def start(self) -> None:
134+
return
135+
136+
137+
class _FakeTelegramBuilder:
138+
def __init__(self) -> None:
139+
self.app = _FakeTelegramApp()
140+
self.request: object | None = None
141+
self.proxy_value: str | None = None
142+
self.token_value: str | None = None
143+
144+
def token(self, token: str) -> _FakeTelegramBuilder:
145+
self.token_value = token
146+
return self
147+
148+
def get_updates_request(self, request: object) -> _FakeTelegramBuilder:
149+
self.request = request
150+
return self
151+
152+
def proxy(self, proxy: str) -> _FakeTelegramBuilder:
153+
self.proxy_value = proxy
154+
return self
155+
156+
def get_updates_proxy(self, _proxy: str) -> _FakeTelegramBuilder:
157+
raise AssertionError("get_updates_proxy should not be called when get_updates_request is already set")
158+
159+
def build(self) -> _FakeTelegramApp:
160+
return self.app
161+
162+
163+
def _telegram_proxy_config() -> str:
164+
return """
165+
telegram:
166+
token: "test-token"
167+
proxy: "http://127.0.0.1:1087"
168+
""".strip()
169+
170+
114171
@pytest.mark.asyncio
115172
async def test_buffered_handler_passes_commands_through_immediately() -> None:
116173
handled: list[str] = []
@@ -476,6 +533,22 @@ async def send_message(chat_id: str, text: str) -> None:
476533
assert sent == [("42", "hello")]
477534

478535

536+
@pytest.mark.asyncio
537+
async def test_telegram_channel_start_with_proxy_does_not_call_get_updates_proxy(
538+
monkeypatch: pytest.MonkeyPatch, load_config
539+
) -> None:
540+
load_config(_telegram_proxy_config())
541+
fake_builder = _FakeTelegramBuilder()
542+
monkeypatch.setattr("bub.channels.telegram.Application.builder", lambda: fake_builder)
543+
544+
channel = TelegramChannel(lambda message: None)
545+
await channel.start(asyncio.Event())
546+
547+
assert fake_builder.proxy_value == "http://127.0.0.1:1087"
548+
assert fake_builder.request is not None
549+
assert fake_builder.app.updater.kwargs == {"drop_pending_updates": True, "allowed_updates": ["message"]}
550+
551+
479552
@pytest.mark.asyncio
480553
async def test_telegram_channel_build_message_returns_command_directly(load_config) -> None:
481554
_load_channel_config(load_config, telegram_value="test-token")

0 commit comments

Comments
 (0)