commit: 42844df966d7f503321c82a1f04a8a9be0210dbf
parent: b0fe58dc699fd1b2de61b54b8e884783f742c664
Author: Akihiko Odaki (@fn_aki@pawoo.net) <akihiko.odaki.4i@stu.hosei.ac.jp>
Date: Mon, 5 Jun 2017 00:07:39 +0900
Spec ScopedSettings (#3559)
Diffstat:
3 files changed, 99 insertions(+), 31 deletions(-)
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
@@ -41,37 +41,6 @@ RSpec.describe User, type: :model do
end
end
- describe 'settings' do
- it 'inherits default settings from default yml' do
- expect(Setting.boost_modal).to eq false
- expect(Setting.interactions['must_be_follower']).to eq false
-
- user = User.new
- expect(user.settings.boost_modal).to eq false
- expect(user.settings.interactions['must_be_follower']).to eq false
- end
-
- it 'can update settings' do
- user = Fabricate(:user)
- expect(user.settings['interactions']['must_be_follower']).to eq false
- user.settings['interactions'] = user.settings['interactions'].merge('must_be_follower' => true)
- user.reload
-
- expect(user.settings['interactions']['must_be_follower']).to eq true
- end
-
- xit 'does not mutate defaults via the cache' do
- user = Fabricate(:user)
- user.settings['interactions']['must_be_follower'] = true
- # TODO
- # This mutates the global settings default such that future user
- # instances will inherit the incorrect starting values
-
- other = Fabricate(:user)
- expect(other.settings['interactions']['must_be_follower']).to eq false
- end
- end
-
describe 'scopes' do
describe 'recent' do
it 'returns an array of recent users ordered by id' do
@@ -285,4 +254,14 @@ RSpec.describe User, type: :model do
end
end
end
+
+ it_behaves_like 'Settings-extended' do
+ def create!
+ User.create!(account: Fabricate(:account), email: 'foo@mastodon.space', password: 'abcd1234' )
+ end
+
+ def fabricate
+ Fabricate(:user)
+ end
+ end
end
diff --git a/spec/support/examples/lib/settings/scoped_settings.rb b/spec/support/examples/lib/settings/scoped_settings.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+shared_examples 'ScopedSettings' do
+ describe '[]' do
+ it 'inherits default settings' do
+ expect(Setting.boost_modal).to eq false
+ expect(Setting.interactions['must_be_follower']).to eq false
+
+ settings = create!
+
+ expect(settings['boost_modal']).to eq false
+ expect(settings['interactions']['must_be_follower']).to eq false
+ end
+ end
+
+ describe 'all_as_records' do
+ # expecting [] and []= works
+
+ it 'returns records merged with default values except hashes' do
+ expect(Setting.boost_modal).to eq false
+ expect(Setting.delete_modal).to eq true
+
+ settings = create!
+ settings['boost_modal'] = true
+
+ records = settings.all_as_records
+
+ expect(records['boost_modal'].value).to eq true
+ expect(records['delete_modal'].value).to eq true
+ end
+ end
+
+ describe 'missing methods' do
+ # expecting [] and []= works.
+
+ it 'reads settings' do
+ expect(Setting.boost_modal).to eq false
+ settings = create!
+ expect(settings.boost_modal).to eq false
+ end
+
+ it 'updates settings' do
+ settings = fabricate
+ settings.boost_modal = true
+ expect(settings['boost_modal']).to eq true
+ end
+ end
+
+ it 'can update settings with [] and can read with []=' do
+ settings = fabricate
+
+ settings['boost_modal'] = true
+ settings['interactions'] = settings['interactions'].merge('must_be_follower' => true)
+
+ Setting.save!
+
+ expect(settings['boost_modal']).to eq true
+ expect(settings['interactions']['must_be_follower']).to eq true
+
+ Rails.cache.clear
+
+ expect(settings['boost_modal']).to eq true
+ expect(settings['interactions']['must_be_follower']).to eq true
+ end
+
+ xit 'does not mutate defaults via the cache' do
+ fabricate['interactions']['must_be_follower'] = true
+ # TODO
+ # This mutates the global settings default such that future
+ # instances will inherit the incorrect starting values
+
+ expect(fabricate.settings['interactions']['must_be_follower']).to eq false
+ end
+end
diff --git a/spec/support/examples/lib/settings/settings_extended.rb b/spec/support/examples/lib/settings/settings_extended.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+shared_examples 'Settings-extended' do
+ describe 'settings' do
+ def fabricate
+ super.settings
+ end
+
+ def create!
+ super.settings
+ end
+
+ it_behaves_like 'ScopedSettings'
+ end
+end