Files
takopi/tests/test_telegram_engine_defaults.py

78 lines
2.5 KiB
Python

from pathlib import Path
import pytest
from takopi.config import ProjectConfig, ProjectsConfig
from takopi.context import RunContext
from takopi.router import AutoRouter, RunnerEntry
from takopi.runners.mock import Return, ScriptRunner
from takopi.telegram.chat_prefs import ChatPrefsStore
from takopi.telegram.engine_defaults import resolve_engine_for_message
from takopi.telegram.topic_state import TopicStateStore
from takopi.transport_runtime import TransportRuntime
@pytest.mark.anyio
async def test_resolve_engine_for_message_sources(tmp_path) -> None:
codex = ScriptRunner([Return(answer="ok")], engine="codex")
pi = ScriptRunner([Return(answer="ok")], engine="pi")
router = AutoRouter(
entries=[
RunnerEntry(engine=codex.engine, runner=codex),
RunnerEntry(engine=pi.engine, runner=pi),
],
default_engine=codex.engine,
)
project = ProjectConfig(
alias="proj",
path=tmp_path,
worktrees_dir=Path(".worktrees"),
default_engine=pi.engine,
)
runtime = TransportRuntime(
router=router,
projects=ProjectsConfig(projects={"proj": project}, default_project=None),
)
chat_prefs = ChatPrefsStore(tmp_path / "telegram_chat_prefs_state.json")
topic_store = TopicStateStore(tmp_path / "telegram_topics_state.json")
await chat_prefs.set_default_engine(1, "pi")
await topic_store.set_default_engine(1, 10, "codex")
resolved = await resolve_engine_for_message(
runtime=runtime,
context=RunContext(project="proj"),
explicit_engine="codex",
chat_id=1,
topic_key=(1, 10),
topic_store=topic_store,
chat_prefs=chat_prefs,
)
assert resolved.source == "directive"
assert resolved.engine == "codex"
await topic_store.clear_default_engine(1, 10)
resolved = await resolve_engine_for_message(
runtime=runtime,
context=RunContext(project="proj"),
explicit_engine=None,
chat_id=1,
topic_key=(1, 10),
topic_store=topic_store,
chat_prefs=chat_prefs,
)
assert resolved.source == "chat_default"
assert resolved.engine == "pi"
await chat_prefs.clear_default_engine(1)
resolved = await resolve_engine_for_message(
runtime=runtime,
context=RunContext(project="proj"),
explicit_engine=None,
chat_id=1,
topic_key=(1, 10),
topic_store=topic_store,
chat_prefs=chat_prefs,
)
assert resolved.source == "project_default"
assert resolved.engine == "pi"