Skip to content

Commit dea90f6

Browse files
authored
Feat(decide): Added UserContext add reason logs (#250)
- Added Decide api - Added logs into reasons info and error - Added unit test of OptimizelyUserContext
1 parent 3031bd5 commit dea90f6

File tree

11 files changed

+470
-123
lines changed

11 files changed

+470
-123
lines changed

OptimizelySDK.Tests/BucketerTest.cs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using OptimizelySDK.Config;
2020
using OptimizelySDK.Entity;
2121
using OptimizelySDK.Logger;
22+
using OptimizelySDK.OptimizelyDecisions;
2223

2324
namespace OptimizelySDK.Tests
2425
{
@@ -27,6 +28,7 @@ public class BucketerTest
2728
{
2829
private Mock<ILogger> LoggerMock;
2930
private ProjectConfig Config;
31+
private IDecisionReasons DecisionReasons;
3032
private const string TestUserId = "testUserId";
3133
public string TestBucketingIdControl { get; } = "testBucketingIdControl!"; // generates bucketing number 3741
3234
public string TestBucketingIdVariation { get; } = "123456789'"; // generates bucketing number 4567
@@ -59,6 +61,7 @@ public override string ToString()
5961
public void Initialize()
6062
{
6163
LoggerMock = new Mock<ILogger>();
64+
DecisionReasons = DefaultDecisionReasons.NewInstance();
6265
Config = DatafileProjectConfig.Create(TestData.Datafile, LoggerMock.Object, new ErrorHandler.NoOpErrorHandler());
6366
}
6467

@@ -95,42 +98,41 @@ public void TestBucketValidExperimentNotInGroup()
9598
{
9699
TestBucketer bucketer = new TestBucketer(LoggerMock.Object);
97100
bucketer.SetBucketValues(new[] { 3000, 7000, 9000 });
98-
99101
// control
100102
Assert.AreEqual(new Variation { Id = "7722370027", Key = "control" },
101-
bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId));
103+
bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId, DecisionReasons));
102104

103105
LoggerMock.Verify(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<string>()), Times.Exactly(2));
104106
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [3000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
105107
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in variation [control] of experiment [test_experiment]."));
106-
107108
// variation
108109
Assert.AreEqual(new Variation { Id = "7721010009", Key = "variation" },
109-
bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId));
110+
bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId, DecisionReasons));
110111

111112
LoggerMock.Verify(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<string>()), Times.Exactly(4));
112113
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [7000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
113114
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in variation [variation] of experiment [test_experiment]."));
114115

115116
// no variation
116117
Assert.AreEqual(new Variation { },
117-
bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId));
118+
bucketer.Bucket(Config, Config.GetExperimentFromKey("test_experiment"), TestBucketingIdControl, TestUserId, DecisionReasons));
118119

119120
LoggerMock.Verify(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<string>()), Times.Exactly(6));
120121
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [9000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
121122
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in no variation."));
123+
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
122124
}
123125

124126
[Test]
125127
public void TestBucketValidExperimentInGroup()
126128
{
127129
TestBucketer bucketer = new TestBucketer(LoggerMock.Object);
128-
130+
129131
// group_experiment_1 (20% experiment)
130132
// variation 1
131133
bucketer.SetBucketValues(new[] { 1000, 4000 });
132134
Assert.AreEqual(new Variation { Id = "7722260071", Key = "group_exp_1_var_1" },
133-
bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId));
135+
bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId, DecisionReasons));
134136
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [1000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
135137
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in experiment [group_experiment_1] of group [7722400015]."));
136138
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [4000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
@@ -139,7 +141,7 @@ public void TestBucketValidExperimentInGroup()
139141
// variation 2
140142
bucketer.SetBucketValues(new[] { 1500, 7000 });
141143
Assert.AreEqual(new Variation { Id = "7722360022", Key = "group_exp_1_var_2" },
142-
bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId));
144+
bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId, DecisionReasons));
143145
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [1500] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
144146
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is in experiment [group_experiment_1] of group [7722400015]."));
145147
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [7000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
@@ -148,20 +150,21 @@ public void TestBucketValidExperimentInGroup()
148150
// User not in experiment
149151
bucketer.SetBucketValues(new[] { 5000, 7000 });
150152
Assert.AreEqual(new Variation { },
151-
bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId));
153+
bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_1"), TestBucketingIdControl, TestUserId, DecisionReasons));
152154
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, "Assigned bucket [5000] to user [testUserId] with bucketing ID [testBucketingIdControl!]."));
153155
LoggerMock.Verify(l => l.Log(LogLevel.INFO, "User [testUserId] is not in experiment [group_experiment_1] of group [7722400015]."));
154156

