Skip to content

Commit 61a95c3

Browse files
[FSSDK-11389] update: experiment_id and variation_id added to payloads (#361)
* optimizely.rb -> added variation id and experiment id to notification listerner payload optimizely_user_context_spec.rb -> fixed unit tests * -unit tests updated -rubocop autocorrection * chore: trigger CI * fix: rubocop corrections
1 parent cfdd022 commit 61a95c3

File tree

4 files changed

+52
-21
lines changed

4 files changed

+52
-21
lines changed

lib/optimizely.rb

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,12 +185,17 @@ def create_optimizely_decision(user_context, flag_key, decision, reasons, decide
185185
feature_flag = config.get_feature_flag_from_key(flag_key)
186186
experiment = nil
187187
decision_source = Optimizely::DecisionService::DECISION_SOURCES['ROLLOUT']
188+
experiment_id = nil
189+
variation_id = nil
190+
188191
# Send impression event if Decision came from a feature test and decide options doesn't include disableDecisionEvent
189192
if decision.is_a?(Optimizely::DecisionService::Decision)
190193
experiment = decision.experiment
191194
rule_key = experiment ? experiment['key'] : nil
195+
experiment_id = experiment ? experiment['id'] : nil
192196
variation = decision['variation']
193197
variation_key = variation ? variation['key'] : nil
198+
variation_id = variation ? variation['id'] : nil
194199
feature_enabled = variation ? variation['featureEnabled'] : false
195200
decision_source = decision.source
196201
end
@@ -214,14 +219,16 @@ def create_optimizely_decision(user_context, flag_key, decision, reasons, decide
214219
@notification_center.send_notifications(
215220
NotificationCenter::NOTIFICATION_TYPES[:DECISION],
216221
Helpers::Constants::DECISION_NOTIFICATION_TYPES['FLAG'],
217-
user_id, (attributes || {}),
222+
user_id, attributes || {},
218223
flag_key: flag_key,
219224
enabled: feature_enabled,
220225
variables: all_variables,
221226
variation_key: variation_key,
222227
rule_key: rule_key,
223228
reasons: should_include_reasons ? reasons : [],
224-
decision_event_dispatched: decision_event_dispatched
229+
decision_event_dispatched: decision_event_dispatched,
230+
experiment_id: experiment_id,
231+
variation_id: variation_id
225232
)
226233

227234
OptimizelyDecision.new(
@@ -625,7 +632,7 @@ def is_feature_enabled(feature_flag_key, user_id, attributes = nil)
625632
@notification_center.send_notifications(
626633
NotificationCenter::NOTIFICATION_TYPES[:DECISION],
627634
Helpers::Constants::DECISION_NOTIFICATION_TYPES['FEATURE'],
628-
user_id, (attributes || {}),
635+
user_id, attributes || {},
629636
feature_key: feature_flag_key,
630637
feature_enabled: feature_enabled,
631638
source: source_string,
@@ -853,7 +860,7 @@ def get_all_feature_variables(feature_flag_key, user_id, attributes = nil)
853860

854861
@notification_center.send_notifications(
855862
NotificationCenter::NOTIFICATION_TYPES[:DECISION],
856-
Helpers::Constants::DECISION_NOTIFICATION_TYPES['ALL_FEATURE_VARIABLES'], user_id, (attributes || {}),
863+
Helpers::Constants::DECISION_NOTIFICATION_TYPES['ALL_FEATURE_VARIABLES'], user_id, attributes || {},
857864
feature_key: feature_flag_key,
858865
feature_enabled: feature_enabled,
859866
source: source_string,
@@ -1033,7 +1040,7 @@ def get_variation_with_config(experiment_key, user_id, attributes, config)
10331040
end
10341041
@notification_center.send_notifications(
10351042
NotificationCenter::NOTIFICATION_TYPES[:DECISION],
1036-
decision_notification_type, user_id, (attributes || {}),
1043+
decision_notification_type, user_id, attributes || {},
10371044
experiment_key: experiment_key,
10381045
variation_key: variation_key
10391046
)
@@ -1108,7 +1115,7 @@ def get_feature_variable_for_type(feature_flag_key, variable_key, variable_type,
11081115

11091116
@notification_center.send_notifications(
11101117
NotificationCenter::NOTIFICATION_TYPES[:DECISION],
1111-
Helpers::Constants::DECISION_NOTIFICATION_TYPES['FEATURE_VARIABLE'], user_id, (attributes || {}),
1118+
Helpers::Constants::DECISION_NOTIFICATION_TYPES['FEATURE_VARIABLE'], user_id, attributes || {},
11121119
feature_key: feature_flag_key,
11131120
feature_enabled: feature_enabled,
11141121
source: source_string,

lib/optimizely/helpers/validator.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,11 @@ def inputs_valid?(variables, logger = NoOpLogger.new, level = Logger::ERROR)
122122

123123
return false unless variables.respond_to?(:each) && !variables.empty?
124124

125-
is_valid = true # rubocop:disable Lint/UselessAssignment
125+
is_valid = true
126126
if variables.include? :user_id
127127
# Empty str is a valid user ID.
128128
unless variables[:user_id].is_a?(String)
129-
is_valid = false # rubocop:disable Lint/UselessAssignment
129+
is_valid = false
130130
logger.log(level, "#{Constants::INPUT_VARIABLES['USER_ID']} is invalid")
131131
end
132132
variables.delete :user_id

spec/optimizely_user_context_spec.rb

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,9 @@
251251
variation_key: '3324490562',
252252
rule_key: nil,
253253
reasons: [],
254-
decision_event_dispatched: true
254+
decision_event_dispatched: true,
255+
experiment_id: nil,
256+
variation_id: '3324490562'
255257
)
256258
user_context_obj = forced_decision_project_instance.create_user_context(user_id)
257259
context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new(feature_key, nil)
@@ -347,7 +349,9 @@
347349
variation_key: 'b',
348350
rule_key: 'exp_with_audience',
349351
reasons: ['Variation (b) is mapped to flag (feature_1), rule (exp_with_audience) and user (tester) in the forced decision map.'],
350-
decision_event_dispatched: true
352+
decision_event_dispatched: true,
353+
experiment_id: '10390977673',
354+
variation_id: '10416523121'
351355
)
352356
user_context_obj = Optimizely::OptimizelyUserContext.new(forced_decision_project_instance, user_id, original_attributes)
353357
context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new(feature_key, 'exp_with_audience')
@@ -464,7 +468,9 @@
464468
variation_key: '3324490562',
465469
rule_key: nil,
466470
reasons: [],
467-
decision_event_dispatched: true
471+
decision_event_dispatched: true,
472+
experiment_id: nil,
473+
variation_id: '3324490562'
468474
)
469475
user_context_obj = forced_decision_project_instance.create_user_context(user_id)
470476
context_with_flag = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new(feature_key, nil)

spec/project_spec.rb

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2079,7 +2079,7 @@ def callback(_args); end
20792079
it 'should return only enabled feature flags keys' do
20802080
# Sets all feature-flags keys with randomly assigned status
20812081
features_keys = project_config.feature_flags.map do |item|
2082-
{key: (item['key']).to_s, value: [true, false].sample} # '[true, false].sample' generates random boolean
2082+
{key: item['key'].to_s, value: [true, false].sample} # '[true, false].sample' generates random boolean
20832083
end
20842084

20852085
enabled_features = features_keys.map { |x| x[:key] if x[:value] == true }.compact
@@ -3758,7 +3758,9 @@ def callback(_args); end
37583758
variation_key: 'Fred',
37593759
rule_key: 'test_experiment_multivariate',
37603760
reasons: [],
3761-
decision_event_dispatched: true
3761+
decision_event_dispatched: true,
3762+
experiment_id: experiment_to_return['id'],
3763+
variation_id: variation_to_return['id']
37623764
)
37633765
allow(project_instance.event_dispatcher).to receive(:dispatch_event).with(instance_of(Optimizely::Event))
37643766
decision_to_return = Optimizely::DecisionService::Decision.new(
@@ -3801,7 +3803,9 @@ def callback(_args); end
38013803
variation_key: 'Fred',
38023804
rule_key: 'test_experiment_multivariate',
38033805
reasons: [],
3804-
decision_event_dispatched: true
3806+
decision_event_dispatched: true,
3807+
experiment_id: experiment_to_return['id'],
3808+
variation_id: variation_to_return['id']
38053809
)
38063810
allow(project_instance.event_dispatcher).to receive(:dispatch_event).with(instance_of(Optimizely::Event))
38073811
decision_to_return = Optimizely::DecisionService::Decision.new(
@@ -3883,7 +3887,9 @@ def callback(_args); end
38833887
variation_key: 'Fred',
38843888
rule_key: 'test_experiment_multivariate',
38853889
reasons: [],
3886-
decision_event_dispatched: false
3890+
decision_event_dispatched: false,
3891+
experiment_id: experiment_to_return['id'],
3892+
variation_id: variation_to_return['id']
38873893
)
38883894
allow(project_config).to receive(:send_flag_decisions).and_return(false)
38893895
allow(project_instance.event_dispatcher).to receive(:dispatch_event).with(instance_of(Optimizely::Event))
@@ -3921,7 +3927,9 @@ def callback(_args); end
39213927
variation_key: nil,
39223928
rule_key: nil,
39233929
reasons: [],
3924-
decision_event_dispatched: false
3930+
decision_event_dispatched: false,
3931+
experiment_id: nil,
3932+
variation_id: nil
39253933
)
39263934
allow(project_config).to receive(:send_flag_decisions).and_return(false)
39273935
allow(project_instance.event_dispatcher).to receive(:dispatch_event).with(instance_of(Optimizely::Event))
@@ -3958,7 +3966,9 @@ def callback(_args); end
39583966
variation_key: nil,
39593967
rule_key: nil,
39603968
reasons: [],
3961-
decision_event_dispatched: true
3969+
decision_event_dispatched: true,
3970+
experiment_id: nil,
3971+
variation_id: nil
39623972
)
39633973
allow(project_instance.event_dispatcher).to receive(:dispatch_event).with(instance_of(Optimizely::Event))
39643974
decision_to_return = nil
@@ -4122,7 +4132,9 @@ def callback(_args); end
41224132
"The user 'user1' is not bucketed into any of the experiments on the feature 'multi_variate_feature'.",
41234133
"Feature flag 'multi_variate_feature' is not used in a rollout."
41244134
],
4125-
decision_event_dispatched: true
4135+
decision_event_dispatched: true,
4136+
experiment_id: nil,
4137+
variation_id: nil
41264138
)
41274139
expect(project_instance.notification_center).to receive(:send_notifications)
41284140
.once.with(Optimizely::NotificationCenter::NOTIFICATION_TYPES[:LOG_EVENT], any_args)
@@ -4162,7 +4174,9 @@ def callback(_args); end
41624174
variation_key: nil,
41634175
rule_key: nil,
41644176
reasons: [],
4165-
decision_event_dispatched: true
4177+
decision_event_dispatched: true,
4178+
experiment_id: nil,
4179+
variation_id: nil
41664180
)
41674181
allow(project_instance.event_dispatcher).to receive(:dispatch_event).with(instance_of(Optimizely::Event))
41684182
user_context = project_instance.create_user_context('user1')
@@ -4481,7 +4495,9 @@ def callback(_args); end
44814495
"The user 'user1' is not bucketed into any of the experiments on the feature 'multi_variate_feature'.",
44824496
"Feature flag 'multi_variate_feature' is not used in a rollout."
44834497
],
4484-
decision_event_dispatched: true
4498+
decision_event_dispatched: true,
4499+
experiment_id: nil,
4500+
variation_id: nil
44854501
)
44864502
allow(custom_project_instance.event_dispatcher).to receive(:dispatch_event).with(instance_of(Optimizely::Event))
44874503
user_context = custom_project_instance.create_user_context('user1')
@@ -4521,7 +4537,9 @@ def callback(_args); end
45214537
variation_key: nil,
45224538
rule_key: nil,
45234539
reasons: [],
4524-
decision_event_dispatched: true
4540+
decision_event_dispatched: true,
4541+
experiment_id: nil,
4542+
variation_id: nil
45254543
)
45264544
allow(custom_project_instance.event_dispatcher).to receive(:dispatch_event).with(instance_of(Optimizely::Event))
45274545
user_context = custom_project_instance.create_user_context('user1')

0 commit comments

Comments
 (0)