@@ -4308,6 +4308,103 @@ def callback(_args); end
4308
4308
expect ( decision . reasons ) . to include ( 'CMAB service failed to fetch decision' )
4309
4309
end
4310
4310
end
4311
+ describe 'CMAB experiments' do
4312
+ it 'should include CMAB UUID in dispatched event when decision service returns CMAB result' do
4313
+ # Use an existing feature flag from the test config
4314
+ feature_flag_key = 'boolean_single_variable_feature'
4315
+
4316
+ # Get an existing experiment that actually exists in the datafile
4317
+ # Looking at the test config, let's use experiment ID '122230' which exists
4318
+ existing_experiment = project_config . get_experiment_from_id ( '122230' )
4319
+
4320
+ # Modify the existing experiment to be a CMAB experiment
4321
+ cmab_experiment = existing_experiment . dup
4322
+ cmab_experiment [ 'trafficAllocation' ] = [ ] # Empty for CMAB
4323
+ cmab_experiment [ 'cmab' ] = { 'attributeIds' => %w[ 808797688 808797689 ] , 'trafficAllocation' => 4000 }
4324
+
4325
+ # Mock the config to return our modified CMAB experiment
4326
+ allow ( project_instance . config_manager . config ) . to receive ( :get_experiment_from_id )
4327
+ . with ( '122230' )
4328
+ . and_return ( cmab_experiment )
4329
+
4330
+ allow ( project_instance . config_manager . config ) . to receive ( :experiment_running? )
4331
+ . with ( cmab_experiment )
4332
+ . and_return ( true )
4333
+
4334
+ # Get the feature flag and update it to reference our CMAB experiment
4335
+ feature_flag = project_instance . config_manager . config . get_feature_flag_from_key ( feature_flag_key )
4336
+ feature_flag [ 'experimentIds' ] = [ '122230' ]
4337
+
4338
+ # Use existing variations from the original experiment
4339
+ variation_to_use = existing_experiment [ 'variations' ] [ 0 ]
4340
+
4341
+ # Create a decision with CMAB UUID
4342
+ expected_cmab_uuid = 'uuid-cmab'
4343
+ decision_with_cmab = Optimizely ::DecisionService ::Decision . new (
4344
+ cmab_experiment ,
4345
+ variation_to_use ,
4346
+ Optimizely ::DecisionService ::DECISION_SOURCES [ 'FEATURE_TEST' ] ,
4347
+ expected_cmab_uuid
4348
+ )
4349
+
4350
+ decision_result_with_cmab = Optimizely ::DecisionService ::DecisionResult . new (
4351
+ decision_with_cmab ,
4352
+ false ,
4353
+ [ ]
4354
+ )
4355
+
4356
+ # Mock get_variations_for_feature_list to return CMAB result
4357
+ allow ( project_instance . decision_service ) . to receive ( :get_variations_for_feature_list )
4358
+ . and_return ( [ decision_result_with_cmab ] )
4359
+
4360
+ # Set up time and UUID mocks for consistent event data
4361
+ allow ( Time ) . to receive ( :now ) . and_return ( time_now )
4362
+ allow ( SecureRandom ) . to receive ( :uuid ) . and_return ( 'a68cf1ad-0393-4e18-af87-efe8f01a7c9c' )
4363
+
4364
+ # Create array to capture dispatched events
4365
+ dispatched_events = [ ]
4366
+ allow ( project_instance . event_dispatcher ) . to receive ( :dispatch_event ) do |event |
4367
+ dispatched_events << event
4368
+ end
4369
+
4370
+ user_context = project_instance . create_user_context ( 'test_user' )
4371
+ decision = user_context . decide ( feature_flag_key )
4372
+
4373
+ # Wait for batch processing thread to send event
4374
+ sleep 0.1 until project_instance . event_processor . event_queue . empty?
4375
+
4376
+ # Verify the decision contains expected information
4377
+ expect ( decision . enabled ) . to eq ( true )
4378
+ expect ( decision . variation_key ) . to eq ( variation_to_use [ 'key' ] )
4379
+ expect ( decision . rule_key ) . to eq ( existing_experiment [ 'key' ] )
4380
+ expect ( decision . flag_key ) . to eq ( feature_flag_key )
4381
+
4382
+ # Verify an event was dispatched
4383
+ expect ( dispatched_events . length ) . to eq ( 1 )
4384
+
4385
+ dispatched_event = dispatched_events [ 0 ]
4386
+
4387
+ # Remove the puts statement and verify the event structure and CMAB UUID
4388
+ expect ( dispatched_event . params ) . to have_key ( :visitors )
4389
+ expect ( dispatched_event . params [ :visitors ] . length ) . to be > 0
4390
+ expect ( dispatched_event . params [ :visitors ] [ 0 ] ) . to have_key ( :snapshots )
4391
+ expect ( dispatched_event . params [ :visitors ] [ 0 ] [ :snapshots ] . length ) . to be > 0
4392
+ expect ( dispatched_event . params [ :visitors ] [ 0 ] [ :snapshots ] [ 0 ] ) . to have_key ( :decisions )
4393
+ expect ( dispatched_event . params [ :visitors ] [ 0 ] [ :snapshots ] [ 0 ] [ :decisions ] . length ) . to be > 0
4394
+
4395
+ # Get the metadata and assert CMAB UUID
4396
+ metadata = dispatched_event . params [ :visitors ] [ 0 ] [ :snapshots ] [ 0 ] [ :decisions ] [ 0 ] [ :metadata ]
4397
+ expect ( metadata ) . to have_key ( :cmab_uuid )
4398
+ expect ( metadata [ :cmab_uuid ] ) . to eq ( expected_cmab_uuid )
4399
+
4400
+ # Also verify other expected metadata fields
4401
+ expect ( metadata [ :flag_key ] ) . to eq ( feature_flag_key )
4402
+ expect ( metadata [ :rule_key ] ) . to eq ( 'test_experiment_multivariate' )
4403
+ expect ( metadata [ :rule_type ] ) . to eq ( 'feature-test' )
4404
+ expect ( metadata [ :variation_key ] ) . to eq ( 'Fred' )
4405
+ expect ( metadata [ :enabled ] ) . to eq ( true )
4406
+ end
4407
+ end
4311
4408
end
4312
4409
4313
4410
describe '#decide_all' do
0 commit comments