diff options
Diffstat (limited to 'rubocop/cop/rspec/factory_bot/avoid_create.rb')
-rw-r--r-- | rubocop/cop/rspec/factory_bot/avoid_create.rb | 46 |
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 |