Refactor Setting model

- Make easier to group settings by using prefixes
- Add method to rename setting keys
- Add method to remove setting keys
This commit is contained in:
Julian Herrero
2019-03-13 11:54:20 +01:00
parent 8ae80cd1a1
commit 9ed6aae348
2 changed files with 93 additions and 20 deletions

View File

@@ -4,19 +4,16 @@ class Setting < ActiveRecord::Base
default_scope { order(id: :asc) } default_scope { order(id: :asc) }
def type def type
if feature_flag? prefix = key.split(".").first
"feature" if %w[feature process map html homepage].include? prefix
prefix
else else
"common" "configuration"
end end
end end
def feature_flag?
key.start_with?("feature.")
end
def enabled? def enabled?
feature_flag? && value.present? value.present?
end end
class << self class << self
@@ -30,5 +27,18 @@ class Setting < ActiveRecord::Base
setting.save! setting.save!
value value
end end
def rename_key(from:, to:)
if where(key: to).empty?
value = where(key: from).pluck(:value).first.presence
create!(key: to, value: value)
end
remove(from)
end
def remove(key)
setting = where(key: key).first
setting.destroy if setting.present?
end
end end
end end

View File

@@ -17,20 +17,40 @@ describe Setting do
expect(described_class.where(key: "official_level_1_name", value: "Stormtrooper")).to exist expect(described_class.where(key: "official_level_1_name", value: "Stormtrooper")).to exist
end end
describe "#feature_flag?" do describe "#type" do
it "is true if key starts with 'feature.'" do it "returns the key prefix for 'process' settings" do
setting = described_class.create(key: "feature.whatever") process_setting = Setting.create(key: "process.whatever")
expect(setting.feature_flag?).to eq true expect(process_setting.type).to eq "process"
end end
it "is false if key does not start with 'feature.'" do it "returns the key prefix for 'feature' settings" do
setting = described_class.create(key: "whatever") feature_setting = Setting.create(key: "feature.whatever")
expect(setting.feature_flag?).to eq false expect(feature_setting.type).to eq "feature"
end
it "returns the key prefix for 'map' settings" do
map_setting = Setting.create(key: "map.whatever")
expect(map_setting.type).to eq "map"
end
it "returns the key prefix for 'html' settings" do
html_setting = Setting.create(key: "html.whatever")
expect(html_setting.type).to eq "html"
end
it "returns the key prefix for 'homepage' settings" do
homepage_setting = Setting.create(key: "homepage.whatever")
expect(homepage_setting.type).to eq "homepage"
end
it "returns 'configuration' for the rest of the settings" do
configuration_setting = Setting.create(key: "whatever")
expect(configuration_setting.type).to eq "configuration"
end end
end end
describe "#enabled?" do describe "#enabled?" do
it "is true if feature_flag and value present" do it "is true if value is present" do
setting = described_class.create(key: "feature.whatever", value: 1) setting = described_class.create(key: "feature.whatever", value: 1)
expect(setting.enabled?).to eq true expect(setting.enabled?).to eq true
@@ -41,17 +61,60 @@ describe Setting do
expect(setting.enabled?).to eq true expect(setting.enabled?).to eq true
end end
it "is false if feature_flag and value blank" do it "is false if value is blank" do
setting = described_class.create(key: "feature.whatever") setting = described_class.create(key: "feature.whatever")
expect(setting.enabled?).to eq false expect(setting.enabled?).to eq false
setting.value = "" setting.value = ""
expect(setting.enabled?).to eq false expect(setting.enabled?).to eq false
end end
end
it "is false if not feature_flag" do describe ".rename_key" do
setting = described_class.create(key: "whatever", value: "whatever") it "renames the setting keeping the original value and deletes the old setting" do
expect(setting.enabled?).to eq false Setting["old_key"] = "old_value"
Setting.rename_key from: "old_key", to: "new_key"
expect(Setting.where(key: "new_key", value: "old_value")).to exist
expect(Setting.where(key: "old_key")).not_to exist
end
it "initialize the setting with null value if old key doesn't exist" do
expect(Setting.where(key: "old_key")).not_to exist
Setting.rename_key from: "old_key", to: "new_key"
expect(Setting.where(key: "new_key", value: nil)).to exist
expect(Setting.where(key: "old_key")).not_to exist
end
it "does not change value if new key already exists, but deletes setting with old key" do
Setting["new_key"] = "new_value"
Setting["old_key"] = "old_value"
Setting.rename_key from: "old_key", to: "new_key"
expect(Setting["new_key"]).to eq "new_value"
expect(Setting.where(key: "old_key")).not_to exist
end
end
describe ".remove" do
it "deletes the setting by given key" do
expect(Setting.where(key: "official_level_1_name")).to exist
Setting.remove("official_level_1_name")
expect(Setting.where(key: "official_level_1_name")).not_to exist
end
it "does nothing if key doesn't exists" do
all_settings = Setting.all
Setting.remove("not_existing_key")
expect(Setting.all).to eq all_settings
end end
end end
end end