Skip to content

Commit d0bc332

Browse files
all unit tests passing
1 parent ca1b248 commit d0bc332

File tree

2 files changed

+49
-37
lines changed

2 files changed

+49
-37
lines changed

optimizely/optimizely.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,10 @@ def _decide(
11331133

11341134
return decision
11351135

1136+
def _fix_nested_decision_reasons_list(self, decision_reasons)->list:
1137+
if len(decision_reasons)==1 and type(decision_reasons[0])==type(list()):
1138+
decision_reasons = decision_reasons[0]
1139+
return decision_reasons
11361140

11371141
def _create_optimizely_decision(
11381142
self,
@@ -1155,7 +1159,7 @@ def _create_optimizely_decision(
11551159
attributes = user_context.get_user_attributes()
11561160
rule_key = flag_decision.experiment.key if flag_decision.experiment else None
11571161
all_variables = {}
1158-
decision_source = DecisionSources.ROLLOUT
1162+
decision_source = flag_decision.source
11591163
decision_event_dispatched = False
11601164

11611165
feature_flag = project_config.feature_key_map.get(flag_key)
@@ -1352,10 +1356,11 @@ def _decide_for_keys(
13521356
flag_decisions[flag_key] = decision
13531357
decision_reasons_dict[flag_key] += reasons
13541358

1355-
1359+
print(decision_reasons_dict)
13561360
for key in valid_keys:
13571361
flag_decision = flag_decisions[key]
13581362
decision_reasons = decision_reasons_dict[key]
1363+
decision_reasons = self._fix_nested_decision_reasons_list(decision_reasons)
13591364
optimizely_decision = self._create_optimizely_decision(
13601365
user_context,
13611366
key,
@@ -1367,7 +1372,7 @@ def _decide_for_keys(
13671372

13681373
if (OptimizelyDecideOption.ENABLED_FLAGS_ONLY not in merged_decide_options) or (optimizely_decision.enabled):
13691374
decisions[key] = optimizely_decision
1370-
1375+
13711376
return decisions
13721377

13731378
def _setup_odp(self, sdk_key: Optional[str]) -> None:

tests/test_user_context.py

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -228,9 +228,9 @@ def test_decide__feature_test(self):
228228
mock_variation = project_config.get_variation_from_id('test_experiment', '111129')
229229

230230
with mock.patch(
231-
'optimizely.decision_service.DecisionService.get_variation_for_feature',
232-
return_value=(decision_service.Decision(mock_experiment, mock_variation,
233-
enums.DecisionSources.FEATURE_TEST), []),
231+
'optimizely.decision_service.DecisionService.get_variations_for_feature_list',
232+
return_value=[(decision_service.Decision(mock_experiment, mock_variation,
233+
enums.DecisionSources.FEATURE_TEST), [])]
234234
), mock.patch(
235235
'optimizely.notification_center.NotificationCenter.send_notifications'
236236
) as mock_broadcast_decision, mock.patch(
@@ -303,9 +303,9 @@ def test_decide__feature_test__send_flag_decision_false(self):
303303
mock_variation = project_config.get_variation_from_id('test_experiment', '111129')
304304

305305
with mock.patch(
306-
'optimizely.decision_service.DecisionService.get_variation_for_feature',
307-
return_value=(decision_service.Decision(mock_experiment, mock_variation,
308-
enums.DecisionSources.FEATURE_TEST), []),
306+
'optimizely.decision_service.DecisionService.get_variations_for_feature_list',
307+
return_value=[(decision_service.Decision(mock_experiment, mock_variation,
308+
enums.DecisionSources.FEATURE_TEST), [])]
309309
), mock.patch(
310310
'optimizely.notification_center.NotificationCenter.send_notifications'
311311
) as mock_broadcast_decision, mock.patch(
@@ -478,9 +478,9 @@ def test_decide_feature_null_variation(self):
478478
mock_variation = None
479479

480480
with mock.patch(
481-
'optimizely.decision_service.DecisionService.get_variation_for_feature',
482-
return_value=(decision_service.Decision(mock_experiment, mock_variation,
483-
enums.DecisionSources.ROLLOUT), []),
481+
'optimizely.decision_service.DecisionService.get_variations_for_feature_list',
482+
return_value=[(decision_service.Decision(mock_experiment, mock_variation,
483+
enums.DecisionSources.ROLLOUT), [])],
484484
), mock.patch(
485485
'optimizely.notification_center.NotificationCenter.send_notifications'
486486
) as mock_broadcast_decision, mock.patch(
@@ -553,9 +553,9 @@ def test_decide_feature_null_variation__send_flag_decision_false(self):
553553
mock_variation = None
554554

555555
with mock.patch(
556-
'optimizely.decision_service.DecisionService.get_variation_for_feature',
557-
return_value=(decision_service.Decision(mock_experiment, mock_variation,
558-
enums.DecisionSources.ROLLOUT), []),
556+
'optimizely.decision_service.DecisionService.get_variations_for_feature_list',
557+
return_value=[(decision_service.Decision(mock_experiment, mock_variation,
558+
enums.DecisionSources.ROLLOUT), [])],
559559
), mock.patch(
560560
'optimizely.notification_center.NotificationCenter.send_notifications'
561561
) as mock_broadcast_decision, mock.patch(
@@ -614,9 +614,9 @@ def test_decide__option__disable_decision_event(self):
614614
mock_variation = project_config.get_variation_from_id('test_experiment', '111129')
615615

616616
with mock.patch(
617-
'optimizely.decision_service.DecisionService.get_variation_for_feature',
618-
return_value=(decision_service.Decision(mock_experiment, mock_variation,
619-
enums.DecisionSources.FEATURE_TEST), []),
617+
'optimizely.decision_service.DecisionService.get_variations_for_feature_list',
618+
return_value=[(decision_service.Decision(mock_experiment, mock_variation,
619+
enums.DecisionSources.FEATURE_TEST), [])],
620620
), mock.patch(
621621
'optimizely.notification_center.NotificationCenter.send_notifications'
622622
) as mock_broadcast_decision, mock.patch(
@@ -679,8 +679,8 @@ def test_decide__default_option__disable_decision_event(self):
679679

680680
with mock.patch(
681681
'optimizely.decision_service.DecisionService.get_variations_for_feature_list',
682-
return_value=([decision_service.Decision(mock_experiment, mock_variation,
683-
enums.DecisionSources.FEATURE_TEST), []]),
682+
return_value=[(decision_service.Decision(mock_experiment, mock_variation,
683+
enums.DecisionSources.FEATURE_TEST), [])]
684684
), mock.patch(
685685
'optimizely.notification_center.NotificationCenter.send_notifications'
686686
) as mock_broadcast_decision, mock.patch(
@@ -739,9 +739,9 @@ def test_decide__option__exclude_variables(self):
739739
mock_variation = project_config.get_variation_from_id('test_experiment', '111129')
740740

741741
with mock.patch(
742-
'optimizely.decision_service.DecisionService.get_variation_for_feature',
743-
return_value=(decision_service.Decision(mock_experiment, mock_variation,
744-
enums.DecisionSources.FEATURE_TEST), []),
742+
'optimizely.decision_service.DecisionService.get_variations_for_feature_list',
743+
return_value=[(decision_service.Decision(mock_experiment, mock_variation,
744+
enums.DecisionSources.FEATURE_TEST), [])],
745745
), mock.patch(
746746
'optimizely.notification_center.NotificationCenter.send_notifications'
747747
) as mock_broadcast_decision, mock.patch(
@@ -835,9 +835,9 @@ def test_decide__option__enabled_flags_only(self):
835835
expected_var = project_config.get_variation_from_key('211127', '211229')
836836

837837
with mock.patch(
838-
'optimizely.decision_service.DecisionService.get_variation_for_feature',
839-
return_value=(decision_service.Decision(expected_experiment, expected_var,
840-
enums.DecisionSources.ROLLOUT), []),
838+
'optimizely.decision_service.DecisionService.get_variations_for_feature_list',
839+
return_value=[(decision_service.Decision(expected_experiment, expected_var,
840+
enums.DecisionSources.ROLLOUT), [])],
841841
), mock.patch(
842842
'optimizely.notification_center.NotificationCenter.send_notifications'
843843
) as mock_broadcast_decision, mock.patch(
@@ -914,9 +914,9 @@ def test_decide__default_options__with__options(self):
914914
mock_variation = project_config.get_variation_from_id('test_experiment', '111129')
915915

916916
with mock.patch(
917-
'optimizely.decision_service.DecisionService.get_variation_for_feature',
918-
return_value=(decision_service.Decision(mock_experiment, mock_variation,
919-
enums.DecisionSources.FEATURE_TEST), []),
917+
'optimizely.decision_service.DecisionService.get_variations_for_feature_list',
918+
return_value=[(decision_service.Decision(mock_experiment, mock_variation,
919+
enums.DecisionSources.FEATURE_TEST), [])],
920920
), mock.patch(
921921
'optimizely.notification_center.NotificationCenter.send_notifications'
922922
) as mock_broadcast_decision, mock.patch(
@@ -1026,19 +1026,24 @@ def side_effect(*args, **kwargs):
10261026
options = ['ENABLED_FLAGS_ONLY']
10271027
decisions = user_context.decide_for_keys(flags, options)
10281028

1029-
self.assertEqual(1, len(decisions))
1030-
1031-
mock_decide.assert_any_call(
1032-
user_context,
1033-
'test_feature_in_experiment',
1034-
options
1035-
)
1029+
self.assertEqual(2, len(decisions))
10361030

10371031
mock_decide.assert_any_call(
10381032
user_context,
1039-
'test_feature_in_rollout',
1033+
['test_feature_in_rollout', 'test_feature_in_experiment'],
10401034
options
10411035
)
1036+
# mock_decide.assert_any_call(
1037+
# user_context,
1038+
# 'test_feature_in_experiment',
1039+
# options
1040+
# )
1041+
1042+
# mock_decide.assert_any_call(
1043+
# user_context,
1044+
# 'test_feature_in_rollout',
1045+
# options
1046+
# )
10421047

10431048
self.assertEqual(mocked_decision_1, decisions['test_feature_in_experiment'])
10441049

@@ -1638,6 +1643,8 @@ def test_should_return_valid_decision_after_setting_invalid_experiment_rule_vari
16381643
self.assertEqual(decide_decision.user_context.get_user_attributes(), {})
16391644

16401645
expected_reasons = [
1646+
'Invalid variation is mapped to flag (test_feature_in_experiment), rule (test_experiment) '
1647+
'and user (test_user) in the forced decision map.',
16411648
'Invalid variation is mapped to flag (test_feature_in_experiment), rule (test_experiment) '
16421649
'and user (test_user) in the forced decision map.',
16431650
'Evaluating audiences for experiment "test_experiment": [].',

0 commit comments

Comments
 (0)