test/mapped_error_test.rb in rtomayko-sinatra-0.3.3 vs test/mapped_error_test.rb in rtomayko-sinatra-0.8.9

- old
+ new

@@ -1,72 +1,164 @@ -require File.dirname(__FILE__) + '/helper' +require 'test/spec' +require 'sinatra/base' +require 'sinatra/test' -class FooError < RuntimeError; end +describe 'Exception Mappings' do + include Sinatra::Test -context "Mapped errors" do + class FooError < RuntimeError + end - setup do - Sinatra.application = nil - Sinatra.application.options.raise_errors = false + it 'invokes handlers registered with ::error when raised' do + mock_app { + set :raise_errors, false + error(FooError) { 'Foo!' } + get '/' do + raise FooError + end + } + get '/' + status.should.equal 500 + body.should.equal 'Foo!' end - specify "are rescued and run in context" do + it 'uses the Exception handler if no matching handler found' do + mock_app { + set :raise_errors, false + error(Exception) { 'Exception!' } + get '/' do + raise FooError + end + } + get '/' + status.should.equal 500 + body.should.equal 'Exception!' + end - error FooError do - 'MAPPED ERROR!' - end + it "sets env['sinatra.error'] to the rescued exception" do + mock_app { + set :raise_errors, false + error(FooError) { + env.should.include 'sinatra.error' + env['sinatra.error'].should.be.kind_of FooError + 'looks good' + } + get '/' do + raise FooError + end + } + get '/' + body.should.equal 'looks good' + end - get '/' do - raise FooError - end + it 'dumps errors to rack.errors when dump_errors is enabled' do + mock_app { + set :raise_errors, false + set :dump_errors, true + get('/') { raise FooError, 'BOOM!' } + } - get_it '/' + get '/' + status.should.equal 500 + @response.errors.should.match(/FooError - BOOM!:/) + end - should.be.server_error - body.should.equal 'MAPPED ERROR!' + it "raises without calling the handler when the raise_errors options is set" do + mock_app { + set :raise_errors, true + error(FooError) { "she's not there." } + get '/' do + raise FooError + end + } + lambda { get '/' }.should.raise FooError + end + it "never raises Sinatra::NotFound beyond the application" do + mock_app { + set :raise_errors, true + get '/' do + raise Sinatra::NotFound + end + } + lambda { get '/' }.should.not.raise Sinatra::NotFound + status.should.equal 404 end - specify "renders empty if no each method on result" do + class FooNotFound < Sinatra::NotFound + end - error FooError do - nil - end + it "cascades for subclasses of Sinatra::NotFound" do + mock_app { + set :raise_errors, true + error(FooNotFound) { "foo! not found." } + get '/' do + raise FooNotFound + end + } + lambda { get '/' }.should.not.raise FooNotFound + status.should.equal 404 + body.should.equal 'foo! not found.' + end - get '/' do - raise FooError - end + it 'has a not_found method for backwards compatibility' do + mock_app { + not_found do + "Lost, are we?" + end + } - get_it '/' + get '/test' + status.should.equal 404 + body.should.equal "Lost, are we?" + end +end - should.be.server_error - body.should.be.empty - +describe 'Custom Error Pages' do + it 'allows numeric status code mappings to be registered with ::error' do + mock_app { + set :raise_errors, false + error(500) { 'Foo!' } + get '/' do + [500, {}, 'Internal Foo Error'] + end + } + get '/' + status.should.equal 500 + body.should.equal 'Foo!' end - specify "doesn't override status if set" do - - error FooError do - status(200) - end - - get '/' do - raise FooError - end - - get_it '/' - - should.be.ok - + it 'allows ranges of status code mappings to be registered with :error' do + mock_app { + set :raise_errors, false + error(500..550) { "Error: #{response.status}" } + get '/' do + [507, {}, 'A very special error'] + end + } + get '/' + status.should.equal 507 + body.should.equal 'Error: 507' end - specify "raises errors when the raise_errors option is set" do - Sinatra.application.options.raise_errors = true - error FooError do - end - get '/' do - raise FooError - end - assert_raises(FooError) { get_it('/') } + class FooError < RuntimeError end + it 'runs after exception mappings and overwrites body' do + mock_app { + set :raise_errors, false + error FooError do + response.status = 502 + 'from exception mapping' + end + error(500) { 'from 500 handler' } + error(502) { 'from custom error page' } + + get '/' do + raise FooError + end + } + get '/' + status.should.equal 502 + body.should.equal 'from custom error page' + end end