@@ -5903,6 +5903,69 @@ describe('lib/optimizely', function() {
5903
5903
assert . deepEqual ( decision , expectedDecision ) ;
5904
5904
sinon . assert . calledTwice ( eventDispatcher . dispatchEvent ) ;
5905
5905
} ) ;
5906
+ describe ( 'UPS Batching' , function ( ) {
5907
+ var userProfileServiceInstance = {
5908
+ lookup : function ( ) { } ,
5909
+ save : function ( ) { } ,
5910
+ } ;
5911
+ beforeEach ( function ( ) {
5912
+ optlyInstance = new Optimizely ( {
5913
+ clientEngine : 'node-sdk' ,
5914
+ datafile : testData . getTestDecideProjectConfig ( ) ,
5915
+ userProfileService : userProfileServiceInstance ,
5916
+ errorHandler : errorHandler ,
5917
+ eventDispatcher : eventDispatcher ,
5918
+ jsonSchemaValidator : jsonSchemaValidator ,
5919
+ logger : createdLogger ,
5920
+ isValidInstance : true ,
5921
+ eventBatchSize : 1 ,
5922
+ defaultDecideOptions : [ ] ,
5923
+ notificationCenter,
5924
+ eventProcessor,
5925
+ } ) ;
5926
+
5927
+ sinon . stub ( optlyInstance . decisionService . userProfileService , 'lookup' )
5928
+ sinon . stub ( optlyInstance . decisionService . userProfileService , 'save' )
5929
+ } ) ;
5930
+
5931
+ it ( 'Should call UPS methods only once' , function ( ) {
5932
+ var flagKeysArray = [ 'feature_1' , 'feature_2' ] ;
5933
+ var user = optlyInstance . createUserContext ( userId ) ;
5934
+ var expectedVariables1 = optlyInstance . getAllFeatureVariables ( flagKeysArray [ 0 ] , userId ) ;
5935
+ var expectedVariables2 = optlyInstance . getAllFeatureVariables ( flagKeysArray [ 1 ] , userId ) ;
5936
+ optlyInstance . decisionService . userProfileService . save . resetHistory ( ) ;
5937
+ optlyInstance . decisionService . userProfileService . lookup . resetHistory ( ) ;
5938
+ var decisionsMap = optlyInstance . decideForKeys ( user , flagKeysArray ) ;
5939
+ var decision1 = decisionsMap [ flagKeysArray [ 0 ] ] ;
5940
+ var decision2 = decisionsMap [ flagKeysArray [ 1 ] ] ;
5941
+ var expectedDecision1 = {
5942
+ variationKey : '18257766532' ,
5943
+ enabled : true ,
5944
+ variables : expectedVariables1 ,
5945
+ ruleKey : '18322080788' ,
5946
+ flagKey : flagKeysArray [ 0 ] ,
5947
+ userContext : user ,
5948
+ reasons : [ ] ,
5949
+ } ;
5950
+ var expectedDecision2 = {
5951
+ variationKey : 'variation_with_traffic' ,
5952
+ enabled : true ,
5953
+ variables : expectedVariables2 ,
5954
+ ruleKey : 'exp_no_audience' ,
5955
+ flagKey : flagKeysArray [ 1 ] ,
5956
+ userContext : user ,
5957
+ reasons : [ ] ,
5958
+ } ;
5959
+
5960
+ assert . deepEqual ( Object . values ( decisionsMap ) . length , 2 ) ;
5961
+ assert . deepEqual ( decision1 , expectedDecision1 ) ;
5962
+ assert . deepEqual ( decision2 , expectedDecision2 ) ;
5963
+ // UPS batch assertion
5964
+ sinon . assert . calledOnce ( optlyInstance . decisionService . userProfileService . lookup ) ;
5965
+ sinon . assert . calledOnce ( optlyInstance . decisionService . userProfileService . save ) ;
5966
+ } ) ;
5967
+ } )
5968
+
5906
5969
} ) ;
5907
5970
5908
5971
describe ( '#decideAll' , function ( ) {
@@ -6096,6 +6159,69 @@ describe('lib/optimizely', function() {
6096
6159
sinon . assert . calledThrice ( eventDispatcher . dispatchEvent ) ;
6097
6160
} ) ;
6098
6161
} ) ;
6162
+
6163
+ describe ( 'UPS batching' , function ( ) {
6164
+ beforeEach ( function ( ) {
6165
+ var userProfileServiceInstance = {
6166
+ lookup : function ( ) { } ,
6167
+ save : function ( ) { } ,
6168
+ } ;
6169
+
6170
+ optlyInstance = new Optimizely ( {
6171
+ clientEngine : 'node-sdk' ,
6172
+ datafile : testData . getTestDecideProjectConfig ( ) ,
6173
+ userProfileService : userProfileServiceInstance ,
6174
+ errorHandler : errorHandler ,
6175
+ eventDispatcher : eventDispatcher ,
6176
+ jsonSchemaValidator : jsonSchemaValidator ,
6177
+ logger : createdLogger ,
6178
+ isValidInstance : true ,
6179
+ eventBatchSize : 1 ,
6180
+ defaultDecideOptions : [ OptimizelyDecideOption . ENABLED_FLAGS_ONLY ] ,
6181
+ eventProcessor,
6182
+ notificationCenter,
6183
+ } ) ;
6184
+
6185
+ sinon . stub ( optlyInstance . decisionService . userProfileService , 'lookup' )
6186
+ sinon . stub ( optlyInstance . decisionService . userProfileService , 'save' )
6187
+ } ) ;
6188
+
6189
+ it ( 'should call UPS methods only once' , function ( ) {
6190
+ var flagKey1 = 'feature_1' ;
6191
+ var flagKey2 = 'feature_2' ;
6192
+ var user = optlyInstance . createUserContext ( userId , { gender : 'female' } ) ;
6193
+ var decisionsMap = optlyInstance . decideAll ( user , [ OptimizelyDecideOption . EXCLUDE_VARIABLES ] ) ;
6194
+ var decision1 = decisionsMap [ flagKey1 ] ;
6195
+ var decision2 = decisionsMap [ flagKey2 ] ;
6196
+ var expectedDecision1 = {
6197
+ variationKey : '18257766532' ,
6198
+ enabled : true ,
6199
+ variables : { } ,
6200
+ ruleKey : '18322080788' ,
6201
+ flagKey : flagKey1 ,
6202
+ userContext : user ,
6203
+ reasons : [ ] ,
6204
+ } ;
6205
+ var expectedDecision2 = {
6206
+ variationKey : 'variation_with_traffic' ,
6207
+ enabled : true ,
6208
+ variables : { } ,
6209
+ ruleKey : 'exp_no_audience' ,
6210
+ flagKey : flagKey2 ,
6211
+ userContext : user ,
6212
+ reasons : [ ] ,
6213
+ } ;
6214
+
6215
+ // Decision assertion
6216
+ assert . deepEqual ( Object . values ( decisionsMap ) . length , 2 ) ;
6217
+ assert . deepEqual ( decision1 , expectedDecision1 ) ;
6218
+ assert . deepEqual ( decision2 , expectedDecision2 ) ;
6219
+
6220
+ // UPS batch assertion
6221
+ sinon . assert . calledOnce ( optlyInstance . decisionService . userProfileService . lookup ) ;
6222
+ sinon . assert . calledOnce ( optlyInstance . decisionService . userProfileService . save ) ;
6223
+ } )
6224
+ } ) ;
6099
6225
} ) ;
6100
6226
} ) ;
6101
6227
0 commit comments