@@ -19,6 +19,8 @@ import projectConfig, { ProjectConfig } from '../../project_config/project_confi
19
19
import { getTestProjectConfig } from '../../tests/test_data' ;
20
20
import { INVALID_BUCKETING_ID , INVALID_GROUP_ID } from 'error_message' ;
21
21
import * as bucketer from './' ;
22
+ import * as bucketValueGenerator from './bucket_value_generator' ;
23
+
22
24
import {
23
25
USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP ,
24
26
USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP ,
@@ -79,6 +81,10 @@ describe('excluding groups', () => {
79
81
groupIdMap : configObj . groupIdMap ,
80
82
logger : mockLogger ,
81
83
} ;
84
+
85
+ vi . spyOn ( bucketValueGenerator , '_generateBucketValue' )
86
+ . mockReturnValueOnce ( 50 )
87
+ . mockReturnValueOnce ( 50000 ) ;
82
88
} ) ;
83
89
84
90
afterEach ( ( ) => {
@@ -95,10 +101,9 @@ describe('excluding groups', () => {
95
101
96
102
const bucketerParamsTest2 = cloneDeep ( bucketerParams ) ;
97
103
bucketerParamsTest2 . userId = 'ppid2' ;
98
- bucketerParamsTest2 . bucketingId = 'test_3166_1739796928766' ;
99
104
const decisionResponse2 = bucketer . bucket ( bucketerParamsTest2 ) ;
100
105
101
- expect ( decisionResponse2 . result ) . toBe ( null ) ;
106
+ expect ( decisionResponse2 . result ) . toBeNull ( ) ;
102
107
expect ( mockLogger . debug ) . toHaveBeenCalledWith ( USER_ASSIGNED_TO_EXPERIMENT_BUCKET , expect . any ( Number ) , 'ppid2' ) ;
103
108
} ) ;
104
109
} ) ;
@@ -122,7 +127,6 @@ describe('including groups: random', () => {
122
127
groupIdMap : configObj . groupIdMap ,
123
128
logger : mockLogger ,
124
129
userId : 'testUser' ,
125
- bucketingId : 'test_303_1739432593254' ,
126
130
} ;
127
131
} ) ;
128
132
@@ -131,6 +135,10 @@ describe('including groups: random', () => {
131
135
} ) ;
132
136
133
137
it ( 'should return decision response with the proper variation for a user in a grouped experiment' , ( ) => {
138
+ vi . spyOn ( bucketValueGenerator , '_generateBucketValue' )
139
+ . mockReturnValueOnce ( 50 )
140
+ . mockReturnValueOnce ( 50 ) ;
141
+
134
142
const decisionResponse = bucketer . bucket ( bucketerParams ) ;
135
143
136
144
expect ( decisionResponse . result ) . toBe ( '551' ) ;
@@ -146,7 +154,8 @@ describe('including groups: random', () => {
146
154
} ) ;
147
155
148
156
it ( 'should return decision response with variation null when a user is bucketed into a different grouped experiment than the one speicfied' , ( ) => {
149
- bucketerParams . bucketingId = '123456789' ;
157
+ vi . spyOn ( bucketValueGenerator , '_generateBucketValue' ) . mockReturnValue ( 5000 ) ;
158
+
150
159
const decisionResponse = bucketer . bucket ( bucketerParams ) ;
151
160
152
161
expect ( decisionResponse . result ) . toBeNull ( ) ;
@@ -162,21 +171,23 @@ describe('including groups: random', () => {
162
171
} ) ;
163
172
164
173
it ( 'should return decision response with variation null when a user is not bucketed into any experiments in the random group' , ( ) => {
165
- bucketerParams . bucketingId = 'test_1228_1739468735344' ;
174
+ vi . spyOn ( bucketValueGenerator , '_generateBucketValue' ) . mockReturnValue ( 50000 ) ;
175
+
166
176
const decisionResponse = bucketer . bucket ( bucketerParams ) ;
167
177
168
- expect ( decisionResponse . result ) . toBe ( null ) ;
178
+ expect ( decisionResponse . result ) . toBeNull ( ) ;
169
179
expect ( mockLogger . debug ) . toHaveBeenCalledTimes ( 1 ) ;
170
180
expect ( mockLogger . info ) . toHaveBeenCalledTimes ( 1 ) ;
171
181
expect ( mockLogger . debug ) . toHaveBeenCalledWith ( USER_ASSIGNED_TO_EXPERIMENT_BUCKET , expect . any ( Number ) , 'testUser' ) ;
172
182
expect ( mockLogger . info ) . toHaveBeenCalledWith ( USER_NOT_IN_ANY_EXPERIMENT , 'testUser' , '666' ) ;
173
183
} ) ;
174
184
175
185
it ( 'should return decision response with variation null when a user is bucketed into traffic space of deleted experiment within a random group' , ( ) => {
176
- bucketerParams . bucketingId = 'test_1228_1739468735344' ;
186
+ vi . spyOn ( bucketValueGenerator , '_generateBucketValue' ) . mockReturnValueOnce ( 9000 ) ;
187
+
177
188
const decisionResponse = bucketer . bucket ( bucketerParams ) ;
178
189
179
- expect ( decisionResponse . result ) . toBe ( null ) ;
190
+ expect ( decisionResponse . result ) . toBeNull ( ) ;
180
191
expect ( mockLogger . debug ) . toHaveBeenCalledTimes ( 1 ) ;
181
192
expect ( mockLogger . info ) . toHaveBeenCalledTimes ( 1 ) ;
182
193
expect ( mockLogger . debug ) . toHaveBeenCalledWith ( USER_ASSIGNED_TO_EXPERIMENT_BUCKET , expect . any ( Number ) , 'testUser' ) ;
@@ -220,7 +231,8 @@ describe('including groups: overlapping', () => {
220
231
} ) ;
221
232
222
233
it ( 'should return decision response with variation when a user falls into an experiment within an overlapping group' , ( ) => {
223
- bucketerParams . bucketingId = 'test_4283_1739793857480' ;
234
+ vi . spyOn ( bucketValueGenerator , '_generateBucketValue' ) . mockReturnValueOnce ( 0 ) ;
235
+
224
236
const decisionResponse = bucketer . bucket ( bucketerParams ) ;
225
237
226
238
expect ( decisionResponse . result ) . toBe ( '553' ) ;
@@ -229,10 +241,10 @@ describe('including groups: overlapping', () => {
229
241
} ) ;
230
242
231
243
it ( 'should return decision response with variation null when a user does not fall into an experiment within an overlapping group' , ( ) => {
232
- bucketerParams . bucketingId = 'test_9318_1739793997430' ;
244
+ vi . spyOn ( bucketValueGenerator , '_generateBucketValue' ) . mockReturnValueOnce ( 3000 ) ;
233
245
const decisionResponse = bucketer . bucket ( bucketerParams ) ;
234
246
235
- expect ( decisionResponse . result ) . toBe ( null ) ;
247
+ expect ( decisionResponse . result ) . toBeNull ( ) ;
236
248
} ) ;
237
249
} ) ;
238
250
@@ -275,7 +287,7 @@ describe('bucket value falls into empty traffic allocation ranges', () => {
275
287
bucketerParamsTest1 . userId = 'ppid1' ;
276
288
const decisionResponse = bucketer . bucket ( bucketerParamsTest1 ) ;
277
289
278
- expect ( decisionResponse . result ) . toBe ( null ) ;
290
+ expect ( decisionResponse . result ) . toBeNull ( ) ;
279
291
} ) ;
280
292
281
293
it ( 'should not log an invalid variation ID warning' , ( ) => {
@@ -324,7 +336,7 @@ describe('traffic allocation has invalid variation ids', () => {
324
336
bucketerParamsTest1 . userId = 'ppid1' ;
325
337
const decisionResponse = bucketer . bucket ( bucketerParamsTest1 ) ;
326
338
327
- expect ( decisionResponse . result ) . toBe ( null ) ;
339
+ expect ( decisionResponse . result ) . toBeNull ( ) ;
328
340
} ) ;
329
341
} ) ;
330
342
@@ -336,16 +348,18 @@ describe('_generateBucketValue', () => {
336
348
const bucketingKey3 = sprintf ( '%s%s' , 'ppid2' , 1886780722 ) ;
337
349
const bucketingKey4 = sprintf ( '%s%s' , 'ppid3' , experimentId ) ;
338
350
339
- expect ( bucketer . _generateBucketValue ( bucketingKey1 ) ) . toBe ( 5254 ) ;
340
- expect ( bucketer . _generateBucketValue ( bucketingKey2 ) ) . toBe ( 4299 ) ;
341
- expect ( bucketer . _generateBucketValue ( bucketingKey3 ) ) . toBe ( 2434 ) ;
342
- expect ( bucketer . _generateBucketValue ( bucketingKey4 ) ) . toBe ( 5439 ) ;
351
+ expect ( bucketValueGenerator . _generateBucketValue ( bucketingKey1 ) ) . toBe ( 5254 ) ;
352
+ expect ( bucketValueGenerator . _generateBucketValue ( bucketingKey2 ) ) . toBe ( 4299 ) ;
353
+ expect ( bucketValueGenerator . _generateBucketValue ( bucketingKey3 ) ) . toBe ( 2434 ) ;
354
+ expect ( bucketValueGenerator . _generateBucketValue ( bucketingKey4 ) ) . toBe ( 5439 ) ;
343
355
} ) ;
344
356
345
357
it ( 'should return an error if it cannot generate the hash value' , ( ) => {
346
358
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
347
359
// @ts -ignore
348
- expect ( ( ) => bucketer . _generateBucketValue ( null ) ) . toThrowError ( new OptimizelyError ( INVALID_BUCKETING_ID ) ) ;
360
+ expect ( ( ) => bucketValueGenerator . _generateBucketValue ( null ) ) . toThrowError (
361
+ new OptimizelyError ( INVALID_BUCKETING_ID )
362
+ ) ;
349
363
} ) ;
350
364
} ) ;
351
365
0 commit comments