about summary refs log tree commit diff
path: root/spec/models
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models')
-rw-r--r--spec/models/account/field_spec.rb18
-rw-r--r--spec/models/account_alias_spec.rb3
-rw-r--r--spec/models/account_conversation_spec.rb2
-rw-r--r--spec/models/account_deletion_request_spec.rb2
-rw-r--r--spec/models/account_domain_block_spec.rb6
-rw-r--r--spec/models/account_filter_spec.rb28
-rw-r--r--spec/models/account_migration_spec.rb2
-rw-r--r--spec/models/account_moderation_note_spec.rb2
-rw-r--r--spec/models/account_spec.rb113
-rw-r--r--spec/models/account_statuses_cleanup_policy_spec.rb83
-rw-r--r--spec/models/account_statuses_filter_spec.rb4
-rw-r--r--spec/models/account_warning_preset_spec.rb17
-rw-r--r--spec/models/admin/account_action_spec.rb7
-rw-r--r--spec/models/admin/appeal_filter_spec.rb16
-rw-r--r--spec/models/announcement_mute_spec.rb2
-rw-r--r--spec/models/announcement_reaction_spec.rb2
-rw-r--r--spec/models/announcement_spec.rb2
-rw-r--r--spec/models/appeal_spec.rb37
-rw-r--r--spec/models/backup_spec.rb2
-rw-r--r--spec/models/block_spec.rb15
-rw-r--r--spec/models/canonical_email_block_spec.rb2
-rw-r--r--spec/models/concerns/account_counters_spec.rb2
-rw-r--r--spec/models/concerns/account_interactions_spec.rb201
-rw-r--r--spec/models/concerns/remotable_spec.rb8
-rw-r--r--spec/models/conversation_mute_spec.rb2
-rw-r--r--spec/models/conversation_spec.rb2
-rw-r--r--spec/models/custom_emoji_category_spec.rb13
-rw-r--r--spec/models/custom_emoji_filter_spec.rb14
-rw-r--r--spec/models/custom_emoji_spec.rb28
-rw-r--r--spec/models/custom_filter_keyword_spec.rb2
-rw-r--r--spec/models/custom_filter_spec.rb2
-rw-r--r--spec/models/device_spec.rb3
-rw-r--r--spec/models/domain_allow_spec.rb17
-rw-r--r--spec/models/domain_block_spec.rb13
-rw-r--r--spec/models/email_domain_block_spec.rb9
-rw-r--r--spec/models/encrypted_message_spec.rb3
-rw-r--r--spec/models/export_spec.rb4
-rw-r--r--spec/models/extended_description_spec.rb29
-rw-r--r--spec/models/favourite_spec.rb4
-rw-r--r--spec/models/featured_tag_spec.rb2
-rw-r--r--spec/models/follow_recommendation_suppression_spec.rb2
-rw-r--r--spec/models/follow_request_spec.rb2
-rw-r--r--spec/models/follow_spec.rb7
-rw-r--r--spec/models/form/admin_settings_spec.rb36
-rw-r--r--spec/models/form/status_filter_batch_action_spec.rb13
-rw-r--r--spec/models/home_feed_spec.rb6
-rw-r--r--spec/models/identity_spec.rb2
-rw-r--r--spec/models/import_spec.rb13
-rw-r--r--spec/models/invite_spec.rb2
-rw-r--r--spec/models/ip_block_spec.rb14
-rw-r--r--spec/models/list_account_spec.rb2
-rw-r--r--spec/models/list_spec.rb2
-rw-r--r--spec/models/login_activity_spec.rb3
-rw-r--r--spec/models/marker_spec.rb15
-rw-r--r--spec/models/media_attachment_spec.rb44
-rw-r--r--spec/models/mention_spec.rb7
-rw-r--r--spec/models/mute_spec.rb2
-rw-r--r--spec/models/notification_spec.rb4
-rw-r--r--spec/models/one_time_key_spec.rb20
-rw-r--r--spec/models/poll_spec.rb31
-rw-r--r--spec/models/poll_vote_spec.rb49
-rw-r--r--spec/models/preview_card_provider_spec.rb42
-rw-r--r--spec/models/preview_card_spec.rb2
-rw-r--r--spec/models/preview_card_trend_spec.rb2
-rw-r--r--spec/models/privacy_policy_spec.rb28
-rw-r--r--spec/models/public_feed_spec.rb58
-rw-r--r--spec/models/relay_spec.rb2
-rw-r--r--spec/models/remote_follow_spec.rb14
-rw-r--r--spec/models/report_filter_spec.rb2
-rw-r--r--spec/models/report_spec.rb12
-rw-r--r--spec/models/rule_spec.rb18
-rw-r--r--spec/models/scheduled_status_spec.rb2
-rw-r--r--spec/models/session_activation_spec.rb16
-rw-r--r--spec/models/setting_spec.rb16
-rw-r--r--spec/models/status_edit_spec.rb12
-rw-r--r--spec/models/status_pin_spec.rb2
-rw-r--r--spec/models/status_spec.rb60
-rw-r--r--spec/models/status_stat_spec.rb2
-rw-r--r--spec/models/status_trend_spec.rb2
-rw-r--r--spec/models/system_key_spec.rb3
-rw-r--r--spec/models/tag_feed_spec.rb4
-rw-r--r--spec/models/tag_follow_spec.rb2
-rw-r--r--spec/models/tag_spec.rb7
-rw-r--r--spec/models/trends/statuses_spec.rb4
-rw-r--r--spec/models/trends/tags_spec.rb6
-rw-r--r--spec/models/unavailable_domain_spec.rb2
-rw-r--r--spec/models/user_invite_request_spec.rb2
-rw-r--r--spec/models/user_role_spec.rb12
-rw-r--r--spec/models/user_settings/namespace_spec.rb25
-rw-r--r--spec/models/user_settings/setting_spec.rb106
-rw-r--r--spec/models/user_settings_spec.rb110
-rw-r--r--spec/models/user_spec.rb176
-rw-r--r--spec/models/web/push_subscription_spec.rb20
-rw-r--r--spec/models/web/setting_spec.rb2
-rw-r--r--spec/models/webauthn_credentials_spec.rb6
-rw-r--r--spec/models/webhook_spec.rb2
96 files changed, 1303 insertions, 477 deletions
diff --git a/spec/models/account/field_spec.rb b/spec/models/account/field_spec.rb
index 0ac9769bc..6745fbb26 100644
--- a/spec/models/account/field_spec.rb
+++ b/spec/models/account/field_spec.rb
@@ -1,11 +1,13 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Account::Field, type: :model do
   describe '#verified?' do
-    let(:account) { double('Account', local?: true) }
-
     subject { described_class.new(account, 'name' => 'Foo', 'value' => 'Bar', 'verified_at' => verified_at) }
 
+    let(:account) { double('Account', local?: true) }
+
     context 'when verified_at is set' do
       let(:verified_at) { Time.now.utc.iso8601 }
 
@@ -24,11 +26,11 @@ RSpec.describe Account::Field, type: :model do
   end
 
   describe '#mark_verified!' do
+    subject { described_class.new(account, original_hash) }
+
     let(:account) { double('Account', local?: true) }
     let(:original_hash) { { 'name' => 'Foo', 'value' => 'Bar' } }
 
-    subject { described_class.new(account, original_hash) }
-
     before do
       subject.mark_verified!
     end
@@ -43,10 +45,10 @@ RSpec.describe Account::Field, type: :model do
   end
 
   describe '#verifiable?' do
-    let(:account) { double('Account', local?: local) }
-
     subject { described_class.new(account, 'name' => 'Foo', 'value' => value) }
 
+    let(:account) { double('Account', local?: local) }
+
     context 'for local accounts' do
       let(:local) { true }
 
@@ -97,7 +99,7 @@ RSpec.describe Account::Field, type: :model do
           expect(subject.verifiable?).to be false
         end
       end
-      
+
       context 'for text which is blank' do
         let(:value) { '' }
 
@@ -149,7 +151,7 @@ RSpec.describe Account::Field, type: :model do
           expect(subject.verifiable?).to be false
         end
       end
-      
+
       context 'for text which is blank' do
         let(:value) { '' }
 
diff --git a/spec/models/account_alias_spec.rb b/spec/models/account_alias_spec.rb
index 27ec215aa..08c3eaff4 100644
--- a/spec/models/account_alias_spec.rb
+++ b/spec/models/account_alias_spec.rb
@@ -1,5 +1,6 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe AccountAlias, type: :model do
-
 end
diff --git a/spec/models/account_conversation_spec.rb b/spec/models/account_conversation_spec.rb
index 70a76281e..c4e8918ad 100644
--- a/spec/models/account_conversation_spec.rb
+++ b/spec/models/account_conversation_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe AccountConversation, type: :model do
diff --git a/spec/models/account_deletion_request_spec.rb b/spec/models/account_deletion_request_spec.rb
index afaecbe22..db332f14c 100644
--- a/spec/models/account_deletion_request_spec.rb
+++ b/spec/models/account_deletion_request_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe AccountDeletionRequest, type: :model do
diff --git a/spec/models/account_domain_block_spec.rb b/spec/models/account_domain_block_spec.rb
index 469bc05cb..bc46f44ba 100644
--- a/spec/models/account_domain_block_spec.rb
+++ b/spec/models/account_domain_block_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe AccountDomainBlock, type: :model do
@@ -7,7 +9,7 @@ RSpec.describe AccountDomainBlock, type: :model do
 
     AccountDomainBlock.create!(account: account, domain: 'a.domain.blocked.later')
 
-    expect(Rails.cache.exist?("exclude_domains_for:#{account.id}")).to eq false
+    expect(Rails.cache.exist?("exclude_domains_for:#{account.id}")).to be false
   end
 
   it 'removes blocking cache after destruction' do
@@ -17,6 +19,6 @@ RSpec.describe AccountDomainBlock, type: :model do
 
     block.destroy!
 
-    expect(Rails.cache.exist?("exclude_domains_for:#{account.id}")).to eq false
+    expect(Rails.cache.exist?("exclude_domains_for:#{account.id}")).to be false
   end
 end
diff --git a/spec/models/account_filter_spec.rb b/spec/models/account_filter_spec.rb
index c2bd8c220..3032260fe 100644
--- a/spec/models/account_filter_spec.rb
+++ b/spec/models/account_filter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 describe AccountFilter do
@@ -16,4 +18,30 @@ describe AccountFilter do
       expect { filter.results }.to raise_error(/wrong/)
     end
   end
+
+  describe 'with origin and by_domain interacting' do
+    let!(:local_account) { Fabricate(:account, domain: nil) }
+    let!(:remote_account_one) { Fabricate(:account, domain: 'example.org') }
+    let(:remote_account_two) { Fabricate(:account, domain: 'other.domain') }
+
+    it 'works with domain first and origin remote' do
+      filter = described_class.new(by_domain: 'example.org', origin: 'remote')
+      expect(filter.results).to match_array [remote_account_one]
+    end
+
+    it 'works with domain last and origin remote' do
+      filter = described_class.new(origin: 'remote', by_domain: 'example.org')
+      expect(filter.results).to match_array [remote_account_one]
+    end
+
+    it 'works with domain first and origin local' do
+      filter = described_class.new(by_domain: 'example.org', origin: 'local')
+      expect(filter.results).to match_array [local_account]
+    end
+
+    it 'works with domain last and origin local' do
+      filter = described_class.new(origin: 'local', by_domain: 'example.org')
+      expect(filter.results).to match_array [remote_account_one]
+    end
+  end
 end
diff --git a/spec/models/account_migration_spec.rb b/spec/models/account_migration_spec.rb
index 5f66fe8da..a91ba5dc5 100644
--- a/spec/models/account_migration_spec.rb
+++ b/spec/models/account_migration_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe AccountMigration, type: :model do
diff --git a/spec/models/account_moderation_note_spec.rb b/spec/models/account_moderation_note_spec.rb
index 69bd5500a..b7f5701e6 100644
--- a/spec/models/account_moderation_note_spec.rb
+++ b/spec/models/account_moderation_note_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe AccountModerationNote, type: :model do
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index 6cd769dc8..ae4e5ee32 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -1,10 +1,13 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Account, type: :model do
   context do
-    let(:bob) { Fabricate(:account, username: 'bob') }
     subject { Fabricate(:account) }
 
+    let(:bob) { Fabricate(:account, username: 'bob') }
+
     describe '#suspend!' do
       it 'marks the account as suspended' do
         subject.suspend!
@@ -30,7 +33,7 @@ RSpec.describe Account, type: :model do
           end
 
           it 'does not raise an error' do
-            expect { subject.suspend! }.not_to raise_error
+            expect { subject.suspend! }.to_not raise_error
           end
         end
       end
@@ -86,14 +89,14 @@ RSpec.describe Account, type: :model do
   end
 
   describe 'Local domain user methods' do
+    subject { Fabricate(:account, domain: nil, username: 'alice') }
+
     around do |example|
       before = Rails.configuration.x.local_domain
       example.run
       Rails.configuration.x.local_domain = before
     end
 
-    subject { Fabricate(:account, domain: nil, username: 'alice') }
-
     describe '#to_webfinger_s' do
       it 'returns a webfinger string for the account' do
         Rails.configuration.x.local_domain = 'example.com'
@@ -159,7 +162,7 @@ RSpec.describe Account, type: :model do
       it 'sets default avatar, header, avatar_remote_url, and header_remote_url' do
         expect(account.avatar_remote_url).to eq 'https://remote.test/invalid_avatar'
         expect(account.header_remote_url).to eq expectation.header_remote_url
-        expect(account.avatar_file_name).to  eq nil
+        expect(account.avatar_file_name).to  be_nil
         expect(account.header_file_name).to  eq expectation.header_file_name
       end
     end
@@ -205,7 +208,7 @@ RSpec.describe Account, type: :model do
       end
 
       it 'calls not ResolveAccountService#call' do
-        expect_any_instance_of(ResolveAccountService).not_to receive(:call).with(acct)
+        expect_any_instance_of(ResolveAccountService).to_not receive(:call).with(acct)
         account.refresh!
       end
     end
@@ -242,13 +245,13 @@ RSpec.describe Account, type: :model do
   end
 
   describe '#favourited?' do
+    subject { Fabricate(:account) }
+
     let(:original_status) do
       author = Fabricate(:account, username: 'original')
       Fabricate(:status, account: author)
     end
 
-    subject { Fabricate(:account) }
-
     context 'when the status is a reblog of another status' do
       let(:original_reblog) do
         author = Fabricate(:account, username: 'original_reblogger')
@@ -258,11 +261,11 @@ RSpec.describe Account, type: :model do
       it 'is true when this account has favourited it' do
         Fabricate(:favourite, status: original_reblog, account: subject)
 
-        expect(subject.favourited?(original_status)).to eq true
+        expect(subject.favourited?(original_status)).to be true
       end
 
       it 'is false when this account has not favourited it' do
-        expect(subject.favourited?(original_status)).to eq false
+        expect(subject.favourited?(original_status)).to be false
       end
     end
 
@@ -270,23 +273,23 @@ RSpec.describe Account, type: :model do
       it 'is true when this account has favourited it' do
         Fabricate(:favourite, status: original_status, account: subject)
 
-        expect(subject.favourited?(original_status)).to eq true
+        expect(subject.favourited?(original_status)).to be true
       end
 
       it 'is false when this account has not favourited it' do
-        expect(subject.favourited?(original_status)).to eq false
+        expect(subject.favourited?(original_status)).to be false
       end
     end
   end
 
   describe '#reblogged?' do
+    subject { Fabricate(:account) }
+
     let(:original_status) do
       author = Fabricate(:account, username: 'original')
       Fabricate(:status, account: author)
     end
 
-    subject { Fabricate(:account) }
-
     context 'when the status is a reblog of another status' do
       let(:original_reblog) do
         author = Fabricate(:account, username: 'original_reblogger')
@@ -296,11 +299,11 @@ RSpec.describe Account, type: :model do
       it 'is true when this account has reblogged it' do
         Fabricate(:status, reblog: original_reblog, account: subject)
 
-        expect(subject.reblogged?(original_reblog)).to eq true
+        expect(subject.reblogged?(original_reblog)).to be true
       end
 
       it 'is false when this account has not reblogged it' do
-        expect(subject.reblogged?(original_reblog)).to eq false
+        expect(subject.reblogged?(original_reblog)).to be false
       end
     end
 
@@ -308,11 +311,11 @@ RSpec.describe Account, type: :model do
       it 'is true when this account has reblogged it' do
         Fabricate(:status, reblog: original_status, account: subject)
 
-        expect(subject.reblogged?(original_status)).to eq true
+        expect(subject.reblogged?(original_status)).to be true
       end
 
       it 'is false when this account has not reblogged it' do
-        expect(subject.reblogged?(original_status)).to eq false
+        expect(subject.reblogged?(original_status)).to be false
       end
     end
   end
@@ -344,9 +347,9 @@ RSpec.describe Account, type: :model do
     before do
       _missing = Fabricate(
         :account,
-        display_name: "Missing",
-        username: "missing",
-        domain: "missing.com"
+        display_name: 'Missing',
+        username: 'missing',
+        domain: 'missing.com'
       )
     end
 
@@ -404,58 +407,58 @@ RSpec.describe Account, type: :model do
     it 'finds accounts with matching display_name' do
       match = Fabricate(
         :account,
-        display_name: "Display Name",
-        username: "username",
-        domain: "example.com"
+        display_name: 'Display Name',
+        username: 'username',
+        domain: 'example.com'
       )
 
