Sha256: ec81d3623bad1767ca9a732eb5446ad0725f4cb79c72b55a0eee704a98e52f51

Contents?: true

Size: 1.97 KB

Versions: 10

Compression:

Stored size: 1.97 KB

Contents

# frozen_string_literal: true

require 'rspec/expectations'

RSpec::Matchers.define :be_handled_as_an_error do |expected_error_class|
  include MyApiClient::MatcherHelper

  match do |api_request|
    init
    set_validation_for_retry_count
    handle_error(api_request).is_a? expected_error_class
  end

  match_when_negated do |api_request|
    init
    handle_error(api_request).nil?
  end

  chain(:after_retry, :retry_count)
  chain(:times) {}
  chain(:when_receive, :expected_response)

  description do
    message = "be handled as #{expected_error_class || 'an error'}"
    message += " after retry #{retry_count} times" unless retry_count.nil?
    message
  end

  failure_message do |api_request|
    actual_error = handle_error(api_request)
    if actual_error.nil?
      "expected to be handled as #{expected_error_class.name}, " \
        'but not to be handled'
    else
      "expected to be handled as #{expected_error_class.name}, " \
        "but it was handled as #{actual_error.class.name}"
    end
  end

  failure_message_when_negated do |api_request|
    actual_error = handle_error(api_request)
    'expected not to be handled as an error, ' \
      "but it was handled as #{actual_error.class.name}"
  end

  attr_reader :sawyer

  # rubocop:disable Metrics/AbcSize
  def init
    disable_logging
    response = dummy_response(
      status: expected_response[:status_code] || 200,
      headers: expected_response[:headers] || {},
      body: expected_response[:body] || nil
    )
    @sawyer = instance_double(Sawyer::Agent, call: response)
    allow(Sawyer::Agent).to receive(:new).and_return(sawyer)
    allow(MyApiClient::Sleeper).to receive(:call)
  end
  # rubocop:enable Metrics/AbcSize

  def set_validation_for_retry_count
    return if retry_count.nil?

    expect(sawyer).to receive(:call).exactly(retry_count + 1).times
  end

  def handle_error(api_request)
    api_request.call
  rescue MyApiClient::Error => e
    e
  else
    nil
  end

  supports_block_expectations
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
my_api_client-1.2.0 lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb
my_api_client-1.1.0 lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb
my_api_client-1.0.0 lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb
my_api_client-0.27.0 lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb
my_api_client-0.26.0 lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb
my_api_client-0.25.0 lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb
my_api_client-0.24.0 lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb
my_api_client-0.23.0 lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb
my_api_client-0.22.0 lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb
my_api_client-0.21.0 lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb