mirror of
https://github.com/thoughtbot/shoulda-matchers.git
synced 2022-11-09 12:01:38 -05:00
b7e02184d9
- bump rubocop to v1.0 - Fix Layout/MultilineAssignmentLayout and other remaining offences - Exculde appraisal generated gemfiles in rubocop - Replace NON_NUMERIC_VALUE constant with instance method against failing test case in rails <= 5.1 and postgres adapter. This is a defect in rails where a frozen string is modified in https://github.com/rails/rails/blob/v5.1.7/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb#L25
115 lines
3 KiB
Ruby
115 lines
3 KiB
Ruby
module Shoulda
|
|
module Matchers
|
|
module ActionController
|
|
# The `rescue_from` matcher tests usage of the `rescue_from` macro. It
|
|
# asserts that an exception and method are present in the list of
|
|
# exception handlers, and that the handler method exists.
|
|
#
|
|
# class ApplicationController < ActionController::Base
|
|
# rescue_from ActiveRecord::RecordNotFound, with: :handle_not_found
|
|
#
|
|
# private
|
|
#
|
|
# def handle_not_found
|
|
# # ...
|
|
# end
|
|
# end
|
|
#
|
|
# # RSpec
|
|
# RSpec.describe ApplicationController, type: :controller do
|
|
# it do
|
|
# should rescue_from(ActiveRecord::RecordNotFound).
|
|
# with(:handle_not_found)
|
|
# end
|
|
# end
|
|
#
|
|
# # Minitest (Shoulda)
|
|
# class ApplicationControllerTest < ActionController::TestCase
|
|
# should rescue_from(ActiveRecord::RecordNotFound).
|
|
# with(:handle_not_found)
|
|
# end
|
|
#
|
|
# @return [RescueFromMatcher]
|
|
#
|
|
def rescue_from(exception)
|
|
RescueFromMatcher.new exception
|
|
end
|
|
|
|
# @private
|
|
class RescueFromMatcher
|
|
def initialize(exception)
|
|
@exception = exception
|
|
@expected_method = nil
|
|
@controller = nil
|
|
end
|
|
|
|
def with(method)
|
|
@expected_method = method
|
|
self
|
|
end
|
|
|
|
def matches?(controller)
|
|
@controller = controller
|
|
rescues_from_exception? && method_name_matches? && handler_exists?
|
|
end
|
|
|
|
def description
|
|
description = "rescue from #{exception}"
|
|
description << " with ##{expected_method}" if expected_method
|
|
description
|
|
end
|
|
|
|
def failure_message
|
|
"Expected #{expectation}"
|
|
end
|
|
|
|
def failure_message_when_negated
|
|
"Did not expect #{expectation}"
|
|
end
|
|
|
|
protected
|
|
|
|
attr_reader :controller, :exception, :expected_method, :handlers
|
|
|
|
def expectation
|
|
expectation = "#{controller} to rescue from #{exception}"
|
|
|
|
if expected_method && !method_name_matches?
|
|
expectation << " with ##{expected_method}"
|
|
end
|
|
|
|
unless handler_exists?
|
|
expectation << " but #{controller} does not respond to"\
|
|
" #{expected_method}"
|
|
end
|
|
expectation
|
|
end
|
|
|
|
def rescues_from_exception?
|
|
@handlers = controller.rescue_handlers.select do |handler|
|
|
handler.first == exception.to_s
|
|
end
|
|
handlers.any?
|
|
end
|
|
|
|
def method_name_matches?
|
|
if expected_method.present?
|
|
handlers.any? do |handler|
|
|
handler.last == expected_method
|
|
end
|
|
else
|
|
true
|
|
end
|
|
end
|
|
|
|
def handler_exists?
|
|
if expected_method.present?
|
|
controller.respond_to? expected_method, true
|
|
else
|
|
true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|