-      results = Account.search_for("display")
+      results = Account.search_for('display')
       expect(results).to eq [match]
     end
 
     it 'finds accounts with matching username' do
       match = Fabricate(
         :account,
-        display_name: "Display Name",
-        username: "username",
-        domain: "example.com"
+        display_name: 'Display Name',
+        username: 'username',
+        domain: 'example.com'
       )
 
-      results = Account.search_for("username")
+      results = Account.search_for('username')
       expect(results).to eq [match]
     end
 
     it 'finds accounts with matching domain' do
       match = Fabricate(
         :account,
-        display_name: "Display Name",
-        username: "username",
-        domain: "example.com"
+        display_name: 'Display Name',
+        username: 'username',
+        domain: 'example.com'
       )
 
-      results = Account.search_for("example")
+      results = Account.search_for('example')
       expect(results).to eq [match]
     end
 
     it 'limits by 10 by default' do
-      11.times.each { Fabricate(:account, display_name: "Display Name") }
-      results = Account.search_for("display")
+      11.times.each { Fabricate(:account, display_name: 'Display Name') }
+      results = Account.search_for('display')
       expect(results.size).to eq 10
     end
 
     it 'accepts arbitrary limits' do
-      2.times.each { Fabricate(:account, display_name: "Display Name") }
-      results = Account.search_for("display", limit: 1)
+      2.times.each { Fabricate(:account, display_name: 'Display Name') }
+      results = Account.search_for('display', limit: 1)
       expect(results.size).to eq 1
     end
 
     it 'ranks multiple matches higher' do
       matches = [
-        { username: "username", display_name: "username" },
-        { display_name: "Display Name", username: "username", domain: "example.com" },
+        { username: 'username', display_name: 'username' },
+        { display_name: 'Display Name', username: 'username', domain: 'example.com' },
       ].map(&method(:Fabricate).curry(2).call(:account))
 
-      results = Account.search_for("username")
+      results = Account.search_for('username')
       expect(results).to eq matches
     end
   end
@@ -581,23 +584,23 @@ RSpec.describe Account, type: :model do
     end
 
     it 'limits by 10 by default' do
-      11.times { Fabricate(:account, display_name: "Display Name") }
-      results = Account.advanced_search_for("display", account)
+      11.times { Fabricate(:account, display_name: 'Display Name') }
+      results = Account.advanced_search_for('display', account)
       expect(results.size).to eq 10
     end
 
     it 'accepts arbitrary limits' do
-      2.times { Fabricate(:account, display_name: "Display Name") }
-      results = Account.advanced_search_for("display", account, limit: 1)
+      2.times { Fabricate(:account, display_name: 'Display Name') }
+      results = Account.advanced_search_for('display', account, limit: 1)
       expect(results.size).to eq 1
     end
 
     it 'ranks followed accounts higher' do
-      match = Fabricate(:account, username: "Matching")
-      followed_match = Fabricate(:account, username: "Matcher")
+      match = Fabricate(:account, username: 'Matching')
+      followed_match = Fabricate(:account, username: 'Matcher')
       Fabricate(:follow, account: account, target_account: followed_match)
 
-      results = Account.advanced_search_for("match", account)
+      results = Account.advanced_search_for('match', account)
       expect(results).to eq [followed_match, match]
       expect(results.first.rank).to be > results.last.rank
     end
@@ -701,12 +704,6 @@ RSpec.describe Account, type: :model do
   end
 
   describe 'validations' do
-    it 'has a valid fabricator' do
-      account = Fabricate.build(:account)
-      account.valid?
-      expect(account).to be_valid
-    end
-
     it 'is invalid without a username' do
       account = Fabricate.build(:account, username: nil)
       account.valid?
@@ -810,19 +807,19 @@ RSpec.describe Account, type: :model do
       it 'is valid even if the username is longer than 30 characters' do
         account = Fabricate.build(:account, domain: 'domain', username: Faker::Lorem.characters(number: 31))
         account.valid?
-        expect(account).not_to model_have_error_on_field(:username)
+        expect(account).to_not model_have_error_on_field(:username)
       end
 
       it 'is valid even if the display name is longer than 30 characters' do
         account = Fabricate.build(:account, domain: 'domain', display_name: Faker::Lorem.characters(number: 31))
         account.valid?
-        expect(account).not_to model_have_error_on_field(:display_name)
+        expect(account).to_not model_have_error_on_field(:display_name)
       end
 
       it 'is valid even if the note is longer than 500 characters' do
         account = Fabricate.build(:account, domain: 'domain', note: Faker::Lorem.characters(number: 501))
         account.valid?
-        expect(account).not_to model_have_error_on_field(:note)
+        expect(account).to_not model_have_error_on_field(:note)
       end
     end
   end
@@ -894,7 +891,7 @@ RSpec.describe Account, type: :model do
 
     describe 'partitioned' do
       it 'returns a relation of accounts partitioned by domain' do
-        matches = ['a', 'b', 'a', 'b']
+        matches = %w(a b a b)
         matches.size.times.to_a.shuffle.each do |index|
           matches[index] = Fabricate(:account, domain: matches[index])
         end
@@ -957,7 +954,7 @@ RSpec.describe Account, type: :model do
     # Test disabled because test environment omits autogenerating keys for performance
     xit 'generates keys' do
       account = Account.create!(domain: nil, username: Faker::Internet.user_name(separators: ['_']))
-      expect(account.keypair.private?).to eq true
+      expect(account.keypair.private?).to be true
     end
   end
 
diff --git a/spec/models/account_statuses_cleanup_policy_spec.rb b/spec/models/account_statuses_cleanup_policy_spec.rb
index b01321a20..1b7857547 100644
--- a/spec/models/account_statuses_cleanup_policy_spec.rb
+++ b/spec/models/account_statuses_cleanup_policy_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe AccountStatusesCleanupPolicy, type: :model do
@@ -16,16 +18,15 @@ RSpec.describe AccountStatusesCleanupPolicy, type: :model do
     context 'when widening a policy' do
       let!(:account_statuses_cleanup_policy) do
         Fabricate(:account_statuses_cleanup_policy,
-          account: account,
-          keep_direct: true,
-          keep_pinned: true,
-          keep_polls: true,
-          keep_media: true,
-          keep_self_fav: true,
-          keep_self_bookmark: true,
-          min_favs: 1,
-          min_reblogs: 1
-        )
+                  account: account,
+                  keep_direct: true,
+                  keep_pinned: true,
+                  keep_polls: true,
+                  keep_media: true,
+                  keep_self_fav: true,
+                  keep_self_bookmark: true,
+                  min_favs: 1,
+                  min_reblogs: 1)
       end
 
       before do
@@ -35,77 +36,76 @@ RSpec.describe AccountStatusesCleanupPolicy, type: :model do
       it 'invalidates last_inspected when widened because of keep_direct' do
         account_statuses_cleanup_policy.keep_direct = false
         account_statuses_cleanup_policy.save
-        expect(account_statuses_cleanup_policy.last_inspected).to be nil
+        expect(account_statuses_cleanup_policy.last_inspected).to be_nil
       end
 
       it 'invalidates last_inspected when widened because of keep_pinned' do
         account_statuses_cleanup_policy.keep_pinned = false
         account_statuses_cleanup_policy.save
-        expect(account_statuses_cleanup_policy.last_inspected).to be nil
+        expect(account_statuses_cleanup_policy.last_inspected).to be_nil
       end
 
       it 'invalidates last_inspected when widened because of keep_polls' do
         account_statuses_cleanup_policy.keep_polls = false
         account_statuses_cleanup_policy.save
-        expect(account_statuses_cleanup_policy.last_inspected).to be nil
+        expect(account_statuses_cleanup_policy.last_inspected).to be_nil
       end
 
       it 'invalidates last_inspected when widened because of keep_media' do
         account_statuses_cleanup_policy.keep_media = false
         account_statuses_cleanup_policy.save
-        expect(account_statuses_cleanup_policy.last_inspected).to be nil
+        expect(account_statuses_cleanup_policy.last_inspected).to be_nil
       end
 
       it 'invalidates last_inspected when widened because of keep_self_fav' do
         account_statuses_cleanup_policy.keep_self_fav = false
         account_statuses_cleanup_policy.save
-        expect(account_statuses_cleanup_policy.last_inspected).to be nil
+        expect(account_statuses_cleanup_policy.last_inspected).to be_nil
       end
 
       it 'invalidates last_inspected when widened because of keep_self_bookmark' do
         account_statuses_cleanup_policy.keep_self_bookmark = false
         account_statuses_cleanup_policy.save
-        expect(account_statuses_cleanup_policy.last_inspected).to be nil
+        expect(account_statuses_cleanup_policy.last_inspected).to be_nil
       end
 
       it 'invalidates last_inspected when widened because of higher min_favs' do
         account_statuses_cleanup_policy.min_favs = 5
         account_statuses_cleanup_policy.save
-        expect(account_statuses_cleanup_policy.last_inspected).to be nil
+        expect(account_statuses_cleanup_policy.last_inspected).to be_nil
       end
 
       it 'invalidates last_inspected when widened because of disabled min_favs' do
         account_statuses_cleanup_policy.min_favs = nil
         account_statuses_cleanup_policy.save
-        expect(account_statuses_cleanup_policy.last_inspected).to be nil
+        expect(account_statuses_cleanup_policy.last_inspected).to be_nil
       end
 
       it 'invalidates last_inspected when widened because of higher min_reblogs' do
         account_statuses_cleanup_policy.min_reblogs = 5
         account_statuses_cleanup_policy.save
-        expect(account_statuses_cleanup_policy.last_inspected).to be nil
+        expect(account_statuses_cleanup_policy.last_inspected).to be_nil
       end
 
       it 'invalidates last_inspected when widened because of disable min_reblogs' do
         account_statuses_cleanup_policy.min_reblogs = nil
         account_statuses_cleanup_policy.save
-        expect(account_statuses_cleanup_policy.last_inspected).to be nil
+        expect(account_statuses_cleanup_policy.last_inspected).to be_nil
       end
     end
 
     context 'when narrowing a policy' do
       let!(:account_statuses_cleanup_policy) do
         Fabricate(:account_statuses_cleanup_policy,
-          account: account,
-          keep_direct: false,
-          keep_pinned: false,
-          keep_polls: false,
-          keep_media: false,
-          keep_self_fav: false,
-          keep_self_bookmark: false,
-          min_favs: nil,
-          min_reblogs: nil
-        )
+                  account: account,
+                  keep_direct: false,
+                  keep_pinned: false,
+                  keep_polls: false,
+                  keep_media: false,
+                  keep_self_fav: false,
+                  keep_self_bookmark: false,
+                  min_favs: nil,
+                  min_reblogs: nil)
       end
 
       it 'does not unnecessarily invalidate last_inspected' do
@@ -134,9 +134,10 @@ RSpec.describe AccountStatusesCleanupPolicy, type: :model do
   end
 
   describe '#invalidate_last_inspected' do
+    subject { account_statuses_cleanup_policy.invalidate_last_inspected(status, action) }
+
     let(:account_statuses_cleanup_policy) { Fabricate(:account_statuses_cleanup_policy, account: account) }
     let(:status) { Fabricate(:status, id: 10, account: account) }
-    subject { account_statuses_cleanup_policy.invalidate_last_inspected(status, action) }
 
     before do
       account_statuses_cleanup_policy.record_last_inspected(42)
@@ -232,11 +233,11 @@ RSpec.describe AccountStatusesCleanupPolicy, type: :model do
   end
 
   describe '#compute_cutoff_id' do
-    let!(:unrelated_status)  { Fabricate(:status, created_at: 3.years.ago) }
-    let(:account_statuses_cleanup_policy) { Fabricate(:account_statuses_cleanup_policy, account: account) }
-
     subject { account_statuses_cleanup_policy.compute_cutoff_id }
 
+    let!(:unrelated_status) { Fabricate(:status, created_at: 3.years.ago) }
+    let(:account_statuses_cleanup_policy) { Fabricate(:account_statuses_cleanup_policy, account: account) }
+
     context 'when the account has posted multiple toots' do
       let!(:very_old_status)   { Fabricate(:status, created_at: 3.years.ago, account: account) }
       let!(:old_status)        { Fabricate(:status, created_at: 3.weeks.ago, account: account) }
@@ -255,13 +256,15 @@ RSpec.describe AccountStatusesCleanupPolicy, type: :model do
   end
 
   describe '#statuses_to_delete' do
+    subject { account_statuses_cleanup_policy.statuses_to_delete }
+
     let!(:unrelated_status)  { Fabricate(:status, created_at: 3.years.ago) }
     let!(:very_old_status)   { Fabricate(:status, created_at: 3.years.ago, account: account) }
     let!(:pinned_status)     { Fabricate(:status, created_at: 1.year.ago, account: account) }
     let!(:direct_message)    { Fabricate(:status, created_at: 1.year.ago, account: account, visibility: :direct) }
     let!(:self_faved)        { Fabricate(:status, created_at: 1.year.ago, account: account) }
     let!(:self_bookmarked)   { Fabricate(:status, created_at: 1.year.ago, account: account) }
-    let!(:status_with_poll)  { Fabricate(:status, created_at: 1.year.ago, account: account, poll_attributes: { account: account, voters_count: 0, options: ['a', 'b'], expires_in: 2.days }) }
+    let!(:status_with_poll)  { Fabricate(:status, created_at: 1.year.ago, account: account, poll_attributes: { account: account, voters_count: 0, options: %w(a b), expires_in: 2.days }) }
     let!(:status_with_media) { Fabricate(:status, created_at: 1.year.ago, account: account) }
     let!(:faved4)            { Fabricate(:status, created_at: 1.year.ago, account: account) }
     let!(:faved5)            { Fabricate(:status, created_at: 1.year.ago, account: account) }
@@ -276,8 +279,6 @@ RSpec.describe AccountStatusesCleanupPolicy, type: :model do
 
     let(:account_statuses_cleanup_policy) { Fabricate(:account_statuses_cleanup_policy, account: account) }
 
-    subject { account_statuses_cleanup_policy.statuses_to_delete }
-
     before do
       4.times { faved4.increment_count!(:favourites_count) }
       5.times { faved5.increment_count!(:favourites_count) }
@@ -286,11 +287,11 @@ RSpec.describe AccountStatusesCleanupPolicy, type: :model do
     end
 
     context 'when passed a max_id' do
+      subject { account_statuses_cleanup_policy.statuses_to_delete(50, old_status.id).pluck(:id) }
+
       let!(:old_status)               { Fabricate(:status, created_at: 1.year.ago, account: account) }
       let!(:slightly_less_old_status) { Fabricate(:status, created_at: 6.months.ago, account: account) }
 
-      subject { account_statuses_cleanup_policy.statuses_to_delete(50, old_status.id).pluck(:id) }
-
       it 'returns statuses including max_id' do
         expect(subject).to include(old_status.id)
       end
@@ -305,11 +306,11 @@ RSpec.describe AccountStatusesCleanupPolicy, type: :model do
     end
 
     context 'when passed a min_id' do
+      subject { account_statuses_cleanup_policy.statuses_to_delete(50, recent_status.id, old_status.id).pluck(:id) }
+
       let!(:old_status)               { Fabricate(:status, created_at: 1.year.ago, account: account) }
       let!(:slightly_less_old_status) { Fabricate(:status, created_at: 6.months.ago, account: account) }
 
-      subject { account_statuses_cleanup_policy.statuses_to_delete(50, recent_status.id, old_status.id).pluck(:id) }
-
       it 'returns statuses including min_id' do
         expect(subject).to include(old_status.id)
       end
diff --git a/spec/models/account_statuses_filter_spec.rb b/spec/models/account_statuses_filter_spec.rb
index 03f0ffeb0..fa7664d92 100644
--- a/spec/models/account_statuses_filter_spec.rb
+++ b/spec/models/account_statuses_filter_spec.rb
@@ -3,12 +3,12 @@
 require 'rails_helper'
 
 RSpec.describe AccountStatusesFilter do
+  subject { described_class.new(account, current_account, params) }
+
   let(:account) { Fabricate(:account) }
   let(:current_account) { nil }
   let(:params) { {} }
 
-  subject { described_class.new(account, current_account, params) }
-
   def status!(visibility)
     Fabricate(:status, account: account, visibility: visibility)
   end
diff --git a/spec/models/account_warning_preset_spec.rb b/spec/models/account_warning_preset_spec.rb
new file mode 100644
index 000000000..f171df7c9
--- /dev/null
+++ b/spec/models/account_warning_preset_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe AccountWarningPreset do
+  describe 'alphabetical' do
+    let(:first) { Fabricate(:account_warning_preset, title: 'aaa', text: 'aaa') }
+    let(:second) { Fabricate(:account_warning_preset, title: 'bbb', text: 'aaa') }
+    let(:third) { Fabricate(:account_warning_preset, title: 'bbb', text: 'bbb') }
+
+    it 'returns records in order of title and text' do
+      results = described_class.alphabetic
+
+      expect(results).to eq([first, second, third])
+    end
+  end
+end
diff --git a/spec/models/admin/account_action_spec.rb b/spec/models/admin/account_action_spec.rb
index b6a052b76..9f41b7c8e 100644
--- a/spec/models/admin/account_action_spec.rb
+++ b/spec/models/admin/account_action_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Admin::AccountAction, type: :model do
@@ -5,15 +7,16 @@ RSpec.describe Admin::AccountAction, type: :model do
 
   describe '#save!' do
     subject              { account_action.save! }
