mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
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:
committed by
Jean-Baptiste Bellet
parent
a4b53d6ac4
commit
b045a59685
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user