rack-rescue 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Users/dneighman/Projects/rack-rescue/Gemfile +15 -0
- data/Users/dneighman/Projects/rack-rescue/Gemfile.lock +93 -0
- data/Users/dneighman/Projects/rack-rescue/LICENSE +20 -0
- data/Users/dneighman/Projects/rack-rescue/README.textile +80 -0
- data/Users/dneighman/Projects/rack-rescue/Rakefile +26 -0
- data/Users/dneighman/Projects/rack-rescue/TODO.textile +7 -0
- data/Users/dneighman/Projects/rack-rescue/lib/rack-rescue.rb +1 -0
- data/Users/dneighman/Projects/rack-rescue/lib/rack/rescue.rb +93 -0
- data/Users/dneighman/Projects/rack-rescue/lib/rack/rescue/default_exceptions.rb +16 -0
- data/Users/dneighman/Projects/rack-rescue/lib/rack/rescue/exceptions.rb +107 -0
- data/Users/dneighman/Projects/rack-rescue/lib/rack/rescue/handler.rb +124 -0
- data/Users/dneighman/Projects/rack-rescue/lib/rack/rescue/responder.rb +21 -0
- data/Users/dneighman/Projects/rack-rescue/lib/rack/rescue/templates/rack_rescue_templates/error.development.html.erb +19 -0
- data/Users/dneighman/Projects/rack-rescue/lib/rack/rescue/templates/rack_rescue_templates/error.html.erb +15 -0
- data/Users/dneighman/Projects/rack-rescue/lib/rack/rescue/templates/rack_rescue_templates/error.text.erb +14 -0
- data/Users/dneighman/Projects/rack-rescue/lib/rack/rescue/templates/rack_rescue_templates/not_found.text.erb +4 -0
- data/Users/dneighman/Projects/rack-rescue/rack-rescue.gemspec +26 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack-rescue_spec.rb +151 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/exceptions_spec.rb +85 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/fixtures/alternate_errors/alternate_exceptions.foo_env.html.erb +1 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/fixtures/alternate_errors/alternate_exceptions.html.erb +1 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/fixtures/alternate_errors/custom_exception.text.erb +1 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/fixtures/alternate_errors/error.xml.erb +5 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/fixtures/alternate_errors/inherit_from_error_backtrace.text.erb +4 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/fixtures/alternate_errors/inherit_from_error_header.text.erb +4 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/fixtures/alternate_errors/inherit_from_error_message.text.erb +4 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/fixtures/alternate_errors/not_found.text.erb +7 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/fixtures/alternate_errors/not_found.xml.erb +3 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/fixtures/layouts/custom_error_layout.xml.erb +4 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/fixtures/layouts/error.html.erb +7 -0
- data/Users/dneighman/Projects/rack-rescue/spec/rack/rescue/handler_spec.rb +112 -0
- data/Users/dneighman/Projects/rack-rescue/spec/spec.opts +2 -0
- data/Users/dneighman/Projects/rack-rescue/spec/spec_helper.rb +22 -0
- metadata +213 -0
@@ -0,0 +1,124 @@
|
|
1
|
+
module Rack
|
2
|
+
class Rescue
|
3
|
+
class Handler
|
4
|
+
include Pancake::Mixins::Render
|
5
|
+
|
6
|
+
# Setup the default root for the error templates
|
7
|
+
roots << ::File.join(::File.expand_path(::File.dirname(__FILE__)), "templates")
|
8
|
+
push_paths(:error_templates, "rack_rescue_templates", "**/*")
|
9
|
+
|
10
|
+
attr_accessor :exception, :status, :default_template, :default_format
|
11
|
+
attr_reader :name
|
12
|
+
|
13
|
+
# Rack::Rescue::Handler looks for templates in the form
|
14
|
+
# <template_name>.<format>.<engine_name>
|
15
|
+
#
|
16
|
+
# By default, the format is :text, but you can configure this to be any format you like
|
17
|
+
# @see Rack::Rescue::Handler.default_format=
|
18
|
+
# @api public
|
19
|
+
def self.default_format
|
20
|
+
@default_format ||= :text
|
21
|
+
end
|
22
|
+
|
23
|
+
# Set the default format to format of your chosing
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
# Rack::Rescue::Handler.default_format = :html
|
27
|
+
#
|
28
|
+
# @see Rack::Rescue::Handler.default_format
|
29
|
+
# @api public
|
30
|
+
def self.default_format=(format)
|
31
|
+
@default_format = format
|
32
|
+
end
|
33
|
+
|
34
|
+
# Looks to se if a template is avaialble
|
35
|
+
#
|
36
|
+
# @example
|
37
|
+
# Rack::Rescue::Handler.template?(:obscure_error, :format => :html)
|
38
|
+
#
|
39
|
+
# @see Pancake::Mixins::Render::ClassMethods#template
|
40
|
+
def self.template?(name, opts = {})
|
41
|
+
!!template(name, opts)
|
42
|
+
rescue Pancake::Mixins::Render::TemplateNotFound
|
43
|
+
false
|
44
|
+
end
|
45
|
+
|
46
|
+
# The defaule path name for the paths_for label
|
47
|
+
#
|
48
|
+
# @example
|
49
|
+
# Rack::Rescue::Handler.push_paths(:error_templates, ".", "**/*")
|
50
|
+
# Rack::Rescue::Handler._template_path_name should return :error_templates
|
51
|
+
#
|
52
|
+
# @see Pancake::Mixins::Render::ClassMethods._template_path_name
|
53
|
+
# @api overwritable
|
54
|
+
def self._template_path_name(opts = {})
|
55
|
+
:error_templates
|
56
|
+
end
|
57
|
+
|
58
|
+
# Provides the name for the template with the relevant options
|
59
|
+
#
|
60
|
+
# The template name should be the filename of the template up and until the extension for the template engine.
|
61
|
+
#
|
62
|
+
# The template name can be one of two forms.
|
63
|
+
# The first preference includes the format, and the rack environment.
|
64
|
+
#
|
65
|
+
# @example
|
66
|
+
# # ENV['RACK_ENV'] == "test" && format == :html
|
67
|
+
# my_template.test.html.haml
|
68
|
+
#
|
69
|
+
# # The second preference is to use simply the format
|
70
|
+
# my_template.html.haml
|
71
|
+
#
|
72
|
+
# @example
|
73
|
+
# # To find a template: my_template.html.erb
|
74
|
+
#
|
75
|
+
# Rack::Rescue::Handler._template_name_for("my_template", :format => :html) #=> "my_template.html"
|
76
|
+
# @see Pancake::Mixins::Render::ClassMethods._template_name_for
|
77
|
+
# @api overwritable
|
78
|
+
def self._template_name_for(name,opts)
|
79
|
+
@template_names ||= {}
|
80
|
+
format = opts.fetch(:format, default_format)
|
81
|
+
env = ENV['RACK_ENV']
|
82
|
+
key = [name, env, format]
|
83
|
+
@template_names[key] ||= begin
|
84
|
+
names = []
|
85
|
+
names << "#{name}.#{env}.#{format}" if env && format
|
86
|
+
names << "#{name}.#{format}" if format
|
87
|
+
names << "#{name}"
|
88
|
+
names
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def initialize(exception, opts = {}, &blk)
|
93
|
+
@exception = exception
|
94
|
+
@name = Exceptions.exception_name(exception)
|
95
|
+
@status = opts.fetch(:status, 500)
|
96
|
+
@default_template = opts.fetch(:template, 'error')
|
97
|
+
@default_format = opts[:format] if opts[:format]
|
98
|
+
end
|
99
|
+
|
100
|
+
# The main workhorse of the handler
|
101
|
+
# This should be called with the error you want to render.
|
102
|
+
# The error will be provided to the template in the local "error" variable
|
103
|
+
# @api private
|
104
|
+
def render_error(error, opts = {})
|
105
|
+
opts = opts.dup
|
106
|
+
template_name = opts.fetch(:template_name, default_template)
|
107
|
+
opts[:format] ||= default_format || self.class.default_format
|
108
|
+
opts[:error] ||= error
|
109
|
+
opts[:status] = self.status
|
110
|
+
|
111
|
+
if self.class.template?(template_name, opts)
|
112
|
+
tn = template_name
|
113
|
+
else
|
114
|
+
tn = 'error'
|
115
|
+
unless self.class.template?(tn, opts)
|
116
|
+
opts[:format] = :text
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
render(tn, opts)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Rack
|
2
|
+
class Rescue
|
3
|
+
class Responder
|
4
|
+
include Pancake::Mixins::RequestHelper
|
5
|
+
include Pancake::Mixins::ResponseHelper
|
6
|
+
|
7
|
+
def initialize(env, rescuer)
|
8
|
+
@rescuer = rescuer
|
9
|
+
@env = env
|
10
|
+
end
|
11
|
+
|
12
|
+
def negotiate!(opts = {})
|
13
|
+
negotiate_content_type!(@rescuer.formats, opts)
|
14
|
+
rescue Pancake::Errors::NotAcceptable
|
15
|
+
mt = Pancake::MimeTypes.group(:text).first
|
16
|
+
headers["Content-Type"] = mt.type_strings.first
|
17
|
+
:text
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<div class='exception'>
|
2
|
+
<% content_block :error_header do %>
|
3
|
+
<h1>Error: <%= error.class %></h1>
|
4
|
+
<% end %>
|
5
|
+
|
6
|
+
<% content_block :error_message do %>
|
7
|
+
<div class='error'>
|
8
|
+
<%= error.message %>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<% content_block :error_backtrace do %>
|
13
|
+
<ul class='error backtrace'>
|
14
|
+
<% error.backtrace.each do |line| %>
|
15
|
+
<li><%= line %></li>
|
16
|
+
<% end %>
|
17
|
+
</ul>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<div class='exception'>
|
2
|
+
<% content_block :error_header do %>
|
3
|
+
<h1><%= status %> Error</h1>
|
4
|
+
<% end %>
|
5
|
+
|
6
|
+
<% content_block :error_message do %>
|
7
|
+
<div class='error'>
|
8
|
+
<%= error.message %>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<% content_block :error_backtrace do %>
|
13
|
+
|
14
|
+
<% end %>
|
15
|
+
</div>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<% content_block :error_header do %>
|
2
|
+
Error: <%= error.class %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<% content_block :error_message do %>
|
6
|
+
Error Message: <%= error.message %>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<% content_block :error_backtrace do %>
|
10
|
+
Error Backtrace:
|
11
|
+
<% if error && error.backtrace %>
|
12
|
+
<%= error.backtrace.join("\n") %>
|
13
|
+
<% end %>
|
14
|
+
<% end %>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'bundler'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'rack-rescue'
|
6
|
+
s.version = '0.1.0'
|
7
|
+
s.homepage = %q{http://github.com/hassox/rack-rescue}
|
8
|
+
s.authors = ["Daniel Neighman"]
|
9
|
+
s.autorequire = %q{rack/rescue}
|
10
|
+
s.date = Date.today
|
11
|
+
s.description = %q{Rescue Handler for Rack}
|
12
|
+
s.summary =%q{Rescue Handler for Rack}
|
13
|
+
s.email = %q{has.sox@gmail.com}
|
14
|
+
|
15
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubygems_version = %q{1.3.6}
|
18
|
+
|
19
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
20
|
+
s.files = Dir[File.join(Dir.pwd, "**/*")]
|
21
|
+
|
22
|
+
s.add_bundler_dependencies
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
|
@@ -0,0 +1,151 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "RackRescue" do
|
4
|
+
class RRUnknownException < RuntimeError; end
|
5
|
+
|
6
|
+
after do
|
7
|
+
Rack::Rescue.error_handlers.clear
|
8
|
+
end
|
9
|
+
|
10
|
+
def safe_endpoint(msg = "OK")
|
11
|
+
lambda{|e| Rack::Response.new(msg)}
|
12
|
+
end
|
13
|
+
|
14
|
+
def raise_endpoint(exception, msg)
|
15
|
+
lambda{|e| raise exception, msg }
|
16
|
+
end
|
17
|
+
|
18
|
+
def build_stack(endpoint = safe_endpoint)
|
19
|
+
Rack::Builder.new do
|
20
|
+
use Rack::Rescue
|
21
|
+
run endpoint
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
before do
|
26
|
+
@env = Rack::MockRequest.env_for("/")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should do nothing if there is no downstream exception" do
|
30
|
+
result = build_stack.call(@env)
|
31
|
+
result.body.map.join.should == "OK"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should render the error with the defautl text error handler if it's an unkonwn exception" do
|
35
|
+
@env['HTTP_ACCEPT'] = "text/plain"
|
36
|
+
bad_app = raise_endpoint(RRUnknownException, "Unknown Brew")
|
37
|
+
stack = build_stack(bad_app)
|
38
|
+
r = stack.call(@env)
|
39
|
+
r[0].should == 500
|
40
|
+
body = r[2].body.map.join
|
41
|
+
body.should include("Error")
|
42
|
+
body.should include("Unknown Brew")
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "A known exception" do
|
46
|
+
it "should render the template for the error" do
|
47
|
+
bad_app = raise_endpoint(Pancake::Errors::NotFound, "Action Not Found")
|
48
|
+
stack = build_stack(bad_app)
|
49
|
+
@env['HTTP_ACCEPT'] = 'text/plain'
|
50
|
+
r = stack.call(@env)
|
51
|
+
|
52
|
+
body = r[2].body.map.join
|
53
|
+
body.should include("Pancake::Errors::NotFound")
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should set the correct status code" do
|
57
|
+
bad_app = raise_endpoint(Pancake::Errors::NotFound, "Action Not Found")
|
58
|
+
stack = build_stack(bad_app)
|
59
|
+
@env['HTTP_ACCEPT'] = "text/plain"
|
60
|
+
r = stack.call(@env)
|
61
|
+
|
62
|
+
status = r[0]
|
63
|
+
status.should == 404
|
64
|
+
body = r[2].body.map.join
|
65
|
+
body.should include("Action Not Found")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should provide a list of default formats" do
|
70
|
+
Rack::Rescue.default_formats.should == Pancake::MimeTypes.groups.keys.map(&:to_sym)
|
71
|
+
rr = Rack::Rescue.new SUCCESS_APP
|
72
|
+
rr.formats.should == Pancake::MimeTypes.groups.keys.map(&:to_sym)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should let me overwrite the formats avaiable" do
|
76
|
+
rr = Rack::Rescue.new(SUCCESS_APP, :formats => [:text, :html])
|
77
|
+
rr.formats.should == [:text, :html]
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should inspect the rack env and negotiate the content" do
|
81
|
+
env = Rack::MockRequest.env_for("/")
|
82
|
+
env['HTTP_ACCEPT'] = "text/xml"
|
83
|
+
|
84
|
+
rr = Rack::Rescue.new(raise_endpoint(RuntimeError, "Boo"))
|
85
|
+
result = rr.call(env)
|
86
|
+
result[0].should == 500
|
87
|
+
result[2].body.to_s.should include("XML Error Template")
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should inspect the extension of the " do
|
91
|
+
env = Rack::MockRequest.env_for("/")
|
92
|
+
env['HTTP_ACCEPT'] = "text/xml"
|
93
|
+
|
94
|
+
rr = Rack::Rescue.new(raise_endpoint(RuntimeError, "Boo"))
|
95
|
+
result = rr.call(env)
|
96
|
+
result[0].should == 500
|
97
|
+
result[2].body.to_s.should include("XML Error Template")
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should wrap the error in a layout if there's one present" do
|
101
|
+
endpoint = raise_endpoint(RuntimeError, "Bad Error")
|
102
|
+
|
103
|
+
layout_dir = File.join(File.expand_path(File.dirname(__FILE__)), 'rack', 'rescue', 'fixtures', 'layouts')
|
104
|
+
|
105
|
+
File.exists?(File.join(layout_dir, "error.html.erb")).should be_true
|
106
|
+
|
107
|
+
app = Rack::Builder.new do
|
108
|
+
use Wrapt do |wrapt|
|
109
|
+
wrapt.layout_dirs << layout_dir
|
110
|
+
end
|
111
|
+
|
112
|
+
use Rack::Rescue
|
113
|
+
run endpoint
|
114
|
+
end
|
115
|
+
|
116
|
+
env = Rack::MockRequest.env_for("/foo.html")
|
117
|
+
r = app.call(env)
|
118
|
+
r[0].should == 500
|
119
|
+
body = r[2].body.to_s
|
120
|
+
body.should include("<h1>Error Layout</h1>")
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should allow me to add error handlers and they should execute on each exception" do
|
124
|
+
layout_dir = File.join(File.expand_path(File.dirname(__FILE__)), 'rack', 'rescue', 'fixtures', 'layouts')
|
125
|
+
Rack::Rescue.add_handler do |exception, env, options|
|
126
|
+
options[:format].should == :html
|
127
|
+
options[:layout].should == 'error'
|
128
|
+
end
|
129
|
+
Rack::Rescue.add_handler do |exception, env, options|
|
130
|
+
options[:format] = :xml
|
131
|
+
options[:layout] = 'custom_error_layout'
|
132
|
+
end
|
133
|
+
Rack::Rescue.add_handler do |exception, env, options|
|
134
|
+
options[:format].should == :xml
|
135
|
+
options[:layout].should == 'custom_error_layout'
|
136
|
+
end
|
137
|
+
|
138
|
+
app = Rack::Builder.new do
|
139
|
+
use Wrapt do |wrapt|
|
140
|
+
wrapt.layout_dirs << layout_dir
|
141
|
+
end
|
142
|
+
use Rack::Rescue
|
143
|
+
the_app = lambda{|e| raise "Halp"}
|
144
|
+
run the_app
|
145
|
+
end
|
146
|
+
|
147
|
+
result = app.call(Rack::MockRequest.env_for("/"))
|
148
|
+
result[2].body.join.should include("Custom Error Layout")
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
|
2
|
+
|
3
|
+
describe Rack::Rescue::Exceptions do
|
4
|
+
subject { Rack::Rescue::Exceptions.new(false) }
|
5
|
+
|
6
|
+
before do
|
7
|
+
subject.add("MyNotFoundException")
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should allow me to access the exception" do
|
11
|
+
subject["MyNotFoundException"].should be_an_instance_of(Rack::Rescue::Handler)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should provide me with a hash of all handlers" do
|
15
|
+
handler = subject.exception_handlers["MyNotFoundException"]
|
16
|
+
subject.exception_handlers.should == {"MyNotFoundException" => handler}
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should allow me to remove handling of an exception" do
|
20
|
+
subject.delete("MyNotFoundException")
|
21
|
+
subject["MyNotFoundHandler"].should be_nil
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should set the status of the exception to 500 by default" do
|
25
|
+
subject["MyNotFoundException"].status.should == 500
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should allow me to change the status of an exception" do
|
29
|
+
handler = subject["MyNotFoundException"]
|
30
|
+
handler.status = 404
|
31
|
+
handler.status.should == 404
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "accessing handlers" do
|
35
|
+
before do
|
36
|
+
@handler = subject["MyNotFoundException"]
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should allow me to access the exception with the constnat" do
|
40
|
+
subject[MyNotFoundException].should == @handler
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should allow me to access the exception with an instance" do
|
44
|
+
subject[MyNotFoundException.new].should == @handler
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should add to the default list" do
|
49
|
+
e = Rack::Rescue::Exceptions
|
50
|
+
lambda do
|
51
|
+
e.add_defaults("MyException", :status => 400)
|
52
|
+
end.should change(e::DEFAULT_HANDLERS, :size).by(1)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should add to the default list with a string" do
|
56
|
+
e = Rack::Rescue::Exceptions
|
57
|
+
e.add_defaults("MyException", "SomethingElse", "Another")
|
58
|
+
lambda do
|
59
|
+
e.remove_defaults("SomethingElse", "Another")
|
60
|
+
end.should change(Rack::Rescue::Exceptions::DEFAULT_HANDLERS, :size).by(-2)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should add to the default list with a string" do
|
64
|
+
e = Rack::Rescue::Exceptions
|
65
|
+
e.add_defaults("Foo::MyException", "Foo::SomethingElse", "Another")
|
66
|
+
lambda do
|
67
|
+
e.remove_defaults(/^Foo/)
|
68
|
+
end.should change(Rack::Rescue::Exceptions::DEFAULT_HANDLERS, :size).by(-2)
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "Pre-Packaged Exceptions" do
|
72
|
+
subject{ Rack::Rescue::Exceptions.new }
|
73
|
+
describe "Not found errors" do
|
74
|
+
it{ subject["DataMapper::ObjectNotFoundError" ].status.should == 404 }
|
75
|
+
it{ subject["ActiveRecord::RecordNotFound" ].status.should == 404 }
|
76
|
+
it{ subject["Pancake::Errors::NotFound" ].status.should == 404 }
|
77
|
+
it{ subject["Pancake::Errors::UnknownRouter" ].status.should == 500 }
|
78
|
+
it{ subject["Pancake::Errors::UnknownConfiguration" ].status.should == 500 }
|
79
|
+
it{ subject["Pancake::Errors::Unauthorized" ].status.should == 401 }
|
80
|
+
it{ subject["Pancake::Errors::Forbidden" ].status.should == 403 }
|
81
|
+
it{ subject["Pancake::Errors::Server" ].status.should == 500 }
|
82
|
+
it{ subject["Pancake::Errors::NotAcceptable" ].status.should == 406 }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|