ducklm/tests/test_runtime_loop.py

39 lines
1.7 KiB
Python

from app.core.contracts import UserTask
from app.runtime.runtime_controller import RuntimeController
def test_runtime_loop_emits_basic_events() -> None:
controller = RuntimeController()
result = controller.handle_task(UserTask(input="hello runtime"))
event_types = [event["type"] for event in result["events"]]
assert result["status"] == "completed"
assert "message" in result["result"]
assert "task_received" in event_types
assert "context_built" in event_types
assert "task_completed" in event_types
def test_runtime_loop_routes_natural_language_shell_request_to_permission_flow() -> None:
import os, shutil
# Clear permission cache to ensure clean state
cache_file = os.path.join(os.path.dirname(__file__), '..', 'data', 'runtime', 'allowed_commands.json')
if os.path.exists(cache_file):
os.remove(cache_file)
controller = RuntimeController()
result = controller.handle_task(UserTask(input="запусти sudo apt update"))
event_types = [event["type"] for event in result["events"]]
# sudo commands require both permission and password
# First step: permission request
assert result["status"] == "awaiting_permission"
assert result["directive"]["type"] == "tool"
assert result["directive"]["payload"]["tool"] == "shell_exec"
assert "permission_requested" in event_types
assert "task_awaiting_permission" in event_types
assert result["result"]["error"] == "Permission required before execution."
# After granting permission, should request sudo password
resumed = controller.resolve_permission(task_id=result["task_id"], decision="allow_once")
assert resumed["status"] == "awaiting_input"
assert resumed["result"]["secret_request"]["kind"] == "sudo_password"