|
21 | 21 | TokenUsage, |
22 | 22 | ToolExecutionData, |
23 | 23 | ToolTelemetry, |
| 24 | + UserMessageData, |
24 | 25 | ) |
25 | 26 | from copilot_usage.render_detail import ( |
26 | 27 | _build_event_details, |
|
31 | 32 | _render_code_changes, |
32 | 33 | _render_recent_events, |
33 | 34 | _render_shutdown_cycles, |
| 35 | + _safe_event_data, |
34 | 36 | render_session_detail, |
35 | 37 | ) |
36 | 38 |
|
@@ -806,3 +808,50 @@ def test_empty_content_returns_empty_string(self) -> None: |
806 | 808 | """Empty content → empty string.""" |
807 | 809 | ev = SessionEvent(type=EventType.USER_MESSAGE, data={"content": ""}) |
808 | 810 | assert _build_event_details(ev) == "" |
| 811 | + |
| 812 | + |
| 813 | +# --------------------------------------------------------------------------- |
| 814 | +# _safe_event_data — exception recovery paths (issue #885) |
| 815 | +# --------------------------------------------------------------------------- |
| 816 | + |
| 817 | + |
| 818 | +class TestSafeEventData: |
| 819 | + """Cover the except (ValidationError, ValueError) branch of _safe_event_data.""" |
| 820 | + |
| 821 | + def test_returns_none_on_validation_error(self) -> None: |
| 822 | + """ValidationError from the parser must be caught; returns None.""" |
| 823 | + ev = SessionEvent( |
| 824 | + type=EventType.USER_MESSAGE, |
| 825 | + data={"attachments": 123}, # int, not list[str] |
| 826 | + ) |
| 827 | + result = _safe_event_data(ev, ev.as_user_message) |
| 828 | + assert result is None |
| 829 | + |
| 830 | + def test_returns_none_on_value_error(self) -> None: |
| 831 | + """ValueError from the parser must be caught; returns None.""" |
| 832 | + ev = SessionEvent(type=EventType.USER_MESSAGE, data={}) |
| 833 | + |
| 834 | + def _raise() -> UserMessageData: |
| 835 | + raise ValueError("synthetic mismatch") |
| 836 | + |
| 837 | + result = _safe_event_data(ev, _raise) |
| 838 | + assert result is None |
| 839 | + |
| 840 | + def test_returns_none_propagates_to_build_event_details(self) -> None: |
| 841 | + """_build_event_details returns '' when _safe_event_data returns None.""" |
| 842 | + ev = SessionEvent( |
| 843 | + type=EventType.USER_MESSAGE, |
| 844 | + data={"attachments": 123}, |
| 845 | + ) |
| 846 | + assert _build_event_details(ev) == "" |
| 847 | + |
| 848 | + |
| 849 | +# --------------------------------------------------------------------------- |
| 850 | +# _build_event_details — wildcard case (issue #885) |
| 851 | +# --------------------------------------------------------------------------- |
| 852 | + |
| 853 | + |
| 854 | +def test_build_event_details_returns_empty_for_unrecognized_type() -> None: |
| 855 | + """Wildcard case must return '' for event types without explicit handling.""" |
| 856 | + ev = SessionEvent(type=EventType.SESSION_RESUME, data={}) |
| 857 | + assert _build_event_details(ev) == "" |
0 commit comments