From 09d4e520a447163df522eeb0bdc1f32fd430443b Mon Sep 17 00:00:00 2001 From: Jonathan Norris Date: Mon, 4 May 2026 15:44:35 -0400 Subject: [PATCH] fix: initialize payloads before try block in _flush_events Prevents UnboundLocalError when flush_event_queue() raises (e.g. a WASM trap), which previously masked the original error. Adds a regression test. Fixes #111 --- .../managers/event_queue_manager.py | 1 + test/managers/test_event_queue_manager.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/devcycle_python_sdk/managers/event_queue_manager.py b/devcycle_python_sdk/managers/event_queue_manager.py index a08bb9c..d5c4d2d 100644 --- a/devcycle_python_sdk/managers/event_queue_manager.py +++ b/devcycle_python_sdk/managers/event_queue_manager.py @@ -88,6 +88,7 @@ def _flush_events(self) -> int: return 0 with self._flush_lock: + payloads = [] try: payloads = self._local_bucketing.flush_event_queue() except Exception as e: diff --git a/test/managers/test_event_queue_manager.py b/test/managers/test_event_queue_manager.py index 7195d06..7f8dced 100644 --- a/test/managers/test_event_queue_manager.py +++ b/test/managers/test_event_queue_manager.py @@ -147,6 +147,24 @@ def test_publish_event_payload_non_retryable_api_error(self, mock_publish_events ) self.test_local_bucketing.on_event_payload_success.assert_not_called() + @patch("devcycle_python_sdk.api.event_client.EventAPIClient.publish_events") + def test_flush_events_wasm_error_does_not_raise(self, mock_publish_events): + self.test_local_bucketing.flush_event_queue.side_effect = Exception( + "WASMAbortError: Request Payload has not finished sending" + ) + + manager = EventQueueManager( + self.sdk_key, + self.client_uuid, + self.test_options_no_thread, + self.test_local_bucketing, + ) + # Must not raise UnboundLocalError; must return 0 + result = manager._flush_events() + + self.assertEqual(result, 0) + mock_publish_events.assert_not_called() + @patch("devcycle_python_sdk.api.event_client.EventAPIClient.publish_events") def test_flush_events_no_events(self, mock_publish_events): self.test_local_bucketing.flush_event_queue = MagicMock()