13
13
* See the License for the specific language governing permissions and
14
14
* limitations under the License.
15
15
*/
16
- using OptimizelySDK . Entity ;
17
- using OptimizelySDK . Logger ;
18
16
using Moq ;
19
17
using NUnit . Framework ;
20
18
using OptimizelySDK . Bucketing ;
19
+ using OptimizelySDK . Entity ;
20
+ using OptimizelySDK . Logger ;
21
21
22
22
namespace OptimizelySDK . Tests
23
23
{
@@ -27,6 +27,11 @@ public class BucketerTest
27
27
private Mock < ILogger > LoggerMock ;
28
28
private ProjectConfig Config ;
29
29
private const string TestUserId = "testUserId" ;
30
+ public string TestBucketingIdControl { get ; } = "testBucketingIdControl!" ; // generates bucketing number 3741
31
+ public string TestBucketingIdVariation { get ; } = "123456789'" ; // generates bucketing number 4567
32
+ public string TestBucketingIdGroupExp2Var2 { get ; } = "123456789" ; // group_exp_2_var_2
33
+ public string TestUserIdBucketsToVariation { get ; } = "bucketsToVariation!" ;
34
+ public string TestUserIdBucketsToNoGroup { get ; } = "testUserId" ;
30
35
31
36
/// <summary>
32
37
/// Bucket Testing helper class
@@ -36,7 +41,7 @@ private class BucketerTestItem
36
41
public string UserId { get ; set ; }
37
42
public string ExperimentId { get ; set ; }
38
43
public int ExpectedBucketValue { get ; set ; }
39
-
44
+
40
45
public string BucketingId
41
46
{
42
47
get { return UserId + ExperimentId ; }
@@ -92,26 +97,26 @@ public void TestBucketValidExperimentNotInGroup()
92
97
93
98
// control
94
99
Assert . AreEqual ( new Variation { Id = "7722370027" , Key = "control" } ,
95
- bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "test_experiment" ) , TestUserId ) ) ;
100
+ bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "test_experiment" ) , TestBucketingIdControl , TestUserId ) ) ;
96
101
97
102
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Exactly ( 2 ) ) ;
98
- LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [3000] to user [testUserId]" ) ) ;
103
+ LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [3000] to user [testUserId] with bucketing ID [testBucketingIdControl!]. " ) ) ;
99
104
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in variation [control] of experiment [test_experiment]." ) ) ;
100
105
101
106
// variation
102
107
Assert . AreEqual ( new Variation { Id = "7721010009" , Key = "variation" } ,
103
- bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "test_experiment" ) , TestUserId ) ) ;
108
+ bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "test_experiment" ) , TestBucketingIdControl , TestUserId ) ) ;
104
109
105
110
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Exactly ( 4 ) ) ;
106
- LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [7000] to user [testUserId]" ) ) ;
111
+ LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [7000] to user [testUserId] with bucketing ID [testBucketingIdControl!]. " ) ) ;
107
112
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in variation [variation] of experiment [test_experiment]." ) ) ;
108
113
109
114
// no variation
110
115
Assert . AreEqual ( new Variation { } ,
111
- bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "test_experiment" ) , TestUserId ) ) ;
116
+ bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "test_experiment" ) , TestBucketingIdControl , TestUserId ) ) ;
112
117
113
118
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Exactly ( 6 ) ) ;
114
- LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [9000] to user [testUserId]" ) ) ;
119
+ LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [9000] to user [testUserId] with bucketing ID [testBucketingIdControl!]. " ) ) ;
115
120
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in no variation." ) ) ;
116
121
}
117
122
@@ -124,26 +129,26 @@ public void TestBucketValidExperimentInGroup()
124
129
// variation 1
125
130
bucketer . SetBucketValues ( new [ ] { 1000 , 4000 } ) ;
126
131
Assert . AreEqual ( new Variation { Id = "7722260071" , Key = "group_exp_1_var_1" } ,
127
- bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "group_experiment_1" ) , TestUserId ) ) ;
128
- LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [1000] to user [testUserId]" ) ) ;
132
+ bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "group_experiment_1" ) , TestBucketingIdControl , TestUserId ) ) ;
133
+ LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [1000] to user [testUserId] with bucketing ID [testBucketingIdControl!]. " ) ) ;
129
134
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in experiment [group_experiment_1] of group [7722400015]." ) ) ;
130
- LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [4000] to user [testUserId]" ) ) ;
135
+ LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [4000] to user [testUserId] with bucketing ID [testBucketingIdControl!]. " ) ) ;
131
136
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in variation [group_exp_1_var_1] of experiment [group_experiment_1]." ) ) ;
132
137
133
138
// variation 2
134
139
bucketer . SetBucketValues ( new [ ] { 1500 , 7000 } ) ;
135
140
Assert . AreEqual ( new Variation { Id = "7722360022" , Key = "group_exp_1_var_2" } ,
136
- bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "group_experiment_1" ) , TestUserId ) ) ;
137
- LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [1500] to user [testUserId]" ) ) ;
141
+ bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "group_experiment_1" ) , TestBucketingIdControl , TestUserId ) ) ;
142
+ LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [1500] to user [testUserId] with bucketing ID [testBucketingIdControl!]. " ) ) ;
138
143
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in experiment [group_experiment_1] of group [7722400015]." ) ) ;
139
- LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [7000] to user [testUserId]" ) ) ;
144
+ LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [7000] to user [testUserId] with bucketing ID [testBucketingIdControl!]. " ) ) ;
140
145
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is in variation [group_exp_1_var_1] of experiment [group_experiment_1]." ) ) ;
141
146
142
147
// User not in experiment
143
148
bucketer . SetBucketValues ( new [ ] { 5000 , 7000 } ) ;
144
149
Assert . AreEqual ( new Variation { } ,
145
- bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "group_experiment_1" ) , TestUserId ) ) ;
146
- LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [5000] to user [testUserId]" ) ) ;
150
+ bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "group_experiment_1" ) , TestBucketingIdControl , TestUserId ) ) ;
151
+ LoggerMock . Verify ( l => l . Log ( LogLevel . DEBUG , "Assigned bucket [5000] to user [testUserId] with bucketing ID [testBucketingIdControl!]. " ) ) ;
147
152
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [testUserId] is not in experiment [group_experiment_1] of group [7722400015]." ) ) ;
148
153
149
154
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Exactly ( 10 ) ) ;
@@ -155,7 +160,7 @@ public void TestBucketInvalidExperiment()
155
160
var bucketer = new Bucketer ( LoggerMock . Object ) ;
156
161
157
162
Assert . AreEqual ( new Variation { } ,
158
- bucketer . Bucket ( Config , new Experiment ( ) , TestUserId ) ) ;
163
+ bucketer . Bucket ( Config , new Experiment ( ) , TestBucketingIdControl , TestUserId ) ) ;
159
164
160
165
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Never ) ;
161
166
}
@@ -166,7 +171,7 @@ public void TestBucketValidExperimentNotInGroupUserInForcedVariation()
166
171
var bucketer = new Bucketer ( LoggerMock . Object ) ;
167
172
168
173
Assert . AreEqual ( new Variation { Id = "7722370027" , Key = "control" } ,
169
- bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "test_experiment" ) , "user1" ) ) ;
174
+ bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "test_experiment" ) , TestBucketingIdControl , "user1" ) ) ;
170
175
171
176
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [user1] is forced into variation [control]." ) ) ;
172
177
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Exactly ( 1 ) ) ;
@@ -178,10 +183,47 @@ public void TestBucketValidExperimentInGroupUserInForcedVariation()
178
183
var bucketer = new Bucketer ( LoggerMock . Object ) ;
179
184
180
185
Assert . AreEqual ( new Variation { Id = "7722260071" , Key = "group_exp_1_var_1" } ,
181
- bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "group_experiment_1" ) , "user1" ) ) ;
186
+ bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "group_experiment_1" ) , TestBucketingIdControl , "user1" ) ) ;
182
187
183
188
LoggerMock . Verify ( l => l . Log ( LogLevel . INFO , "User [user1] is forced into variation [group_exp_1_var_1]." ) ) ;
184
189
LoggerMock . Verify ( l => l . Log ( It . IsAny < LogLevel > ( ) , It . IsAny < string > ( ) ) , Times . Exactly ( 1 ) ) ;
185
190
}
191
+
192
+ [ Test ]
193
+ public void TestBucketWithBucketingId ( )
194
+ {
195
+ var bucketer = new Bucketer ( LoggerMock . Object ) ;
196
+ var experiment = Config . GetExperimentFromKey ( "test_experiment" ) ;
197
+ var expectedVariation = new Variation { Id = "7722370027" , Key = "control" } ;
198
+ var expectedVariation2 = new Variation { Id = "7721010009" , Key = "variation" } ;
199
+
200
+ // make sure that the bucketing ID is used for the variation bucketing and not the user ID
201
+ Assert . AreEqual ( expectedVariation ,
202
+ bucketer . Bucket ( Config , experiment , TestBucketingIdControl , TestUserIdBucketsToVariation ) ) ;
203
+ }
204
+
205
+ // Test for invalid experiment keys, null variation should be returned
206
+ [ Test ]
207
+ public void TestBucketVariationInvalidExperimentsWithBucketingId ( )
208
+ {
209
+ var bucketer = new Bucketer ( LoggerMock . Object ) ;
210
+ var expectedVariation = new Variation ( ) ;
211
+
212
+ Assert . AreEqual ( expectedVariation ,
213
+ bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "invalid_experiment" ) , TestBucketingIdVariation , TestUserId ) ) ;
214
+ }
215
+
216
+ // Make sure that the bucketing ID is used to bucket the user into a group and not the user ID
217
+ [ Test ]
218
+ public void TestBucketVariationGroupedExperimentsWithBucketingId ( )
219
+ {
220
+ var bucketer = new Bucketer ( LoggerMock . Object ) ;
221
+ var expectedVariation = new Variation ( ) ;
222
+ var expectedGroupVariation = new Variation { Id = "7725250007" , Key = "group_exp_2_var_2" } ;
223
+
224
+ Assert . AreEqual ( expectedGroupVariation ,
225
+ bucketer . Bucket ( Config , Config . GetExperimentFromKey ( "group_experiment_2" ) ,
226
+ TestBucketingIdGroupExp2Var2 , TestUserIdBucketsToNoGroup ) ) ;
227
+ }
186
228
}
187
229
}
0 commit comments