lib/rubocop/cop/rspec/be_nil.rb in rubocop-rspec-2.9.0 vs lib/rubocop/cop/rspec/be_nil.rb in rubocop-rspec-2.10.0
- old
+ new
@@ -1,37 +1,71 @@
# frozen_string_literal: true
module RuboCop
module Cop
module RSpec
- # Check that `be_nil` is used instead of `be(nil)`.
+ # Ensures a consistent style is used when matching `nil`.
#
- # RSpec has a built-in `be_nil` matcher specifically for expecting `nil`.
- # For consistent specs, we recommend using that instead of `be(nil)`.
+ # You can either use the more specific `be_nil` matcher, or the more
+ # generic `be` matcher with a `nil` argument.
#
- # @example
+ # This cop can be configured using the `EnforcedStyle` option
#
+ # @example `EnforcedStyle: be_nil` (default)
# # bad
# expect(foo).to be(nil)
#
# # good
# expect(foo).to be_nil
#
+ # @example `EnforcedStyle: be`
+ # # bad
+ # expect(foo).to be_nil
+ #
+ # # good
+ # expect(foo).to be(nil)
+ #
class BeNil < Base
extend AutoCorrector
+ include ConfigurableEnforcedStyle
- MSG = 'Prefer `be_nil` over `be(nil)`.'
- RESTRICT_ON_SEND = %i[be].freeze
+ BE_MSG = 'Prefer `be(nil)` over `be_nil`.'
+ BE_NIL_MSG = 'Prefer `be_nil` over `be(nil)`.'
+ RESTRICT_ON_SEND = %i[be be_nil].freeze
+ # @!method be_nil_matcher?(node)
+ def_node_matcher :be_nil_matcher?, <<-PATTERN
+ (send nil? :be_nil)
+ PATTERN
+
# @!method nil_value_expectation?(node)
def_node_matcher :nil_value_expectation?, <<-PATTERN
(send nil? :be nil)
PATTERN
def on_send(node)
+ case style
+ when :be
+ check_be_style(node)
+ when :be_nil
+ check_be_nil_style(node)
+ end
+ end
+
+ private
+
+ def check_be_style(node)
+ return unless be_nil_matcher?(node)
+
+ add_offense(node, message: BE_MSG) do |corrector|
+ corrector.replace(node.loc.expression, 'be(nil)')
+ end
+ end
+
+ def check_be_nil_style(node)
return unless nil_value_expectation?(node)
- add_offense(node) do |corrector|
+ add_offense(node, message: BE_NIL_MSG) do |corrector|
corrector.replace(node.loc.expression, 'be_nil')
end
end
end
end