19
19
using OptimizelySDK . Config ;
20
20
using OptimizelySDK . Entity ;
21
21
using OptimizelySDK . Logger ;
22
+ using OptimizelySDK . OptimizelyDecisions ;
22
23
23
24
namespace OptimizelySDK . Tests
24
25
{
@@ -27,6 +28,7 @@ public class BucketerTest
27
28
{
28
29
private Mock < ILogger > LoggerMock ;
29
30
private ProjectConfig Config ;
31
+ private IDecisionReasons DecisionReasons ;
30
32
private const string TestUserId = "testUserId" ;
31
33
public string TestBucketingIdControl { get ; } = "testBucketingIdControl!" ; // generates bucketing number 3741
32
34
public string TestBucketingIdVariation { get ; } = "123456789'" ; // generates bucketing number 4567
@@ -59,6 +61,7 @@ public override string ToString()
59
61
public void Initialize ( )
60
62
{
61
63
LoggerMock = new Mock < ILogger > ( ) ;
64
+ DecisionReasons = DefaultDecisionReasons . NewInstance ( ) ;
62
65
Config = DatafileProjectConfig . Create ( TestData . Datafile , LoggerMock . Object , new ErrorHandler . NoOpErrorHandler ( ) ) ;
63
66
}
64
67
@@ -95,42 +98,41 @@ public void TestBucketValidExperimentNotInGroup()
95
98
{
96
99
TestBucketer bucketer = new TestBucketer ( LoggerMock . Object ) ;
97
100
bucketer . SetBucketValues ( new [ ] { 3000 , 7000 , 9000 } ) ;
98
-
99
101
// control
100
102
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 ) ) ;
102
104
103
105
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Exactly ( 2 ) ) ;
104
106
LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [3000] to user [testUserId] with bucketing ID [testBucketingIdControl!]." ) ) ;
105
107
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in variation [control] of experiment [test_experiment]." ) ) ;
106
-
107
108
// variation
108
109
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 ) ) ;
110
111
111
112
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Exactly ( 4 ) ) ;
112
113
LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [7000] to user [testUserId] with bucketing ID [testBucketingIdControl!]." ) ) ;
113
114
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in variation [variation] of experiment [test_experiment]." ) ) ;
114
115
115
116
// no variation
116
117
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 ) ) ;
118
119
119
120
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Exactly ( 6 ) ) ;
120
121
LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [9000] to user [testUserId] with bucketing ID [testBucketingIdControl!]." ) ) ;
121
122
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in no variation." ) ) ;
123
+ Assert . AreEqual ( DecisionReasons . ToReport ( ) . Count , 0 ) ;
122
124
}
123
125
124
126
[ Test ]
125
127
public void TestBucketValidExperimentInGroup ( )
126
128
{
127
129
TestBucketer bucketer = new TestBucketer ( LoggerMock . Object ) ;
128
-
130
+
129
131
// group_experiment_1 (20% experiment)
130
132
// variation 1
131
133
bucketer . SetBucketValues ( new [ ] { 1000 , 4000 } ) ;
132
134
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 ) ) ;
134
136
LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [1000] to user [testUserId] with bucketing ID [testBucketingIdControl!]." ) ) ;
135
137
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in experiment [group_experiment_1] of group [7722400015]." ) ) ;
136
138
LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [4000] to user [testUserId] with bucketing ID [testBucketingIdControl!]." ) ) ;
@@ -139,7 +141,7 @@ public void TestBucketValidExperimentInGroup()
139
141
// variation 2
140
142
bucketer . SetBucketValues ( new [ ] { 1500 , 7000 } ) ;
141
143
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 ) ) ;
143
145
LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [1500] to user [testUserId] with bucketing ID [testBucketingIdControl!]." ) ) ;
144
146
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in experiment [group_experiment_1] of group [7722400015]." ) ) ;
145
147
LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [7000] to user [testUserId] with bucketing ID [testBucketingIdControl!]." ) ) ;
@@ -148,20 +150,21 @@ public void TestBucketValidExperimentInGroup()
148
150
// User not in experiment
149
151
bucketer . SetBucketValues ( new [ ] { 5000 , 7000 } ) ;
150
152
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 ) ) ;
152
154
LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [5000] to user [testUserId] with bucketing ID [testBucketingIdControl!]." ) ) ;
153
155
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is not in experiment [group_experiment_1] of group [7722400015]." ) ) ;
154
156
155
157
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Exactly ( 10 ) ) ;
158
+ Assert . AreEqual ( DecisionReasons . ToReport ( ) . Count , 0 ) ;
156
159
}
157
160
158
161
[ Test ]
159
162
public void TestBucketInvalidExperiment ( )
160
163
{
161
164
var bucketer = new Bucketer ( LoggerMock . Object ) ;
162
-
165
+
163
166
Assert . AreEqual ( new Variation { } ,
164
- bucketer . Bucket ( Config , new Experiment ( ) , TestBucketingIdControl , TestUserId ) ) ;
167
+ bucketer . Bucket ( Config , new Experiment ( ) , TestBucketingIdControl , TestUserId , DecisionReasons ) ) ;
165
168
166
169
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Never ) ;
167
170
}
@@ -176,7 +179,8 @@ public void TestBucketWithBucketingId()
176
179
177
180
// make sure that the bucketing ID is used for the variation bucketing and not the user ID
178
181
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 ) ;
180
184
}
181
185
182
186
// Test for invalid experiment keys, null variation should be returned
@@ -187,7 +191,8 @@ public void TestBucketVariationInvalidExperimentsWithBucketingId()
187
191
var expectedVariation = new Variation ( ) ;
188
192
189
193
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 ) ;
191
196
}
192
197
193
198
// 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()
200
205
201
206
Assert . AreEqual ( expectedGroupVariation ,
202
207
bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "group_experiment_2" ) ,
203
- TestBucketingIdGroupExp2Var2 , TestUserIdBucketsToNoGroup ) ) ;
208
+ TestBucketingIdGroupExp2Var2 , TestUserIdBucketsToNoGroup , DecisionReasons ) ) ;
209
+ Assert . AreEqual ( DecisionReasons . ToReport ( ) . Count , 0 ) ;
204
210
}
205
211
206
212
// Make sure that user gets bucketed into the rollout rule.
@@ -213,7 +219,8 @@ public void TestBucketRolloutRule()
213
219
var expectedVariation = Config . GetVariationFromId ( rolloutRule . Key , "177773" ) ;
214
220
215
221
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 ) ;
217
224
}
218
225
}
219
- }
226
+ }
0 commit comments