+
     let(:account)        { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
     let(:target_account) { Fabricate(:account) }
     let(:type)           { 'disable' }
 
     before do
       account_action.assign_attributes(
-        type:            type,
+        type: type,
         current_account: account,
-        target_account:  target_account
+        target_account: target_account
       )
     end
 
diff --git a/spec/models/admin/appeal_filter_spec.rb b/spec/models/admin/appeal_filter_spec.rb
new file mode 100644
index 000000000..e840bc3bc
--- /dev/null
+++ b/spec/models/admin/appeal_filter_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe Admin::AppealFilter do
+  describe '#results' do
+    let(:approved_appeal) { Fabricate(:appeal, approved_at: 10.days.ago) }
+    let(:not_approved_appeal) { Fabricate(:appeal, approved_at: nil) }
+
+    it 'returns filtered appeals' do
+      filter = described_class.new(status: 'approved')
+
+      expect(filter.results).to eq([approved_appeal])
+    end
+  end
+end
diff --git a/spec/models/announcement_mute_spec.rb b/spec/models/announcement_mute_spec.rb
index 9d0e4c903..f4a7a5dc9 100644
--- a/spec/models/announcement_mute_spec.rb
+++ b/spec/models/announcement_mute_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe AnnouncementMute, type: :model do
diff --git a/spec/models/announcement_reaction_spec.rb b/spec/models/announcement_reaction_spec.rb
index f6e151584..38095b015 100644
--- a/spec/models/announcement_reaction_spec.rb
+++ b/spec/models/announcement_reaction_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe AnnouncementReaction, type: :model do
diff --git a/spec/models/announcement_spec.rb b/spec/models/announcement_spec.rb
index 7f7b647a9..024fa2888 100644
--- a/spec/models/announcement_spec.rb
+++ b/spec/models/announcement_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Announcement, type: :model do
diff --git a/spec/models/appeal_spec.rb b/spec/models/appeal_spec.rb
index 14062dc4f..12373a949 100644
--- a/spec/models/appeal_spec.rb
+++ b/spec/models/appeal_spec.rb
@@ -1,5 +1,38 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
-RSpec.describe Appeal, type: :model do
-  pending "add some examples to (or delete) #{__FILE__}"
+describe Appeal do
+  describe 'scopes' do
+    describe 'approved' do
+      let(:approved_appeal) { Fabricate(:appeal, approved_at: 10.days.ago) }
+      let(:not_approved_appeal) { Fabricate(:appeal, approved_at: nil) }
+
+      it 'finds the correct records' do
+        results = described_class.approved
+        expect(results).to eq([approved_appeal])
+      end
+    end
+
+    describe 'rejected' do
+      let(:rejected_appeal) { Fabricate(:appeal, rejected_at: 10.days.ago) }
+      let(:not_rejected_appeal) { Fabricate(:appeal, rejected_at: nil) }
+
+      it 'finds the correct records' do
+        results = described_class.rejected
+        expect(results).to eq([rejected_appeal])
+      end
+    end
+
+    describe 'pending' do
+      let(:approved_appeal) { Fabricate(:appeal, approved_at: 10.days.ago) }
+      let(:rejected_appeal) { Fabricate(:appeal, rejected_at: 10.days.ago) }
+      let(:pending_appeal) { Fabricate(:appeal, rejected_at: nil, approved_at: nil) }
+
+      it 'finds the correct records' do
+        results = described_class.pending
+        expect(results).to eq([pending_appeal])
+      end
+    end
+  end
 end
diff --git a/spec/models/backup_spec.rb b/spec/models/backup_spec.rb
index 45230986d..239e7aef7 100644
--- a/spec/models/backup_spec.rb
+++ b/spec/models/backup_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Backup, type: :model do
diff --git a/spec/models/block_spec.rb b/spec/models/block_spec.rb
index acbdc77f5..6e31786d0 100644
--- a/spec/models/block_spec.rb
+++ b/spec/models/block_spec.rb
@@ -1,12 +1,9 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Block, type: :model do
   describe 'validations' do
-    it 'has a valid fabricator' do
-      block = Fabricate.build(:block)
-      expect(block).to be_valid
-    end
-
     it 'is invalid without an account' do
       block = Fabricate.build(:block, account: nil)
       block.valid?
@@ -28,8 +25,8 @@ RSpec.describe Block, type: :model do
 
     Block.create!(account: account, target_account: target_account)
 
-    expect(Rails.cache.exist?("exclude_account_ids_for:#{account.id}")).to eq false
-    expect(Rails.cache.exist?("exclude_account_ids_for:#{target_account.id}")).to eq false
+    expect(Rails.cache.exist?("exclude_account_ids_for:#{account.id}")).to be false
+    expect(Rails.cache.exist?("exclude_account_ids_for:#{target_account.id}")).to be false
   end
 
   it 'removes blocking cache after destruction' do
@@ -41,7 +38,7 @@ RSpec.describe Block, type: :model do
 
     block.destroy!
 
-    expect(Rails.cache.exist?("exclude_account_ids_for:#{account.id}")).to eq false
-    expect(Rails.cache.exist?("exclude_account_ids_for:#{target_account.id}")).to eq false
+    expect(Rails.cache.exist?("exclude_account_ids_for:#{account.id}")).to be false
+    expect(Rails.cache.exist?("exclude_account_ids_for:#{target_account.id}")).to be false
   end
 end
diff --git a/spec/models/canonical_email_block_spec.rb b/spec/models/canonical_email_block_spec.rb
index 8e0050d65..2b3fd6d6a 100644
--- a/spec/models/canonical_email_block_spec.rb
+++ b/spec/models/canonical_email_block_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe CanonicalEmailBlock, type: :model do
diff --git a/spec/models/concerns/account_counters_spec.rb b/spec/models/concerns/account_counters_spec.rb
index 4350496e7..fb02d79f1 100644
--- a/spec/models/concerns/account_counters_spec.rb
+++ b/spec/models/concerns/account_counters_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 describe AccountCounters do
diff --git a/spec/models/concerns/account_interactions_spec.rb b/spec/models/concerns/account_interactions_spec.rb
index b5aecf6be..32e08d5f7 100644
--- a/spec/models/concerns/account_interactions_spec.rb
+++ b/spec/models/concerns/account_interactions_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 describe AccountInteractions do
@@ -14,20 +16,20 @@ describe AccountInteractions do
     context 'account with Follow' do
       it 'returns { target_account_id => { reblogs: true } }' do
         Fabricate(:follow, account: account, target_account: target_account)
-        is_expected.to eq(target_account_id => { reblogs: true, notify: false, languages: nil })
+        expect(subject).to eq(target_account_id => { reblogs: true, notify: false, languages: nil })
       end
     end
 
     context 'account with Follow but with reblogs disabled' do
       it 'returns { target_account_id => { reblogs: false } }' do
         Fabricate(:follow, account: account, target_account: target_account, show_reblogs: false)
-        is_expected.to eq(target_account_id => { reblogs: false, notify: false, languages: nil })
+        expect(subject).to eq(target_account_id => { reblogs: false, notify: false, languages: nil })
       end
     end
 
     context 'account without Follow' do
       it 'returns {}' do
-        is_expected.to eq({})
+        expect(subject).to eq({})
       end
     end
   end
@@ -38,13 +40,13 @@ describe AccountInteractions do
     context 'account with Follow' do
       it 'returns { target_account_id => true }' do
         Fabricate(:follow, account: target_account, target_account: account)
-        is_expected.to eq(target_account_id => true)
+        expect(subject).to eq(target_account_id => true)
       end
     end
 
     context 'account without Follow' do
       it 'returns {}' do
-        is_expected.to eq({})
+        expect(subject).to eq({})
       end
     end
   end
@@ -55,13 +57,13 @@ describe AccountInteractions do
     context 'account with Block' do
       it 'returns { target_account_id => true }' do
         Fabricate(:block, account: account, target_account: target_account)
-        is_expected.to eq(target_account_id => true)
+        expect(subject).to eq(target_account_id => true)
       end
     end
 
     context 'account without Block' do
       it 'returns {}' do
-        is_expected.to eq({})
+        expect(subject).to eq({})
       end
     end
   end
@@ -78,7 +80,7 @@ describe AccountInteractions do
         let(:hide) { true }
 
         it 'returns { target_account_id => { notifications: true } }' do
-          is_expected.to eq(target_account_id => { notifications: true })
+          expect(subject).to eq(target_account_id => { notifications: true })
         end
       end
 
@@ -86,14 +88,14 @@ describe AccountInteractions do
         let(:hide) { false }
 
         it 'returns { target_account_id => { notifications: false } }' do
-          is_expected.to eq(target_account_id => { notifications: false })
+          expect(subject).to eq(target_account_id => { notifications: false })
         end
       end
     end
 
     context 'account without Mute' do
       it 'returns {}' do
-        is_expected.to eq({})
+        expect(subject).to eq({})
       end
     end
   end
@@ -101,7 +103,7 @@ describe AccountInteractions do
   describe '#follow!' do
     it 'creates and returns Follow' do
       expect do
-        expect(account.follow!(target_account)).to be_kind_of Follow
+        expect(account.follow!(target_account)).to be_a Follow
       end.to change { account.following.count }.by 1
     end
   end
@@ -109,7 +111,7 @@ describe AccountInteractions do
   describe '#block' do
     it 'creates and returns Block' do
       expect do
-        expect(account.block!(target_account)).to be_kind_of Block
+        expect(account.block!(target_account)).to be_a Block
       end.to change { account.block_relationships.count }.by 1
     end
   end
@@ -123,7 +125,7 @@ describe AccountInteractions do
 
         it 'creates Mute, and returns Mute' do
           expect do
-            expect(subject).to be_kind_of Mute
+            expect(subject).to be_a Mute
           end.to change { account.mute_relationships.count }.by 1
         end
       end
@@ -133,7 +135,7 @@ describe AccountInteractions do
 
         it 'creates Mute, and returns Mute' do
           expect do
-            expect(subject).to be_kind_of Mute
+            expect(subject).to be_a Mute
           end.to change { account.mute_relationships.count }.by 1
         end
       end
@@ -143,7 +145,7 @@ describe AccountInteractions do
 
         it 'creates Mute, and returns Mute' do
           expect do
-            expect(subject).to be_kind_of Mute
+            expect(subject).to be_a Mute
           end.to change { account.mute_relationships.count }.by 1
         end
       end
@@ -156,8 +158,8 @@ describe AccountInteractions do
 
       let(:mute) do
         Fabricate(:mute,
-                  account:            account,
-                  target_account:     target_account,
+                  account: account,
+                  target_account: target_account,
                   hide_notifications: hide_notifications)
       end
 
@@ -169,8 +171,8 @@ describe AccountInteractions do
 
           it 'returns Mute without updating mute.hide_notifications' do
             expect do
-              expect(subject).to be_kind_of Mute
-            end.not_to change { mute.reload.hide_notifications? }.from(true)
+              expect(subject).to be_a Mute
+            end.to_not change { mute.reload.hide_notifications? }.from(true)
           end
         end
 
@@ -179,7 +181,7 @@ describe AccountInteractions do
 
           it 'returns Mute, and updates mute.hide_notifications false' do
             expect do
-              expect(subject).to be_kind_of Mute
+              expect(subject).to be_a Mute
             end.to change { mute.reload.hide_notifications? }.from(true).to(false)
           end
         end
@@ -189,8 +191,8 @@ describe AccountInteractions do
 
           it 'returns Mute without updating mute.hide_notifications' do
             expect do
-              expect(subject).to be_kind_of Mute
-            end.not_to change { mute.reload.hide_notifications? }.from(true)
+              expect(subject).to be_a Mute
+            end.to_not change { mute.reload.hide_notifications? }.from(true)
           end
         end
       end
@@ -203,7 +205,7 @@ describe AccountInteractions do
 
           it 'returns Mute, and updates mute.hide_notifications true' do
             expect do
-              expect(subject).to be_kind_of Mute
+              expect(subject).to be_a Mute
             end.to change { mute.reload.hide_notifications? }.from(false).to(true)
           end
         end
@@ -213,8 +215,8 @@ describe AccountInteractions do
 
           it 'returns Mute without updating mute.hide_notifications' do
             expect do
-              expect(subject).to be_kind_of Mute
-            end.not_to change { mute.reload.hide_notifications? }.from(false)
+              expect(subject).to be_a Mute
+            end.to_not change { mute.reload.hide_notifications? }.from(false)
           end
         end
 
@@ -223,7 +225,7 @@ describe AccountInteractions do
 
           it 'returns Mute, and updates mute.hide_notifications true' do
             expect do
-              expect(subject).to be_kind_of Mute
+              expect(subject).to be_a Mute
             end.to change { mute.reload.hide_notifications? }.from(false).to(true)
           end
         end
@@ -232,25 +234,25 @@ describe AccountInteractions do
   end
 
   describe '#mute_conversation!' do
-    let(:conversation) { Fabricate(:conversation) }
-
     subject { account.mute_conversation!(conversation) }
 
+    let(:conversation) { Fabricate(:conversation) }
+
     it 'creates and returns ConversationMute' do
       expect do
-        is_expected.to be_kind_of ConversationMute
+        expect(subject).to be_a ConversationMute
       end.to change { account.conversation_mutes.count }.by 1
     end
   end
 
   describe '#block_domain!' do
-    let(:domain) { 'example.com' }
-
     subject { account.block_domain!(domain) }
 
+    let(:domain) { 'example.com' }
+
     it 'creates and returns AccountDomainBlock' do
       expect do
-        is_expected.to be_kind_of AccountDomainBlock
+        expect(subject).to be_a AccountDomainBlock
       end.to change { account.domain_blocks.count }.by 1
     end
   end
@@ -261,14 +263,14 @@ describe AccountInteractions do
     context 'following target_account' do
       it 'returns destroyed Follow' do
         account.active_relationships.create(target_account: target_account)
-        is_expected.to be_kind_of Follow
+        expect(subject).to be_a Follow
         expect(subject).to be_destroyed
       end
     end
 
     context 'not following target_account' do
       it 'returns nil' do
-        is_expected.to be_nil
+        expect(subject).to be_nil
       end
     end
   end
@@ -279,14 +281,14 @@ describe AccountInteractions do
     context 'blocking target_account' do
       it 'returns destroyed Block' do
         account.block_relationships.create(target_account: target_account)
-        is_expected.to be_kind_of Block
+        expect(subject).to be_a Block
         expect(subject).to be_destroyed
       end
     end
 
     context 'not blocking target_account' do
       it 'returns nil' do
-        is_expected.to be_nil
+        expect(subject).to be_nil
       end
     end
   end
@@ -297,55 +299,55 @@ describe AccountInteractions do
     context 'muting target_account' do
       it 'returns destroyed Mute' do
         account.mute_relationships.create(target_account: target_account)
-        is_expected.to be_kind_of Mute
+        expect(subject).to be_a Mute
         expect(subject).to be_destroyed
       end
     end
 
     context 'not muting target_account' do
       it 'returns nil' do
-        is_expected.to be_nil
+        expect(subject).to be_nil
       end
     end
   end
 
   describe '#unmute_conversation!' do
-    let(:conversation) { Fabricate(:conversation) }
-
     subject { account.unmute_conversation!(conversation) }
 
+    let(:conversation) { Fabricate(:conversation) }
+
     context 'muting the conversation' do
       it 'returns destroyed ConversationMute' do
         account.conversation_mutes.create(conversation: conversation)
-        is_expected.to be_kind_of ConversationMute
+        expect(subject).to be_a ConversationMute
         expect(subject).to be_destroyed
       end
     end
 
     context 'not muting the conversation' do
       it 'returns nil' do
-        is_expected.to be nil
+        expect(subject).to be_nil
       end
     end
   end
 
   describe '#unblock_domain!' do
-    let(:domain) { 'example.com' }
-
     subject { account.unblock_domain!(domain) }
 
+    let(:domain) { 'example.com' }
+
     context 'blocking the domain' do
       it 'returns destroyed AccountDomainBlock' do
         account_domain_block = Fabricate(:account_domain_block, domain: domain)
         account.domain_blocks << account_domain_block
-        is_expected.to be_kind_of AccountDomainBlock
+        expect(subject).to be_a AccountDomainBlock
         expect(subject).to be_destroyed
       end
     end
 
     context 'unblocking the domain' do
       it 'returns nil' do
-        is_expected.to be_nil
+        expect(subject).to be_nil
       end
     end
   end
@@ -356,13 +358,13 @@ describe AccountInteractions do
     context 'following target_account' do
       it 'returns true' do
         account.active_relationships.create(target_account: target_account)
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
     context 'not following target_account' do
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
@@ -373,13 +375,13 @@ describe AccountInteractions do
     context 'followed by target_account' do
       it 'returns true' do
         account.passive_relationships.create(account: target_account)
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
     context 'not followed by target_account' do
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
@@ -390,33 +392,33 @@ describe AccountInteractions do
     context 'blocking target_account' do
       it 'returns true' do
         account.block_relationships.create(target_account: target_account)
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
     context 'not blocking target_account' do
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
 
   describe '#domain_blocking?' do
-    let(:domain)               { 'example.com' }
-
     subject { account.domain_blocking?(domain) }
 
+    let(:domain) { 'example.com' }
+
     context 'blocking the domain' do
-      it' returns true' do
+      it 'returns true' do
         account_domain_block = Fabricate(:account_domain_block, domain: domain)
         account.domain_blocks << account_domain_block
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
     context 'not blocking the domain' do
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
@@ -428,49 +430,49 @@ describe AccountInteractions do
       it 'returns true' do
         mute = Fabricate(:mute, account: account, target_account: target_account)
         account.mute_relationships << mute
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
     context 'not muting target_account' do
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
 
   describe '#muting_conversation?' do
-    let(:conversation) { Fabricate(:conversation) }
-
     subject { account.muting_conversation?(conversation) }
 
+    let(:conversation) { Fabricate(:conversation) }
+
     context 'muting the conversation' do
       it 'returns true' do
         account.conversation_mutes.create(conversation: conversation)
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
     context 'not muting the conversation' do
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
 
   describe '#muting_notifications?' do
+    subject { account.muting_notifications?(target_account) }
+
     before do
       mute = Fabricate(:mute, target_account: target_account, account: account, hide_notifications: hide)
       account.mute_relationships << mute
     end
 
-    subject { account.muting_notifications?(target_account) }
-
     context 'muting notifications of target_account' do
       let(:hide) { true }
 
       it 'returns true' do
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
@@ -478,7 +480,7 @@ describe AccountInteractions do
       let(:hide) { false }
 
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
@@ -489,27 +491,27 @@ describe AccountInteractions do
     context 'requested by target_account' do
       it 'returns true' do
         Fabricate(:follow_request, account: account, target_account: target_account)
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
     context 'not requested by target_account' do
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
 
   describe '#favourited?' do
-    let(:status) { Fabricate(:status, account: account, favourites: favourites) }
-
     subject { account.favourited?(status) }
 
+    let(:status) { Fabricate(:status, account: account, favourites: favourites) }
+
     context 'favorited' do
       let(:favourites) { [Fabricate(:favourite, account: account)] }
 
       it 'returns true' do
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
@@ -517,21 +519,21 @@ describe AccountInteractions do
       let(:favourites) { [] }
 
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
 
   describe '#reblogged?' do
-    let(:status) { Fabricate(:status, account: account, reblogs: reblogs) }
-
     subject { account.reblogged?(status) }
 
+    let(:status) { Fabricate(:status, account: account, reblogs: reblogs) }
+
     context 'reblogged' do
       let(:reblogs) { [Fabricate(:status, account: account)] }
 
       it 'returns true' do
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
@@ -539,26 +541,26 @@ describe AccountInteractions do
       let(:reblogs) { [] }
 
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
 
   describe '#pinned?' do
-    let(:status) { Fabricate(:status, account: account) }
-
     subject { account.pinned?(status) }
 
+    let(:status) { Fabricate(:status, account: account) }
+
     context 'pinned' do
       it 'returns true' do
         Fabricate(:status_pin, account: account, status: status)
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
     context 'not pinned' do
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
@@ -688,41 +690,4 @@ describe AccountInteractions do
       end
     end
   end
-
-  describe 'ignoring reblogs from an account' do
-    before do
-      @me = Fabricate(:account, username: 'Me')
-      @you = Fabricate(:account, username: 'You')
-    end
-
-    context 'with the reblogs option unspecified' do
-      before do
-        @me.follow!(@you)
-      end
-
-      it 'defaults to showing reblogs' do
-        expect(@me.muting_reblogs?(@you)).to be(false)
-      end
-    end
-
-    context 'with the reblogs option set to false' do
-      before do
-        @me.follow!(@you, reblogs: false)
-      end
-
-      it 'does mute reblogs' do
-        expect(@me.muting_reblogs?(@you)).to be(true)
-      end
-    end
-
-    context 'with the reblogs option set to true' do
-      before do
-        @me.follow!(@you, reblogs: true)
-      end
-
-      it 'does not mute reblogs' do
-        expect(@me.muting_reblogs?(@you)).to be(false)
-      end
-    end
-  end
 end
diff --git a/spec/models/concerns/remotable_spec.rb b/spec/models/concerns/remotable_spec.rb
index 9cc849ded..964520427 100644
--- a/spec/models/concerns/remotable_spec.rb
+++ b/spec/models/concerns/remotable_spec.rb
@@ -147,8 +147,8 @@ RSpec.describe Remotable do
         let(:code) { 500 }
 
         it 'does not assign file' do
-          expect(foo).not_to receive(:public_send).with("#{hoge}=", any_args)
-          expect(foo).not_to receive(:public_send).with("#{hoge}_file_name=", any_args)
+          expect(foo).to_not receive(:public_send).with("#{hoge}=", any_args)
+          expect(foo).to_not receive(:public_send).with("#{hoge}_file_name=", any_args)
 
           foo.hoge_remote_url = url
         end
@@ -194,7 +194,9 @@ RSpec.describe Remotable do
           let(:error_class) { error_class }
 
           it 'calls Rails.logger.debug' do
-            expect(Rails.logger).to receive(:debug).with(/^Error fetching remote #{hoge}: /)
+            expect(Rails.logger).to receive(:debug) do |&block|
+              expect(block.call).to match(/^Error fetching remote #{hoge}: /)
+            end
             foo.hoge_remote_url = url
           end
         end
diff --git a/spec/models/conversation_mute_spec.rb b/spec/models/conversation_mute_spec.rb
index 3fc2915d4..6439b0ecd 100644
--- a/spec/models/conversation_mute_spec.rb
+++ b/spec/models/conversation_mute_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe ConversationMute, type: :model do
diff --git a/spec/models/conversation_spec.rb b/spec/models/conversation_spec.rb
index 8b5e4fdaf..9d58ad0ac 100644
--- a/spec/models/conversation_spec.rb
+++ b/spec/models/conversation_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Conversation, type: :model do
diff --git a/spec/models/custom_emoji_category_spec.rb b/spec/models/custom_emoji_category_spec.rb
index 160033f4d..30de07bd8 100644
--- a/spec/models/custom_emoji_category_spec.rb
+++ b/spec/models/custom_emoji_category_spec.rb
@@ -1,5 +1,14 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
-RSpec.describe CustomEmojiCategory, type: :model do
-  pending "add some examples to (or delete) #{__FILE__}"
+describe CustomEmojiCategory do
+  describe 'validations' do
+    it 'validates name presence' do
+      record = described_class.new(name: nil)
+
+      expect(record).to_not be_valid
+      expect(record).to model_have_error_on_field(:name)
+    end
+  end
 end
diff --git a/spec/models/custom_emoji_filter_spec.rb b/spec/models/custom_emoji_filter_spec.rb
index 2b1b5dc54..30f0ec2b2 100644
--- a/spec/models/custom_emoji_filter_spec.rb
+++ b/spec/models/custom_emoji_filter_spec.rb
@@ -4,18 +4,18 @@ require 'rails_helper'
 
 RSpec.describe CustomEmojiFilter do
   describe '#results' do
+    subject { described_class.new(params).results }
+
     let!(:custom_emoji_0) { Fabricate(:custom_emoji, domain: 'a') }
     let!(:custom_emoji_1) { Fabricate(:custom_emoji, domain: 'b') }
     let!(:custom_emoji_2) { Fabricate(:custom_emoji, domain: nil, shortcode: 'hoge') }
 
-    subject { described_class.new(params).results }
-
     context 'params have values' do
       context 'local' do
         let(:params) { { local: true } }
 
         it 'returns ActiveRecord::Relation' do
-          expect(subject).to be_kind_of(ActiveRecord::Relation)
+          expect(subject).to be_a(ActiveRecord::Relation)
           expect(subject).to match_array([custom_emoji_2])
         end
       end
@@ -24,7 +24,7 @@ RSpec.describe CustomEmojiFilter do
         let(:params) { { remote: true } }
 
         it 'returns ActiveRecord::Relation' do
-          expect(subject).to be_kind_of(ActiveRecord::Relation)
+          expect(subject).to be_a(ActiveRecord::Relation)
           expect(subject).to match_array([custom_emoji_0, custom_emoji_1])
         end
       end
@@ -33,7 +33,7 @@ RSpec.describe CustomEmojiFilter do
         let(:params) { { by_domain: 'a' } }
 
         it 'returns ActiveRecord::Relation' do
-          expect(subject).to be_kind_of(ActiveRecord::Relation)
+          expect(subject).to be_a(ActiveRecord::Relation)
           expect(subject).to match_array([custom_emoji_0])
         end
       end
@@ -42,7 +42,7 @@ RSpec.describe CustomEmojiFilter do
         let(:params) { { shortcode: 'hoge' } }
 
         it 'returns ActiveRecord::Relation' do
-          expect(subject).to be_kind_of(ActiveRecord::Relation)
+          expect(subject).to be_a(ActiveRecord::Relation)
           expect(subject).to match_array([custom_emoji_2])
         end
       end
@@ -62,7 +62,7 @@ RSpec.describe CustomEmojiFilter do
       let(:params) { { hoge: nil } }
 
       it 'returns ActiveRecord::Relation' do
-        expect(subject).to be_kind_of(ActiveRecord::Relation)
+        expect(subject).to be_a(ActiveRecord::Relation)
         expect(subject).to match_array([custom_emoji_0, custom_emoji_1, custom_emoji_2])
       end
     end
diff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb
index 9de218b4f..ef5f39aca 100644
--- a/spec/models/custom_emoji_spec.rb
+++ b/spec/models/custom_emoji_spec.rb
@@ -1,17 +1,19 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe CustomEmoji, type: :model do
   describe '#search' do
-    let(:custom_emoji) { Fabricate(:custom_emoji, shortcode: shortcode) }
-
     subject { described_class.search(search_term) }
 
+    let(:custom_emoji) { Fabricate(:custom_emoji, shortcode: shortcode) }
+
     context 'shortcode is exact' do
       let(:shortcode) { 'blobpats' }
       let(:search_term) { 'blobpats' }
 
       it 'finds emoji' do
-        is_expected.to include(custom_emoji)
+        expect(subject).to include(custom_emoji)
       end
     end
 
@@ -20,21 +22,21 @@ RSpec.describe CustomEmoji, type: :model do
       let(:search_term) { 'blob' }
 
       it 'finds emoji' do
-        is_expected.to include(custom_emoji)
+        expect(subject).to include(custom_emoji)
       end
     end
   end
 
   describe '#local?' do
-    let(:custom_emoji) { Fabricate(:custom_emoji, domain: domain) }
-
     subject { custom_emoji.local? }
 
+    let(:custom_emoji) { Fabricate(:custom_emoji, domain: domain) }
+
     context 'domain is nil' do
       let(:domain) { nil }
 
       it 'returns true' do
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
@@ -42,7 +44,7 @@ RSpec.describe CustomEmoji, type: :model do
       let(:domain) { 'example.com' }
 
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
@@ -55,15 +57,15 @@ RSpec.describe CustomEmoji, type: :model do
   end
 
   describe '.from_text' do
-    let!(:emojo) { Fabricate(:custom_emoji) }
-
     subject { described_class.from_text(text, nil) }
 
+    let!(:emojo) { Fabricate(:custom_emoji) }
+
     context 'with plain text' do
       let(:text) { 'Hello :coolcat:' }
 
       it 'returns records used via shortcodes in text' do
-        is_expected.to include(emojo)
+        expect(subject).to include(emojo)
       end
     end
 
@@ -71,7 +73,7 @@ RSpec.describe CustomEmoji, type: :model do
       let(:text) { '<p>Hello :coolcat:</p>' }
 
       it 'returns records used via shortcodes in text' do
-        is_expected.to include(emojo)
+        expect(subject).to include(emojo)
       end
     end
   end
@@ -79,7 +81,7 @@ RSpec.describe CustomEmoji, type: :model do
   describe 'pre_validation' do
     let(:custom_emoji) { Fabricate(:custom_emoji, domain: 'wWw.MaStOdOn.CoM') }
 
-    it 'should downcase' do
+    it 'downcases' do
       custom_emoji.valid?
       expect(custom_emoji.domain).to eq('www.mastodon.com')
     end
diff --git a/spec/models/custom_filter_keyword_spec.rb b/spec/models/custom_filter_keyword_spec.rb
index e15b9dad5..bbc4b9c2e 100644
--- a/spec/models/custom_filter_keyword_spec.rb
+++ b/spec/models/custom_filter_keyword_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe CustomFilterKeyword, type: :model do
diff --git a/spec/models/custom_filter_spec.rb b/spec/models/custom_filter_spec.rb
index 3943dd5f1..d2bc090ab 100644
--- a/spec/models/custom_filter_spec.rb
+++ b/spec/models/custom_filter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe CustomFilter, type: :model do
diff --git a/spec/models/device_spec.rb b/spec/models/device_spec.rb
index f56fbf978..cb214b9cb 100644
--- a/spec/models/device_spec.rb
+++ b/spec/models/device_spec.rb
@@ -1,5 +1,6 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Device, type: :model do
-
 end
diff --git a/spec/models/domain_allow_spec.rb b/spec/models/domain_allow_spec.rb
index e65435127..49e16376e 100644
--- a/spec/models/domain_allow_spec.rb
+++ b/spec/models/domain_allow_spec.rb
@@ -1,5 +1,18 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
-RSpec.describe DomainAllow, type: :model do
-  pending "add some examples to (or delete) #{__FILE__}"
+describe DomainAllow do
+  describe 'scopes' do
+    describe 'matches_domain' do
+      let(:domain) { Fabricate(:domain_allow, domain: 'example.com') }
+      let(:other_domain) { Fabricate(:domain_allow, domain: 'example.biz') }
+
+      it 'returns the correct records' do
+        results = described_class.matches_domain('example.com')
+
+        expect(results).to eq([domain])
+      end
+    end
+  end
 end
diff --git a/spec/models/domain_block_spec.rb b/spec/models/domain_block_spec.rb
index 28647dc89..9839ee9d4 100644
--- a/spec/models/domain_block_spec.rb
+++ b/spec/models/domain_block_spec.rb
@@ -1,12 +1,9 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe DomainBlock, type: :model do
   describe 'validations' do
-    it 'has a valid fabricator' do
-      domain_block = Fabricate.build(:domain_block)
-      expect(domain_block).to be_valid
-    end
-
     it 'is invalid without a domain' do
       domain_block = Fabricate.build(:domain_block, domain: nil)
       domain_block.valid?
@@ -24,16 +21,16 @@ RSpec.describe DomainBlock, type: :model do
   describe '.blocked?' do
     it 'returns true if the domain is suspended' do
       Fabricate(:domain_block, domain: 'example.com', severity: :suspend)
-      expect(DomainBlock.blocked?('example.com')).to eq true
+      expect(DomainBlock.blocked?('example.com')).to be true
     end
 
     it 'returns false even if the domain is silenced' do
       Fabricate(:domain_block, domain: 'example.com', severity: :silence)
-      expect(DomainBlock.blocked?('example.com')).to eq false
+      expect(DomainBlock.blocked?('example.com')).to be false
     end
 
     it 'returns false if the domain is not suspended nor silenced' do
-      expect(DomainBlock.blocked?('example.com')).to eq false
+      expect(DomainBlock.blocked?('example.com')).to be false
     end
   end
 
diff --git a/spec/models/email_domain_block_spec.rb b/spec/models/email_domain_block_spec.rb
index e23116888..3321ffc81 100644
--- a/spec/models/email_domain_block_spec.rb
+++ b/spec/models/email_domain_block_spec.rb
@@ -1,13 +1,8 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe EmailDomainBlock, type: :model do
-  describe 'validations' do
-    it 'has a valid fabricator' do
-      email_domain_block = Fabricate.build(:email_domain_block)
-      expect(email_domain_block).to be_valid
-    end
-  end
-
   describe 'block?' do
     let(:input) { nil }
 
diff --git a/spec/models/encrypted_message_spec.rb b/spec/models/encrypted_message_spec.rb
index 1238d57b6..bf7a406ff 100644
--- a/spec/models/encrypted_message_spec.rb
+++ b/spec/models/encrypted_message_spec.rb
@@ -1,5 +1,6 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe EncryptedMessage, type: :model do
-
 end
diff --git a/spec/models/export_spec.rb b/spec/models/export_spec.rb
index 135d7a36b..3fb5fc3a5 100644
--- a/spec/models/export_spec.rb
+++ b/spec/models/export_spec.rb
@@ -1,9 +1,11 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 describe Export do
   let(:account) { Fabricate(:account) }
   let(:target_accounts) do
-    [ {}, { username: 'one', domain: 'local.host' } ].map(&method(:Fabricate).curry(2).call(:account))
+    [{}, { username: 'one', domain: 'local.host' }].map(&method(:Fabricate).curry(2).call(:account))
   end
 
   describe 'to_csv' do
diff --git a/spec/models/extended_description_spec.rb b/spec/models/extended_description_spec.rb
new file mode 100644
index 000000000..ecc27c0f6
--- /dev/null
+++ b/spec/models/extended_description_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe ExtendedDescription do
+  describe '.current' do
+    context 'with the default values' do
+      it 'makes a new instance' do
+        record = described_class.current
+
+        expect(record.text).to be_nil
+        expect(record.updated_at).to be_nil
+      end
+    end
+
+    context 'with a custom setting value' do
+      before do
+        setting = instance_double(Setting, value: 'Extended text', updated_at: 10.days.ago)
+        allow(Setting).to receive(:find_by).with(var: 'site_extended_description').and_return(setting)
+      end
+
+      it 'has the privacy text' do
+        record = described_class.current
+
+        expect(record.text).to eq('Extended text')
+      end
+    end
+  end
+end
diff --git a/spec/models/favourite_spec.rb b/spec/models/favourite_spec.rb
index ba1410a45..f7e2812a6 100644
--- a/spec/models/favourite_spec.rb
+++ b/spec/models/favourite_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Favourite, type: :model do
@@ -9,7 +11,7 @@ RSpec.describe Favourite, type: :model do
 
     it 'invalidates if the reblogged status is already a favourite' do
       Favourite.create!(account: account, status: reblog)
-      expect(Favourite.new(account: account, status: status).valid?).to eq false
+      expect(Favourite.new(account: account, status: status).valid?).to be false
     end
 
     it 'replaces status with the reblogged one if it is a reblog' do
diff --git a/spec/models/featured_tag_spec.rb b/spec/models/featured_tag_spec.rb
index 07533e0b9..4bf087c82 100644
--- a/spec/models/featured_tag_spec.rb
+++ b/spec/models/featured_tag_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe FeaturedTag, type: :model do
diff --git a/spec/models/follow_recommendation_suppression_spec.rb b/spec/models/follow_recommendation_suppression_spec.rb
index 39107a2b0..4c1d8281b 100644
--- a/spec/models/follow_recommendation_suppression_spec.rb
+++ b/spec/models/follow_recommendation_suppression_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe FollowRecommendationSuppression, type: :model do
diff --git a/spec/models/follow_request_spec.rb b/spec/models/follow_request_spec.rb
index c456c285f..ff81cd78d 100644
--- a/spec/models/follow_request_spec.rb
+++ b/spec/models/follow_request_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe FollowRequest, type: :model do
diff --git a/spec/models/follow_spec.rb b/spec/models/follow_spec.rb
index e723a1ef2..a9a9af88a 100644
--- a/spec/models/follow_spec.rb
+++ b/spec/models/follow_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Follow, type: :model do
@@ -7,11 +9,6 @@ RSpec.describe Follow, type: :model do
   describe 'validations' do
     subject { Follow.new(account: alice, target_account: bob, rate_limit: true) }
 
-    it 'has a valid fabricator' do
-      follow = Fabricate.build(:follow)
-      expect(follow).to be_valid
-    end
-
     it 'is invalid without an account' do
       follow = Fabricate.build(:follow, account: nil)
       follow.valid?
diff --git a/spec/models/form/admin_settings_spec.rb b/spec/models/form/admin_settings_spec.rb
new file mode 100644
index 000000000..0dc2d881a
--- /dev/null
+++ b/spec/models/form/admin_settings_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe Form::AdminSettings do
+  describe 'validations' do
+    describe 'site_contact_username' do
+      context 'with no accounts' do
+        it 'is not valid' do
+          setting = described_class.new(site_contact_username: 'Test')
+          setting.valid?
+
+          expect(setting).to model_have_error_on_field(:site_contact_username)
+        end
+      end
+
+      context 'with an account' do
+        before { Fabricate(:account, username: 'Glorp') }
+
+        it 'is not valid when account doesnt match' do
+          setting = described_class.new(site_contact_username: 'Test')
+          setting.valid?
+
+          expect(setting).to model_have_error_on_field(:site_contact_username)
+        end
+
+        it 'is valid when account matches' do
+          setting = described_class.new(site_contact_username: 'Glorp')
+          setting.valid?
+
+          expect(setting).to_not model_have_error_on_field(:site_contact_username)
+        end
+      end
+    end
+  end
+end
diff --git a/spec/models/form/status_filter_batch_action_spec.rb b/spec/models/form/status_filter_batch_action_spec.rb
new file mode 100644
index 000000000..f06a11cc8
--- /dev/null
+++ b/spec/models/form/status_filter_batch_action_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe Form::StatusFilterBatchAction do
+  describe '#save!' do
+    it 'does nothing if status_filter_ids is empty' do
+      batch_action = described_class.new(status_filter_ids: [])
+
+      expect(batch_action.save!).to be_nil
+    end
+  end
+end
diff --git a/spec/models/home_feed_spec.rb b/spec/models/home_feed_spec.rb
index 80f6edbff..d7034f3f0 100644
--- a/spec/models/home_feed_spec.rb
+++ b/spec/models/home_feed_spec.rb
@@ -1,10 +1,12 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe HomeFeed, type: :model do
-  let(:account) { Fabricate(:account) }
-
   subject { described_class.new(account) }
 
+  let(:account) { Fabricate(:account) }
+
   describe '#get' do
     before do
       Fabricate(:status, account: account, id: 1)
diff --git a/spec/models/identity_spec.rb b/spec/models/identity_spec.rb
index 689c9b797..6eab5a2e1 100644
--- a/spec/models/identity_spec.rb
+++ b/spec/models/identity_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Identity, type: :model do
diff --git a/spec/models/import_spec.rb b/spec/models/import_spec.rb
index a5eec1722..1c8474413 100644
--- a/spec/models/import_spec.rb
+++ b/spec/models/import_spec.rb
@@ -1,9 +1,11 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Import, type: :model do
-  let (:account) { Fabricate(:account) }
-  let (:type) { 'following' }
-  let (:data) { attachment_fixture('imports.txt') }
+  let(:account) { Fabricate(:account) }
+  let(:type) { 'following' }
+  let(:data) { attachment_fixture('imports.txt') }
 
   describe 'validations' do
     it 'has a valid parameters' do
@@ -21,6 +23,11 @@ RSpec.describe Import, type: :model do
       expect(import).to model_have_error_on_field(:data)
     end
 
+    it 'is invalid with malformed data' do
+      import = Import.create(account: account, type: type, data: StringIO.new('\"test'))
+      expect(import).to model_have_error_on_field(:data)
+    end
+
     it 'is invalid with too many rows in data' do
       import = Import.create(account: account, type: type, data: StringIO.new("foo@bar.com\n" * (ImportService::ROWS_PROCESSING_LIMIT + 10)))
       expect(import).to model_have_error_on_field(:data)
diff --git a/spec/models/invite_spec.rb b/spec/models/invite_spec.rb
index b0596c561..dac4b6431 100644
--- a/spec/models/invite_spec.rb
+++ b/spec/models/invite_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Invite, type: :model do
diff --git a/spec/models/ip_block_spec.rb b/spec/models/ip_block_spec.rb
index 6603c6417..ed5882667 100644
--- a/spec/models/ip_block_spec.rb
+++ b/spec/models/ip_block_spec.rb
@@ -1,5 +1,15 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
-RSpec.describe IpBlock, type: :model do
-  pending "add some examples to (or delete) #{__FILE__}"
+describe IpBlock do
+  describe 'to_log_human_identifier' do
+    let(:ip_block) { described_class.new(ip: '192.168.0.1') }
+
+    it 'combines the IP and prefix into a string' do
+      result = ip_block.to_log_human_identifier
+
+      expect(result).to eq('192.168.0.1/32')
+    end
+  end
 end
diff --git a/spec/models/list_account_spec.rb b/spec/models/list_account_spec.rb
index a0cf02efe..8312defac 100644
--- a/spec/models/list_account_spec.rb
+++ b/spec/models/list_account_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe ListAccount, type: :model do
diff --git a/spec/models/list_spec.rb b/spec/models/list_spec.rb
index b780bb1de..8167f8a7e 100644
--- a/spec/models/list_spec.rb
+++ b/spec/models/list_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe List, type: :model do
diff --git a/spec/models/login_activity_spec.rb b/spec/models/login_activity_spec.rb
index ba2d207c9..1c3111a20 100644
--- a/spec/models/login_activity_spec.rb
+++ b/spec/models/login_activity_spec.rb
@@ -1,5 +1,6 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe LoginActivity, type: :model do
-
 end
diff --git a/spec/models/marker_spec.rb b/spec/models/marker_spec.rb
index d716aa75c..51dd58438 100644
--- a/spec/models/marker_spec.rb
+++ b/spec/models/marker_spec.rb
@@ -1,5 +1,16 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
-RSpec.describe Marker, type: :model do
-  pending "add some examples to (or delete) #{__FILE__}"
+describe Marker do
+  describe 'validations' do
+    describe 'timeline' do
+      it 'must be included in valid list' do
+        record = described_class.new(timeline: 'not real timeline')
+
+        expect(record).to_not be_valid
+        expect(record).to model_have_error_on_field(:timeline)
+      end
+    end
+  end
 end
diff --git a/spec/models/media_attachment_spec.rb b/spec/models/media_attachment_spec.rb
index 29fd313ae..63edfc152 100644
--- a/spec/models/media_attachment_spec.rb
+++ b/spec/models/media_attachment_spec.rb
@@ -1,16 +1,18 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe MediaAttachment, type: :model do
   describe 'local?' do
-    let(:media_attachment) { Fabricate(:media_attachment, remote_url: remote_url) }
-
     subject { media_attachment.local? }
 
+    let(:media_attachment) { Fabricate(:media_attachment, remote_url: remote_url) }
+
     context 'remote_url is blank' do
       let(:remote_url) { '' }
 
       it 'returns true' do
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
@@ -18,16 +20,16 @@ RSpec.describe MediaAttachment, type: :model do
       let(:remote_url) { 'remote_url' }
 
       it 'returns false' do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
 
   describe 'needs_redownload?' do
-    let(:media_attachment) { Fabricate(:media_attachment, remote_url: remote_url, file: file) }
-
     subject { media_attachment.needs_redownload? }
 
+    let(:media_attachment) { Fabricate(:media_attachment, remote_url: remote_url, file: file) }
+
     context 'file is blank' do
       let(:file) { nil }
 
@@ -35,7 +37,7 @@ RSpec.describe MediaAttachment, type: :model do
         let(:remote_url) { 'remote_url' }
 
         it 'returns true' do
-          is_expected.to be true
+          expect(subject).to be true
         end
       end
     end
@@ -47,7 +49,7 @@ RSpec.describe MediaAttachment, type: :model do
         let(:remote_url) { '' }
 
         it 'returns false' do
-          is_expected.to be false
+          expect(subject).to be false
         end
       end
 
@@ -55,7 +57,7 @@ RSpec.describe MediaAttachment, type: :model do
         let(:remote_url) { 'remote_url' }
 
         it 'returns true' do
-          is_expected.to be false
+          expect(subject).to be false
         end
       end
     end
@@ -94,8 +96,8 @@ RSpec.describe MediaAttachment, type: :model do
     end
 
     it 'sets meta' do
-      expect(media.file.meta["original"]["width"]).to eq 128
-      expect(media.file.meta["original"]["height"]).to eq 128
+      expect(media.file.meta['original']['width']).to eq 128
+      expect(media.file.meta['original']['height']).to eq 128
     end
   end
 
@@ -118,9 +120,9 @@ RSpec.describe MediaAttachment, type: :model do
         end
 
         it 'sets meta' do
-          expect(media.file.meta["original"]["width"]).to eq fixture[:width]
-          expect(media.file.meta["original"]["height"]).to eq fixture[:height]
-          expect(media.file.meta["original"]["aspect"]).to eq fixture[:aspect]
+          expect(media.file.meta['original']['width']).to eq fixture[:width]
+          expect(media.file.meta['original']['height']).to eq fixture[:height]
+          expect(media.file.meta['original']['aspect']).to eq fixture[:aspect]
         end
       end
     end
@@ -138,7 +140,7 @@ RSpec.describe MediaAttachment, type: :model do
     end
 
     it 'extracts thumbnail' do
-      expect(media.thumbnail.present?).to eq true
+      expect(media.thumbnail.present?).to be true
     end
 
     it 'extracts colors from thumbnail' do
@@ -154,12 +156,12 @@ RSpec.describe MediaAttachment, type: :model do
     let(:media) { MediaAttachment.create(account: Fabricate(:account), file: attachment_fixture('attachment.jpg')) }
 
     it 'sets meta for different style' do
-      expect(media.file.meta["original"]["width"]).to eq 600
-      expect(media.file.meta["original"]["height"]).to eq 400
-      expect(media.file.meta["original"]["aspect"]).to eq 1.5
-      expect(media.file.meta["small"]["width"]).to eq 588
-      expect(media.file.meta["small"]["height"]).to eq 392
-      expect(media.file.meta["small"]["aspect"]).to eq 1.5
+      expect(media.file.meta['original']['width']).to eq 600
+      expect(media.file.meta['original']['height']).to eq 400
+      expect(media.file.meta['original']['aspect']).to eq 1.5
+      expect(media.file.meta['small']['width']).to eq 588
+      expect(media.file.meta['small']['height']).to eq 392
+      expect(media.file.meta['small']['aspect']).to eq 1.5
     end
 
     it 'gives the file a random name' do
diff --git a/spec/models/mention_spec.rb b/spec/models/mention_spec.rb
index dbcf6a32c..044bb80cf 100644
--- a/spec/models/mention_spec.rb
+++ b/spec/models/mention_spec.rb
@@ -1,12 +1,9 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Mention, type: :model do
   describe 'validations' do
-    it 'has a valid fabricator' do
-      mention = Fabricate.build(:mention)
-      expect(mention).to be_valid
-    end
-
     it 'is invalid without an account' do
       mention = Fabricate.build(:mention, account: nil)
       mention.valid?
diff --git a/spec/models/mute_spec.rb b/spec/models/mute_spec.rb
index 38a87bdf4..48b5a37ab 100644
--- a/spec/models/mute_spec.rb
+++ b/spec/models/mute_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Mute, type: :model do
diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb
index 1e9e45d8d..64527e3d7 100644
--- a/spec/models/notification_spec.rb
+++ b/spec/models/notification_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Notification, type: :model do
@@ -68,7 +70,7 @@ RSpec.describe Notification, type: :model do
       let(:notifications) { [] }
 
       it 'returns []' do
-        is_expected.to eq []
+        expect(subject).to eq []
       end
     end
 
diff --git a/spec/models/one_time_key_spec.rb b/spec/models/one_time_key_spec.rb
index 34598334c..6ff7ffc5c 100644
--- a/spec/models/one_time_key_spec.rb
+++ b/spec/models/one_time_key_spec.rb
@@ -1,5 +1,23 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
-RSpec.describe OneTimeKey, type: :model do
+describe OneTimeKey do
+  describe 'validations' do
+    context 'with an invalid signature' do
+      let(:one_time_key) { Fabricate.build(:one_time_key, signature: 'wrong!') }
+
+      it 'is invalid' do
+        expect(one_time_key).to_not be_valid
+      end
+    end
+
+    context 'with an invalid key' do
+      let(:one_time_key) { Fabricate.build(:one_time_key, key: 'wrong!') }
 
+      it 'is invalid' do
+        expect(one_time_key).to_not be_valid
+      end
+    end
+  end
 end
diff --git a/spec/models/poll_spec.rb b/spec/models/poll_spec.rb
index 666f8ca68..8ae04ca41 100644
--- a/spec/models/poll_spec.rb
+++ b/spec/models/poll_spec.rb
@@ -1,5 +1,32 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
-RSpec.describe Poll, type: :model do
-  pending "add some examples to (or delete) #{__FILE__}"
+describe Poll do
+  describe 'scopes' do
+    let(:status) { Fabricate(:status) }
+    let(:attached_poll) { Fabricate(:poll, status: status) }
+    let(:not_attached_poll) do
+      Fabricate(:poll).tap do |poll|
+        poll.status = nil
+        poll.save(validate: false)
+      end
+    end
+
+    describe 'attached' do
+      it 'finds the correct records' do
+        results = described_class.attached
+
+        expect(results).to eq([attached_poll])
+      end
+    end
+
+    describe 'unattached' do
+      it 'finds the correct records' do
+        results = described_class.unattached
+
+        expect(results).to eq([not_attached_poll])
+      end
+    end
+  end
 end
diff --git a/spec/models/poll_vote_spec.rb b/spec/models/poll_vote_spec.rb
index 563f34699..6886a82aa 100644
--- a/spec/models/poll_vote_spec.rb
+++ b/spec/models/poll_vote_spec.rb
@@ -10,4 +10,53 @@ RSpec.describe PollVote, type: :model do
       expect(poll_vote.object_type).to eq :vote
     end
   end
+
+  describe 'validations' do
+    context 'with a vote on an expired poll' do
+      it 'marks the vote invalid' do
+        poll = Fabricate.build(:poll, expires_at: 30.days.ago)
+
+        vote = Fabricate.build(:poll_vote, poll: poll)
+        expect(vote).to_not be_valid
+      end
+    end
+
+    context 'with invalid choices' do
+      it 'marks vote invalid with negative choice' do
+        poll = Fabricate.build(:poll)
+
+        vote = Fabricate.build(:poll_vote, poll: poll, choice: -100)
+        expect(vote).to_not be_valid
+      end
+
+      it 'marks vote invalid with choice in excess of options' do
+        poll = Fabricate.build(:poll, options: %w(a b c))
+
+        vote = Fabricate.build(:poll_vote, poll: poll, choice: 10)
+        expect(vote).to_not be_valid
+      end
+    end
+
+    context 'with a poll where multiple is true' do
+      it 'does not allow a second vote on same choice from same account' do
+        poll = Fabricate(:poll, multiple: true, options: %w(a b c))
+        first_vote = Fabricate(:poll_vote, poll: poll, choice: 1)
+        expect(first_vote).to be_valid
+
+        second_vote = Fabricate.build(:poll_vote, account: first_vote.account, poll: poll, choice: 1)
+        expect(second_vote).to_not be_valid
+      end
+    end
+
+    context 'with a poll where multiple is false' do
+      it 'does not allow a second vote from same account' do
+        poll = Fabricate(:poll, multiple: false, options: %w(a b c))
+        first_vote = Fabricate(:poll_vote, poll: poll)
+        expect(first_vote).to be_valid
+
+        second_vote = Fabricate.build(:poll_vote, account: first_vote.account, poll: poll)
+        expect(second_vote).to_not be_valid
+      end
+    end
+  end
 end
diff --git a/spec/models/preview_card_provider_spec.rb b/spec/models/preview_card_provider_spec.rb
new file mode 100644
index 000000000..7425b9394
--- /dev/null
+++ b/spec/models/preview_card_provider_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe PreviewCardProvider do
+  describe 'scopes' do
+    let(:trendable_and_reviewed) { Fabricate(:preview_card_provider, trendable: true, reviewed_at: 5.days.ago) }
+    let(:not_trendable_and_not_reviewed) { Fabricate(:preview_card_provider, trendable: false, reviewed_at: nil) }
+
+    describe 'trendable' do
+      it 'returns the relevant records' do
+        results = described_class.trendable
+
+        expect(results).to eq([trendable_and_reviewed])
+      end
+    end
+
+    describe 'not_trendable' do
+      it 'returns the relevant records' do
+        results = described_class.not_trendable
+
+        expect(results).to eq([not_trendable_and_not_reviewed])
+      end
+    end
+
+    describe 'reviewed' do
+      it 'returns the relevant records' do
+        results = described_class.reviewed
+
+        expect(results).to eq([trendable_and_reviewed])
+      end
+    end
+
+    describe 'pending_review' do
+      it 'returns the relevant records' do
+        results = described_class.pending_review
+
+        expect(results).to eq([not_trendable_and_not_reviewed])
+      end
+    end
+  end
+end
diff --git a/spec/models/preview_card_spec.rb b/spec/models/preview_card_spec.rb
index 45233d1d4..1858644c9 100644
--- a/spec/models/preview_card_spec.rb
+++ b/spec/models/preview_card_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe PreviewCard, type: :model do
diff --git a/spec/models/preview_card_trend_spec.rb b/spec/models/preview_card_trend_spec.rb
index c7ab6ed14..97ad05e75 100644
--- a/spec/models/preview_card_trend_spec.rb
+++ b/spec/models/preview_card_trend_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe PreviewCardTrend, type: :model do
diff --git a/spec/models/privacy_policy_spec.rb b/spec/models/privacy_policy_spec.rb
new file mode 100644
index 000000000..0d7471375
--- /dev/null
+++ b/spec/models/privacy_policy_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe PrivacyPolicy do
+  describe '.current' do
+    context 'with the default values' do
+      it 'has the privacy text' do
+        policy = described_class.current
+
+        expect(policy.text).to eq(PrivacyPolicy::DEFAULT_PRIVACY_POLICY)
+      end
+    end
+
+    context 'with a custom setting value' do
+      before do
+        terms_setting = instance_double(Setting, value: 'Terms text', updated_at: 10.days.ago)
+        allow(Setting).to receive(:find_by).with(var: 'site_terms').and_return(terms_setting)
+      end
+
+      it 'has the privacy text' do
+        policy = described_class.current
+
+        expect(policy.text).to eq('Terms text')
+      end
+    end
+  end
+end
diff --git a/spec/models/public_feed_spec.rb b/spec/models/public_feed_spec.rb
index 23cc3ceea..d31aba084 100644
--- a/spec/models/public_feed_spec.rb
+++ b/spec/models/public_feed_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe PublicFeed, type: :model do
@@ -11,7 +13,7 @@ RSpec.describe PublicFeed, type: :model do
       private_status = Fabricate(:status, visibility: :private)
 
       expect(subject).to include(public_status.id)
-      expect(subject).not_to include(private_status.id)
+      expect(subject).to_not include(private_status.id)
     end
 
     it 'does not include replies' do
@@ -19,7 +21,7 @@ RSpec.describe PublicFeed, type: :model do
       reply = Fabricate(:status, in_reply_to_id: status.id)
 
       expect(subject).to include(status.id)
-      expect(subject).not_to include(reply.id)
+      expect(subject).to_not include(reply.id)
     end
 
     it 'does not include boosts' do
@@ -27,7 +29,7 @@ RSpec.describe PublicFeed, type: :model do
       boost = Fabricate(:status, reblog_of_id: status.id)
 
       expect(subject).to include(status.id)
-      expect(subject).not_to include(boost.id)
+      expect(subject).to_not include(boost.id)
     end
 
     it 'filters out silenced accounts' do
@@ -36,10 +38,12 @@ RSpec.describe PublicFeed, type: :model do
       silenced_status = Fabricate(:status, account: silenced_account)
 
       expect(subject).to include(status.id)
-      expect(subject).not_to include(silenced_status.id)
+      expect(subject).to_not include(silenced_status.id)
     end
 
     context 'without local_only option' do
+      subject { described_class.new(viewer).get(20).map(&:id) }
+
       let(:viewer) { nil }
 
       let!(:local_account)  { Fabricate(:account, domain: nil) }
@@ -48,8 +52,6 @@ RSpec.describe PublicFeed, type: :model do
       let!(:remote_status)  { Fabricate(:status, account: remote_account) }
       let!(:local_only_status) { Fabricate(:status, account: local_account, local_only: true) }
 
-      subject { described_class.new(viewer).get(20).map(&:id) }
-
       context 'without a viewer' do
         let(:viewer) { nil }
 
@@ -62,7 +64,7 @@ RSpec.describe PublicFeed, type: :model do
         end
 
         it 'does not include local-only statuses' do
-          expect(subject).not_to include(local_only_status.id)
+          expect(subject).to_not include(local_only_status.id)
         end
       end
 
@@ -78,12 +80,14 @@ RSpec.describe PublicFeed, type: :model do
         end
 
         it 'does not include local-only statuses' do
-          expect(subject).not_to include(local_only_status.id)
+          expect(subject).to_not include(local_only_status.id)
         end
       end
     end
 
     context 'without local_only option but allow_local_only' do
+      subject { described_class.new(viewer, allow_local_only: true).get(20).map(&:id) }
+
       let(:viewer) { nil }
 
       let!(:local_account)  { Fabricate(:account, domain: nil) }
@@ -92,8 +96,6 @@ RSpec.describe PublicFeed, type: :model do
       let!(:remote_status)  { Fabricate(:status, account: remote_account) }
       let!(:local_only_status) { Fabricate(:status, account: local_account, local_only: true) }
 
-      subject { described_class.new(viewer, allow_local_only: true).get(20).map(&:id) }
-
       context 'without a viewer' do
         let(:viewer) { nil }
 
@@ -106,7 +108,7 @@ RSpec.describe PublicFeed, type: :model do
         end
 
         it 'does not include local-only statuses' do
-          expect(subject).not_to include(local_only_status.id)
+          expect(subject).to_not include(local_only_status.id)
         end
       end
 
@@ -128,24 +130,24 @@ RSpec.describe PublicFeed, type: :model do
     end
 
     context 'with a local_only option set' do
+      subject { described_class.new(viewer, local: true).get(20).map(&:id) }
+
       let!(:local_account)  { Fabricate(:account, domain: nil) }
       let!(:remote_account) { Fabricate(:account, domain: 'test.com') }
       let!(:local_status)   { Fabricate(:status, account: local_account) }
       let!(:remote_status)  { Fabricate(:status, account: remote_account) }
       let!(:local_only_status) { Fabricate(:status, account: local_account, local_only: true) }
 
-      subject { described_class.new(viewer, local: true).get(20).map(&:id) }
-
       context 'without a viewer' do
         let(:viewer) { nil }
 
         it 'does not include remote instances statuses' do
           expect(subject).to include(local_status.id)
-          expect(subject).not_to include(remote_status.id)
+          expect(subject).to_not include(remote_status.id)
         end
 
         it 'does not include local-only statuses' do
-          expect(subject).not_to include(local_only_status.id)
+          expect(subject).to_not include(local_only_status.id)
         end
       end
 
@@ -154,13 +156,13 @@ RSpec.describe PublicFeed, type: :model do
 
         it 'does not include remote instances statuses' do
           expect(subject).to include(local_status.id)
-          expect(subject).not_to include(remote_status.id)
+          expect(subject).to_not include(remote_status.id)
         end
 
         it 'is not affected by personal domain blocks' do
           viewer.block_domain!('test.com')
           expect(subject).to include(local_status.id)
-          expect(subject).not_to include(remote_status.id)
+          expect(subject).to_not include(remote_status.id)
         end
 
         it 'includes local-only statuses' do
@@ -170,18 +172,18 @@ RSpec.describe PublicFeed, type: :model do
     end
 
     context 'with a remote_only option set' do
+      subject { described_class.new(viewer, remote: true).get(20).map(&:id) }
+
       let!(:local_account)  { Fabricate(:account, domain: nil) }
       let!(:remote_account) { Fabricate(:account, domain: 'test.com') }
       let!(:local_status)   { Fabricate(:status, account: local_account) }
       let!(:remote_status)  { Fabricate(:status, account: remote_account) }
 
-      subject { described_class.new(viewer, remote: true).get(20).map(&:id) }
-
       context 'without a viewer' do
         let(:viewer) { nil }
 
         it 'does not include local instances statuses' do
-          expect(subject).not_to include(local_status.id)
+          expect(subject).to_not include(local_status.id)
           expect(subject).to include(remote_status.id)
         end
       end
@@ -190,25 +192,25 @@ RSpec.describe PublicFeed, type: :model do
         let(:viewer) { Fabricate(:account, username: 'viewer') }
 
         it 'does not include local instances statuses' do
-          expect(subject).not_to include(local_status.id)
+          expect(subject).to_not include(local_status.id)
           expect(subject).to include(remote_status.id)
         end
       end
     end
 
     describe 'with an account passed in' do
+      subject { described_class.new(@account).get(20).map(&:id) }
+
       before do
         @account = Fabricate(:account)
       end
 
-      subject { described_class.new(@account).get(20).map(&:id) }
-
       it 'excludes statuses from accounts blocked by the account' do
         blocked = Fabricate(:account)
         @account.block!(blocked)
         blocked_status = Fabricate(:status, account: blocked)
 
-        expect(subject).not_to include(blocked_status.id)
+        expect(subject).to_not include(blocked_status.id)
       end
 
       it 'excludes statuses from accounts who have blocked the account' do
@@ -216,7 +218,7 @@ RSpec.describe PublicFeed, type: :model do
         blocker.block!(@account)
         blocked_status = Fabricate(:status, account: blocker)
 
-        expect(subject).not_to include(blocked_status.id)
+        expect(subject).to_not include(blocked_status.id)
       end
 
       it 'excludes statuses from accounts muted by the account' do
@@ -224,7 +226,7 @@ RSpec.describe PublicFeed, type: :model do
         @account.mute!(muted)
         muted_status = Fabricate(:status, account: muted)
 
-        expect(subject).not_to include(muted_status.id)
+        expect(subject).to_not include(muted_status.id)
       end
 
       it 'excludes statuses from accounts from personally blocked domains' do
@@ -232,7 +234,7 @@ RSpec.describe PublicFeed, type: :model do
         @account.block_domain!(blocked.domain)
         blocked_status = Fabricate(:status, account: blocked)
 
-        expect(subject).not_to include(blocked_status.id)
+        expect(subject).to_not include(blocked_status.id)
       end
 
       context 'with language preferences' do
@@ -244,7 +246,7 @@ RSpec.describe PublicFeed, type: :model do
 
           expect(subject).to include(en_status.id)
           expect(subject).to include(es_status.id)
-          expect(subject).not_to include(fr_status.id)
+          expect(subject).to_not include(fr_status.id)
         end
 
         it 'includes all languages when user does not have a setting' do
diff --git a/spec/models/relay_spec.rb b/spec/models/relay_spec.rb
index 12dc0f20f..86c1762c1 100644
--- a/spec/models/relay_spec.rb
+++ b/spec/models/relay_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Relay, type: :model do
diff --git a/spec/models/remote_follow_spec.rb b/spec/models/remote_follow_spec.rb
index 5b4c19b5b..ea36b0076 100644
--- a/spec/models/remote_follow_spec.rb
+++ b/spec/models/remote_follow_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe RemoteFollow do
       let(:attrs) { { acct: 'gargron@quitter.no' } }
 
       it 'returns acct' do
-        is_expected.to eq 'gargron@quitter.no'
+        expect(subject).to eq 'gargron@quitter.no'
       end
     end
 
@@ -25,7 +25,7 @@ RSpec.describe RemoteFollow do
       let(:attrs) { {} }
 
       it do
-        is_expected.to be_nil
+        expect(subject).to be_nil
       end
     end
   end
@@ -37,7 +37,7 @@ RSpec.describe RemoteFollow do
       let(:attrs) { { acct: 'gargron@quitter.no' } }
 
       it do
-        is_expected.to be true
+        expect(subject).to be true
       end
     end
 
@@ -45,12 +45,14 @@ RSpec.describe RemoteFollow do
       let(:attrs) { {} }
 
       it do
-        is_expected.to be false
+        expect(subject).to be false
       end
     end
   end
 
   describe '#subscribe_address_for' do
+    subject { remote_follow.subscribe_address_for(account) }
+
     before do
       remote_follow.valid?
     end
@@ -58,10 +60,8 @@ RSpec.describe RemoteFollow do
     let(:attrs)   { { acct: 'gargron@quitter.no' } }
     let(:account) { Fabricate(:account, username: 'alice') }
 
-    subject { remote_follow.subscribe_address_for(account) }
-
     it 'returns subscribe address' do
-      is_expected.to eq 'https://quitter.no/main/ostatussub?profile=https%3A%2F%2Fcb6e6126.ngrok.io%2Fusers%2Falice'
+      expect(subject).to eq 'https://quitter.no/main/ostatussub?profile=https%3A%2F%2Fcb6e6126.ngrok.io%2Fusers%2Falice'
     end
   end
 end
diff --git a/spec/models/report_filter_spec.rb b/spec/models/report_filter_spec.rb
index 099c0731d..8269c4579 100644
--- a/spec/models/report_filter_spec.rb
+++ b/spec/models/report_filter_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 describe ReportFilter do
diff --git a/spec/models/report_spec.rb b/spec/models/report_spec.rb
index 874be4132..20a048c33 100644
--- a/spec/models/report_spec.rb
+++ b/spec/models/report_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 describe Report do
@@ -33,7 +35,7 @@ describe Report do
     end
 
     it 'assigns to a given account' do
-      is_expected.to eq current_account.id
+      expect(subject).to eq current_account.id
     end
   end
 
@@ -48,7 +50,7 @@ describe Report do
     end
 
     it 'unassigns' do
-      is_expected.to be_nil
+      expect(subject).to be_nil
     end
   end
 
@@ -119,12 +121,6 @@ describe Report do
   end
 
   describe 'validations' do
-    it 'has a valid fabricator' do
-      report = Fabricate(:report)
-      report.valid?
-      expect(report).to be_valid
-    end
-
     it 'is invalid if comment is longer than 1000 characters' do
       report = Fabricate.build(:report, comment: Faker::Lorem.characters(number: 1001))
       report.valid?
diff --git a/spec/models/rule_spec.rb b/spec/models/rule_spec.rb
index 8666bda71..c9b9c5502 100644
--- a/spec/models/rule_spec.rb
+++ b/spec/models/rule_spec.rb
@@ -1,5 +1,19 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
-RSpec.describe Rule, type: :model do
-  pending "add some examples to (or delete) #{__FILE__}"
+describe Rule do
+  describe 'scopes' do
+    describe 'ordered' do
+      let(:deleted_rule) { Fabricate(:rule, deleted_at: 10.days.ago) }
+      let(:first_rule) { Fabricate(:rule, deleted_at: nil, priority: 1) }
+      let(:last_rule) { Fabricate(:rule, deleted_at: nil, priority: 10) }
+
+      it 'finds the correct records' do
+        results = described_class.ordered
+
+        expect(results).to eq([first_rule, last_rule])
+      end
+    end
+  end
 end
diff --git a/spec/models/scheduled_status_spec.rb b/spec/models/scheduled_status_spec.rb
index f8c9d8b81..294fa9f36 100644
--- a/spec/models/scheduled_status_spec.rb
+++ b/spec/models/scheduled_status_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe ScheduledStatus, type: :model do
diff --git a/spec/models/session_activation_spec.rb b/spec/models/session_activation_spec.rb
index 450dc1399..375199d57 100644
--- a/spec/models/session_activation_spec.rb
+++ b/spec/models/session_activation_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe SessionActivation, type: :model do
     let(:session_activation) { Fabricate(:session_activation, user_agent: 'Chrome/62.0.3202.89') }
 
     it 'sets a Browser instance as detection' do
-      expect(session_activation.detection).to be_kind_of Browser::Chrome
+      expect(session_activation.detection).to be_a Browser::Chrome
     end
   end
 
@@ -44,7 +44,7 @@ RSpec.describe SessionActivation, type: :model do
       let(:id) { nil }
 
       it 'returns nil' do
-        is_expected.to be nil
+        expect(subject).to be_nil
       end
     end
 
@@ -54,7 +54,7 @@ RSpec.describe SessionActivation, type: :model do
 
       context 'id exists as session_id' do
         it 'returns true' do
-          is_expected.to be true
+          expect(subject).to be true
         end
       end
 
@@ -64,7 +64,7 @@ RSpec.describe SessionActivation, type: :model do
         end
 
         it 'returns false' do
-          is_expected.to be false
+          expect(subject).to be false
         end
       end
     end
@@ -80,7 +80,7 @@ RSpec.describe SessionActivation, type: :model do
     end
 
     it 'returns an instance of SessionActivation' do
-      expect(described_class.activate(**options)).to be_kind_of SessionActivation
+      expect(described_class.activate(**options)).to be_a SessionActivation
     end
   end
 
@@ -89,7 +89,7 @@ RSpec.describe SessionActivation, type: :model do
       let(:id) { nil }
 
       it 'returns nil' do
-        expect(described_class.deactivate(id)).to be nil
+        expect(described_class.deactivate(id)).to be_nil
       end
     end
 
@@ -118,8 +118,8 @@ RSpec.describe SessionActivation, type: :model do
     let(:id) { '1' }
 
     it 'calls where.destroy_all' do
-      expect(described_class).to receive_message_chain(:where, :destroy_all)
-        .with('session_id != ?', id).with(no_args)
+      expect(described_class).to receive_message_chain(:where, :not, :destroy_all)
+        .with(session_id: id).with(no_args)
 
       described_class.exclusive(id)
     end
diff --git a/spec/models/setting_spec.rb b/spec/models/setting_spec.rb
index 3ccc21d6c..826a13878 100644
--- a/spec/models/setting_spec.rb
+++ b/spec/models/setting_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe Setting, type: :model do
       let(:cache_value)       { 'cache-value' }
 
       it 'calls not RailsSettings::Base#[]' do
-        expect(RailsSettings::Base).not_to receive(:[]).with(key)
+        expect(RailsSettings::Base).to_not receive(:[]).with(key)
         described_class[key]
       end
 
@@ -104,7 +104,7 @@ RSpec.describe Setting, type: :model do
           ActiveSupport::Notifications.subscribed callback, 'sql.active_record' do
             described_class[key]
           end
-          expect(callback).not_to have_received(:call)
+          expect(callback).to_not have_received(:call)
         end
 
         it 'returns the cached value' do
@@ -127,7 +127,7 @@ RSpec.describe Setting, type: :model do
     let(:records)          { [original_setting] }
 
     it 'returns a Hash' do
-      expect(described_class.all_as_records).to be_kind_of Hash
+      expect(described_class.all_as_records).to be_a Hash
     end
 
     context 'records includes Setting with var as the key' do
@@ -146,7 +146,7 @@ RSpec.describe Setting, type: :model do
         it 'includes Setting with value of default_value' do
           setting = described_class.all_as_records[key]
 
-          expect(setting).to be_kind_of Setting
+          expect(setting).to be_a Setting
           expect(setting).to have_attributes(var: key)
           expect(setting).to have_attributes(value: 'default_value')
         end
@@ -163,17 +163,17 @@ RSpec.describe Setting, type: :model do
   end
 
   describe '.default_settings' do
+    subject { described_class.default_settings }
+
     before do
       allow(RailsSettings::Default).to receive(:enabled?).and_return(enabled)
     end
 
-    subject { described_class.default_settings }
-
     context 'RailsSettings::Default.enabled? is false' do
       let(:enabled) { false }
 
       it 'returns {}' do
-        is_expected.to eq({})
+        expect(subject).to eq({})
       end
     end
 
@@ -181,7 +181,7 @@ RSpec.describe Setting, type: :model do
       let(:enabled) { true }
 
       it 'returns instance of RailsSettings::Default' do
-        is_expected.to be_kind_of RailsSettings::Default
+        expect(subject).to be_a RailsSettings::Default
       end
     end
   end
diff --git a/spec/models/status_edit_spec.rb b/spec/models/status_edit_spec.rb
index 2ecafef73..2d3351452 100644
--- a/spec/models/status_edit_spec.rb
+++ b/spec/models/status_edit_spec.rb
@@ -1,5 +1,13 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
-RSpec.describe StatusEdit, type: :model do
-  pending "add some examples to (or delete) #{__FILE__}"
+describe StatusEdit do
+  describe '#reblog?' do
+    it 'returns false' do
+      record = described_class.new
+
+      expect(record).to_not be_a_reblog
+    end
+  end
 end
diff --git a/spec/models/status_pin_spec.rb b/spec/models/status_pin_spec.rb
index c18faca78..c4ebf96da 100644
--- a/spec/models/status_pin_spec.rb
+++ b/spec/models/status_pin_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe StatusPin, type: :model do
diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb
index e0a7aba7e..04e5c26af 100644
--- a/spec/models/status_spec.rb
+++ b/spec/models/status_spec.rb
@@ -1,12 +1,14 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Status, type: :model do
+  subject { Fabricate(:status, account: alice) }
+
   let(:alice) { Fabricate(:account, username: 'alice') }
   let(:bob)   { Fabricate(:account, username: 'bob') }
   let(:other) { Fabricate(:status, account: bob, text: 'Skulls for the skull god! The enemy\'s gates are sideways!') }
 
-  subject { Fabricate(:status, account: alice) }
-
   describe '#local?' do
     it 'returns true when no remote URI is set' do
       expect(subject.local?).to be true
@@ -204,14 +206,14 @@ RSpec.describe Status, type: :model do
   end
 
   describe 'on create' do
+    subject { Status.new }
+
     let(:local_account) { Fabricate(:account, username: 'local', domain: nil) }
     let(:remote_account) { Fabricate(:account, username: 'remote', domain: 'example.com') }
 
-    subject { Status.new }
-
     describe 'on a status that ends with the local-only emoji' do
       before do
-        subject.text = 'A toot ' + subject.local_only_emoji
+        subject.text = "A toot #{subject.local_only_emoji}"
       end
 
       context 'if the status originates from this instance' do
@@ -241,11 +243,11 @@ RSpec.describe Status, type: :model do
   end
 
   describe '.mutes_map' do
+    subject { Status.mutes_map([status.conversation.id], account) }
+
     let(:status)  { Fabricate(:status) }
     let(:account) { Fabricate(:account) }
 
-    subject { Status.mutes_map([status.conversation.id], account) }
-
     it 'returns a hash' do
       expect(subject).to be_a Hash
     end
@@ -257,11 +259,11 @@ RSpec.describe Status, type: :model do
   end
 
   describe '.favourites_map' do
+    subject { Status.favourites_map([status], account) }
+
     let(:status)  { Fabricate(:status) }
     let(:account) { Fabricate(:account) }
 
-    subject { Status.favourites_map([status], account) }
-
     it 'returns a hash' do
       expect(subject).to be_a Hash
     end
@@ -273,11 +275,11 @@ RSpec.describe Status, type: :model do
   end
 
   describe '.reblogs_map' do
+    subject { Status.reblogs_map([status], account) }
+
     let(:status)  { Fabricate(:status) }
     let(:account) { Fabricate(:account) }
 
-    subject { Status.reblogs_map([status], account) }
-
     it 'returns a hash' do
       expect(subject).to be_a Hash
     end
@@ -289,52 +291,52 @@ RSpec.describe Status, type: :model do
   end
 
   describe '.as_direct_timeline' do
+    subject(:results) { Status.as_direct_timeline(account) }
+
     let(:account) { Fabricate(:account) }
     let(:followed) { Fabricate(:account) }
     let(:not_followed) { Fabricate(:account) }
 
-    before do
-      Fabricate(:follow, account: account, target_account: followed)
-
-      @self_public_status = Fabricate(:status, account: account, visibility: :public)
-      @self_direct_status = Fabricate(:status, account: account, visibility: :direct)
-      @followed_public_status = Fabricate(:status, account: followed, visibility: :public)
-      @followed_direct_status = Fabricate(:status, account: followed, visibility: :direct)
-      @not_followed_direct_status = Fabricate(:status, account: not_followed, visibility: :direct)
+    let!(:self_public_status) { Fabricate(:status, account: account, visibility: :public) }
+    let!(:self_direct_status) { Fabricate(:status, account: account, visibility: :direct) }
+    let!(:followed_public_status) { Fabricate(:status, account: followed, visibility: :public) }
+    let!(:followed_direct_status) { Fabricate(:status, account: followed, visibility: :direct) }
+    let!(:not_followed_direct_status) { Fabricate(:status, account: not_followed, visibility: :direct) }
 
-      @results = Status.as_direct_timeline(account)
+    before do
+      account.follow!(followed)
     end
 
     it 'does not include public statuses from self' do
-      expect(@results).to_not include(@self_public_status)
+      expect(results).to_not include(self_public_status)
     end
 
     it 'includes direct statuses from self' do
-      expect(@results).to include(@self_direct_status)
+      expect(results).to include(self_direct_status)
     end
 
     it 'does not include public statuses from followed' do
-      expect(@results).to_not include(@followed_public_status)
+      expect(results).to_not include(followed_public_status)
     end
 
     it 'does not include direct statuses not mentioning recipient from followed' do
-      expect(@results).to_not include(@followed_direct_status)
+      expect(results).to_not include(followed_direct_status)
     end
 
     it 'does not include direct statuses not mentioning recipient from non-followed' do
-      expect(@results).to_not include(@not_followed_direct_status)
+      expect(results).to_not include(not_followed_direct_status)
     end
 
     it 'includes direct statuses mentioning recipient from followed' do
-      Fabricate(:mention, account: account, status: @followed_direct_status)
+      Fabricate(:mention, account: account, status: followed_direct_status)
       results2 = Status.as_direct_timeline(account)
-      expect(results2).to include(@followed_direct_status)
+      expect(results2).to include(followed_direct_status)
     end
 
     it 'includes direct statuses mentioning recipient from non-followed' do
-      Fabricate(:mention, account: account, status: @not_followed_direct_status)
+      Fabricate(:mention, account: account, status: not_followed_direct_status)
       results2 = Status.as_direct_timeline(account)
-      expect(results2).to include(@not_followed_direct_status)
+      expect(results2).to include(not_followed_direct_status)
     end
   end
 
diff --git a/spec/models/status_stat_spec.rb b/spec/models/status_stat_spec.rb
index af1a6f288..749ca097d 100644
--- a/spec/models/status_stat_spec.rb
+++ b/spec/models/status_stat_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe StatusStat, type: :model do
diff --git a/spec/models/status_trend_spec.rb b/spec/models/status_trend_spec.rb
index 6b82204a6..9678b838a 100644
--- a/spec/models/status_trend_spec.rb
+++ b/spec/models/status_trend_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe StatusTrend, type: :model do
diff --git a/spec/models/system_key_spec.rb b/spec/models/system_key_spec.rb
index a138bc131..a4e8b7784 100644
--- a/spec/models/system_key_spec.rb
+++ b/spec/models/system_key_spec.rb
@@ -1,5 +1,6 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe SystemKey, type: :model do
-
 end
diff --git a/spec/models/tag_feed_spec.rb b/spec/models/tag_feed_spec.rb
index 45f7c3329..d8683b86f 100644
--- a/spec/models/tag_feed_spec.rb
+++ b/spec/models/tag_feed_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 describe TagFeed, type: :service do
@@ -65,7 +67,7 @@ describe TagFeed, type: :service do
       expect(results).to include(status)
     end
 
-    context 'on a local-only status' do
+    context 'when the feed contains a local-only status' do
       let!(:status) { Fabricate(:status, tags: [tag1], local_only: true) }
 
       it 'does not show local-only statuses without a viewer' do
diff --git a/spec/models/tag_follow_spec.rb b/spec/models/tag_follow_spec.rb
index 50c04d2e4..88409bb28 100644
--- a/spec/models/tag_follow_spec.rb
+++ b/spec/models/tag_follow_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe TagFollow, type: :model do
diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb
index 102d2f625..4d6e5c380 100644
--- a/spec/models/tag_spec.rb
+++ b/spec/models/tag_spec.rb
@@ -1,18 +1,19 @@
 # frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Tag do
   describe 'validations' do
     it 'invalid with #' do
-      expect(described_class.new(name: '#hello_world')).not_to be_valid
+      expect(described_class.new(name: '#hello_world')).to_not be_valid
     end
 
     it 'invalid with .' do
-      expect(described_class.new(name: '.abcdef123')).not_to be_valid
+      expect(described_class.new(name: '.abcdef123')).to_not be_valid
     end
 
     it 'invalid with spaces' do
-      expect(described_class.new(name: 'hello world')).not_to be_valid
+      expect(described_class.new(name: 'hello world')).to_not be_valid
     end
 
     it 'valid with aesthetic' do
diff --git a/spec/models/trends/statuses_spec.rb b/spec/models/trends/statuses_spec.rb
index 5f338a65e..29a20a595 100644
--- a/spec/models/trends/statuses_spec.rb
+++ b/spec/models/trends/statuses_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Trends::Statuses do
@@ -76,7 +78,7 @@ RSpec.describe Trends::Statuses do
     before do
       13.times { reblog(status1, today) }
       13.times { reblog(status2, today) }
-       4.times { reblog(status3, today) }
+      4.times { reblog(status3, today) }
     end
 
     context do
diff --git a/spec/models/trends/tags_spec.rb b/spec/models/trends/tags_spec.rb
index f48c73503..09ac918d0 100644
--- a/spec/models/trends/tags_spec.rb
+++ b/spec/models/trends/tags_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Trends::Tags do
@@ -22,7 +24,9 @@ RSpec.describe Trends::Tags do
   end
 
   describe '#query' do
-    pending
+    it 'returns a composable query scope' do
+      expect(subject.query).to be_a Trends::Query
+    end
   end
 
   describe '#refresh' do
diff --git a/spec/models/unavailable_domain_spec.rb b/spec/models/unavailable_domain_spec.rb
index 3f2621034..5469ff693 100644
--- a/spec/models/unavailable_domain_spec.rb
+++ b/spec/models/unavailable_domain_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe UnavailableDomain, type: :model do
diff --git a/spec/models/user_invite_request_spec.rb b/spec/models/user_invite_request_spec.rb
index 1be38d8a4..95e128439 100644
--- a/spec/models/user_invite_request_spec.rb
+++ b/spec/models/user_invite_request_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe UserInviteRequest, type: :model do
diff --git a/spec/models/user_role_spec.rb b/spec/models/user_role_spec.rb
index 28019593e..97456c106 100644
--- a/spec/models/user_role_spec.rb
+++ b/spec/models/user_role_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe UserRole, type: :model do
@@ -58,7 +60,7 @@ RSpec.describe UserRole, type: :model do
   end
 
   describe '#permissions_as_keys=' do
-    let(:input) { }
+    let(:input) {}
 
     before do
       subject.permissions_as_keys = input
@@ -127,7 +129,7 @@ RSpec.describe UserRole, type: :model do
     subject { described_class.everyone }
 
     it 'returns a role' do
-      expect(subject).to be_kind_of(described_class)
+      expect(subject).to be_a(described_class)
     end
 
     it 'is identified as the everyone role' do
@@ -139,7 +141,7 @@ RSpec.describe UserRole, type: :model do
     end
 
     it 'has negative position' do
-      expect(subject.position).to eq -1
+      expect(subject.position).to eq(-1)
     end
   end
 
@@ -147,7 +149,7 @@ RSpec.describe UserRole, type: :model do
     subject { described_class.nobody }
 
     it 'returns a role' do
-      expect(subject).to be_kind_of(described_class)
+      expect(subject).to be_a(described_class)
     end
 
     it 'is identified as the nobody role' do
@@ -159,7 +161,7 @@ RSpec.describe UserRole, type: :model do
     end
 
     it 'has negative position' do
-      expect(subject.position).to eq -1
+      expect(subject.position).to eq(-1)
     end
   end
 
diff --git a/spec/models/user_settings/namespace_spec.rb b/spec/models/user_settings/namespace_spec.rb
new file mode 100644
index 000000000..ae2fa7b48
--- /dev/null
+++ b/spec/models/user_settings/namespace_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe UserSettings::Namespace do
+  subject { described_class.new(name) }
+
+  let(:name) { :foo }
+
+  describe '#setting' do
+    before do
+      subject.setting :bar, default: 'baz'
+    end
+
+    it 'adds setting to definitions' do
+      expect(subject.definitions[:'foo.bar']).to have_attributes(name: :bar, namespace: :foo, default_value: 'baz')
+    end
+  end
+
+  describe '#definitions' do
+    it 'returns a hash' do
+      expect(subject.definitions).to be_a Hash
+    end
+  end
+end
diff --git a/spec/models/user_settings/setting_spec.rb b/spec/models/user_settings/setting_spec.rb
new file mode 100644
index 000000000..9884ae4f8
--- /dev/null
+++ b/spec/models/user_settings/setting_spec.rb
@@ -0,0 +1,106 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe UserSettings::Setting do
+  subject { described_class.new(name, options) }
+
+  let(:name)      { :foo }
+  let(:options)   { { default: default, namespace: namespace } }
+  let(:default)   { false }
+  let(:namespace) { nil }
+
+  describe '#default_value' do
+    context 'when default value is a primitive value' do
+      it 'returns default value' do
+        expect(subject.default_value).to eq default
+      end
+    end
+
+    context 'when default value is a proc' do
+      let(:default) { -> { 'bar' } }
+
+      it 'returns value from proc' do
+        expect(subject.default_value).to eq 'bar'
+      end
+    end
+  end
+
+  describe '#type' do
+    it 'returns a type' do
+      expect(subject.type).to be_a ActiveModel::Type::Value
+    end
+
+    context 'when default value is a boolean' do
+      let(:default) { false }
+
+      it 'returns boolean' do
+        expect(subject.type).to be_a ActiveModel::Type::Boolean
+      end
+    end
+
+    context 'when default value is a string' do
+      let(:default) { '' }
+
+      it 'returns string' do
+        expect(subject.type).to be_a ActiveModel::Type::String
+      end
+    end
+
+    context 'when default value is a lambda returning a boolean' do
+      let(:default) { -> { false } }
+
+      it 'returns boolean' do
+        expect(subject.type).to be_a ActiveModel::Type::Boolean
+      end
+    end
+
+    context 'when default value is a lambda returning a string' do
+      let(:default) { -> { '' } }
+
+      it 'returns boolean' do
+        expect(subject.type).to be_a ActiveModel::Type::String
+      end
+    end
+  end
+
+  describe '#type_cast' do
+    context 'when default value is a boolean' do
+      let(:default) { false }
+
+      it 'returns boolean' do
+        expect(subject.type_cast('1')).to be true
+      end
+    end
+
+    context 'when default value is a string' do
+      let(:default) { '' }
+
+      it 'returns string' do
+        expect(subject.type_cast(1)).to eq '1'
+      end
+    end
+  end
+
+  describe '#to_a' do
+    it 'returns an array' do
+      expect(subject.to_a).to eq [name, default]
+    end
+  end
+
+  describe '#key' do
+    context 'when there is no namespace' do
+      it 'returnsn a symbol' do
+        expect(subject.key).to eq :foo
+      end
+    end
+
+    context 'when there is a namespace' do
+      let(:namespace) { :bar }
+
+      it 'returns a symbol' do
+        expect(subject.key).to eq :'bar.foo'
+      end
+    end
+  end
+end
diff --git a/spec/models/user_settings_spec.rb b/spec/models/user_settings_spec.rb
new file mode 100644
index 000000000..f0e4272fd
--- /dev/null
+++ b/spec/models/user_settings_spec.rb
@@ -0,0 +1,110 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe UserSettings do
+  subject { described_class.new(json) }
+
+  let(:json) { {} }
+
+  describe '#[]' do
+    context 'when setting is not set' do
+      it 'returns default value' do
+        expect(subject[:always_send_emails]).to be false
+      end
+    end
+
+    context 'when setting is set' do
+      let(:json) { { default_language: 'fr' } }
+
+      it 'returns value' do
+        expect(subject[:default_language]).to eq 'fr'
+      end
+    end
+
+    context 'when setting was not defined' do
+      it 'raises error' do
+        expect { subject[:foo] }.to raise_error UserSettings::KeyError
+      end
+    end
+  end
+
+  describe '#[]=' do
+    context 'when value matches type' do
+      before do
+        subject[:always_send_emails] = true
+      end
+
+      it 'updates value' do
+        expect(subject[:always_send_emails]).to be true
+      end
+    end
+
+    context 'when value needs to be type-cast' do
+      before do
+        subject[:always_send_emails] = '1'
+      end
+
+      it 'updates value with a type-cast' do
+        expect(subject[:always_send_emails]).to be true
+      end
+    end
+  end
+
+  describe '#update' do
+    before do
+      subject.update(always_send_emails: true, default_language: 'fr', default_privacy: nil)
+    end
+
+    it 'updates values' do
+      expect(subject[:always_send_emails]).to be true
+      expect(subject[:default_language]).to eq 'fr'
+    end
+
+    it 'does not set values that are nil' do
+      expect(subject.as_json).to_not include(default_privacy: nil)
+    end
+  end
+
+  describe '#as_json' do
+    let(:json) { { default_language: 'fr' } }
+
+    it 'returns hash' do
+      expect(subject.as_json).to eq json
+    end
+  end
+
+  describe '.keys' do
+    it 'returns an array' do
+      expect(described_class.keys).to be_a Array
+    end
+  end
+
+  describe '.definition_for' do
+    context 'when key is defined' do
+      it 'returns a setting' do
+        expect(described_class.definition_for(:always_send_emails)).to be_a UserSettings::Setting
+      end
+    end
+
+    context 'when key is not defined' do
+      it 'returns nil' do
+        expect(described_class.definition_for(:foo)).to be_nil
+      end
+    end
+  end
+
+  describe '.definition_for?' do
+    context 'when key is defined' do
+      it 'returns true' do
+        expect(described_class.definition_for?(:always_send_emails)).to be true
+      end
+    end
+
+    context 'when key is not defined' do
+      it 'returns false' do
+        expect(described_class.definition_for?(:foo)).to be false
+      end
+    end
+  end
+end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index a7da31e60..ab883927a 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -1,7 +1,12 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 require 'devise_two_factor/spec_helpers'
 
 RSpec.describe User, type: :model do
+  let(:password) { 'abcd1234' }
+  let(:account) { Fabricate(:account, username: 'alice') }
+
   it_behaves_like 'two_factor_backupable'
 
   describe 'otp_secret' do
@@ -43,7 +48,7 @@ RSpec.describe User, type: :model do
     it 'cleans out empty string from languages' do
       user = Fabricate.build(:user, chosen_languages: [''])
       user.valid?
-      expect(user.chosen_languages).to eq nil
+      expect(user.chosen_languages).to be_nil
     end
   end
 
@@ -96,9 +101,6 @@ RSpec.describe User, type: :model do
     end
   end
 
-  let(:account) { Fabricate(:account, username: 'alice') }
-  let(:password) { 'abcd1234' }
-
   describe 'blacklist' do
     around(:each) do |example|
       old_blacklist = Rails.configuration.x.email_blacklist
@@ -110,19 +112,19 @@ RSpec.describe User, type: :model do
       Rails.configuration.x.email_domains_blacklist = old_blacklist
     end
 
-    it 'should allow a non-blacklisted user to be created' do
+    it 'allows a non-blacklisted user to be created' do
       user = User.new(email: 'foo@example.com', account: account, password: password, agreement: true)
 
       expect(user.valid?).to be_truthy
     end
 
-    it 'should not allow a blacklisted user to be created' do
+    it 'does not allow a blacklisted user to be created' do
       user = User.new(email: 'foo@mvrht.com', account: account, password: password, agreement: true)
 
       expect(user.valid?).to be_falsey
     end
 
-    it 'should not allow a subdomain blacklisted user to be created' do
+    it 'does not allow a subdomain blacklisted user to be created' do
       user = User.new(email: 'foo@mvrht.com.topdomain.tld', account: account, password: password, agreement: true)
 
       expect(user.valid?).to be_falsey
@@ -142,10 +144,136 @@ RSpec.describe User, type: :model do
   end
 
   describe '#confirm' do
-    it 'sets email to unconfirmed_email' do
-      user = Fabricate.build(:user, confirmed_at: Time.now.utc, unconfirmed_email: 'new-email@example.com')
-      user.confirm
-      expect(user.email).to eq 'new-email@example.com'
+    subject { user.confirm }
+
+    let(:new_email) { 'new-email@example.com' }
+
+    before do
+      allow(TriggerWebhookWorker).to receive(:perform_async)
+    end
+
+    context 'when the user is already confirmed' do
+      let!(:user) { Fabricate(:user, confirmed_at: Time.now.utc, approved: true, unconfirmed_email: new_email) }
+
+      it 'sets email to unconfirmed_email' do
+        expect { subject }.to change { user.reload.email }.to(new_email)
+      end
+
+      it 'does not trigger the account.approved Web Hook' do
+        subject
+        expect(TriggerWebhookWorker).to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id)
+      end
+    end
+
+    context 'when the user is a new user' do
+      let(:user) { Fabricate(:user, confirmed_at: nil, unconfirmed_email: new_email) }
+
+      context 'when the user is already approved' do
+        around(:example) do |example|
+          registrations_mode = Setting.registrations_mode
+          Setting.registrations_mode = 'approved'
+
+          example.run
+
+          Setting.registrations_mode = registrations_mode
+        end
+
+        before do
+          user.approve!
+        end
+
+        it 'sets email to unconfirmed_email' do
+          expect { subject }.to change { user.reload.email }.to(new_email)
+        end
+
+        it 'triggers the account.approved Web Hook' do
+          user.confirm
+          expect(TriggerWebhookWorker).to have_received(:perform_async).with('account.approved', 'Account', user.account_id).once
+        end
+      end
+
+      context 'when the user does not require explicit approval' do
+        around(:example) do |example|
+          registrations_mode = Setting.registrations_mode
+          Setting.registrations_mode = 'open'
+
+          example.run
+
+          Setting.registrations_mode = registrations_mode
+        end
+
+        it 'sets email to unconfirmed_email' do
+          expect { subject }.to change { user.reload.email }.to(new_email)
+        end
+
+        it 'triggers the account.approved Web Hook' do
+          user.confirm
+          expect(TriggerWebhookWorker).to have_received(:perform_async).with('account.approved', 'Account', user.account_id).once
+        end
+      end
+
+      context 'when the user requires explicit approval but is not approved' do
+        around(:example) do |example|
+          registrations_mode = Setting.registrations_mode
+          Setting.registrations_mode = 'approved'
+
+          example.run
+
+          Setting.registrations_mode = registrations_mode
+        end
+
+        it 'sets email to unconfirmed_email' do
+          expect { subject }.to change { user.reload.email }.to(new_email)
+        end
+
+        it 'does not trigger the account.approved Web Hook' do
+          subject
+          expect(TriggerWebhookWorker).to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id)
+        end
+      end
+    end
+  end
+
+  describe '#approve!' do
+    subject { user.approve! }
+
+    around(:example) do |example|
+      registrations_mode = Setting.registrations_mode
+      Setting.registrations_mode = 'approved'
+
+      example.run
+
+      Setting.registrations_mode = registrations_mode
+    end
+
+    before do
+      allow(TriggerWebhookWorker).to receive(:perform_async)
+    end
+
+    context 'when the user is already confirmed' do
+      let(:user) { Fabricate(:user, confirmed_at: Time.now.utc, approved: false) }
+
+      it 'sets the approved flag' do
+        expect { subject }.to change { user.reload.approved? }.to(true)
+      end
+
+      it 'triggers the account.approved Web Hook' do
+        subject
+        expect(TriggerWebhookWorker).to have_received(:perform_async).with('account.approved', 'Account', user.account_id).once
+      end
+    end
+
+    context 'when the user is not confirmed' do
+      let(:user) { Fabricate(:user, confirmed_at: nil, approved: false) }
+
+      it 'sets the approved flag' do
+        expect { subject }.to change { user.reload.approved? }.to(true)
+      end
+
+      it 'does not trigger the account.approved Web Hook' do
+        subject
+        expect(TriggerWebhookWorker).to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id)
+      end
     end
   end
 
