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