76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
"""Behave step definitions for dynamic_router coverage."""
|
|
|
|
from behave import given, then, when # type: ignore
|
|
from behave.runner import Context # type: ignore
|
|
|
|
from cleveragents.langgraph.dynamic_router import DynamicRouter
|
|
from cleveragents.langgraph.nodes import Edge
|
|
|
|
|
|
@given("a dynamic router with no rules")
|
|
def step_no_rules(context: Context):
|
|
context.router = DynamicRouter()
|
|
|
|
|
|
@given('a dynamic router with a rule targeting "next" and no condition')
|
|
def step_rule_no_condition(context: Context):
|
|
context.router = DynamicRouter(rules=[{"target": "next"}])
|
|
|
|
|
|
@given(
|
|
'a dynamic router with a rule targeting "match_target" when message type is "match"'
|
|
)
|
|
def step_rule_with_condition_matches(context: Context):
|
|
context.router = DynamicRouter(
|
|
rules=[
|
|
{
|
|
"target": "match_target",
|
|
"condition": lambda msg: msg.get("type") == "match",
|
|
}
|
|
]
|
|
)
|
|
|
|
|
|
@given(
|
|
'a dynamic router with a rule targeting "conditional" when message type is "expected"'
|
|
)
|
|
def step_rule_with_condition_fails(context: Context):
|
|
context.router = DynamicRouter(
|
|
rules=[
|
|
{
|
|
"target": "conditional",
|
|
"condition": lambda msg: msg.get("type") == "expected",
|
|
}
|
|
]
|
|
)
|
|
|
|
|
|
@when("I route the message")
|
|
def step_route_message(context: Context):
|
|
# Parse message from scenario text (provided as JSON-like string)
|
|
import json
|
|
|
|
message_text = context.text.strip() if context.text else "{}"
|
|
context.message = json.loads(message_text)
|
|
context.result_edges = context.router.route(context.message)
|
|
|
|
|
|
@then("the router should return the default end edge")
|
|
def step_assert_default_edge(context: Context):
|
|
assert context.result_edges == [Edge(source="start", target="end")]
|
|
|
|
|
|
@then('the router should return a single edge to "next"')
|
|
def step_assert_next_edge(context: Context):
|
|
assert context.result_edges == [Edge(source="start", target="next")]
|
|
|
|
|
|
@then('the router should return a single edge to "match_target"')
|
|
def step_assert_match_edge(context: Context):
|
|
assert context.result_edges == [Edge(source="start", target="match_target")]
|
|
|
|
|
|
@then("the router should return the default end edge even when rules do not match")
|
|
def step_assert_fallback_edge(context: Context):
|
|
assert context.result_edges == [Edge(source="start", target="end")]
|