Skip to content

Commit f000c6e

Browse files
[FSSDK-8946] fix: make odp event identifiers required (#418)
* make odp event identifiers required
1 parent 8363350 commit f000c6e

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

optimizely/optimizely.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -1369,25 +1369,29 @@ def _fetch_qualified_segments(self, user_id: str, options: Optional[list[str]] =
13691369
def send_odp_event(
13701370
self,
13711371
action: str,
1372+
identifiers: dict[str, str],
13721373
type: str = enums.OdpManagerConfig.EVENT_TYPE,
1373-
identifiers: Optional[dict[str, str]] = None,
13741374
data: Optional[dict[str, str | int | float | bool | None]] = None
13751375
) -> None:
13761376
"""
13771377
Send an event to the ODP server.
13781378
13791379
Args:
13801380
action: The event action name.
1381+
identifiers: A dictionary for identifiers. The caller must provide at least one key-value pair.
13811382
type: The event type. Default 'fullstack'.
1382-
identifiers: An optional dictionary for identifiers.
13831383
data: An optional dictionary for associated data. The default event data will be added to this data
13841384
before sending to the ODP server.
13851385
"""
13861386
if not self.is_valid:
13871387
self.logger.error(enums.Errors.INVALID_OPTIMIZELY.format('send_odp_event'))
13881388
return
13891389

1390-
self.odp_manager.send_event(type, action, identifiers or {}, data or {})
1390+
if not identifiers or not isinstance(identifiers, dict):
1391+
self.logger.error('ODP events must have at least one key-value pair in identifiers.')
1392+
return
1393+
1394+
self.odp_manager.send_event(type, action, identifiers, data or {})
13911395

13921396
def close(self) -> None:
13931397
if callable(getattr(self.event_processor, 'stop', None)):

tests/test_optimizely.py

+25-7
Original file line numberDiff line numberDiff line change
@@ -5386,7 +5386,7 @@ def test_send_odp_event__send_event_with_static_config_manager(self):
53865386
logger=mock_logger,
53875387
)
53885388
with mock.patch('requests.post', return_value=self.fake_server_response(status_code=200)):
5389-
client.send_odp_event(type='wow', action='great', identifiers={}, data={})
5389+
client.send_odp_event(type='wow', action='great', identifiers={'amazing': 'fantastic'}, data={})
53905390
client.close()
53915391
mock_logger.error.assert_not_called()
53925392
mock_logger.debug.assert_called_with('ODP event queue: flushing batch size 1.')
@@ -5405,7 +5405,7 @@ def test_send_odp_event__send_event_with_polling_config_manager(self):
54055405
client.config_manager.get_config()
54065406

54075407
with mock.patch('requests.post', return_value=self.fake_server_response(status_code=200)):
5408-
client.send_odp_event(type='wow', action='great', identifiers={}, data={})
5408+
client.send_odp_event(type='wow', action='great', identifiers={'amazing': 'fantastic'}, data={})
54095409
client.close()
54105410

54115411
mock_logger.error.assert_not_called()
@@ -5419,14 +5419,14 @@ def test_send_odp_event__log_error_when_odp_disabled(self):
54195419
settings=OptimizelySdkSettings(odp_disabled=True)
54205420
)
54215421
with mock.patch('requests.post', return_value=self.fake_server_response(status_code=200)):
5422-
client.send_odp_event(type='wow', action='great', identifiers={}, data={})
5422+
client.send_odp_event(type='wow', action='great', identifiers={'amazing': 'fantastic'}, data={})
54235423
client.close()
54245424
mock_logger.error.assert_called_with('ODP is not enabled.')
54255425

54265426
def test_send_odp_event__log_debug_if_datafile_not_ready(self):
54275427
mock_logger = mock.Mock()
54285428
client = optimizely.Optimizely(sdk_key='test', logger=mock_logger)
5429-
client.send_odp_event(type='wow', action='great', identifiers={}, data={})
5429+
client.send_odp_event(type='wow', action='great', identifiers={'amazing': 'fantastic'}, data={})
54305430

54315431
mock_logger.debug.assert_called_with('ODP event queue: cannot send before config has been set.')
54325432
client.close()
@@ -5449,7 +5449,7 @@ def test_send_odp_event__log_error_if_odp_not_enabled_with_polling_config_manage
54495449
client.config_manager.get_config()
54505450

54515451
with mock.patch('requests.post', return_value=self.fake_server_response(status_code=200)):
5452-
client.send_odp_event(type='wow', action='great', identifiers={}, data={})
5452+
client.send_odp_event(type='wow', action='great', identifiers={'amazing': 'fantastic'}, data={})
54535453
client.close()
54545454

54555455
mock_logger.error.assert_called_with('ODP is not enabled.')
@@ -5458,15 +5458,33 @@ def test_send_odp_event__log_error_with_invalid_data(self):
54585458
mock_logger = mock.Mock()
54595459
client = optimizely.Optimizely(json.dumps(self.config_dict_with_audience_segments), logger=mock_logger)
54605460

5461-
client.send_odp_event(type='wow', action='great', identifiers={}, data={'test': {}})
5461+
client.send_odp_event(type='wow', action='great', identifiers={'amazing': 'fantastic'}, data={'test': {}})
54625462
client.close()
54635463

54645464
mock_logger.error.assert_called_with('ODP data is not valid.')
54655465

5466+
def test_send_odp_event__log_error_with_empty_identifiers(self):
5467+
mock_logger = mock.Mock()
5468+
client = optimizely.Optimizely(json.dumps(self.config_dict_with_audience_segments), logger=mock_logger)
5469+
5470+
client.send_odp_event(type='wow', action='great', identifiers={}, data={})
5471+
client.close()
5472+
5473+
mock_logger.error.assert_called_with('ODP events must have at least one key-value pair in identifiers.')
5474+
5475+
def test_send_odp_event__log_error_with_no_identifiers(self):
5476+
mock_logger = mock.Mock()
5477+
client = optimizely.Optimizely(json.dumps(self.config_dict_with_audience_segments), logger=mock_logger)
5478+
5479+
client.send_odp_event(type='wow', action='great', identifiers=None, data={})
5480+
client.close()
5481+
5482+
mock_logger.error.assert_called_with('ODP events must have at least one key-value pair in identifiers.')
5483+
54665484
def test_send_odp_event__log_error_with_missing_integrations_data(self):
54675485
mock_logger = mock.Mock()
54685486
client = optimizely.Optimizely(json.dumps(self.config_dict_with_typed_audiences), logger=mock_logger)
5469-
client.send_odp_event(type='wow', action='great', identifiers={}, data={})
5487+
client.send_odp_event(type='wow', action='great', identifiers={'amazing': 'fantastic'}, data={})
54705488

54715489
mock_logger.error.assert_called_with('ODP is not integrated.')
54725490
client.close()

0 commit comments

Comments
 (0)