Consider feature toggles without user as well

This is running the same feature toggle logic when a user is given or no
user is given. This allows features to define what to do with guests.
This commit is contained in:
Maikel Linke
2021-04-06 14:48:07 +10:00
committed by Jean-Baptiste Bellet
parent a4b53d6ac4
commit b045a59685
2 changed files with 27 additions and 21 deletions

View File

@@ -40,29 +40,13 @@ module OpenFoodNetwork
end
def enabled?(feature_name, user)
if user.present?
feature = features.fetch(feature_name, NullFeature.new)
feature.enabled?(user)
else
true?(env_variable_value(feature_name))
end
feature = features.fetch(feature_name, DefaultFeature.new(feature_name))
feature.enabled?(user)
end
private
attr_reader :features
def env_variable_value(feature_name)
ENV.fetch(env_variable_name(feature_name), nil)
end
def env_variable_name(feature_name)
"OFN_FEATURE_#{feature_name.to_s.upcase}"
end
def true?(value)
value.to_s.casecmp("true").zero?
end
end
class Feature
@@ -79,9 +63,29 @@ module OpenFoodNetwork
attr_reader :block
end
class NullFeature
class DefaultFeature
attr_reader :feature_name
def initialize(feature_name)
@feature_name = feature_name
end
def enabled?(_user)
false
true?(env_variable_value(feature_name))
end
private
def env_variable_value(feature_name)
ENV.fetch(env_variable_name(feature_name), nil)
end
def env_variable_name(feature_name)
"OFN_FEATURE_#{feature_name.to_s.upcase}"
end
def true?(value)
value.to_s.casecmp("true").zero?
end
end
end

View File

@@ -46,11 +46,13 @@ module OpenFoodNetwork
let(:users) { [user.email] }
before do
FeatureToggle.enable(:foo) { |user| users.include?(user.email) }
FeatureToggle.enable(:foo) { |user| users.include?(user&.email) }
end
it "returns the block's return value" do
expect(FeatureToggle.enabled?(:foo, user)).to eq(true)
expect(FeatureToggle.enabled?(:foo, OpenStruct.new(email: "different"))).to eq(false)
expect(FeatureToggle.enabled?(:foo, nil)).to eq(false)
end
end
end