47 lines
1.4 KiB
Ruby
47 lines
1.4 KiB
Ruby
|
# 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
|