# retoor <retoor@molodetz.nl>
import asyncio
from tests.conftest import run_async
from devplacepy.services.devii.interaction.broker import InteractionBroker
def test_broker_site_prompt_returns_submitted_values():
async def wait_site(interaction_id, frame, timeout):
assert frame["title"] == "Deploy?"
assert frame["widgets"][0]["type"] == "confirm"
return {
"status": "submitted",
"interaction_id": interaction_id,
"values": {"delete": True},
}
broker = InteractionBroker("main", wait_site=wait_site)
async def run():
return await broker.prompt(
{
"title": "Deploy?",
"widgets": [
{
"type": "confirm",
"name": "delete",
"label": "Delete",
"default": False,
}
],
}
)
result = run_async(run())
assert result.status == "submitted"
assert result.values == {"delete": True}
assert result.meta["adapter"] == "site-chat"
assert result.meta["degraded"] is False
assert broker.open_id() is None
def test_broker_plain_adapter_parses_reply():
async def present_plain(menu: str) -> str:
assert "yes" in menu.lower() or "Delete" in menu
return "yes"
broker = InteractionBroker("cli", present_plain=present_plain)
result = run_async(
broker.prompt(
{
"title": "Delete?",
"widgets": [
{"type": "confirm", "name": "ok", "label": "OK", "default": False}
],
}
)
)
assert result.status == "submitted"
assert result.values == {"ok": True}
assert result.meta["degraded"] is True
def test_broker_invalid_args_raise():
from devplacepy.services.devii.errors import ToolInputError
broker = InteractionBroker("main")
try:
run_async(broker.prompt({"title": "x", "widgets": []}))
assert False, "expected ToolInputError"
except ToolInputError:
pass
def test_broker_timeout_status():
async def wait_site(interaction_id, frame, timeout):
raise asyncio.TimeoutError()
broker = InteractionBroker("main", wait_site=wait_site)
result = run_async(
broker.prompt(
{
"title": "T?",
"timeout_sec": 1,
"widgets": [
{"type": "confirm", "name": "ok", "label": "OK"}
],
}
)
)
assert result.status == "timeout"
assert result.values == {}