From 03b40a3575b9d0b45ef49d691531e7e0eb2c8a4a Mon Sep 17 00:00:00 2001 From: Sasa Junuzovic <44276455+microsasa@users.noreply.github.com> Date: Thu, 9 Apr 2026 08:26:18 -0700 Subject: [PATCH] test: cover _safe_event_data exception paths and wildcard case (#885) Add tests for two uncovered code paths in render_detail.py: - _safe_event_data: ValidationError and ValueError recovery branches - _build_event_details: wildcard case returning '' for unhandled event types Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- tests/copilot_usage/test_render_detail.py | 49 +++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tests/copilot_usage/test_render_detail.py b/tests/copilot_usage/test_render_detail.py index 723f825..c1c8591 100644 --- a/tests/copilot_usage/test_render_detail.py +++ b/tests/copilot_usage/test_render_detail.py @@ -21,6 +21,7 @@ TokenUsage, ToolExecutionData, ToolTelemetry, + UserMessageData, ) from copilot_usage.render_detail import ( _build_event_details, @@ -31,6 +32,7 @@ _render_code_changes, _render_recent_events, _render_shutdown_cycles, + _safe_event_data, render_session_detail, ) @@ -806,3 +808,50 @@ def test_empty_content_returns_empty_string(self) -> None: """Empty content → empty string.""" ev = SessionEvent(type=EventType.USER_MESSAGE, data={"content": ""}) assert _build_event_details(ev) == "" + + +# --------------------------------------------------------------------------- +# _safe_event_data — exception recovery paths (issue #885) +# --------------------------------------------------------------------------- + + +class TestSafeEventData: + """Cover the except (ValidationError, ValueError) branch of _safe_event_data.""" + + def test_returns_none_on_validation_error(self) -> None: + """ValidationError from the parser must be caught; returns None.""" + ev = SessionEvent( + type=EventType.USER_MESSAGE, + data={"attachments": 123}, # int, not list[str] + ) + result = _safe_event_data(ev, ev.as_user_message) + assert result is None + + def test_returns_none_on_value_error(self) -> None: + """ValueError from the parser must be caught; returns None.""" + ev = SessionEvent(type=EventType.USER_MESSAGE, data={}) + + def _raise() -> UserMessageData: + raise ValueError("synthetic mismatch") + + result = _safe_event_data(ev, _raise) + assert result is None + + def test_returns_none_propagates_to_build_event_details(self) -> None: + """_build_event_details returns '' when _safe_event_data returns None.""" + ev = SessionEvent( + type=EventType.USER_MESSAGE, + data={"attachments": 123}, + ) + assert _build_event_details(ev) == "" + + +# --------------------------------------------------------------------------- +# _build_event_details — wildcard case (issue #885) +# --------------------------------------------------------------------------- + + +def test_build_event_details_returns_empty_for_unrecognized_type() -> None: + """Wildcard case must return '' for event types without explicit handling.""" + ev = SessionEvent(type=EventType.SESSION_RESUME, data={}) + assert _build_event_details(ev) == ""