Skip to content

Commit f28570e

Browse files
rashidspthomaszurkan-optimizely
authored andcommitted
Implements inputs validator (#103)
1 parent 619f3bc commit f28570e

File tree

6 files changed

+214
-50
lines changed

6 files changed

+214
-50
lines changed

lib/optimizely.rb

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ def activate(experiment_key, user_id, attributes = nil)
105105
return nil
106106
end
107107

108+
return nil unless Optimizely::Helpers::Validator.inputs_valid?(
109+
{
110+
experiment_key: experiment_key,
111+
user_id: user_id
112+
}, @logger, Logger::ERROR
113+
)
114+
108115
variation_key = get_variation(experiment_key, user_id, attributes)
109116

110117
if variation_key.nil?
@@ -135,10 +142,12 @@ def get_variation(experiment_key, user_id, attributes = nil)
135142
return nil
136143
end
137144

138-
if user_id.to_s.empty?
139-
@logger.log(Logger::ERROR, 'User ID cannot be empty.')
140-
return nil
141-
end
145+
return nil unless Optimizely::Helpers::Validator.inputs_valid?(
146+
{
147+
experiment_key: experiment_key,
148+
user_id: user_id
149+
}, @logger, Logger::ERROR
150+
)
142151

143152
unless user_inputs_valid?(attributes)
144153
@logger.log(Logger::INFO, "Not activating user '#{user_id}.")
@@ -196,10 +205,12 @@ def track(event_key, user_id, attributes = nil, event_tags = nil)
196205
return nil
197206
end
198207

199-
if user_id.to_s.empty?
200-
@logger.log(Logger::ERROR, 'User ID cannot be empty.')
201-
return nil
202-
end
208+
return nil unless Optimizely::Helpers::Validator.inputs_valid?(
209+
{
210+
event_key: event_key,
211+
user_id: user_id
212+
}, @logger, Logger::ERROR
213+
)
203214

204215
return nil unless user_inputs_valid?(attributes, event_tags)
205216

@@ -254,15 +265,12 @@ def is_feature_enabled(feature_flag_key, user_id, attributes = nil)
254265
return false
255266
end
256267

257-
unless feature_flag_key
258-
@logger.log(Logger::ERROR, 'Feature flag key cannot be empty.')
259-
return false
260-
end
261-
262-
if user_id.to_s.empty?
263-
@logger.log(Logger::ERROR, 'User ID cannot be empty.')
264-
return false
265-
end
268+
return false unless Optimizely::Helpers::Validator.inputs_valid?(
269+
{
270+
feature_flag_key: feature_flag_key,
271+
user_id: user_id
272+
}, @logger, Logger::ERROR
273+
)
266274

267275
feature_flag = @config.get_feature_flag_from_key(feature_flag_key)
268276
unless feature_flag
@@ -312,6 +320,8 @@ def get_enabled_features(user_id, attributes = nil)
312320
return enabled_features
313321
end
314322

323+
return enabled_features unless Optimizely::Helpers::Validator.inputs_valid?({user_id: user_id}, @logger, Logger::ERROR)
324+
315325
@config.feature_flags.each do |feature|
316326
enabled_features.push(feature['key']) if is_feature_enabled(
317327
feature['key'],
@@ -426,20 +436,15 @@ def get_feature_variable_for_type(feature_flag_key, variable_key, variable_type,
426436
# Returns nil if the feature flag or variable or user ID is empty
427437
# in case of variable type mismatch
428438

429-
unless feature_flag_key
430-
@logger.log(Logger::ERROR, 'Feature flag key cannot be empty.')
431-
return nil
432-
end
433-
434-
unless variable_key
435-
@logger.log(Logger::ERROR, 'Variable key cannot be empty.')
436-
return nil
437-
end
438-
439-
if user_id.to_s.empty?
440-
@logger.log(Logger::ERROR, 'User ID cannot be empty.')
441-
return nil
442-
end
439+
return nil unless Optimizely::Helpers::Validator.inputs_valid?(
440+
{
441+
feature_flag_key: feature_flag_key,
442+
variable_key: variable_key,
443+
variable_type: variable_type,
444+
user_id: user_id
445+
},
446+
@logger, Logger::ERROR
447+
)
443448

444449
feature_flag = @config.get_feature_flag_from_key(feature_flag_key)
445450
unless feature_flag

lib/optimizely/helpers/constants.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22

33
#
4-
# Copyright 2016-2017, Optimizely and contributors
4+
# Copyright 2016-2018, Optimizely and contributors
55
#
66
# Licensed under the Apache License, Version 2.0 (the "License");
77
# you may not use this file except in compliance with the License.
@@ -306,6 +306,15 @@ module Constants
306306
'INTEGER' => 'integer',
307307
'STRING' => 'string'
308308
}.freeze
309+
310+
INPUT_VARIABLES = {
311+
'FEATURE_FLAG_KEY' => 'Feature flag key',
312+
'EXPERIMENT_KEY' => 'Experiment key',
313+
'USER_ID' => 'User ID',
314+
'VARIATION_KEY' => 'Variation key',
315+
'VARIABLE_KEY' => 'Variable key',
316+
'VARIABLE_TYPE' => 'Variable type'
317+
}.freeze
309318
end
310319
end
311320
end

lib/optimizely/helpers/validator.rb

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22

33
#
4-
# Copyright 2016-2017, Optimizely and contributors
4+
# Copyright 2016-2018, Optimizely and contributors
55
#
66
# Licensed under the Apache License, Version 2.0 (the "License");
77
# you may not use this file except in compliance with the License.
@@ -95,6 +95,27 @@ def string_numeric?(str)
9595
rescue
9696
false
9797
end
98+
99+
def inputs_valid?(variables, logger = NoOpLogger.new, level = Logger::ERROR)
100+
# Determines if values of variables in given array are non empty string.
101+
#
102+
# variables - array values to validate.
103+
#
104+
# logger - logger.
105+
#
106+
# Returns boolean True if all of the values are valid, False otherwise.
107+
108+
return false unless variables.respond_to?(:each) && !variables.empty?
109+
is_valid = true
110+
variables.each do |key, value|
111+
next if value.is_a?(String) && !value.empty?
112+
is_valid = false
113+
if logger_valid?(logger) && level
114+
logger.log(level, "#{Optimizely::Helpers::Constants::INPUT_VARIABLES[key.to_s.upcase]} is invalid")
115+
end
116+
end
117+
is_valid
118+
end
98119
end
99120
end
100121
end

lib/optimizely/project_config.rb

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
# limitations under the License.
1616
#
1717
require 'json'
18+
require_relative 'helpers/validator'
1819

1920
module Optimizely
2021
V1_CONFIG_VERSION = '1'
@@ -275,11 +276,12 @@ def get_forced_variation(experiment_key, user_id)
275276
#
276277
# Returns Variation The variation which the given user and experiment should be forced into.
277278

278-
# check for nil and empty string user ID
279-
if user_id.nil? || user_id.empty?
280-
@logger.log(Logger::DEBUG, 'User ID is invalid')
281-
return nil
282-
end
279+
return nil unless Optimizely::Helpers::Validator.inputs_valid?(
280+
{
281+
experiment_key: experiment_key,
282+
user_id: user_id
283+
}, @logger, Logger::DEBUG
284+
)
283285

284286
unless @forced_variation_map.key? user_id
285287
@logger.log(Logger::DEBUG, "User '#{user_id}' is not in the forced variation map.")
@@ -323,11 +325,12 @@ def set_forced_variation(experiment_key, user_id, variation_key)
323325
#
324326
# Returns a boolean value that indicates if the set completed successfully.
325327

326-
# check for null and empty string user ID
327-
if user_id.nil? || user_id.empty?
328-
@logger.log(Logger::DEBUG, 'User ID is invalid')
329-
return false
330-
end
328+
return false unless Optimizely::Helpers::Validator.inputs_valid?(
329+
{
330+
user_id: user_id,
331+
experiment_key: experiment_key
332+
}, @logger, Logger::DEBUG
333+
)
331334

332335
experiment = get_experiment_from_key(experiment_key)
333336
experiment_id = experiment['id'] if experiment

spec/project_config_spec.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,7 @@
859859
@valid_experiment = {id: '111127', key: 'test_experiment'}
860860
@valid_variation = {id: '111128', key: 'control'}
861861
end
862+
862863
# User ID is nil
863864
it 'should log a message and return nil when user_id is passed as nil for get_forced_variation' do
864865
expect(config.get_forced_variation(@valid_experiment[:key], nil)).to eq(nil)
@@ -963,6 +964,26 @@
963964
@valid_variation_for_exp_2 = {id: '122228', key: 'control_with_audience'}
964965
end
965966

967+
it 'should call inputs_valid? with the proper arguments in set_forced_variation' do
968+
expect(Optimizely::Helpers::Validator).to receive(:inputs_valid?).with(
969+
{
970+
user_id: @user_id,
971+
experiment_key: @valid_experiment[:key]
972+
}, spy_logger, Logger::DEBUG
973+
)
974+
config.set_forced_variation(@valid_experiment[:key], @user_id, @valid_variation[:key])
975+
end
976+
977+
it 'should call inputs_valid? with the proper arguments in get_forced_variation' do
978+
expect(Optimizely::Helpers::Validator).to receive(:inputs_valid?).with(
979+
{
980+
experiment_key: @valid_experiment[:key],
981+
user_id: @user_id
982+
}, spy_logger, Logger::DEBUG
983+
)
984+
config.get_forced_variation(@valid_experiment[:key], @user_id)
985+
end
986+
966987
# Call set variation with different variations on one user/experiment to confirm that each set is expected.
967988
it 'should set and return expected variations when different variations are set and removed for one user/experiment' do
968989
expect(config.set_forced_variation(@valid_experiment[:key], @user_id, @valid_variation[:key])).to eq(true)

0 commit comments

Comments
 (0)