diff --git a/optimizely/user_context.py b/optimizely/user_context.py index 98b40a277..07de155e6 100644 --- a/optimizely/user_context.py +++ b/optimizely/user_context.py @@ -40,6 +40,9 @@ def __init__(self, optimizely_client, user_id, user_attributes=None): self.logger = _logging.reset_logger(self.logger_name) + def clone(self): + return UserContext(self.client, self.user_id, self.user_attributes) + def set_attribute(self, attribute_key, attribute_value): """ sets a attribute by key for this user context. @@ -66,7 +69,7 @@ def decide(self, key, options=None): self.logger.error("Optimizely Client invalid") return None - return self.client.decide(self, key, options) + return self.client.decide(self.clone(), key, options) def decide_for_keys(self, keys, options=None): """ @@ -82,7 +85,7 @@ def decide_for_keys(self, keys, options=None): self.logger.error("Optimizely Client invalid") return None - self.client.decide_for_keys(self, keys, options) + self.client.decide_for_keys(self.clone(), keys, options) def decide_all(self, options=None): """ @@ -97,7 +100,7 @@ def decide_all(self, options=None): self.logger.error("Optimizely Client invalid") return None - self.client.decide_all(self, options) + self.client.decide_all(self.clone(), options) def track_event(self, event_key, event_tags=None): self.client.track(event_key, self.user_id, self.user_attributes, event_tags) diff --git a/tests/test_user_context.py b/tests/test_user_context.py index 4312b1cb6..1ab34c4bb 100644 --- a/tests/test_user_context.py +++ b/tests/test_user_context.py @@ -66,6 +66,17 @@ def test_decide_rollout(self): self.assertFalse(decision.enabled) self.assertEqual(decision.flag_key, 'test_feature_in_rollout') + def test_decide_user_context(self): + """ Test that the user context in decide response is not the same object on which + the decide was called """ + + opt_obj = optimizely.Optimizely(json.dumps(self.config_dict_with_features)) + + user_context = opt_obj.create_user_context('test_user') + decision = user_context.decide('test_feature_in_rollout') + user_context.set_attribute("test_key", "test_value") + self.assertNotEqual(user_context.user_attributes, decision.user_context.user_attributes) + def test_decide_for_keys(self): """ Test that the feature is enabled for the user if bucketed into variation of a rollout. Also confirm that no impression event is processed. """