lib/rubocop/cop/rspec/capybara/negation_matcher.rb in rubocop-rspec-2.17.1 vs lib/rubocop/cop/rspec/capybara/negation_matcher.rb in rubocop-rspec-2.18.0

- old
+ new

@@ -2,105 +2,32 @@ module RuboCop module Cop module RSpec module Capybara - # Enforces use of `have_no_*` or `not_to` for negated expectations. - # - # @example EnforcedStyle: not_to (default) - # # bad - # expect(page).to have_no_selector - # expect(page).to have_no_css('a') - # - # # good - # expect(page).not_to have_selector - # expect(page).not_to have_css('a') - # - # @example EnforcedStyle: have_no - # # bad - # expect(page).not_to have_selector - # expect(page).not_to have_css('a') - # - # # good - # expect(page).to have_no_selector - # expect(page).to have_no_css('a') - # - class NegationMatcher < ::RuboCop::Cop::Base - extend AutoCorrector - include ConfigurableEnforcedStyle - - MSG = 'Use `expect(...).%<runner>s %<matcher>s`.' - CAPYBARA_MATCHERS = %w[ - selector css xpath text title current_path link button - field checked_field unchecked_field select table - sibling ancestor - ].freeze - POSITIVE_MATCHERS = - Set.new(CAPYBARA_MATCHERS) { |element| :"have_#{element}" }.freeze - NEGATIVE_MATCHERS = - Set.new(CAPYBARA_MATCHERS) { |element| :"have_no_#{element}" } - .freeze - RESTRICT_ON_SEND = (POSITIVE_MATCHERS + NEGATIVE_MATCHERS).freeze - - # @!method not_to?(node) - def_node_matcher :not_to?, <<~PATTERN - (send ... :not_to - (send nil? %POSITIVE_MATCHERS ...)) - PATTERN - - # @!method have_no?(node) - def_node_matcher :have_no?, <<~PATTERN - (send ... :to - (send nil? %NEGATIVE_MATCHERS ...)) - PATTERN - - def on_send(node) - return unless offense?(node.parent) - - matcher = node.method_name.to_s - add_offense(offense_range(node), - message: message(matcher)) do |corrector| - corrector.replace(node.parent.loc.selector, replaced_runner) - corrector.replace(node.loc.selector, - replaced_matcher(matcher)) - end - end - - private - - def offense?(node) - (style == :have_no && not_to?(node)) || - (style == :not_to && have_no?(node)) - end - - def offense_range(node) - node.parent.loc.selector.with(end_pos: node.loc.selector.end_pos) - end - - def message(matcher) - format(MSG, - runner: replaced_runner, - matcher: replaced_matcher(matcher)) - end - - def replaced_runner - case style - when :have_no - 'to' - when :not_to - 'not_to' - end - end - - def replaced_matcher(matcher) - case style - when :have_no - matcher.sub('have_', 'have_no_') - when :not_to - matcher.sub('have_no_', 'have_') - end - end - end + # @!parse + # # Enforces use of `have_no_*` or `not_to` for negated expectations. + # # + # # @example EnforcedStyle: not_to (default) + # # # bad + # # expect(page).to have_no_selector + # # expect(page).to have_no_css('a') + # # + # # # good + # # expect(page).not_to have_selector + # # expect(page).not_to have_css('a') + # # + # # @example EnforcedStyle: have_no + # # # bad + # # expect(page).not_to have_selector + # # expect(page).not_to have_css('a') + # # + # # # good + # # expect(page).to have_no_selector + # # expect(page).to have_no_css('a') + # # + # class NegationMatcher < ::RuboCop::Cop::Base; end + NegationMatcher = ::RuboCop::Cop::Capybara::NegationMatcher end end end end