Refactor user preferences, add defaults from file
* Turn prefs into a flat hash structure, since nesting is not worth the trouble * Add a custom serializer class for prefs * Add a config file for defaults and merge set prefs with unset ones * Use booleans for "true" and "false", and integers where appropriate
This commit is contained in:
41
spec/models/user_preferences_spec.rb
Normal file
41
spec/models/user_preferences_spec.rb
Normal file
@@ -0,0 +1,41 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe UserPreferences, type: :model do
|
||||
let(:default_prefs) { YAML.load_file("#{Rails.root}/config/default_preferences.yml") }
|
||||
|
||||
describe ".load" do
|
||||
it "provides default values when no preferences are stored yet" do
|
||||
expect(UserPreferences.load(nil)).to eq(default_prefs)
|
||||
end
|
||||
|
||||
it "provides default values for unset preferences" do
|
||||
prefs = UserPreferences.load("lightning_notify_sats_received: xmpp")
|
||||
expect(prefs[:lightning_notify_sats_received]).to eq("xmpp")
|
||||
expect(prefs[:xmpp_exchange_contacts_with_invitees]).to eq(true)
|
||||
end
|
||||
end
|
||||
|
||||
describe ".process" do
|
||||
it "turns all keys into strings" do
|
||||
res = UserPreferences.process({ foo: "bar" })
|
||||
expect(res[:foo]).to be(nil)
|
||||
expect(res['foo']).to eq("bar")
|
||||
end
|
||||
|
||||
it "converts value 'true' to boolean" do
|
||||
res = UserPreferences.process({ lightning_notify_sats_received: "true" })
|
||||
expect(res['lightning_notify_sats_received']).to be(true)
|
||||
end
|
||||
|
||||
it "converts value 'false' to boolean" do
|
||||
res = UserPreferences.process({ lightning_notify_sats_received: "false" })
|
||||
expect(res['lightning_notify_sats_received']).to be(false)
|
||||
end
|
||||
|
||||
it "converts value string with integer into integer" do
|
||||
res = UserPreferences.process({ lightning_notify_sats_received_threshold: 1000 })
|
||||
expect(res['lightning_notify_sats_received_threshold']).to be_a(Integer)
|
||||
expect(res['lightning_notify_sats_received_threshold']).to eq(1000)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -140,7 +140,7 @@ RSpec.describe User, type: :model do
|
||||
|
||||
before do
|
||||
# TODO remove when defaults are implemented
|
||||
user.update! preferences: {"xmpp" => { "exchange_contacts_with_invitees" => true }}
|
||||
user.update! preferences: { xmpp_exchange_contacts_with_invitees: true }
|
||||
Invitation.create! user: user, invited_user_id: guest.id, used_at: DateTime.now
|
||||
allow_any_instance_of(User).to receive(:enable_service).and_return(true)
|
||||
end
|
||||
@@ -152,7 +152,7 @@ RSpec.describe User, type: :model do
|
||||
|
||||
context "automatic contact exchange disabled" do
|
||||
before do
|
||||
user.update! preferences: {"xmpp" => { "exchange_contacts_with_invitees" => false }}
|
||||
user.update! preferences: { xmpp_exchange_contacts_with_invitees: false }
|
||||
end
|
||||
|
||||
it "does not exchange XMPP contacts with the inviter" do
|
||||
@@ -162,50 +162,4 @@ RSpec.describe User, type: :model do
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#pref_enabled?" do
|
||||
describe "preference not set" do
|
||||
# TODO return default value
|
||||
it "returns false" do
|
||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(false)
|
||||
end
|
||||
end
|
||||
|
||||
describe "preference is set" do
|
||||
it "returns true for boolean true" do
|
||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => true}})
|
||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(true)
|
||||
end
|
||||
|
||||
it "returns true for string 'true'" do
|
||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => "true"}})
|
||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(true)
|
||||
end
|
||||
|
||||
it "returns true for string 'enabled'" do
|
||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => "enabled"}})
|
||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(true)
|
||||
end
|
||||
|
||||
it "returns true for integer 1" do
|
||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => 1}})
|
||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(true)
|
||||
end
|
||||
|
||||
it "returns false for boolean false" do
|
||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => false}})
|
||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(false)
|
||||
end
|
||||
|
||||
it "returns false for string 'false'" do
|
||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => "false"}})
|
||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(false)
|
||||
end
|
||||
|
||||
it "returns false for integer 0" do
|
||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => 0}})
|
||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user