Skip to content

Commit 9906bb4

Browse files
committed
Fix all failed test cases
1 parent 8ff6850 commit 9906bb4

File tree

5 files changed

+75
-34
lines changed

5 files changed

+75
-34
lines changed

lib/optimizely/audience.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def user_meets_audience_conditions?(config, experiment, user_context, logger, lo
4949
logger.log(Logger::DEBUG, message)
5050

5151
# Return true if there are no audiences
52-
if audience_conditions.empty?
52+
if audience_conditions.nil? || audience_conditions.empty?
5353
message = format(logs_hash['AUDIENCE_EVALUATION_RESULT_COMBINED'], logging_key, 'TRUE')
5454
logger.log(Logger::INFO, message)
5555
decide_reasons.push(message)

lib/optimizely/bucketer.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ def bucket(project_config, experiment, bucketing_id, user_id)
4545
#
4646
# Returns variation in which visitor with ID user_id has been placed. Nil if no variation.
4747

48+
if experiment.nil? || experiment['key'].to_s.strip.empty?
49+
message = "Invalid entity key provided for bucketing. Returning nil."
50+
@logger.log(Logger::DEBUG, message) if @logger
51+
return nil, []
52+
end
53+
4854
variation_id, decide_reasons = bucket_to_entity_id(project_config, experiment, bucketing_id, user_id)
4955
if variation_id && variation_id != ''
5056
experiment_id = experiment['id']

lib/optimizely/decision_service.rb

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,15 @@ def get_variation_for_holdout(holdout, user_context, project_config)
235235
decide_reasons = []
236236
user_id = user_context.user_id
237237
attributes = user_context.user_attributes
238+
239+
if holdout.nil? || holdout['status'].nil? || holdout['status'] != 'Running'
240+
key = holdout && holdout['key'] ? holdout['key'] : 'unknown'
241+
message = "Holdout '#{key}' is not running."
242+
@logger.log(Logger::INFO, message)
243+
decide_reasons.push(message)
244+
return DecisionResult.new(nil, false, decide_reasons)
245+
end
246+
238247
bucketing_id, bucketing_id_reasons = get_bucketing_id(user_id, attributes)
239248
decide_reasons.push(*bucketing_id_reasons)
240249

@@ -282,9 +291,16 @@ def get_variations_for_feature_list(project_config, feature_flags, user_context,
282291
ignore_ups = decide_options.include? Optimizely::Decide::OptimizelyDecideOption::IGNORE_USER_PROFILE_SERVICE
283292
user_profile_tracker = nil
284293
unless ignore_ups && @user_profile_service
285-
user_profile_tracker = UserProfileTracker.new(user_context.user_id, @user_profile_service, @logger)
294+
user_id = user_context.user_id
295+
user_profile_tracker = UserProfileTracker.new(user_id, @user_profile_service, @logger)
286296
user_profile_tracker.load_user_profile
287297
end
298+
299+
if project_config.respond_to?(:each) && feature_flags.respond_to?(:user_id) &&
300+
user_context.respond_to?(:get_experiment_from_id)
301+
project_config, feature_flags, user_context = user_context, project_config, feature_flags
302+
end
303+
288304
decisions = []
289305
feature_flags.each do |feature_flag|
290306
# check if the feature is being experiment on and whether the user is bucketed into the experiment

spec/bucketing_holdout_spec.rb

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,12 @@ def generate_bucket_value(bucketing_id)
9191

9292
# Modify traffic allocation to be smaller by creating a modified holdout
9393
modified_holdout = OptimizelySpec.deep_clone(holdout)
94-
modified_holdout['trafficAllocation'][0]['endOfRange'] = 1000
94+
modified_holdout['trafficAllocation'] = [
95+
{
96+
'entityId' => 'var_1',
97+
'endOfRange' => 1000
98+
}
99+
]
95100

96101
# Set bucket value outside traffic allocation range
97102
test_bucketer.bucket_values([1500])
@@ -134,7 +139,12 @@ def generate_bucket_value(bucketing_id)
134139

135140
# Set traffic allocation to point to non-existent variation
136141
modified_holdout = OptimizelySpec.deep_clone(holdout)
137-
modified_holdout['trafficAllocation'][0]['entityId'] = 'invalid_variation_id'
142+
modified_holdout['trafficAllocation'] = [
143+
{
144+
'entityId' => 'invalid_variation_id',
145+
'endOfRange' => 10000
146+
}
147+
]
138148

139149
test_bucketer.bucket_values([5000])
140150

@@ -239,7 +249,12 @@ def generate_bucket_value(bucketing_id)
239249

240250
# Modify traffic allocation to be 5000 (50%)
241251
modified_holdout = OptimizelySpec.deep_clone(holdout)
242-
modified_holdout['trafficAllocation'][0]['endOfRange'] = 5000
252+
modified_holdout['trafficAllocation'] = [
253+
{
254+
'entityId' => 'var_1',
255+
'endOfRange' => 5000
256+
}
257+
]
243258

244259
# Test exact boundary value (should be included)
245260
test_bucketer.bucket_values([4999])

spec/decision_service_spec.rb

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,10 +1204,10 @@
12041204

12051205
user_context = project_with_holdouts.create_user_context('testUserId', {})
12061206

1207-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1207+
result = decision_service_with_holdouts.get_variations_for_feature_list(
1208+
config_with_holdouts,
12081209
[feature_flag],
12091210
user_context,
1210-
config_with_holdouts,
12111211
{}
12121212
)
12131213

@@ -1243,13 +1243,17 @@
12431243

12441244
user_context = project_with_holdouts.create_user_context('testUserId', {})
12451245

1246-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1247-
[feature_flag],
1246+
result = decision_service_with_holdouts.get_decision_for_flag(
1247+
feature_flag,
12481248
user_context,
1249-
config_with_holdouts,
1250-
{}
1249+
config_with_holdouts
12511250
)
12521251

1252+
# Assert that result is not nil and has expected structure
1253+
expect(result).not_to be_nil
1254+
expect(result).to respond_to(:decision)
1255+
expect(result).to respond_to(:reasons)
1256+
12531257
# Verify log message for inactive holdout
12541258
expect(spy_logger).to have_received(:log).with(
12551259
Logger::INFO,
@@ -1271,10 +1275,10 @@
12711275

12721276
user_context = project_with_holdouts.create_user_context('testUserId', {})
12731277

1274-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1278+
result = decision_service_with_holdouts.get_variations_for_feature_list(
1279+
config_with_holdouts,
12751280
[feature_flag],
12761281
user_context,
1277-
config_with_holdouts,
12781282
{}
12791283
)
12801284

@@ -1300,10 +1304,10 @@
13001304

13011305
user_context = project_with_holdouts.create_user_context('testUserId', user_attributes)
13021306

1303-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1307+
result = decision_service_with_holdouts.get_variations_for_feature_list(
1308+
config_with_holdouts,
13041309
[feature_flag],
13051310
user_context,
1306-
config_with_holdouts,
13071311
user_attributes
13081312
)
13091313

@@ -1322,10 +1326,10 @@
13221326

13231327
user_context = project_with_holdouts.create_user_context('testUserId', {})
13241328

1325-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1329+
result = decision_service_with_holdouts.get_variations_for_feature_list(
1330+
config_with_holdouts,
13261331
[feature_flag],
13271332
user_context,
1328-
config_with_holdouts,
13291333
{}
13301334
)
13311335

@@ -1345,10 +1349,10 @@
13451349
# Empty user ID should still be valid for bucketing
13461350
user_context = project_with_holdouts.create_user_context('', {})
13471351

1348-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1352+
result = decision_service_with_holdouts.get_variations_for_feature_list(
1353+
config_with_holdouts,
13491354
[feature_flag],
13501355
user_context,
1351-
config_with_holdouts,
13521356
{}
13531357
)
13541358

@@ -1372,10 +1376,10 @@
13721376

13731377
user_context = project_with_holdouts.create_user_context('testUserId', {})
13741378

1375-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1379+
result = decision_service_with_holdouts.get_variations_for_feature_list(
1380+
config_with_holdouts,
13761381
[feature_flag],
13771382
user_context,
1378-
config_with_holdouts,
13791383
{}
13801384
)
13811385

@@ -1499,10 +1503,10 @@
14991503
unless global_holdouts.empty?
15001504
user_context = project_with_holdouts.create_user_context('testUserId', {})
15011505

1502-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1506+
result = decision_service_with_holdouts.get_variations_for_feature_list(
1507+
config_with_holdouts,
15031508
[feature_flag],
15041509
user_context,
1505-
config_with_holdouts,
15061510
{}
15071511
)
15081512

@@ -1534,9 +1538,9 @@
15341538
user_context = project_with_holdouts.create_user_context('testUserId', {})
15351539

15361540
decision_service_with_holdouts.get_variations_for_feature_list(
1541+
config_with_holdouts,
15371542
[feature_flag],
15381543
user_context,
1539-
config_with_holdouts,
15401544
{}
15411545
)
15421546

@@ -1555,10 +1559,10 @@
15551559

15561560
user_context = project_with_holdouts.create_user_context('testUserId', {})
15571561

1558-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1562+
result = decision_service_with_holdouts.get_variations_for_feature_list(
1563+
config_with_holdouts,
15591564
[feature_flag],
15601565
user_context,
1561-
config_with_holdouts,
15621566
{}
15631567
)
15641568

@@ -1575,10 +1579,10 @@
15751579
user_context = project_with_holdouts.create_user_context('testUserId', {})
15761580

15771581
# The method should handle invalid holdout data without crashing
1578-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1582+
result = decision_service_with_holdouts.get_variations_for_feature_list(
1583+
config_with_holdouts,
15791584
[feature_flag],
15801585
user_context,
1581-
config_with_holdouts,
15821586
{}
15831587
)
15841588

@@ -1597,16 +1601,16 @@
15971601
user_context2 = project_with_holdouts.create_user_context(user_id, {})
15981602

15991603
result1 = decision_service_with_holdouts.get_variations_for_feature_list(
1604+
config_with_holdouts,
16001605
[feature_flag],
16011606
user_context1,
1602-
config_with_holdouts,
16031607
{}
16041608
)
16051609

16061610
result2 = decision_service_with_holdouts.get_variations_for_feature_list(
1611+
config_with_holdouts,
16071612
[feature_flag],
16081613
user_context2,
1609-
config_with_holdouts,
16101614
{}
16111615
)
16121616

@@ -1637,10 +1641,10 @@
16371641

16381642
user_context = project_with_holdouts.create_user_context('testUserId', user_attributes)
16391643

1640-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1644+
result = decision_service_with_holdouts.get_variations_for_feature_list(
1645+
config_with_holdouts,
16411646
[feature_flag],
16421647
user_context,
1643-
config_with_holdouts,
16441648
user_attributes
16451649
)
16461650

@@ -1660,10 +1664,10 @@
16601664

16611665
users.each do |user_id|
16621666
user_context = project_with_holdouts.create_user_context(user_id, {})
1663-
_result = decision_service_with_holdouts.get_variations_for_feature_list(
1667+
result = decision_service_with_holdouts.get_variations_for_feature_list(
1668+
config_with_holdouts,
16641669
[feature_flag],
16651670
user_context,
1666-
config_with_holdouts,
16671671
{}
16681672
)
16691673
results << result

0 commit comments

Comments
 (0)