1
0
Fork 0
mirror of https://github.com/thoughtbot/shoulda-matchers.git synced 2022-11-09 12:01:38 -05:00
thoughtbot--shoulda-matchers/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb
Elliot Winkler afa6a7b666 Update RSpec test style across docs
Instead of using

    describe Foo do
      # ...
    end

use

    RSpec.describe Foo, type: :model do
      # ...
    end

instead. This is not exactly official, as the former style still works,
but the latter style is highly suggested in RSpec documentation and the
like, so this is what people are used to.

[ci skip]
2016-06-15 18:02:07 -06:00

114 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