File size: 2,294 Bytes
f5d03aa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import pytest

from backend.engine import WorkflowEngine
from backend.models import StartRequest


def node(node_id, mode, **data):
    return {"id": node_id, "position": {"x": 0, "y": 0}, "data": {"label": data.pop("label", mode), "mode": mode, **data}}


def edge(edge_id, source, target, connection_type="flow", label=""):
    return {"id": edge_id, "source": source, "target": target, "label": label, "data": {"connectionType": connection_type}}


def test_ai_worker_calls_attached_simulated_tool_in_demo_mode(monkeypatch):
    monkeypatch.delenv("OPENAI_API_KEY", raising=False)
    request = StartRequest.model_validate({"workflow": {"nodes": [
        node("i", "Input", value="Order 42 is damaged"),
        node("w", "AI Worker", prompt="Investigate and respond"),
        node("t", "Simulated Tool", label="Order lookup", description="Retrieves order details", input_guidance="Order ID", prompt="Return a plausible order"),
        node("o", "Output"),
    ], "edges": [edge("a", "i", "w"), edge("b", "w", "o"), edge("tool", "w", "t", "tool")]}})
    result = WorkflowEngine().start(request)
    assert result.status == "completed"
    assert "Order lookup" in result.result
    assert any(event.kind == "tool" and event.node_id == "t" for event in result.trace)


def test_human_review_pauses_and_resumes(monkeypatch):
    monkeypatch.delenv("OPENAI_API_KEY", raising=False)
    request = StartRequest.model_validate({"workflow": {"nodes": [node("i", "Input", value="case"), node("h", "Human Review"), node("o", "Output")], "edges": [edge("a", "i", "h"), edge("b", "h", "o")]}})
    engine = WorkflowEngine()
    paused = engine.start(request)
    assert paused.status == "awaiting_review"
    finished = engine.resume(paused.run_id, "Approve")
    assert finished.status == "completed"
    assert finished.result == "Approve"


def test_tool_connection_must_target_simulated_tool(monkeypatch):
    monkeypatch.delenv("OPENAI_API_KEY", raising=False)
    request = StartRequest.model_validate({"workflow": {"nodes": [node("i", "Input", value="case"), node("w", "AI Worker"), node("o", "Output")], "edges": [edge("a", "i", "w"), edge("b", "w", "o"), edge("bad", "w", "o", "tool")]}})
    with pytest.raises(ValueError, match="Simulated Tool"):
        WorkflowEngine().start(request)