diff --git a/spec/fabricators/account_alias_fabricator.rb b/spec/fabricators/account_alias_fabricator.rb
deleted file mode 100644
index 4f434c078af32385bf8c433210ae15b3045681d9..0000000000000000000000000000000000000000
--- a/spec/fabricators/account_alias_fabricator.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:account_alias) do
-  account
-  acct 'test@example.com'
-  uri 'https://example.com/users/test'
-end
diff --git a/spec/fabricators/account_deletion_request_fabricator.rb b/spec/fabricators/account_deletion_request_fabricator.rb
deleted file mode 100644
index 3d3d3739889abaef9142f2b24c79211fb19a2d11..0000000000000000000000000000000000000000
--- a/spec/fabricators/account_deletion_request_fabricator.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:account_deletion_request) do
-  account
-end
diff --git a/spec/fabricators/account_migration_fabricator.rb b/spec/fabricators/account_migration_fabricator.rb
index fd453f6d2ab1ab20e24ee5504d5916dec190a260..ae6143a65c7354d2f0547af7c13de6e2d5ca61f6 100644
--- a/spec/fabricators/account_migration_fabricator.rb
+++ b/spec/fabricators/account_migration_fabricator.rb
@@ -5,4 +5,5 @@ Fabricator(:account_migration) do
   target_account { |attrs| Fabricate(:account, also_known_as: [ActivityPub::TagManager.instance.uri_for(attrs[:account])]) }
   acct           { |attrs| attrs[:target_account].acct }
   followers_count 1234
+  created_at { 60.days.ago }
 end
diff --git a/spec/fabricators/account_moderation_note_fabricator.rb b/spec/fabricators/account_moderation_note_fabricator.rb
index 403870db6d8c2c389f1baa02b49561fd0958f22e..341a24dea0ba00cca53821eeb46efcc2b915b95f 100644
--- a/spec/fabricators/account_moderation_note_fabricator.rb
+++ b/spec/fabricators/account_moderation_note_fabricator.rb
@@ -2,5 +2,6 @@
 
 Fabricator(:account_moderation_note) do
   content 'MyText'
-  account nil
+  account
+  target_account { Fabricate(:account) }
 end
diff --git a/spec/fabricators/account_pin_fabricator.rb b/spec/fabricators/account_pin_fabricator.rb
index 7d8a77bb54e78a4728ebaa17b0a490acb185d411..32a5f3bdb82f4fd0e482ce09d1964ac06e43e114 100644
--- a/spec/fabricators/account_pin_fabricator.rb
+++ b/spec/fabricators/account_pin_fabricator.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
 Fabricator(:account_pin) do
-  account        nil
-  target_account nil
+  account
+  target_account(fabricator: :account)
+  before_create { |account_pin, _| account_pin.account.follow!(account_pin.target_account) }
 end
diff --git a/spec/fabricators/account_stat_fabricator.rb b/spec/fabricators/account_stat_fabricator.rb
index 45b1524ef38f566837bd035984c4259e242e4a59..e6085c5f2bbb0768518c7abe5c1673318dbdaf80 100644
--- a/spec/fabricators/account_stat_fabricator.rb
+++ b/spec/fabricators/account_stat_fabricator.rb
@@ -1,8 +1,8 @@
 # frozen_string_literal: true
 
 Fabricator(:account_stat) do
-  account         nil
-  statuses_count  ''
-  following_count ''
-  followers_count ''
+  account
+  statuses_count  '123'
+  following_count '456'
+  followers_count '789'
 end
diff --git a/spec/fabricators/account_tag_stat_fabricator.rb b/spec/fabricators/account_tag_stat_fabricator.rb
deleted file mode 100644
index 769015bd022e49087d6ecd2b6140dc57d1e0397c..0000000000000000000000000000000000000000
--- a/spec/fabricators/account_tag_stat_fabricator.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:account_tag_stat) do
-  accounts_count ''
-end
diff --git a/spec/fabricators/account_warning_preset_fabricator.rb b/spec/fabricators/account_warning_preset_fabricator.rb
deleted file mode 100644
index 7588e7f9cf90657bb773f58bd1922b8ff6c9cf00..0000000000000000000000000000000000000000
--- a/spec/fabricators/account_warning_preset_fabricator.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:account_warning_preset) do
-  text 'MyText'
-end
diff --git a/spec/fabricators/admin_action_log_fabricator.rb b/spec/fabricators/admin_action_log_fabricator.rb
index eb738c01c05e930baf6d8b0eebce82c66169b3f5..a259644bdcfa2b14abdaa5bf15de0f5a9baabe73 100644
--- a/spec/fabricators/admin_action_log_fabricator.rb
+++ b/spec/fabricators/admin_action_log_fabricator.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 Fabricator('Admin::ActionLog') do
-  account nil
+  account
   action  'MyString'
   target  nil
 end
diff --git a/spec/fabricators/announcement_mute_fabricator.rb b/spec/fabricators/announcement_mute_fabricator.rb
deleted file mode 100644
index 109fec0412c64281154546661ad947ce4e59d2f9..0000000000000000000000000000000000000000
--- a/spec/fabricators/announcement_mute_fabricator.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:announcement_mute) do
-  account
-  announcement
-end
diff --git a/spec/fabricators/announcement_reaction_fabricator.rb b/spec/fabricators/announcement_reaction_fabricator.rb
deleted file mode 100644
index 5da51caaa3ce5edc73d84d36cd15900b0c3dfdc3..0000000000000000000000000000000000000000
--- a/spec/fabricators/announcement_reaction_fabricator.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:announcement_reaction) do
-  account
-  announcement
-  name '🌿'
-end
diff --git a/spec/fabricators/conversation_account_fabricator.rb b/spec/fabricators/conversation_account_fabricator.rb
deleted file mode 100644
index f69d36855e3c6ae44150f8372e9986fd87cfd1e2..0000000000000000000000000000000000000000
--- a/spec/fabricators/conversation_account_fabricator.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:conversation_account) do
-  account                 nil
-  conversation            nil
-  participant_account_ids ''
-  last_status             nil
-end
diff --git a/spec/fabricators/conversation_mute_fabricator.rb b/spec/fabricators/conversation_mute_fabricator.rb
deleted file mode 100644
index 5cf4dd3d59e1077414c16c2fcf0e8f421329b987..0000000000000000000000000000000000000000
--- a/spec/fabricators/conversation_mute_fabricator.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:conversation_mute) do
-end
diff --git a/spec/fabricators/custom_emoji_category_fabricator.rb b/spec/fabricators/custom_emoji_category_fabricator.rb
deleted file mode 100644
index 6019baba21c298b13b294be230b0cec2e94ae7e4..0000000000000000000000000000000000000000
--- a/spec/fabricators/custom_emoji_category_fabricator.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:custom_emoji_category) do
-  name 'MyString'
-end
diff --git a/spec/fabricators/encrypted_message_fabricator.rb b/spec/fabricators/encrypted_message_fabricator.rb
deleted file mode 100644
index 2898827549cdd302696d5cd40b3d7a443c83623a..0000000000000000000000000000000000000000
--- a/spec/fabricators/encrypted_message_fabricator.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:encrypted_message) do
-  device
-  from_account
-  from_device_id   { Faker::Number.number(digits: 5) }
-  type             0
-  body             ''
-  message_franking ''
-end
diff --git a/spec/fabricators/featured_tag_fabricator.rb b/spec/fabricators/featured_tag_fabricator.rb
deleted file mode 100644
index 4bfa3e924e75fd082b37bfc401df26435d57a1d3..0000000000000000000000000000000000000000
--- a/spec/fabricators/featured_tag_fabricator.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:featured_tag) do
-  account
-  tag
-  statuses_count 1_337
-  last_status_at Time.now.utc
-end
diff --git a/spec/fabricators/follow_recommendation_suppression_fabricator.rb b/spec/fabricators/follow_recommendation_suppression_fabricator.rb
deleted file mode 100644
index 6477baee11dfde84782f9b4a2bd43ce9bc70656f..0000000000000000000000000000000000000000
--- a/spec/fabricators/follow_recommendation_suppression_fabricator.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:follow_recommendation_suppression) do
-  account
-end
diff --git a/spec/fabricators/identity_fabricator.rb b/spec/fabricators/identity_fabricator.rb
index b830101117ac16977db92e8cf43764741d14bda8..58072c0d65418a6bbec33bd3a84ac836da13cff7 100644
--- a/spec/fabricators/identity_fabricator.rb
+++ b/spec/fabricators/identity_fabricator.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 Fabricator(:identity) do
-  user     nil
+  user
   provider 'MyString'
   uid      'MyString'
 end
diff --git a/spec/fabricators/import_fabricator.rb b/spec/fabricators/import_fabricator.rb
deleted file mode 100644
index 11602f407ff1ce777ca6b05d822fac4eb78785c5..0000000000000000000000000000000000000000
--- a/spec/fabricators/import_fabricator.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:import) do
-end
diff --git a/spec/fabricators/ip_block_fabricator.rb b/spec/fabricators/ip_block_fabricator.rb
deleted file mode 100644
index a5da3f70658b5438f8bce02c2144706975bd9127..0000000000000000000000000000000000000000
--- a/spec/fabricators/ip_block_fabricator.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:ip_block) do
-  ip         ''
-  severity   ''
-  expires_at '2020-10-08 22:20:37'
-  comment    'MyText'
-end
diff --git a/spec/fabricators/list_account_fabricator.rb b/spec/fabricators/list_account_fabricator.rb
deleted file mode 100644
index b0af29e6fafe78013dd223a42f71dc08f5c88686..0000000000000000000000000000000000000000
--- a/spec/fabricators/list_account_fabricator.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:list_account) do
-  list    nil
-  account nil
-  follow  nil
-end
diff --git a/spec/fabricators/one_time_key_fabricator.rb b/spec/fabricators/one_time_key_fabricator.rb
deleted file mode 100644
index e317c28bd174f748b23009a81b5501869cc69120..0000000000000000000000000000000000000000
--- a/spec/fabricators/one_time_key_fabricator.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:one_time_key) do
-  device
-  key_id { Faker::Alphanumeric.alphanumeric(number: 10) }
-  key    { Base64.strict_encode64(Ed25519::SigningKey.generate.verify_key.to_bytes) }
-
-  signature do |attrs|
-    signing_key = Ed25519::SigningKey.generate
-    attrs[:device].update(fingerprint_key: Base64.strict_encode64(signing_key.verify_key.to_bytes))
-    Base64.strict_encode64(signing_key.sign(attrs[:key]))
-  end
-end
diff --git a/spec/fabricators/setting_fabricator.rb b/spec/fabricators/setting_fabricator.rb
index 336d7c3551289ec8c6f37f35e27d5d7494754dee..ce9a48e9019eaf2272ffef158c4d9124eee5a6e7 100644
--- a/spec/fabricators/setting_fabricator.rb
+++ b/spec/fabricators/setting_fabricator.rb
@@ -1,4 +1,5 @@
 # frozen_string_literal: true
 
 Fabricator(:setting) do
+  var 'var'
 end
diff --git a/spec/fabricators/site_upload_fabricator.rb b/spec/fabricators/site_upload_fabricator.rb
index ad1b777cc475a8c42457d38dd74758c5cf86e719..87553ccb8a0b8f8f54afaa8befeea7924d4f7fa3 100644
--- a/spec/fabricators/site_upload_fabricator.rb
+++ b/spec/fabricators/site_upload_fabricator.rb
@@ -2,4 +2,5 @@
 
 Fabricator(:site_upload) do
   file { Rails.root.join('spec', 'fabricators', 'assets', 'utah_teapot.png').open }
+  var 'thumbnail'
 end
diff --git a/spec/fabricators/status_edit_fabricator.rb b/spec/fabricators/status_edit_fabricator.rb
deleted file mode 100644
index 33735a45920bf3dff9ba3c539841038fb2df8dad..0000000000000000000000000000000000000000
--- a/spec/fabricators/status_edit_fabricator.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:status_edit) do
-  status                    nil
-  account                   nil
-  text                      'MyText'
-  spoiler_text              'MyText'
-  media_attachments_changed false
-end
diff --git a/spec/fabricators/status_stat_fabricator.rb b/spec/fabricators/status_stat_fabricator.rb
deleted file mode 100644
index 8a358c51a918a0e3719f3bb6db5618aa96f5b7c4..0000000000000000000000000000000000000000
--- a/spec/fabricators/status_stat_fabricator.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:status_stat) do
-  status_id        nil
-  replies_count    ''
-  reblogs_count    ''
-  favourites_count ''
-end
diff --git a/spec/fabricators/unavailable_domain_fabricator.rb b/spec/fabricators/unavailable_domain_fabricator.rb
index 300a9e7a1413edc89ca0958578df01c4fdd6d028..cb9707020ae04e42f0dea5c9a8b26360b1c8257a 100644
--- a/spec/fabricators/unavailable_domain_fabricator.rb
+++ b/spec/fabricators/unavailable_domain_fabricator.rb
@@ -1,5 +1,5 @@
 # frozen_string_literal: true
 
 Fabricator(:unavailable_domain) do
