Class: RuboCop::Cop::Momocop::FactoryBotMissingClassOption

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Includes:
Momocop::Helpers::FactoryBotHelper
Defined in:
lib/rubocop/cop/momocop/factory_bot_missing_class_option.rb

Overview

Ensures that FactoryBot factories explicitly specify a class.

Examples:

# bad
factory :user do
end

# good
factory :user, class: 'User' do
end

Constant Summary collapse

MSG =
'Specify a class option explicitly in FactoryBot factory.'
RESTRICT_ON_SEND =
%i[factory].freeze

Constants included from Momocop::Helpers::FactoryBotHelper

Momocop::Helpers::FactoryBotHelper::RUBOCOP_HELPER_METHODS

Instance Method Summary collapse

Instance Method Details

#on_send(node) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/rubocop/cop/momocop/factory_bot_missing_class_option.rb', line 24

def on_send(node)
  return unless inside_factory_bot_define?(node)

  # `factory`メソッドの呼び出しで、ハッシュ引数に`:class`キーが含まれているかを調べる
  class_option_specified = node.arguments.any? { |arg|
    arg.hash_type? && arg.pairs.any? { |pair| pair.key.sym_type? && pair.key.children.first == :class }
  }
  return if class_option_specified

  add_offense(node.loc.selector) do |corrector|
    # Assuming the factory name matches the class name.
    # You may need a more sophisticated approach for different naming conventions.
    require 'active_support/core_ext/string/inflections'
    class_name = node.first_argument.value.to_s.camelize
    corrector.insert_after(node.first_argument.loc.expression, ", class: '#{class_name}'")
  end
end