From e03e0fe11c5bc441e8a8eda72365cf440f634ced Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 12 Jan 2021 15:27:17 +0500 Subject: [PATCH 1/4] clone function created and passed as argument --- optimizely/user_context.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/optimizely/user_context.py b/optimizely/user_context.py index 98b40a277..51e138a22 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) From f2e14a6cbc4da85c5eadaf91360248ee97520382 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 12 Jan 2021 15:51:40 +0500 Subject: [PATCH 2/4] linting fixed --- optimizely/user_context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/optimizely/user_context.py b/optimizely/user_context.py index 51e138a22..778a11fd8 100644 --- a/optimizely/user_context.py +++ b/optimizely/user_context.py @@ -41,7 +41,7 @@ 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) + return UserContext(self.client, self.user_id, self.user_attributes) def set_attribute(self, attribute_key, attribute_value): """ From c649b1baf211172448d669071c47a7ea38e6e0bb Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 12 Jan 2021 15:54:43 +0500 Subject: [PATCH 3/4] white space removed --- optimizely/user_context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/optimizely/user_context.py b/optimizely/user_context.py index 778a11fd8..07de155e6 100644 --- a/optimizely/user_context.py +++ b/optimizely/user_context.py @@ -42,7 +42,7 @@ def __init__(self, optimizely_client, user_id, user_attributes=None): 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. From 2f1ae2ca23056046f0d5d9d61ee26c54535ac5e8 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 13 Jan 2021 18:54:56 +0500 Subject: [PATCH 4/4] unit test added for clone --- tests/test_user_context.py | 11 +++++++++++ 1 file changed, 11 insertions(+) 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. """