refactor(telegram): boundary types (#90)

This commit is contained in:
banteg
2026-01-11 21:36:07 +04:00
committed by GitHub
parent c6c34ac17f
commit e8c478d786
23 changed files with 1116 additions and 581 deletions
+64 -14
View File
@@ -9,6 +9,11 @@ from takopi.config import ProjectsConfig
from takopi.model import EngineId
from takopi.router import AutoRouter, RunnerEntry
from takopi.runners.mock import Return, ScriptRunner
from takopi.settings import (
TelegramFilesSettings,
TelegramTopicsSettings,
TelegramTransportSettings,
)
from takopi.telegram import backend as telegram_backend
from takopi.transport_runtime import TransportRuntime
@@ -20,8 +25,13 @@ def test_build_startup_message_includes_missing_engines(tmp_path: Path) -> None:
missing = ScriptRunner([Return(answer="ok")], engine=pi)
router = AutoRouter(
entries=[
RunnerEntry(engine=codex, runner=runner, available=True),
RunnerEntry(engine=pi, runner=missing, available=False, issue="missing"),
RunnerEntry(engine=codex, runner=runner),
RunnerEntry(
engine=pi,
runner=missing,
status="missing_cli",
issue="missing",
),
],
default_engine=codex,
)
@@ -40,6 +50,44 @@ def test_build_startup_message_includes_missing_engines(tmp_path: Path) -> None:
assert "projects: `none`" in message
def test_build_startup_message_surfaces_unavailable_engine_reasons(
tmp_path: Path,
) -> None:
codex = EngineId("codex")
pi = EngineId("pi")
claude = EngineId("claude")
runner = ScriptRunner([Return(answer="ok")], engine=codex)
bad_cfg = ScriptRunner([Return(answer="ok")], engine=pi)
load_err = ScriptRunner([Return(answer="ok")], engine=claude)
router = AutoRouter(
entries=[
RunnerEntry(engine=codex, runner=runner),
RunnerEntry(engine=pi, runner=bad_cfg, status="bad_config", issue="bad"),
RunnerEntry(
engine=claude,
runner=load_err,
status="load_error",
issue="failed",
),
],
default_engine=codex,
)
runtime = TransportRuntime(
router=router,
projects=ProjectsConfig(projects={}, default_project=None),
watch_config=True,
)
message = telegram_backend._build_startup_message(
runtime, startup_pwd=str(tmp_path)
)
assert "agents: `codex" in message
assert "misconfigured: pi" in message
assert "failed to load: claude" in message
def test_telegram_backend_build_and_run_wires_config(
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
) -> None:
@@ -55,7 +103,7 @@ def test_telegram_backend_build_and_run_wires_config(
codex = EngineId("codex")
runner = ScriptRunner([Return(answer="ok")], engine=codex)
router = AutoRouter(
entries=[RunnerEntry(engine=codex, runner=runner, available=True)],
entries=[RunnerEntry(engine=codex, runner=runner)],
default_engine=codex,
)
runtime = TransportRuntime(
@@ -80,13 +128,14 @@ def test_telegram_backend_build_and_run_wires_config(
monkeypatch.setattr(telegram_backend, "run_main_loop", fake_run_main_loop)
monkeypatch.setattr(telegram_backend, "TelegramClient", _FakeClient)
transport_config = {
"bot_token": "token",
"chat_id": 321,
"voice_transcription": True,
"files": {"enabled": True, "allowed_user_ids": [1, 2]},
"topics": {"enabled": True, "scope": "main"},
}
transport_config = TelegramTransportSettings(
bot_token="token",
chat_id=321,
voice_transcription=True,
voice_max_bytes=1234,
files=TelegramFilesSettings(enabled=True, allowed_user_ids=[1, 2]),
topics=TelegramTopicsSettings(enabled=True, scope="main"),
)
telegram_backend.TelegramBackend().build_and_run(
transport_config=transport_config,
@@ -100,18 +149,19 @@ def test_telegram_backend_build_and_run_wires_config(
kwargs = captured["kwargs"]
assert cfg.chat_id == 321
assert cfg.voice_transcription is True
assert cfg.voice_max_bytes == 1234
assert cfg.files.enabled is True
assert cfg.files.allowed_user_ids == frozenset({1, 2})
assert cfg.files.allowed_user_ids == [1, 2]
assert cfg.topics.enabled is True
assert cfg.bot.token == "token"
assert kwargs["watch_config"] is True
assert kwargs["transport_id"] == "telegram"
def test_build_files_config_defaults() -> None:
cfg = telegram_backend._build_files_config({})
def test_telegram_files_settings_defaults() -> None:
cfg = TelegramFilesSettings()
assert cfg.enabled is False
assert cfg.auto_put is True
assert cfg.uploads_dir == "incoming"
assert cfg.allowed_user_ids == frozenset()
assert cfg.allowed_user_ids == []