@@ -159,7 +287,7 @@ RSpec.describe User, type: :model do
     it 'saves nil for otp_secret' do
       user = Fabricate.build(:user, otp_secret: 'oldotpcode')
       user.disable_two_factor!
-      expect(user.reload.otp_secret).to be nil
+      expect(user.reload.otp_secret).to be_nil
     end
 
     it 'saves cleared otp_backup_codes' do
@@ -185,9 +313,9 @@ RSpec.describe User, type: :model do
   end
 
   describe 'settings' do
-    it 'is instance of Settings::ScopedSettings' do
+    it 'is instance of UserSettings' do
       user = Fabricate(:user)
-      expect(user.settings).to be_kind_of Settings::ScopedSettings
+      expect(user.settings).to be_a UserSettings
     end
   end
 
@@ -220,17 +348,17 @@ RSpec.describe User, type: :model do
       Rails.configuration.x.email_domains_whitelist = old_whitelist
     end
 
-    it 'should not allow a user to be created unless they are whitelisted' do
+    it 'does not allow a user to be created unless they are whitelisted' do
       user = User.new(email: 'foo@example.com', account: account, password: password, agreement: true)
       expect(user.valid?).to be_falsey
     end
 
-    it 'should allow a user to be created if they are whitelisted' do
+    it 'allows a user to be created if they are whitelisted' do
       user = User.new(email: 'foo@mastodon.space', account: account, password: password, agreement: true)
       expect(user.valid?).to be_truthy
     end
 
