Skip to content

Commit db1c991

Browse files
update: add test for CMAB UUID handling in decision events. Removed two redundant tests on legacy api.
1 parent b88c08b commit db1c991

File tree

1 file changed

+74
-51
lines changed

1 file changed

+74
-51
lines changed

tests/test_optimizely.py

Lines changed: 74 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4890,57 +4890,6 @@ def test_odp_events_not_sent_with_legacy_apis(self):
48904890

48914891
client.close()
48924892

4893-
def test_get_variation_with_cmab_uuid(self):
4894-
""" Test that get_variation works correctly with CMAB UUID. """
4895-
expected_cmab_uuid = "get-variation-cmab-uuid"
4896-
variation_result = {
4897-
'variation': self.project_config.get_variation_from_id('test_experiment', '111129'),
4898-
'cmab_uuid': expected_cmab_uuid,
4899-
'reasons': [],
4900-
'error': False
4901-
}
4902-
4903-
with mock.patch(
4904-
'optimizely.decision_service.DecisionService.get_variation',
4905-
return_value=variation_result,
4906-
), mock.patch('optimizely.notification_center.NotificationCenter.send_notifications') as mock_broadcast:
4907-
variation = self.optimizely.get_variation('test_experiment', 'test_user')
4908-
self.assertEqual('variation', variation)
4909-
4910-
# Verify decision notification is sent with correct parameters
4911-
mock_broadcast.assert_any_call(
4912-
enums.NotificationTypes.DECISION,
4913-
'ab-test',
4914-
'test_user',
4915-
{},
4916-
{'experiment_key': 'test_experiment', 'variation_key': 'variation'},
4917-
)
4918-
4919-
def test_get_variation_without_cmab_uuid(self):
4920-
""" Test that get_variation works correctly when CMAB UUID is None. """
4921-
variation_result = {
4922-
'variation': self.project_config.get_variation_from_id('test_experiment', '111129'),
4923-
'cmab_uuid': None,
4924-
'reasons': [],
4925-
'error': False
4926-
}
4927-
4928-
with mock.patch(
4929-
'optimizely.decision_service.DecisionService.get_variation',
4930-
return_value=variation_result,
4931-
), mock.patch('optimizely.notification_center.NotificationCenter.send_notifications') as mock_broadcast:
4932-
variation = self.optimizely.get_variation('test_experiment', 'test_user')
4933-
self.assertEqual('variation', variation)
4934-
4935-
# Verify decision notification is sent correctly
4936-
mock_broadcast.assert_any_call(
4937-
enums.NotificationTypes.DECISION,
4938-
'ab-test',
4939-
'test_user',
4940-
{},
4941-
{'experiment_key': 'test_experiment', 'variation_key': 'variation'},
4942-
)
4943-
49444893

49454894
class OptimizelyWithExceptionTest(base.BaseTest):
49464895
def setUp(self):
@@ -5801,3 +5750,77 @@ def test_decide_returns_error_decision_when_decision_service_fails(self):
58015750
self.assertIsNone(decision.rule_key)
58025751
self.assertEqual(decision.flag_key, 'test_feature_in_experiment')
58035752
self.assertIn('CMAB service failed to fetch decision', decision.reasons)
5753+
5754+
def test_decide_includes_cmab_uuid_in_dispatched_event(self):
5755+
"""Test that decide calls UserEventFactory.create_impression_event with correct CMAB UUID."""
5756+
import copy
5757+
config_dict = copy.deepcopy(self.config_dict_with_features)
5758+
config_dict['experiments'][0]['cmab'] = {'attributeIds': ['808797688', '808797689'], 'trafficAllocation': 4000}
5759+
config_dict['experiments'][0]['trafficAllocation'] = []
5760+
opt_obj = optimizely.Optimizely(json.dumps(config_dict))
5761+
user_context = opt_obj.create_user_context('test_user')
5762+
project_config = opt_obj.config_manager.get_config()
5763+
5764+
# Mock decision service to return a CMAB result
5765+
expected_cmab_uuid = 'uuid-cmab'
5766+
mock_experiment = project_config.get_experiment_from_key('test_experiment')
5767+
mock_variation = project_config.get_variation_from_id('test_experiment', '111129')
5768+
decision_result = {
5769+
'decision': decision_service.Decision(
5770+
mock_experiment,
5771+
mock_variation,
5772+
enums.DecisionSources.FEATURE_TEST,
5773+
expected_cmab_uuid
5774+
),
5775+
'reasons': [],
5776+
'error': False
5777+
}
5778+
5779+
with mock.patch.object(
5780+
opt_obj.decision_service, 'get_variations_for_feature_list',
5781+
return_value=[decision_result]
5782+
), mock.patch(
5783+
'optimizely.event.user_event_factory.UserEventFactory.create_impression_event'
5784+
) as mock_create_impression, mock.patch(
5785+
'time.time', return_value=42
5786+
), mock.patch(
5787+
'uuid.uuid4', return_value='a68cf1ad-0393-4e18-af87-efe8f01a7c9c'
5788+
):
5789+
# Call decide
5790+
decision = user_context.decide('test_feature_in_experiment')
5791+
5792+
# Verify the decision contains the expected information
5793+
self.assertTrue(decision.enabled)
5794+
self.assertEqual(decision.variation_key, 'variation')
5795+
self.assertEqual(decision.rule_key, 'test_experiment')
5796+
self.assertEqual(decision.flag_key, 'test_feature_in_experiment')
5797+
5798+
# Verify that create_impression_event was called once
5799+
mock_create_impression.assert_called_once()
5800+
5801+
# Get the call arguments
5802+
call_args = mock_create_impression.call_args[0]
5803+
5804+
# Verify the correct parameters were passed
5805+
project_config_arg = call_args[0]
5806+
experiment_arg = call_args[1]
5807+
variation_id_arg = call_args[2]
5808+
flag_key_arg = call_args[3]
5809+
rule_key_arg = call_args[4]
5810+
rule_type_arg = call_args[5]
5811+
enabled_arg = call_args[6]
5812+
user_id_arg = call_args[7]
5813+
attributes_arg = call_args[8]
5814+
cmab_uuid_arg = call_args[9]
5815+
5816+
# Verify all parameters
5817+
self.assertEqual(project_config_arg, project_config)
5818+
self.assertEqual(experiment_arg, mock_experiment)
5819+
self.assertEqual(variation_id_arg, '111129') # variation.id
5820+
self.assertEqual(flag_key_arg, 'test_feature_in_experiment')
5821+
self.assertEqual(rule_key_arg, 'test_experiment')
5822+
self.assertEqual(rule_type_arg, str(enums.DecisionSources.FEATURE_TEST))
5823+
self.assertTrue(enabled_arg)
5824+
self.assertEqual(user_id_arg, 'test_user')
5825+
self.assertEqual(attributes_arg, {})
5826+
self.assertEqual(cmab_uuid_arg, expected_cmab_uuid)

0 commit comments

Comments
 (0)