Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/bub/channels/telegram.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,10 +173,10 @@ async def start(self, stop_event: asyncio.Event) -> None:
len(self._allow_chats),
bool(proxy),
)
get_updates_request = HTTPXRequest(read_timeout=30)
get_updates_request = HTTPXRequest(read_timeout=30, proxy=proxy)
builder = Application.builder().token(self._settings.token).get_updates_request(get_updates_request)
if proxy:
builder = builder.proxy(proxy).get_updates_proxy(proxy)
builder = builder.proxy(proxy)
self._app = builder.build()
self._app.add_handler(CommandHandler("start", self._on_start))
self._app.add_handler(CommandHandler("bub", self._on_message, has_args=True, block=False))
Expand Down
73 changes: 73 additions & 0 deletions tests/test_channels.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,63 @@ def _message(
)


class _FakeTelegramUpdater:
def __init__(self) -> None:
self.kwargs: dict[str, object] | None = None

async def start_polling(self, **kwargs) -> None:
self.kwargs = kwargs


class _FakeTelegramApp:
def __init__(self) -> None:
self.updater = _FakeTelegramUpdater()
self.handlers: list[object] = []

def add_handler(self, handler: object) -> None:
self.handlers.append(handler)

async def initialize(self) -> None:
return

async def start(self) -> None:
return


class _FakeTelegramBuilder:
def __init__(self) -> None:
self.app = _FakeTelegramApp()
self.request: object | None = None
self.proxy_value: str | None = None
self.token_value: str | None = None

def token(self, token: str) -> _FakeTelegramBuilder:
self.token_value = token
return self

def get_updates_request(self, request: object) -> _FakeTelegramBuilder:
self.request = request
return self

def proxy(self, proxy: str) -> _FakeTelegramBuilder:
self.proxy_value = proxy
return self

def get_updates_proxy(self, _proxy: str) -> _FakeTelegramBuilder:
raise AssertionError("get_updates_proxy should not be called when get_updates_request is already set")

def build(self) -> _FakeTelegramApp:
return self.app


def _telegram_proxy_config() -> str:
return """
telegram:
token: "test-token"
proxy: "http://127.0.0.1:1087"
""".strip()


@pytest.mark.asyncio
async def test_buffered_handler_passes_commands_through_immediately() -> None:
handled: list[str] = []
Expand Down Expand Up @@ -425,6 +482,22 @@ async def send_message(chat_id: str, text: str) -> None:
assert sent == [("42", "hello")]


@pytest.mark.asyncio
async def test_telegram_channel_start_with_proxy_does_not_call_get_updates_proxy(
monkeypatch: pytest.MonkeyPatch, load_config
) -> None:
load_config(_telegram_proxy_config())
fake_builder = _FakeTelegramBuilder()
monkeypatch.setattr("bub.channels.telegram.Application.builder", lambda: fake_builder)

channel = TelegramChannel(lambda message: None)
await channel.start(asyncio.Event())

assert fake_builder.proxy_value == "http://127.0.0.1:1087"
assert fake_builder.request is not None
assert fake_builder.app.updater.kwargs == {"drop_pending_updates": True, "allowed_updates": ["message"]}


@pytest.mark.asyncio
async def test_telegram_channel_build_message_returns_command_directly(load_config) -> None:
_load_channel_config(load_config, telegram_value="test-token")
Expand Down
Loading