-    it 'should not allow a user with a whitelisted top domain as subdomain in their email address to be created' do
+    it 'does not allow a user with a whitelisted top domain as subdomain in their email address to be created' do
       user = User.new(email: 'foo@mastodon.space.userdomain.com', account: account, password: password, agreement: true)
       expect(user.valid?).to be_falsey
     end
@@ -242,7 +370,7 @@ RSpec.describe User, type: :model do
         Rails.configuration.x.email_domains_blacklist = old_blacklist
       end
 
-      it 'should not allow a user to be created with a specific blacklisted subdomain even if the top domain is whitelisted' do
+      it 'does not allow a user to be created with a specific blacklisted subdomain even if the top domain is whitelisted' do
         Rails.configuration.x.email_domains_blacklist = 'blacklisted.mastodon.space'
 
         user = User.new(email: 'foo@blacklisted.mastodon.space', account: account, password: password)
@@ -251,16 +379,6 @@ RSpec.describe User, type: :model do
     end
   end
 
-  it_behaves_like 'Settings-extended' do
-    def create!
-      User.create!(account: Fabricate(:account, user: nil), email: 'foo@mastodon.space', password: 'abcd1234', agreement: true)
-    end
-
-    def fabricate
-      Fabricate(:user)
-    end
-  end
-
   describe 'token_for_app' do
     let(:user) { Fabricate(:user) }
     let(:app) { Fabricate(:application, owner: user) }
