Files
cleveractors-core/features/bridge_source_coverage.feature
CoreRasurae 9753b31c7e
CI / quality (push) Successful in 36s
CI / lint (push) Successful in 38s
CI / typecheck (push) Successful in 49s
CI / security (push) Successful in 51s
CI / integration_tests (push) Successful in 55s
CI / unit_tests (push) Successful in 3m35s
CI / build (push) Successful in 33s
CI / coverage (push) Successful in 3m36s
CI / status-check (push) Successful in 3s
test: add coverage gap tests improving coverage from 81.4% to 96.90%
Add 13 BDD scenarios covering previously uncovered code paths:
- SAFE_BUILTINS validation (sandbox.py: 0% → 100%)
- ConfigurationError re-raise path (config.py: 99.3% → 100%)
- CLI hello/main functions (cli.py: 72.7% → 90.9%)
- GraphState message truncation (state.py: 98.7% → 100%)
- ProgressBarManager update/context rendering (progress.py: 0% → 87.7%)
- MessageRouter regex/exact/contains routing (message_router.py: 0% → 59.4%)
- RoutingAdapter parse_routing_command (routing_adapter.py)
- DynamicRouterNode pattern-based routing (dynamic_router.py)
- EnhancedTemplateRegistry unknown template type (enhanced_registry.py: 99.2%)
- CompositeAgent null-graph error path (composite.py: 97.8% → 98.6%)

Cover routing_adapter.py (17% → 100%): all GOTO/ROUTE patterns,
create_routing_node, create_conditional_router, dynamic config conversion.

Cover dynamic_router.py (21% → 87%): execute with empty/dict/string
messages, extract_message with colon parsing, config creation, graph
extension with edge generation.

Cover message_router.py (59% → 78%): regex, exact, contains, prefix,
suffix match types, invalid regex handling, non-string message, set_state.

Exercise Node._prepare_conversation_history with invalid configs,
_runtime error paths, _execute_message_router with rules,
_execute_agent with current_message and metadata propagation,
_execute_function with dynamic_router, and _execute_conditional
with content_contains/content_not_contains/content_starts_with
and custom condition types. Improves nodes.py from 71.3% to 72.5%.

Exercise PureGraphConfig, PureLangGraph init with dict/config,
RxPyLangGraphBridge registration/connection/lookup,
ReactiveStreamRouter operator creation and condition functions,
ReactiveConfigParser config/route/graph parsing,
ToolAgent tool execution with JSON, space-separated, single,
file_read, progress_bar invocations, and
ReactiveCleverAgentsApp init/dispose/visualization.
2026-06-02 20:02:01 +01:00

63 lines
3.3 KiB
Gherkin

Feature: Bridge Closed Loop Handling and Task Cancellation
As a developer
I want the bridge to create new event loops when the current loop is closed, and handle CancelledError in task result handlers
So that the bridge functions correctly even when the event loop is unexpectedly closed
Background:
Given a fresh bridge source test context (bsc)
Scenario: Graph executor creates new loop when event loop is closed
Given a bridge source test setup with graph (bsc)
When I invoke _create_graph_executor with a closed event loop (bsc)
Then the operator should handle the closed loop gracefully (bsc)
Scenario: Graph executor handle_task_result catches CancelledError
Given a bridge source test setup with graph and active tasks (bsc)
When a graph executor task is cancelled and handle_task_result fires (bsc)
Then CancelledError should be handled silently (bsc)
Scenario: Graph executor handle_task_result catches generic Exception
Given a bridge source test setup with graph and active tasks (bsc)
When a graph executor task raises exception in handle_task_result (bsc)
Then the generic exception should be handled silently (bsc)
Scenario: Node operator creates new loop when event loop is closed
Given a bridge source test setup with graph and node (bsc)
When I invoke _create_node_operator with a closed event loop (bsc)
Then the node operator should handle the closed loop gracefully (bsc)
Scenario: Node operator handle_task_result catches CancelledError
Given a bridge source test setup with graph, node and active tasks (bsc)
When a node operator task is cancelled and handle_task_result fires (bsc)
Then node CancelledError should be handled silently (bsc)
Scenario: Node operator handle_task_result catches generic Exception
Given a bridge source test setup with graph, node and active tasks (bsc)
When a node operator task raises exception in handle_task_result (bsc)
Then node generic exception should be handled silently (bsc)
Scenario: Connector creates new loop when event loop is closed
Given a bridge source test setup with stream (bsc)
When I trigger connect_stream_to_graph with a closed event loop (bsc)
Then the connector should handle the closed loop gracefully (bsc)
Scenario: Connector handle_task_result catches CancelledError
Given a bridge source test setup with stream and active tasks (bsc)
When a connector task is cancelled and handle_task_result fires (bsc)
Then connector CancelledError should be handled silently (bsc)
Scenario: Connector handle_task_result catches generic Exception
Given a bridge source test setup with stream and active tasks (bsc)
When a connector task raises exception in handle_task_result (bsc)
Then connector generic exception should be handled silently (bsc)
Scenario: Cleanup with running event loop cancels tasks directly
Given a bridge source test setup with active tasks and running loop (bsc)
When I call cleanup on the bridge while loop is running (bsc)
Then tasks should be cancelled directly without awaiting (bsc)
Scenario: Cleanup with RuntimeError creates new loop then cancels
Given a bridge source test setup with active tasks and no event loop (bsc)
When I call cleanup on the bridge with RuntimeError path (bsc)
Then cleanup should create new loop and proceed (bsc)