155157
LoggerMock.Verify(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<string>()), Times.Exactly(10));
158+
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
156159
}
157160

158161
[Test]
159162
public void TestBucketInvalidExperiment()
160163
{
161164
var bucketer = new Bucketer(LoggerMock.Object);
162-
165+
163166
Assert.AreEqual(new Variation { },
164-
bucketer.Bucket(Config, new Experiment(), TestBucketingIdControl, TestUserId));
167+
bucketer.Bucket(Config, new Experiment(), TestBucketingIdControl, TestUserId, DecisionReasons));
165168

166169
LoggerMock.Verify(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<string>()), Times.Never);
167170
}
@@ -176,7 +179,8 @@ public void TestBucketWithBucketingId()
176179

177180
// make sure that the bucketing ID is used for the variation bucketing and not the user ID
178181
Assert.AreEqual(expectedVariation,
179-
bucketer.Bucket(Config, experiment, TestBucketingIdControl, TestUserIdBucketsToVariation));
182+
bucketer.Bucket(Config, experiment, TestBucketingIdControl, TestUserIdBucketsToVariation, DecisionReasons));
183+
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
180184
}
181185

182186
// Test for invalid experiment keys, null variation should be returned
@@ -187,7 +191,8 @@ public void TestBucketVariationInvalidExperimentsWithBucketingId()
187191
var expectedVariation = new Variation();
188192

189193
Assert.AreEqual(expectedVariation,
190-
bucketer.Bucket(Config, Config.GetExperimentFromKey("invalid_experiment"), TestBucketingIdVariation, TestUserId));
194+
bucketer.Bucket(Config, Config.GetExperimentFromKey("invalid_experiment"), TestBucketingIdVariation, TestUserId, DecisionReasons));
195+
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
191196
}
192197

193198
// Make sure that the bucketing ID is used to bucket the user into a group and not the user ID
@@ -200,7 +205,8 @@ public void TestBucketVariationGroupedExperimentsWithBucketingId()
200205

201206
Assert.AreEqual(expectedGroupVariation,
202207
bucketer.Bucket(Config, Config.GetExperimentFromKey("group_experiment_2"),
203-
TestBucketingIdGroupExp2Var2, TestUserIdBucketsToNoGroup));
208+
TestBucketingIdGroupExp2Var2, TestUserIdBucketsToNoGroup, DecisionReasons));
209+
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
204210
}
205211

206212
// Make sure that user gets bucketed into the rollout rule.
@@ -213,7 +219,8 @@ public void TestBucketRolloutRule()
213219
var expectedVariation = Config.GetVariationFromId(rolloutRule.Key, "177773");
214220

215221
Assert.True(TestData.CompareObjects(expectedVariation,
216-
bucketer.Bucket(Config, rolloutRule, "testBucketingId", TestUserId)));
222+
bucketer.Bucket(Config, rolloutRule, "testBucketingId", TestUserId, DecisionReasons)));
223+
Assert.AreEqual(DecisionReasons.ToReport().Count, 0);
217224
}
218225
}
219-
}
226+
}

0 commit comments

Comments
 (0)