feat(telegram): improve command planning and testability (#158)
This commit is contained in:
@@ -223,3 +223,62 @@ async def test_trigger_set_clear_permissions(tmp_path: Path) -> None:
|
||||
)
|
||||
assert await prefs.get_trigger_mode(msg.chat_id) is None
|
||||
assert "chat trigger mode reset" in _last_text(transport)
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_trigger_missing_sender_denied(tmp_path: Path) -> None:
|
||||
transport = FakeTransport()
|
||||
cfg = make_cfg(transport)
|
||||
prefs = ChatPrefsStore(tmp_path / "prefs.json")
|
||||
msg = _msg("/trigger all", chat_type="supergroup", sender_id=None)
|
||||
|
||||
await _handle_trigger_command(
|
||||
cfg,
|
||||
msg,
|
||||
args_text="all",
|
||||
_ambient_context=None,
|
||||
topic_store=None,
|
||||
chat_prefs=prefs,
|
||||
)
|
||||
|
||||
assert await prefs.get_trigger_mode(msg.chat_id) is None
|
||||
assert "cannot verify sender" in _last_text(transport)
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_trigger_topic_unavailable() -> None:
|
||||
transport = FakeTransport()
|
||||
cfg = replace(
|
||||
make_cfg(transport),
|
||||
topics=TelegramTopicsSettings(enabled=True, scope="all"),
|
||||
)
|
||||
msg = _msg("/trigger mentions", chat_type="supergroup", thread_id=3)
|
||||
|
||||
await _handle_trigger_command(
|
||||
cfg,
|
||||
msg,
|
||||
args_text="mentions",
|
||||
_ambient_context=None,
|
||||
topic_store=None,
|
||||
chat_prefs=None,
|
||||
)
|
||||
|
||||
assert "topic trigger settings are unavailable" in _last_text(transport)
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_trigger_chat_prefs_unavailable() -> None:
|
||||
transport = FakeTransport()
|
||||
cfg = make_cfg(transport)
|
||||
msg = _msg("/trigger mentions", chat_type="supergroup")
|
||||
|
||||
await _handle_trigger_command(
|
||||
cfg,
|
||||
msg,
|
||||
args_text="mentions",
|
||||
_ambient_context=None,
|
||||
topic_store=None,
|
||||
chat_prefs=None,
|
||||
)
|
||||
|
||||
assert "chat trigger settings are unavailable" in _last_text(transport)
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
import pytest
|
||||
|
||||
from takopi.telegram.api_models import Chat, Message, Update, User
|
||||
from takopi.telegram.parsing import poll_incoming
|
||||
from tests.telegram_fakes import FakeBot
|
||||
|
||||
|
||||
class _Bot(FakeBot):
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.calls = 0
|
||||
|
||||
async def get_updates(
|
||||
self,
|
||||
offset: int | None,
|
||||
timeout_s: int = 50,
|
||||
allowed_updates: list[str] | None = None,
|
||||
) -> list[Update] | None:
|
||||
_ = offset, timeout_s, allowed_updates
|
||||
self.calls += 1
|
||||
if self.calls == 1:
|
||||
return None
|
||||
return [
|
||||
Update(
|
||||
update_id=1,
|
||||
message=Message(
|
||||
message_id=10,
|
||||
text="hello",
|
||||
chat=Chat(id=123, type="private"),
|
||||
from_=User(id=9),
|
||||
),
|
||||
)
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_poll_incoming_retries_on_none() -> None:
|
||||
bot = _Bot()
|
||||
sleeps: list[float] = []
|
||||
|
||||
async def sleep(delay: float) -> None:
|
||||
sleeps.append(delay)
|
||||
|
||||
msg = None
|
||||
async for update in poll_incoming(bot, sleep=sleep):
|
||||
msg = update
|
||||
break
|
||||
|
||||
assert sleeps == [2]
|
||||
assert msg is not None
|
||||
assert msg.chat_id == 123
|
||||
Reference in New Issue
Block a user