Skip to content

Commit 46aff7f

Browse files
authored
feat(decide): clone user-context before calling optimizely decide (#256)
1 parent 6d60cf3 commit 46aff7f

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

OptimizelySDK.Tests/OptimizelyUserContextTest.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
*
3-
* Copyright 2020, Optimizely and contributors
3+
* Copyright 2020-2021, Optimizely and contributors
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
66
* you may not use this file except in compliance with the License.
@@ -181,7 +181,8 @@ public void TestDecide()
181181
Assert.AreEqual(decision.Variables.ToDictionary(), variablesExpected.ToDictionary());
182182
Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate");
183183
Assert.AreEqual(decision.FlagKey, flagKey);
184-
Assert.AreEqual(decision.UserContext, user);
184+
Assert.AreNotEqual(decision.UserContext, user);
185+
Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user));
185186
Assert.AreEqual(decision.Reasons.Length, 0);
186187
}
187188

@@ -551,7 +552,8 @@ public void DecideExcludeVariablesDecideOptions()
551552
Assert.AreEqual(decision.Variables.ToDictionary(), variablesExpected);
552553
Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate");
553554
Assert.AreEqual(decision.FlagKey, flagKey);
554-
Assert.AreEqual(decision.UserContext, user);
555+
Assert.AreNotEqual(decision.UserContext, user);
556+
Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user));
555557
Assert.True(decision.Reasons.IsNullOrEmpty());
556558
}
557559

@@ -580,7 +582,8 @@ public void DecideIncludeReasonsDecideOptions()
580582
Assert.False(decision.Enabled);
581583
Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate");
582584
Assert.AreEqual(decision.FlagKey, flagKey);
583-
Assert.AreEqual(decision.UserContext, user);
585+
Assert.AreNotEqual(decision.UserContext, user);
586+
Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user));
584587
Assert.True(decision.Reasons.IsNullOrEmpty());
585588

586589
decision = user.Decide(flagKey, decideOptions);
@@ -611,7 +614,8 @@ public void TestDoNotSendEventDecide()
611614
Assert.AreEqual(decision.Variables.ToDictionary(), variablesExpected.ToDictionary());
612615
Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate");
613616
Assert.AreEqual(decision.FlagKey, flagKey);
614-
Assert.AreEqual(decision.UserContext, user);
617+
Assert.AreNotEqual(decision.UserContext, user);
618+
Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user));
615619
}
616620

617621
[Test]
@@ -638,7 +642,8 @@ public void TestDefaultDecideOptions()
638642
Assert.AreEqual(decision.Variables.ToDictionary(), variablesExpected.ToDictionary());
639643
Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate");
640644
Assert.AreEqual(decision.FlagKey, flagKey);
641-
Assert.AreEqual(decision.UserContext, user);
645+
Assert.AreNotEqual(decision.UserContext, user);
646+
Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user));
642647
}
643648

644649
[Test]

OptimizelySDK/OptimizelyUserContext.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2020, Optimizely
2+
* Copyright 2020-2021, Optimizely
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -46,6 +46,8 @@ public OptimizelyUserContext(Optimizely optimizely, string userId, UserAttribute
4646
UserId = userId;
4747
}
4848

49+
private OptimizelyUserContext Copy() => new OptimizelyUserContext(Optimizely, UserId, GetAttributes(), ErrorHandler, Logger);
50+
4951
/// <summary>
5052
/// Returns Optimizely instance associated with the UserContext.
5153
/// </summary>
@@ -123,7 +125,8 @@ public OptimizelyDecision Decide(string key)
123125
public OptimizelyDecision Decide(string key,
124126
OptimizelyDecideOption[] options)
125127
{
126-
return Optimizely.Decide(this, key, options);
128+
var optimizelyUserContext = Copy();
129+
return Optimizely.Decide(optimizelyUserContext, key, options);
127130
}
128131

129132
/// <summary>
@@ -133,7 +136,8 @@ public OptimizelyDecision Decide(string key,
133136
/// <returns>A dictionary of all decision results, mapped by flag keys.</returns>
134137
public Dictionary<string, OptimizelyDecision> DecideForKeys(string[] keys, OptimizelyDecideOption[] options)
135138
{
136-
return Optimizely.DecideForKeys(this, keys, options);
139+
var optimizelyUserContext = Copy();
140+
return Optimizely.DecideForKeys(optimizelyUserContext, keys, options);
137141
}
138142

139143
/// <summary>
@@ -162,7 +166,8 @@ public Dictionary<string, OptimizelyDecision> DecideAll()
162166
/// <returns>All decision results mapped by flag keys.</returns>
163167
public Dictionary<string, OptimizelyDecision> DecideAll(OptimizelyDecideOption[] options)
164168
{
165-
return Optimizely.DecideAll(this, options);
169+
var optimizelyUserContext = Copy();
170+
return Optimizely.DecideAll(optimizelyUserContext, options);
166171
}
167172

168173
/// <summary>

0 commit comments

Comments
 (0)