diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index d7ca91e8..735c78c6 100644 --- 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 new file mode 100644 index 00000000..2457dcfb --- /dev/null +++ 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 new file mode 100644 index 00000000..5a9d34bb --- /dev/null +++ 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