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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user