@@ -283,6 +401,7 @@ RSpec.describe User, type: :model do
 
   describe '#disable!' do
     subject(:user) { Fabricate(:user, disabled: false, current_sign_in_at: current_sign_in_at, last_sign_in_at: nil) }
+
     let(:current_sign_in_at) { Time.zone.now }
 
     before do
@@ -371,6 +490,7 @@ RSpec.describe User, type: :model do
 
   describe '#active_for_authentication?' do
     subject { user.active_for_authentication? }
+
     let(:user) { Fabricate(:user, disabled: disabled, confirmed_at: confirmed_at) }
 
     context 'when user is disabled' do
diff --git a/spec/models/web/push_subscription_spec.rb b/spec/models/web/push_subscription_spec.rb
index bd5719593..e925e4c4c 100644
--- a/spec/models/web/push_subscription_spec.rb
+++ b/spec/models/web/push_subscription_spec.rb
@@ -1,6 +1,10 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Web::PushSubscription, type: :model do
+  subject { described_class.new(data: data) }
+
   let(:account) { Fabricate(:account) }
 
   let(:policy) { 'all' }
@@ -19,8 +23,6 @@ RSpec.describe Web::PushSubscription, type: :model do
     }
   end
 
-  subject { described_class.new(data: data) }
-
   describe '#pushable?' do
     let(:notification_type) { :mention }
     let(:notification) { Fabricate(:notification, account: account, type: notification_type) }
@@ -29,7 +31,7 @@ RSpec.describe Web::PushSubscription, type: :model do
       context "when notification is a #{type}" do
         let(:notification_type) { type }
 
-        it "returns boolean corresponding to alert setting" do
+        it 'returns boolean corresponding to alert setting' do
           expect(subject.pushable?(notification)).to eq data[:alerts][type]
         end
       end
@@ -39,7 +41,7 @@ RSpec.describe Web::PushSubscription, type: :model do
       let(:policy) { 'all' }
 
       it 'returns true' do
-        expect(subject.pushable?(notification)).to eq true
+        expect(subject.pushable?(notification)).to be true
       end
     end
 
@@ -47,7 +49,7 @@ RSpec.describe Web::PushSubscription, type: :model do
       let(:policy) { 'none' }
 
       it 'returns false' do
-        expect(subject.pushable?(notification)).to eq false
+        expect(subject.pushable?(notification)).to be false
       end
     end
 
@@ -60,13 +62,13 @@ RSpec.describe Web::PushSubscription, type: :model do
         end
 
         it 'returns true' do
-          expect(subject.pushable?(notification)).to eq true
+          expect(subject.pushable?(notification)).to be true
         end
       end
 
       context 'and notification is not from someone you follow' do
         it 'returns false' do
