Skip to content

Commit a87e217

Browse files
rashidspmikeproeng37
authored andcommitted
Implements get_enabled_features API (#86)
1 parent 96bf517 commit a87e217

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

lib/optimizely.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,32 @@ def is_feature_enabled(feature_flag_key, user_id, attributes = nil)
282282
false
283283
end
284284

285+
def get_enabled_features(user_id, attributes = nil)
286+
# Gets keys of all feature flags which are enabled for the user.
287+
# Args:
288+
# user_id: ID for user.
289+
# attributes: Dict representing user attributes.
290+
# Returns:
291+
# A List of feature flag keys that are enabled for the user.
292+
#
293+
enabled_features = []
294+
295+
unless @is_valid
296+
logger = SimpleLogger.new
297+
logger.log(Logger::ERROR, InvalidDatafileError.new('get_enabled_features').message)
298+
return enabled_features
299+
end
300+
301+
@config.feature_flags.each do |feature|
302+
enabled_features.push(feature['key']) if is_feature_enabled(
303+
feature['key'],
304+
user_id,
305+
attributes
306+
) == true
307+
end
308+
enabled_features
309+
end
310+
285311
def get_feature_variable_string(feature_flag_key, variable_key, user_id, attributes = nil)
286312
# Get the String value of the specified variable in the feature flag.
287313
#

spec/project_spec.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,39 @@ class InvalidErrorHandler; end
703703
end
704704
end
705705

706+
describe '#get_enabled_features' do
707+
it 'should return empty when called with invalid project config' do
708+
invalid_project = Optimizely::Project.new('invalid', nil, spy_logger)
709+
expect(invalid_project.get_enabled_features('test_user')).to be_empty
710+
end
711+
712+
it 'should return empty when no feature flag is enabled' do
713+
allow(project_instance).to receive(:is_feature_enabled).and_return(false)
714+
expect(project_instance.get_enabled_features('test_user')).to be_empty
715+
end
716+
717+
it 'should return only enabled feature flags keys' do
718+
# Sets all feature-flags keys with randomly assigned status
719+
features_keys = project_instance.config.feature_flags.map do |item|
720+
{key: (item['key']).to_s, value: [true, false].sample} # '[true, false].sample' generates random boolean
721+
end
722+
723+
enabled_features = features_keys.map { |x| x[:key] if x[:value] == true }.compact
724+
disabled_features = features_keys.map { |x| x[:key] if x[:value] == false }.compact
725+
726+
features_keys.each do |feature|
727+
allow(project_instance).to receive(:is_feature_enabled).with(feature[:key], 'test_user', 'browser_type' => 'chrome').and_return(feature[:value])
728+
end
729+
730+
# Checks enabled features are returned
731+
expect(project_instance.get_enabled_features('test_user', 'browser_type' => 'chrome')).to include(*enabled_features)
732+
expect(project_instance.get_enabled_features('test_user', 'browser_type' => 'chrome').length).to eq(enabled_features.length)
733+
734+
# Checks prevented features should not return
735+
expect(project_instance.get_enabled_features('test_user', 'browser_type' => 'chrome')).not_to include(*disabled_features)
736+
end
737+
end
738+
706739
describe '#get_feature_variable_string' do
707740
user_id = 'test_user'
708741
user_attributes = {}

0 commit comments

Comments
 (0)