2015-10-11 10:41:23 +01:00
require 'rails_helper'
2013-06-23 13:35:06 +10:00
require_dependency 'site_setting_extension'
require_dependency 'site_settings/local_process_provider'
describe SiteSettingExtension do
2016-01-08 16:23:52 +05:30
describe '#types' do
context " verify enum sequence " do
before do
@types = SiteSetting . types
end
it " 'string' should be at 1st position " do
expect ( @types [ :string ] ) . to eq ( 1 )
end
it " 'value_list' should be at 12th position " do
expect ( @types [ :value_list ] ) . to eq ( 12 )
end
end
end
2016-02-11 11:16:09 +08:00
2015-09-09 15:34:53 +02:00
let :provider_local do
2015-02-04 16:57:16 +11:00
SiteSettings :: LocalProcessProvider . new
2014-03-28 16:36:17 +11:00
end
2015-09-09 15:34:53 +02:00
def new_settings ( provider )
2015-09-09 14:34:44 +02:00
Class . new do
2015-02-04 16:57:16 +11:00
extend SiteSettingExtension
2015-09-09 15:34:53 +02:00
self . provider = provider
2015-02-04 16:57:16 +11:00
end
2013-06-23 13:35:06 +10:00
end
let :settings do
2015-09-09 15:34:53 +02:00
new_settings ( provider_local )
2013-06-23 13:35:06 +10:00
end
2014-03-28 16:36:17 +11:00
let :settings2 do
2015-09-09 15:34:53 +02:00
new_settings ( provider_local )
2015-09-09 14:34:44 +02:00
end
2014-03-28 16:36:17 +11:00
describe " refresh! " do
it " will reset to default if provider vanishes " do
settings . setting ( :hello , 1 )
settings . hello = 100
2015-04-25 11:18:35 -04:00
expect ( settings . hello ) . to eq ( 100 )
2014-03-28 16:36:17 +11:00
settings . provider . clear
settings . refresh!
2015-04-25 11:18:35 -04:00
expect ( settings . hello ) . to eq ( 1 )
2014-03-28 16:36:17 +11:00
end
it " will set to new value if provider changes " do
settings . setting ( :hello , 1 )
settings . hello = 100
2015-04-25 11:18:35 -04:00
expect ( settings . hello ) . to eq ( 100 )
2014-03-28 16:36:17 +11:00
settings . provider . save ( :hello , 99 , SiteSetting . types [ :fixnum ] )
settings . refresh!
2015-04-25 11:18:35 -04:00
expect ( settings . hello ) . to eq ( 99 )
2014-03-28 16:36:17 +11:00
end
it " Publishes changes cross sites " do
settings . setting ( :hello , 1 )
settings2 . setting ( :hello , 1 )
settings . hello = 100
settings2 . refresh!
2015-04-25 11:18:35 -04:00
expect ( settings2 . hello ) . to eq ( 100 )
2014-03-28 16:36:17 +11:00
settings . hello = 99
settings2 . refresh!
2015-04-25 11:18:35 -04:00
expect ( settings2 . hello ) . to eq ( 99 )
2014-03-28 16:36:17 +11:00
end
end
describe " multisite " do
it " has no db cross talk " do
settings . setting ( :hello , 1 )
settings . hello = 100
settings . provider . current_site = " boom "
2015-04-25 11:18:35 -04:00
expect ( settings . hello ) . to eq ( 1 )
2014-03-28 16:36:17 +11:00
end
end
2013-06-23 13:35:06 +10:00
describe " int setting " do
before do
settings . setting ( :test_setting , 77 )
settings . refresh!
end
it " should have a key in all_settings " do
2015-04-25 11:18:35 -04:00
expect ( settings . all_settings . detect { | s | s [ :setting ] == :test_setting } ) . to be_present
2013-06-23 13:35:06 +10:00
end
it " should have the correct desc " do
I18n . expects ( :t ) . with ( " site_settings.test_setting " ) . returns ( " test description " )
2015-04-25 11:18:35 -04:00
expect ( settings . description ( :test_setting ) ) . to eq ( " test description " )
2013-06-23 13:35:06 +10:00
end
it " should have the correct default " do
2015-04-25 11:18:35 -04:00
expect ( settings . test_setting ) . to eq ( 77 )
2013-06-23 13:35:06 +10:00
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
2015-04-25 11:18:35 -04:00
expect ( settings . test_setting ) . to eq ( 100 )
2013-06-23 13:35:06 +10:00
end
it " should coerce correct string to int " do
settings . test_setting = " 101 "
2015-04-25 11:33:26 -04:00
expect ( settings . test_setting ) . to eq ( 101 )
2013-06-23 13:35:06 +10:00
end
it " should coerce incorrect string to 0 " do
settings . test_setting = " pie "
2015-04-25 11:33:26 -04:00
expect ( settings . test_setting ) . to eq ( 0 )
2013-06-23 13:35:06 +10:00
end
2015-04-25 11:33:26 -04:00
it " should not set default when reset " do
2013-06-23 13:35:06 +10:00
settings . test_setting = 100
settings . setting ( :test_setting , 77 )
settings . refresh!
2015-04-25 11:18:35 -04:00
expect ( settings . test_setting ) . not_to eq ( 77 )
2013-06-23 13:35:06 +10:00
end
2014-01-27 13:05:35 -05:00
it " can be overridden with set " do
settings . set ( " test_setting " , 12 )
2015-04-25 11:18:35 -04:00
expect ( settings . test_setting ) . to eq ( 12 )
2014-01-27 13:05:35 -05:00
end
2016-02-11 11:16:09 +08:00
it " should publish changes to clients " do
settings . setting ( " test_setting " , 100 )
settings . client_setting ( " test_setting " )
messages = MessageBus . track_publish do
settings . test_setting = 88
end
expect ( messages . map ( & :channel ) . include? ( '/client_settings' ) ) . to eq ( true )
end
2013-06-23 13:35:06 +10:00
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
2015-04-25 11:18:35 -04:00
expect ( settings . test_str ) . to eq ( " str " )
2013-06-23 13:35:06 +10:00
end
context " when overridden " do
after :each do
settings . remove_override! ( :test_str )
end
it " should coerce int to string " do
2015-04-25 11:33:26 -04:00
skip " This test is not working on Rspec 2 even "
2013-06-23 13:35:06 +10:00
settings . test_str = 100
2015-04-25 11:33:26 -04:00
expect ( settings . test_str ) . to eq ( " 100 " )
2013-06-23 13:35:06 +10:00
end
2014-01-27 13:05:35 -05:00
it " can be overridden with set " do
settings . set ( " test_str " , " hi " )
2015-04-25 11:18:35 -04:00
expect ( settings . test_str ) . to eq ( " hi " )
2014-01-27 13:05:35 -05:00
end
2013-06-23 13:35:06 +10:00
end
end
2015-02-27 11:45:56 +11:00
describe " string setting with regex " do
it " Supports custom validation errors " do
settings . setting ( :test_str , " bob " , regex : " hi " , regex_error : " oops " )
settings . refresh!
begin
settings . test_str = " a "
rescue Discourse :: InvalidParameters = > e
message = e . message
end
2015-04-25 11:18:35 -04:00
expect ( message ) . to match ( / oops / )
2015-02-27 11:45:56 +11:00
end
end
2013-06-23 13:35:06 +10:00
describe " bool setting " do
before do
settings . setting ( :test_hello? , false )
settings . refresh!
end
it " should have the correct default " do
2015-04-25 11:18:35 -04:00
expect ( settings . test_hello? ) . to eq ( false )
2013-06-23 13:35:06 +10:00
end
context " when overridden " do
after do
settings . remove_override! ( :test_hello? )
end
it " should have the correct override " do
settings . test_hello = true
2015-04-25 11:18:35 -04:00
expect ( settings . test_hello? ) . to eq ( true )
2013-06-23 13:35:06 +10:00
end
it " should coerce true strings to true " do
settings . test_hello = " true "
2015-04-25 11:33:26 -04:00
expect ( settings . test_hello? ) . to be ( true )
2013-06-23 13:35:06 +10:00
end
it " should coerce all other strings to false " do
settings . test_hello = " f "
2015-04-25 11:33:26 -04:00
expect ( settings . test_hello? ) . to be ( false )
2013-06-23 13:35:06 +10:00
end
2015-04-25 11:33:26 -04:00
it " should not set default when reset " do
2013-06-23 13:35:06 +10:00
settings . test_hello = true
settings . setting ( :test_hello? , false )
settings . refresh!
2015-04-25 11:18:35 -04:00
expect ( settings . test_hello? ) . not_to eq ( false )
2013-06-23 13:35:06 +10:00
end
2014-01-27 13:05:35 -05:00
it " can be overridden with set " do
settings . set ( " test_hello " , true )
2015-04-25 11:18:35 -04:00
expect ( settings . test_hello? ) . to eq ( true )
2014-01-27 13:05:35 -05:00
end
2013-06-23 13:35:06 +10:00
end
end
2015-08-26 16:39:09 +10:00
describe 'int enum' do
class TestIntEnumClass
def self . valid_value? ( v )
true
end
def self . values
[ 1 , 2 , 3 ]
end
end
it 'should coerce correctly' do
2015-09-09 15:34:53 +02:00
settings . setting ( :test_int_enum , 1 , enum : TestIntEnumClass )
settings . test_int_enum = " 2 "
settings . refresh!
expect ( settings . test_int_enum ) . to eq ( 2 )
2015-08-26 16:39:09 +10:00
end
end
2014-06-09 14:27:44 -04:00
describe 'enum setting' do
class TestEnumClass
def self . valid_value? ( v )
true
end
def self . values
[ 'en' ]
end
def self . translate_names?
false
end
end
let :test_enum_class do
TestEnumClass
end
before do
settings . setting ( :test_enum , 'en' , enum : test_enum_class )
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
2015-04-25 11:18:35 -04:00
expect ( settings . all_settings . detect { | s | s [ :setting ] == :test_enum } ) . to be_present
2014-06-09 14:27:44 -04:00
end
context 'when overridden' do
2014-06-09 15:17:36 -04:00
after :each do
settings . remove_override! ( :validated_setting )
end
2014-06-09 14:27:44 -04:00
it 'stores valid values' do
test_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
test_enum_class . expects ( :valid_value? ) . with ( 'gg' ) . returns ( false )
expect { settings . test_enum = 'gg' } . to raise_error ( Discourse :: InvalidParameters )
end
end
end
2013-11-13 14:02:47 -05:00
describe 'a setting with a category' do
before do
2013-11-15 14:32:33 -05:00
settings . setting ( :test_setting , 88 , { category : :tests } )
2013-11-13 14:02:47 -05:00
settings . refresh!
end
it " should return the category in all_settings " do
2015-04-25 11:18:35 -04:00
expect ( settings . all_settings . find { | s | s [ :setting ] == :test_setting } [ :category ] ) . to eq ( :tests )
2013-11-13 14:02:47 -05:00
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
2015-04-25 11:18:35 -04:00
expect ( settings . test_setting ) . to eq ( 101 )
2013-11-13 14:02:47 -05:00
end
it " should still have the correct category " do
settings . test_setting = 102
2015-04-25 11:18:35 -04:00
expect ( settings . all_settings . find { | s | s [ :setting ] == :test_setting } [ :category ] ) . to eq ( :tests )
2013-11-13 14:02:47 -05:00
end
end
end
2014-06-09 15:17:36 -04:00
describe " setting with a validator " do
before do
2014-06-12 18:03:03 -04:00
settings . setting ( :validated_setting , " info@example.com " , { type : 'email' } )
2014-06-09 15:17:36 -04:00
settings . refresh!
end
after :each do
settings . remove_override! ( :validated_setting )
end
it " stores valid values " do
2014-06-12 18:03:03 -04:00
EmailSettingValidator . any_instance . expects ( :valid_value? ) . returns ( true )
2014-06-09 15:17:36 -04:00
settings . validated_setting = 'success@example.com'
2015-04-25 11:18:35 -04:00
expect ( settings . validated_setting ) . to eq ( 'success@example.com' )
2014-06-09 15:17:36 -04:00
end
it " rejects invalid values " do
expect {
2014-06-12 18:03:03 -04:00
EmailSettingValidator . any_instance . expects ( :valid_value? ) . returns ( false )
2014-06-09 15:17:36 -04:00
settings . validated_setting = 'nope'
} . to raise_error ( Discourse :: InvalidParameters )
2015-04-25 11:18:35 -04:00
expect ( settings . validated_setting ) . to eq ( " info@example.com " )
2014-06-09 15:17:36 -04:00
end
it " allows blank values " do
settings . validated_setting = ''
2015-04-25 11:18:35 -04:00
expect ( settings . validated_setting ) . to eq ( '' )
2014-06-09 15:17:36 -04:00
end
end
2014-01-27 13:05:35 -05:00
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
2015-07-13 22:53:44 +05:30
describe " set for an invalid fixnum value " do
2015-04-23 18:10:12 +05:30
it " raises an error " do
settings . setting ( :test_setting , 80 )
settings . refresh!
expect {
2015-07-13 22:53:44 +05:30
settings . set ( " test_setting " , 9999999999999999999 )
2015-04-23 18:10:12 +05:30
} . to raise_error ( ArgumentError )
end
end
2014-07-24 17:30:15 +05:30
describe " filter domain name " do
before do
settings . setting ( :white_listed_spam_host_domains , " www.example.com " )
settings . refresh!
end
it " filters domain " do
settings . set ( " white_listed_spam_host_domains " , " http://www.discourse.org/ " )
2015-04-25 11:18:35 -04:00
expect ( settings . white_listed_spam_host_domains ) . to eq ( " www.discourse.org " )
2014-07-24 17:30:15 +05:30
end
it " returns invalid domain as is, without throwing exception " do
settings . set ( " white_listed_spam_host_domains " , " test!url " )
2015-04-25 11:18:35 -04:00
expect ( settings . white_listed_spam_host_domains ) . to eq ( " test!url " )
2014-07-24 17:30:15 +05:30
end
end
2015-02-03 16:47:06 -05:00
describe " hidden " do
before do
settings . setting ( :superman_identity , 'Clark Kent' , hidden : true )
settings . refresh!
end
it " is in the `hidden_settings` collection " do
2015-04-25 11:18:35 -04:00
expect ( settings . hidden_settings . include? ( :superman_identity ) ) . to eq ( true )
2015-02-03 16:47:06 -05:00
end
it " can be retrieved " do
2015-04-25 11:18:35 -04:00
expect ( settings . superman_identity ) . to eq ( " Clark Kent " )
2015-02-03 16:47:06 -05:00
end
it " is not present in all_settings by default " do
2015-04-25 11:18:35 -04:00
expect ( settings . all_settings . find { | s | s [ :setting ] == :superman_identity } ) . to be_blank
2015-02-03 16:47:06 -05:00
end
it " is present in all_settings when we ask for hidden " do
2015-04-25 11:18:35 -04:00
expect ( settings . all_settings ( true ) . find { | s | s [ :setting ] == :superman_identity } ) . to be_present
2015-02-03 16:47:06 -05:00
end
end
describe " shadowed_by_global " do
context " without global setting " do
before do
settings . setting ( :trout_api_key , 'evil' , shadowed_by_global : true )
settings . refresh!
end
it " should not add the key to the shadowed_settings collection " do
2015-04-25 11:18:35 -04:00
expect ( settings . shadowed_settings . include? ( :trout_api_key ) ) . to eq ( false )
2015-02-03 16:47:06 -05:00
end
it " can return the default value " do
2015-04-25 11:18:35 -04:00
expect ( settings . trout_api_key ) . to eq ( 'evil' )
2015-02-03 16:47:06 -05:00
end
it " can overwrite the default " do
settings . trout_api_key = 'tophat'
settings . refresh!
2015-04-25 11:18:35 -04:00
expect ( settings . trout_api_key ) . to eq ( 'tophat' )
2015-02-03 16:47:06 -05:00
end
end
2016-02-10 11:54:40 +11:00
context " with blank global setting " do
before do
GlobalSetting . stubs ( :nada ) . returns ( '' )
settings . setting ( :nada , 'nothing' , shadowed_by_global : true )
settings . refresh!
end
it " should return default cause nothing is set " do
expect ( settings . nada ) . to eq ( 'nothing' )
end
end
2016-02-13 17:49:26 +11:00
context " with a false override " do
before do
GlobalSetting . stubs ( :bool ) . returns ( false )
settings . setting ( :bool , true , shadowed_by_global : true )
settings . refresh!
end
it " should return default cause nothing is set " do
expect ( settings . bool ) . to eq ( false )
end
end
2015-02-03 16:47:06 -05:00
context " with global setting " do
before do
GlobalSetting . stubs ( :trout_api_key ) . returns ( 'purringcat' )
settings . setting ( :trout_api_key , 'evil' , shadowed_by_global : true )
settings . refresh!
end
it " should return the global setting instead of default " do
2015-04-25 11:18:35 -04:00
expect ( settings . trout_api_key ) . to eq ( 'purringcat' )
2015-02-03 16:47:06 -05:00
end
it " should return the global setting after a refresh " do
settings . refresh!
2015-04-25 11:18:35 -04:00
expect ( settings . trout_api_key ) . to eq ( 'purringcat' )
2015-02-03 16:47:06 -05:00
end
it " should add the key to the shadowed_settings collection " do
2015-04-25 11:18:35 -04:00
expect ( settings . shadowed_settings . include? ( :trout_api_key ) ) . to eq ( true )
2015-02-03 16:47:06 -05:00
end
end
end
2013-06-23 13:35:06 +10:00
end