-  domain { Faker::Internet.domain }
+  domain { Faker::Internet.domain_name }
 end
diff --git a/spec/fabricators/user_invite_request_fabricator.rb b/spec/fabricators/user_invite_request_fabricator.rb
deleted file mode 100644
index 7736263e4594fc76dfa2125e851743ce7a909b89..0000000000000000000000000000000000000000
--- a/spec/fabricators/user_invite_request_fabricator.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:user_invite_request) do
-  user
-  text { Faker::Lorem.sentence }
-end
diff --git a/spec/fabricators/web_setting_fabricator.rb b/spec/fabricators/web_setting_fabricator.rb
deleted file mode 100644
index 7c9f30079827e33b4ac1dc1b73d8adf72a0cd63a..0000000000000000000000000000000000000000
--- a/spec/fabricators/web_setting_fabricator.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-# frozen_string_literal: true
-
-Fabricator(:web_setting, from: Web::Setting) do
-end
diff --git a/spec/fabricators_spec.rb b/spec/fabricators_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..3b76c56ce657f0a110a7b3797cff1999ac511d22
--- /dev/null
+++ b/spec/fabricators_spec.rb
@@ -0,0 +1,12 @@
+require 'rails_helper'
+
+Fabrication.manager.load_definitions if Fabrication.manager.empty?
+
+Fabrication.manager.schematics.map(&:first).each do |factory_name|
+  describe "The #{factory_name} factory" do
+    it 'is valid' do
+      factory = Fabricate(factory_name)
+      expect(factory).to be_valid
+    end
+  end
+end
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index 1e5a80963fee0f10a1fc3d752e9e29c117ef2152..ae4e5ee32181e9d9070146b45bd8375914ef02dd 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -704,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?
diff --git a/spec/models/block_spec.rb b/spec/models/block_spec.rb
index 64c39fce60aaddfcfff4db2f63992a03b268a397..6e31786d04b5cd9c67e664777b3339c59a38d604 100644
--- a/spec/models/block_spec.rb
+++ b/spec/models/block_spec.rb
@@ -4,11 +4,6 @@ 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?
diff --git a/spec/models/domain_block_spec.rb b/spec/models/domain_block_spec.rb
index 6a5925b8966f6987de40783d39df3e5a0b216e7b..9839ee9d4e5af2ac8fe2acb4c43be9578afa9a12 100644
--- a/spec/models/domain_block_spec.rb
+++ b/spec/models/domain_block_spec.rb
@@ -4,11 +4,6 @@ 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?
diff --git a/spec/models/email_domain_block_spec.rb b/spec/models/email_domain_block_spec.rb
index 01a7a0f0ed7d6ca8d28608824034ddbd36efaf41..3321ffc819d487e39689ae738b075029782b34db 100644
--- a/spec/models/email_domain_block_spec.rb
+++ b/spec/models/email_domain_block_spec.rb
@@ -3,13 +3,6 @@
 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/follow_spec.rb b/spec/models/follow_spec.rb
index f49d5853295f59e94593c49e705d77972bb50928..a9a9af88ad04f5ae1d52c10b8256e31bb5ca3095 100644
--- a/spec/models/follow_spec.rb
+++ b/spec/models/follow_spec.rb
@@ -9,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/mention_spec.rb b/spec/models/mention_spec.rb
index 3de2b4a07203022290f521788225db90600af630..044bb80cf675849513ee5871a4c99faea4c611ea 100644
--- a/spec/models/mention_spec.rb
+++ b/spec/models/mention_spec.rb
@@ -4,11 +4,6 @@ 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/report_spec.rb b/spec/models/report_spec.rb
index d5d40a34f95bb674c4011dfce86216b9fe68356d..20a048c33448488bce7ad237d5e2ce87dae6aab9 100644
--- a/spec/models/report_spec.rb
+++ b/spec/models/report_spec.rb
@@ -121,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?