discourse/spec/components/site_setting_extension_spec.rb

278 lines
6.9 KiB
Ruby

require 'spec_helper'
require_dependency 'site_setting_extension'
require_dependency 'site_settings/local_process_provider'
describe SiteSettingExtension do
class FakeSettings
extend SiteSettingExtension
self.provider = SiteSettings::LocalProcessProvider.new
end
class FakeSettings2
extend SiteSettingExtension
self.provider = FakeSettings.provider
end
let :settings do
FakeSettings
end
let :settings2 do
FakeSettings2
end
describe "refresh!" do
it "will reset to default if provider vanishes" do
settings.setting(:hello, 1)
settings.hello = 100
settings.hello.should == 100
settings.provider.clear
settings.refresh!
settings.hello.should == 1
end
it "will set to new value if provider changes" do
settings.setting(:hello, 1)
settings.hello = 100
settings.hello.should == 100
settings.provider.save(:hello, 99, SiteSetting.types[:fixnum] )
settings.refresh!
settings.hello.should == 99
end
it "Publishes changes cross sites" do
settings.setting(:hello, 1)
settings2.setting(:hello, 1)
settings.hello = 100
settings2.refresh!
settings2.hello.should == 100
settings.hello = 99
settings2.refresh!
settings2.hello.should == 99
end
end
describe "multisite" do
it "has no db cross talk" do
settings.setting(:hello, 1)
settings.hello = 100
settings.provider.current_site = "boom"
settings.hello.should == 1
end
end
describe "int setting" do
before do
settings.setting(:test_setting, 77)
settings.refresh!
end
it "should have a key in all_settings" do
settings.all_settings.detect {|s| s[:setting] == :test_setting }.should be_present
end
it "should have the correct desc" do
I18n.expects(:t).with("site_settings.test_setting").returns("test description")
settings.description(:test_setting).should == "test description"
end
it "should have the correct default" do
settings.test_setting.should == 77
end
context "when overidden" do
after :each do
settings.remove_override!(:test_setting)
end
it "should have the correct override" do
settings.test_setting = 100
settings.test_setting.should == 100
end
it "should coerce correct string to int" do
settings.test_setting = "101"
settings.test_setting.should.eql? 101
end
it "should coerce incorrect string to 0" do
settings.test_setting = "pie"
settings.test_setting.should.eql? 0
end
it "should not set default when reset" do
settings.test_setting = 100
settings.setting(:test_setting, 77)
settings.refresh!
settings.test_setting.should_not == 77
end
it "can be overridden with set" do
settings.set("test_setting", 12)
settings.test_setting.should == 12
end
end
end
describe "remove_override" do
it "correctly nukes overrides" do
settings.setting(:test_override, "test")
settings.test_override = "bla"
settings.remove_override!(:test_override)
expect(settings.test_override).to eq("test")
end
end
describe "string setting" do
before do
settings.setting(:test_str, "str")
settings.refresh!
end
it "should have the correct default" do
settings.test_str.should == "str"
end
context "when overridden" do
after :each do
settings.remove_override!(:test_str)
end
it "should coerce int to string" do
settings.test_str = 100
settings.test_str.should.eql? "100"
end
it "can be overridden with set" do
settings.set("test_str", "hi")
settings.test_str.should == "hi"
end
end
end
describe "bool setting" do
before do
settings.setting(:test_hello?, false)
settings.refresh!
end
it "should have the correct default" do
settings.test_hello?.should == false
end
context "when overridden" do
after do
settings.remove_override!(:test_hello?)
end
it "should have the correct override" do
settings.test_hello = true
settings.test_hello?.should == true
end
it "should coerce true strings to true" do
settings.test_hello = "true"
settings.test_hello?.should.eql? true
end
it "should coerce all other strings to false" do
settings.test_hello = "f"
settings.test_hello?.should.eql? false
end
it "should not set default when reset" do
settings.test_hello = true
settings.setting(:test_hello?, false)
settings.refresh!
settings.test_hello?.should_not == false
end
it "can be overridden with set" do
settings.set("test_hello", true)
settings.test_hello?.should == true
end
end
end
# describe 'enum setting' do
# before do
# @enum_class = Enum.new(:test) # not a valid site setting class
# @enum_class.stubs(:translate_names?).returns(false)
# settings.setting(:test_enum, 'en', enum: @enum_class) # would never do this in practice
# settings.refresh!
# end
# it 'should have the correct default' do
# expect(settings.test_enum).to eq('en')
# end
# it 'should not hose all_settings' do
# settings.all_settings.detect {|s| s[:setting] == :test_enum }.should be_present
# end
# context 'when overridden' do
# it 'stores valid values' do
# @enum_class.expects(:valid_value?).with('fr').returns(true)
# settings.test_enum = 'fr'
# expect(settings.test_enum).to eq('fr')
# end
# it 'rejects invalid values' do
# @enum_class.expects(:valid_value?).with('gg').returns(false)
# expect {settings.test_enum = 'gg' }.to raise_error(Discourse::InvalidParameters)
# end
# end
# end
describe 'a setting with a category' do
before do
settings.setting(:test_setting, 88, {category: :tests})
settings.refresh!
end
it "should return the category in all_settings" do
settings.all_settings.find {|s| s[:setting] == :test_setting }[:category].should == :tests
end
context "when overidden" do
after :each do
settings.remove_override!(:test_setting)
end
it "should have the correct override" do
settings.test_setting = 101
settings.test_setting.should == 101
end
it "should still have the correct category" do
settings.test_setting = 102
settings.all_settings.find {|s| s[:setting] == :test_setting }[:category].should == :tests
end
end
end
describe "set for an invalid setting name" do
it "raises an error" do
settings.setting(:test_setting, 77)
settings.refresh!
expect {
settings.set("provider", "haxxed")
}.to raise_error(ArgumentError)
end
end
end