Sha256: 18cd6a2ae1f61ff3d1f4232c6246ea29dd190d06108223fa60e71084f5fd9669

Contents?: true

Size: 1.6 KB

Versions: 1

Compression:

Stored size: 1.6 KB

Contents

# frozen_string_literal: true

module RuboCop
  module Cop
    module RSpec
      module Rails
        # Checks that tests use `have_http_status` instead of equality matchers.
        #
        # @example
        #   # bad
        #   expect(response.status).to be(200)
        #   expect(response.code).to eq("200")
        #
        #   # good
        #   expect(response).to have_http_status(200)
        #
        class HaveHttpStatus < ::RuboCop::Cop::Base
          extend AutoCorrector

          MSG =
            'Prefer `expect(response).%<to>s have_http_status(%<status>i)` ' \
            '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})
              )
              $RUNNERS
              $(send nil? {:be :eq :eql :equal} ({int str} $_))
            )
          PATTERN

          def on_send(node)
            match_status(node) do |response_status, to, match, status|
              message = format(MSG, to: to, status: status,
                                    bad_code: node.source)
              add_offense(node, message: message) do |corrector|
                corrector.replace(response_status, 'response')
                corrector.replace(match.loc.selector, 'have_http_status')
                corrector.replace(match.first_argument, status.to_i.to_s)
              end
            end
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rubocop-rspec-2.20.0 lib/rubocop/cop/rspec/rails/have_http_status.rb