66 lines
2.1 KiB
Python
66 lines
2.1 KiB
Python
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from v1.agent.tool_dispatcher import (
|
|
BackendExecutionResult,
|
|
InterruptResult,
|
|
ToolDispatcher,
|
|
dispatch_tool_call,
|
|
)
|
|
|
|
|
|
class TestToolDispatcher:
|
|
def test_frontend_tool_returns_interrupt(self):
|
|
tool = {
|
|
"name": "ui.navigate_to",
|
|
"execution_target": "frontend",
|
|
"args": {"path": "/home"},
|
|
}
|
|
result = dispatch_tool_call(tool)
|
|
assert isinstance(result, InterruptResult)
|
|
assert result.interrupt_type == "tool_execution"
|
|
assert result.tool_name == "ui.navigate_to"
|
|
|
|
def test_backend_tool_executes_directly(self):
|
|
tool = {
|
|
"name": "srv.get_user_info",
|
|
"execution_target": "backend",
|
|
"args": {"user_id": "u1"},
|
|
"requires_approval": False,
|
|
}
|
|
result = dispatch_tool_call(tool)
|
|
assert isinstance(result, BackendExecutionResult)
|
|
assert result.tool_name == "srv.get_user_info"
|
|
|
|
def test_backend_tool_with_approval_returns_interrupt(self):
|
|
tool = {
|
|
"name": "srv.transfer_funds",
|
|
"execution_target": "backend",
|
|
"args": {"to": "u2", "amount": 100},
|
|
"requires_approval": True,
|
|
}
|
|
result = dispatch_tool_call(tool)
|
|
assert isinstance(result, InterruptResult)
|
|
assert result.interrupt_type == "approval_required"
|
|
assert result.tool_name == "srv.transfer_funds"
|
|
|
|
def test_dispatcher_class_can_dispatch(self):
|
|
dispatcher = ToolDispatcher()
|
|
tool = {
|
|
"name": "ui.navigate_to",
|
|
"execution_target": "frontend",
|
|
"args": {"message": "Hello"},
|
|
}
|
|
result = dispatcher.dispatch(tool)
|
|
assert isinstance(result, InterruptResult)
|
|
|
|
def test_unknown_frontend_tool_is_rejected(self):
|
|
tool = {
|
|
"name": "ui.unknown_action",
|
|
"execution_target": "frontend",
|
|
"args": {},
|
|
}
|
|
with pytest.raises(ValueError, match="not in allowlist"):
|
|
dispatch_tool_call(tool)
|