fix(tui): align materializer A2A steps with current event models
CI / load-versions (pull_request) Successful in 17s
CI / push-validation (pull_request) Successful in 26s
CI / lint (pull_request) Successful in 52s
CI / typecheck (pull_request) Successful in 1m17s
CI / security (pull_request) Successful in 1m23s
CI / quality (pull_request) Successful in 57s
CI / build (pull_request) Successful in 42s
CI / helm (pull_request) Successful in 54s
CI / unit_tests (pull_request) Successful in 6m52s
CI / integration_tests (pull_request) Successful in 11m6s
CI / docker (pull_request) Successful in 1m57s
CI / coverage (pull_request) Successful in 11m10s
CI / status-check (pull_request) Successful in 3s

This commit is contained in:
2026-06-16 17:17:17 -04:00
parent 3829cf2b33
commit c10b8e85cd
3 changed files with 57 additions and 34 deletions
@@ -7,7 +7,13 @@ from unittest.mock import Mock
from behave import given, then, when
from cleveragents.cli.output.handles import ElementSnapshot
from cleveragents.cli.output.handles import (
ElementClosed,
ElementCreated,
ElementUpdated,
SessionEnd,
TextBlock,
)
from cleveragents.tui.a2a_integration import TuiA2aAdapter, TuiA2aIntegration
from cleveragents.tui.materializer import TuiMaterializer
@@ -60,8 +66,8 @@ def step_call_session_begin(context: Any) -> None:
@then("the materializer should record a session_begin event")
def step_verify_session_begin_event(context: Any) -> None:
"""Verify a session_begin event was recorded."""
assert len(context.materializer._events) > 0, "Events should not be empty"
assert context.materializer._events[0]["type"] == "session_begin"
events = context.materializer.get_events()
assert any(e["type"] == "session_begin" for e in events)
@then("the session should be marked as active")
@@ -73,27 +79,27 @@ def step_verify_session_active(context: Any) -> None:
@when("I call on_element_created with an element")
def step_call_element_created(context: Any) -> None:
"""Call on_element_created with a mock element."""
mock_event = Mock()
mock_element = Mock(spec=ElementSnapshot)
mock_element.id = "elem-1"
mock_element.type = "text"
mock_element.content = "Test content"
mock_element.metadata = {}
mock_event.element = mock_element
context.materializer.on_element_created(mock_event)
event = ElementCreated(
event_type="element_created",
handle_id="elem-1",
element_kind="text",
declaration_index=0,
initial_state=TextBlock(content="Test content"),
)
context.materializer.on_element_created(event)
@then("the materializer should record an element_created event")
def step_verify_element_created_event(context: Any) -> None:
"""Verify an element_created event was recorded."""
events = context.materializer._events
events = context.materializer.get_events()
assert any(e["type"] == "element_created" for e in events)
@then("the event should contain the element ID and type")
def step_verify_element_event_content(context: Any) -> None:
"""Verify the element event contains ID and type."""
events = context.materializer._events
events = context.materializer.get_events()
element_event = next(e for e in events if e["type"] == "element_created")
assert element_event["element_id"] == "elem-1"
assert element_event["element_type"] == "text"
@@ -102,27 +108,26 @@ def step_verify_element_event_content(context: Any) -> None:
@when("I call on_element_updated with an element")
def step_call_element_updated(context: Any) -> None:
"""Call on_element_updated with a mock element."""
mock_event = Mock()
mock_element = Mock(spec=ElementSnapshot)
mock_element.id = "elem-1"
mock_element.type = "text"
mock_element.content = "Updated content"
mock_element.metadata = {}
mock_event.element = mock_element
context.materializer.on_element_updated(mock_event)
event = ElementUpdated(
event_type="element_updated",
handle_id="elem-1",
element_kind="text",
element_snapshot=TextBlock(content="Updated content"),
)
context.materializer.on_element_updated(event)
@then("the materializer should record an element_updated event")
def step_verify_element_updated_event(context: Any) -> None:
"""Verify an element_updated event was recorded."""
events = context.materializer._events
events = context.materializer.get_events()
assert any(e["type"] == "element_updated" for e in events)
@then("the event should contain the updated element data")
def step_verify_updated_element_data(context: Any) -> None:
"""Verify the updated element event contains correct data."""
events = context.materializer._events
events = context.materializer.get_events()
element_event = next(e for e in events if e["type"] == "element_updated")
assert element_event["element_id"] == "elem-1"
@@ -130,22 +135,26 @@ def step_verify_updated_element_data(context: Any) -> None:
@when("I call on_element_closed with an element ID")
def step_call_element_closed(context: Any) -> None:
"""Call on_element_closed with an element ID."""
mock_event = Mock()
mock_event.element_id = "elem-1"
context.materializer.on_element_closed(mock_event)
event = ElementClosed(
event_type="element_closed",
handle_id="elem-1",
element_kind="text",
final_state=TextBlock(content="Final content"),
)
context.materializer.on_element_closed(event)
@then("the materializer should record an element_closed event")
def step_verify_element_closed_event(context: Any) -> None:
"""Verify an element_closed event was recorded."""
events = context.materializer._events
events = context.materializer.get_events()
assert any(e["type"] == "element_closed" for e in events)
@then("the event should contain the element ID")
def step_verify_element_closed_id(context: Any) -> None:
"""Verify the element_closed event contains the element ID."""
events = context.materializer._events
events = context.materializer.get_events()
element_event = next(e for e in events if e["type"] == "element_closed")
assert element_event["element_id"] == "elem-1"
@@ -153,16 +162,19 @@ def step_verify_element_closed_id(context: Any) -> None:
@when("I call on_session_end with a session end event")
def step_call_session_end(context: Any) -> None:
"""Call on_session_end with a mock session end event."""
mock_event = Mock()
mock_event.status = "completed"
mock_event.timestamp = "2026-04-20T00:00:01Z"
context.materializer.on_session_end(mock_event)
event = SessionEnd(
event_type="session_end",
handle_id="session",
element_kind="session",
exit_code=0,
)
context.materializer.on_session_end(event)
@then("the materializer should record a session_end event")
def step_verify_session_end_event(context: Any) -> None:
"""Verify a session_end event was recorded."""
events = context.materializer._events
events = context.materializer.get_events()
assert any(e["type"] == "session_end" for e in events)
@@ -209,7 +221,7 @@ def step_call_get_error_output(context: Any) -> None:
@then("the materializer should record an error event")
def step_verify_error_event(context: Any) -> None:
"""Verify an error event was recorded."""
events = context.materializer._events
events = context.materializer.get_events()
assert any(e["type"] == "error" for e in events)
+1
View File
@@ -23,6 +23,7 @@ if TYPE_CHECKING:
class TuiWidgetEventType:
"""String constants for TUI widget event types."""
SESSION_BEGIN: str = "session_begin"
ELEMENT_CREATED: str = "element_created"
ELEMENT_UPDATED: str = "element_updated"
ELEMENT_CLOSED: str = "element_closed"
+10
View File
@@ -152,6 +152,16 @@ class TuiMaterializer:
"""Called when a new output session begins."""
self._session = session
self._session_active = True
tui_event = TuiWidgetEvent(
event_type=TuiWidgetEventType.SESSION_BEGIN,
handle_id=str(getattr(session, "id", "")),
element_kind="session",
extra={
"session_id": getattr(session, "id", None),
"timestamp": getattr(session, "timestamp", None),
},
)
self._emit(tui_event)
def on_element_created(self, event: ElementCreated) -> None:
"""Called when a new element handle is created.