lib/rubocop/cop/rspec/rails/have_http_status.rb in rubocop-rspec-2.26.1 vs lib/rubocop/cop/rspec/rails/have_http_status.rb in rubocop-rspec-2.27.0

- old
+ new

@@ -4,50 +4,74 @@ module Cop module RSpec module Rails # Checks that tests use `have_http_status` instead of equality matchers. # - # @example + # @example ResponseMethods: ['response', 'last_response'] (default) # # bad # expect(response.status).to be(200) - # expect(response.code).to eq("200") + # expect(last_response.code).to eq("200") # # # good # expect(response).to have_http_status(200) + # expect(last_response).to have_http_status(200) # + # @example ResponseMethods: ['foo_response'] + # # bad + # expect(foo_response.status).to be(200) + # + # # good + # expect(foo_response).to have_http_status(200) + # + # # also good + # expect(response).to have_http_status(200) + # expect(last_response).to have_http_status(200) + # class HaveHttpStatus < ::RuboCop::Cop::Base extend AutoCorrector MSG = - 'Prefer `expect(response).%<to>s have_http_status(%<status>s)` ' \ - 'over `%<bad_code>s`.' + 'Prefer `expect(%<response>s).%<to>s ' \ + 'have_http_status(%<status>s)` over `%<bad_code>s`.' RUNNERS = %i[to to_not not_to].to_set RESTRICT_ON_SEND = RUNNERS # @!method match_status(node) def_node_matcher :match_status, <<~PATTERN (send (send nil? :expect - $(send (send nil? :response) {:status :code}) + $(send $(send nil? #response_methods?) {:status :code}) ) $RUNNERS $(send nil? {:be :eq :eql :equal} ({int str} $_)) ) PATTERN - def on_send(node) - match_status(node) do |response_status, to, match, status| + def on_send(node) # rubocop:disable Metrics/MethodLength + match_status(node) do + |response_status, response_method, to, match, status| return unless status.to_s.match?(/\A\d+\z/) - message = format(MSG, to: to, status: status, + message = format(MSG, response: response_method.method_name, + to: to, status: status, bad_code: node.source) add_offense(node, message: message) do |corrector| - corrector.replace(response_status, 'response') + corrector.replace(response_status, response_method.method_name) corrector.replace(match.loc.selector, 'have_http_status') corrector.replace(match.first_argument, status.to_s) end end + end + + private + + def response_methods?(name) + response_methods.include?(name.to_s) + end + + def response_methods + cop_config.fetch('ResponseMethods', []) end end end end end