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