Skip to content

Commit 9f46ddf

Browse files
fix: skip identify on user_context clone (#409)
1 parent 193d3c9 commit 9f46ddf

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

optimizely/optimizely_user_context.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,12 @@ class OptimizelyUserContext:
3737
"""
3838

3939
def __init__(
40-
self, optimizely_client: optimizely.Optimizely, logger: Logger,
41-
user_id: str, user_attributes: Optional[UserAttributes] = None
40+
self,
41+
optimizely_client: optimizely.Optimizely,
42+
logger: Logger,
43+
user_id: str,
44+
user_attributes: Optional[UserAttributes] = None,
45+
identify: bool = True
4246
):
4347
""" Create an instance of the Optimizely User Context.
4448
@@ -47,6 +51,7 @@ def __init__(
4751
logger: logger for logging
4852
user_id: user id of this user context
4953
user_attributes: user attributes to use for this user context
54+
identify: True to send identify event to ODP.
5055
5156
Returns:
5257
UserContext instance
@@ -67,7 +72,7 @@ def __init__(
6772
OptimizelyUserContext.OptimizelyForcedDecision
6873
] = {}
6974

70-
if self.client:
75+
if self.client and identify:
7176
self.client.identify_user(user_id)
7277

7378
class OptimizelyDecisionContext:
@@ -94,7 +99,13 @@ def _clone(self) -> Optional[OptimizelyUserContext]:
9499
if not self.client:
95100
return None
96101

97-
user_context = OptimizelyUserContext(self.client, self.logger, self.user_id, self.get_user_attributes())
102+
user_context = OptimizelyUserContext(
103+
self.client,
104+
self.logger,
105+
self.user_id,
106+
self.get_user_attributes(),
107+
identify=False
108+
)
98109

99110
with self.lock:
100111
if self.forced_decisions_map:

tests/test_user_context.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,6 +2021,24 @@ def test_send_identify_event_when_user_context_created(self):
20212021
mock_logger.error.assert_not_called()
20222022
client.close()
20232023

2024+
def test_identify_is_skipped_with_decisions(self):
2025+
mock_logger = mock.Mock()
2026+
client = optimizely.Optimizely(json.dumps(self.config_dict_with_features), logger=mock_logger)
2027+
with mock.patch.object(client, 'identify_user') as identify:
2028+
user_context = OptimizelyUserContext(client, mock_logger, 'user-id')
2029+
2030+
identify.assert_called_once_with('user-id')
2031+
mock_logger.error.assert_not_called()
2032+
2033+
with mock.patch.object(client, 'identify_user') as identify:
2034+
user_context.decide('test_feature_in_rollout')
2035+
user_context.decide_all()
2036+
user_context.decide_for_keys(['test_feature_in_rollout'])
2037+
2038+
identify.assert_not_called()
2039+
mock_logger.error.assert_not_called()
2040+
client.close()
2041+
20242042
# fetch qualified segments
20252043
def test_fetch_segments(self):
20262044
mock_logger = mock.Mock()

0 commit comments

Comments
 (0)