about summary refs log tree commit diff
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/models/user_spec.rb41
-rw-r--r--spec/support/examples/lib/settings/scoped_settings.rb74
-rw-r--r--spec/support/examples/lib/settings/settings_extended.rb15
3 files changed, 99 insertions, 31 deletions
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index d7ca91e81..735c78c64 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 000000000..2457dcfbf
--- /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 000000000..5a9d34bb0
--- /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