From 5d3dbca9c339430ec62bb04e0fea2f512249fc24 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Tue, 25 Jun 2019 17:25:21 +1000 Subject: [PATCH] Toggle features via env instead of initializer A FeatureToggle could be switched via a class_eval in an initializer. The initializer was installed via ofn-install. We want to get rid of custom, untracked initializers. Here I'm changing the FeatureToggle class to use environment variables instead. This change needs to be followed up with a change in ofn-install to use the new environment variable. It affects only Australian production. --- lib/open_food_network/feature_toggle.rb | 16 ++++++++++++---- .../lib/open_food_network/feature_toggle_spec.rb | 14 +++++++++++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/lib/open_food_network/feature_toggle.rb b/lib/open_food_network/feature_toggle.rb index 9acbfe0c8d..e979bbf361 100644 --- a/lib/open_food_network/feature_toggle.rb +++ b/lib/open_food_network/feature_toggle.rb @@ -1,13 +1,21 @@ module OpenFoodNetwork class FeatureToggle - def self.enabled?(feature) - !!features.with_indifferent_access[feature] + def self.enabled?(feature_name) + true?(env_variable_value(feature_name)) end private - def self.features - { connect_learn_homepage: false } + def self.env_variable_value(feature_name) + ENV.fetch(env_variable_name(feature_name), nil) + end + + def self.env_variable_name(feature_name) + "OFN_FEATURE_#{feature_name.to_s.upcase}" + end + + def self.true?(value) + value.to_s.casecmp("true").zero? end end end diff --git a/spec/lib/open_food_network/feature_toggle_spec.rb b/spec/lib/open_food_network/feature_toggle_spec.rb index d00c44527c..d07aa9db15 100644 --- a/spec/lib/open_food_network/feature_toggle_spec.rb +++ b/spec/lib/open_food_network/feature_toggle_spec.rb @@ -3,18 +3,26 @@ require 'open_food_network/feature_toggle' module OpenFoodNetwork describe FeatureToggle do it "returns true when feature is on" do - allow(FeatureToggle).to receive(:features).and_return(foo: true) + stub_foo("true") expect(FeatureToggle.enabled?(:foo)).to be true end it "returns false when feature is off" do - allow(FeatureToggle).to receive(:features).and_return(foo: false) + stub_foo("false") + expect(FeatureToggle.enabled?(:foo)).to be false + end + + it "returns false when feature is unspecified" do + stub_foo("maybe") expect(FeatureToggle.enabled?(:foo)).to be false end it "returns false when feature is undefined" do - allow(FeatureToggle).to receive(:features).and_return({}) expect(FeatureToggle.enabled?(:foo)).to be false end + + def stub_foo(value) + allow(ENV).to receive(:fetch).with("OFN_FEATURE_FOO", nil).and_return(value) + end end end