-          expect(subject.pushable?(notification)).to eq false
+          expect(subject.pushable?(notification)).to be false
         end
       end
     end
@@ -80,13 +82,13 @@ RSpec.describe Web::PushSubscription, type: :model do
         end
 
         it 'returns true' do
-          expect(subject.pushable?(notification)).to eq true
+          expect(subject.pushable?(notification)).to be true
         end
       end
 
       context 'and notification is not from someone who follows you' do
         it 'returns false' do
-          expect(subject.pushable?(notification)).to eq false
+          expect(subject.pushable?(notification)).to be false
         end
       end
     end
diff --git a/spec/models/web/setting_spec.rb b/spec/models/web/setting_spec.rb
index 6657d4030..b7ff3c868 100644
--- a/spec/models/web/setting_spec.rb
+++ b/spec/models/web/setting_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Web::Setting, type: :model do
diff --git a/spec/models/webauthn_credentials_spec.rb b/spec/models/webauthn_credentials_spec.rb
index a63ae6cd2..1a2a2f909 100644
--- a/spec/models/webauthn_credentials_spec.rb
+++ b/spec/models/webauthn_credentials_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe WebauthnCredential, type: :model do
@@ -35,8 +37,8 @@ RSpec.describe WebauthnCredential, type: :model do
     end
 
     it 'is invalid if already exist a webauthn credential with the same external id' do
-      existing_webauthn_credential = Fabricate(:webauthn_credential, external_id: "_Typ0ygudDnk9YUVWLQayw")
-      new_webauthn_credential = Fabricate.build(:webauthn_credential, external_id: "_Typ0ygudDnk9YUVWLQayw")
+      existing_webauthn_credential = Fabricate(:webauthn_credential, external_id: '_Typ0ygudDnk9YUVWLQayw')
+      new_webauthn_credential = Fabricate.build(:webauthn_credential, external_id: '_Typ0ygudDnk9YUVWLQayw')
 
       new_webauthn_credential.valid?
 
diff --git a/spec/models/webhook_spec.rb b/spec/models/webhook_spec.rb
index 60c3d9524..fcf3dd14f 100644
--- a/spec/models/webhook_spec.rb
+++ b/spec/models/webhook_spec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 require 'rails_helper'
 
 RSpec.describe Webhook, type: :model do