summaryrefslogtreecommitdiff
path: root/rubocop/cop/rspec/factory_bot/avoid_create.rb
diff options
context:
space:
mode:
Diffstat (limited to 'rubocop/cop/rspec/factory_bot/avoid_create.rb')
-rw-r--r--rubocop/cop/rspec/factory_bot/avoid_create.rb46
1 files changed, 46 insertions, 0 deletions
diff --git a/rubocop/cop/rspec/factory_bot/avoid_create.rb b/rubocop/cop/rspec/factory_bot/avoid_create.rb
new file mode 100644
index 00000000000..e9bccfb37cd
--- /dev/null
+++ b/rubocop/cop/rspec/factory_bot/avoid_create.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'rubocop-rspec'
+
+module RuboCop
+ module Cop
+ module RSpec
+ module FactoryBot
+ # This cop checks for the creation of ActiveRecord objects in serializers specs specs
+ #
+ # @example
+ #
+ # # bad
+ # let(:user) { create(:user) }
+ # let(:users) { create_list(:user, 2) }
+ #
+ # # good
+ # let(:user) { build_stubbed(:user) }
+ # let(:user) { build(:user) }
+ # let(:users) { build_stubbed_list(:user, 2) }
+ # let(:users) { build_list(:user, 2) }
+ class AvoidCreate < RuboCop::Cop::Base
+ MESSAGE = "Prefer using `build_stubbed` or similar over `%{method_name}`. See https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#optimize-factory-usage"
+ FORBIDDEN_METHODS = %i[create create_list].freeze
+ RESTRICT_ON_SEND = FORBIDDEN_METHODS
+
+ def_node_matcher :forbidden_factory_usage, <<~PATTERN
+ (
+ send
+ {(const nil? :FactoryBot) nil?}
+ ${ #{FORBIDDEN_METHODS.map(&:inspect).join(' ')} }
+ ...
+ )
+ PATTERN
+
+ def on_send(node)
+ method_name = forbidden_factory_usage(node)
+ return unless method_name
+
+ add_offense(node, message: format(MESSAGE, method_name: method_name))
+ end
+ end
+ end
+ end
+ end
+end