sinatra-sinatra 0.9.1.2 → 0.9.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +1 -1
- data/README.rdoc +42 -0
- data/Rakefile +15 -3
- data/compat/haml_test.rb +7 -4
- data/compat/helper.rb +4 -0
- data/compat/sass_test.rb +10 -0
- data/lib/sinatra/base.rb +136 -121
- data/lib/sinatra/compat.rb +16 -0
- data/lib/sinatra/showexceptions.rb +303 -0
- data/sinatra.gemspec +11 -3
- data/test/base_test.rb +117 -101
- data/test/builder_test.rb +1 -1
- data/test/contest.rb +62 -0
- data/test/erb_test.rb +1 -1
- data/test/extensions_test.rb +1 -1
- data/test/filter_test.rb +1 -1
- data/test/haml_test.rb +25 -3
- data/test/helper.rb +14 -46
- data/test/helpers_test.rb +444 -442
- data/test/mapped_error_test.rb +147 -144
- data/test/middleware_test.rb +2 -2
- data/test/options_test.rb +247 -206
- data/test/render_backtrace_test.rb +145 -0
- data/test/request_test.rb +1 -1
- data/test/response_test.rb +2 -2
- data/test/result_test.rb +1 -1
- data/test/route_added_hook_test.rb +59 -0
- data/test/routing_test.rb +12 -1
- data/test/sass_test.rb +43 -1
- data/test/server_test.rb +5 -3
- data/test/sinatra_test.rb +1 -1
- data/test/static_test.rb +2 -2
- data/test/templates_test.rb +16 -4
- data/test/test_test.rb +5 -5
- data/test/views/error.builder +3 -0
- data/test/views/error.erb +3 -0
- data/test/views/error.haml +3 -0
- data/test/views/error.sass +2 -0
- metadata +12 -5
data/test/mapped_error_test.rb
CHANGED
@@ -6,155 +6,158 @@ end
|
|
6
6
|
class FooNotFound < Sinatra::NotFound
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
get '/'
|
32
|
-
assert_equal 500, status
|
33
|
-
assert_equal 'Exception!', body
|
34
|
-
end
|
35
|
-
|
36
|
-
it "sets env['sinatra.error'] to the rescued exception" do
|
37
|
-
mock_app {
|
38
|
-
set :raise_errors, false
|
39
|
-
error(FooError) {
|
40
|
-
assert env.include?('sinatra.error')
|
41
|
-
assert env['sinatra.error'].kind_of?(FooError)
|
42
|
-
'looks good'
|
9
|
+
class MappedErrorTest < Test::Unit::TestCase
|
10
|
+
describe 'Exception Mappings' do
|
11
|
+
it 'invokes handlers registered with ::error when raised' do
|
12
|
+
mock_app {
|
13
|
+
set :raise_errors, false
|
14
|
+
error(FooError) { 'Foo!' }
|
15
|
+
get '/' do
|
16
|
+
raise FooError
|
17
|
+
end
|
18
|
+
}
|
19
|
+
get '/'
|
20
|
+
assert_equal 500, status
|
21
|
+
assert_equal 'Foo!', body
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'uses the Exception handler if no matching handler found' do
|
25
|
+
mock_app {
|
26
|
+
set :raise_errors, false
|
27
|
+
error(Exception) { 'Exception!' }
|
28
|
+
get '/' do
|
29
|
+
raise FooError
|
30
|
+
end
|
43
31
|
}
|
44
|
-
get '/' do
|
45
|
-
raise FooError
|
46
|
-
end
|
47
|
-
}
|
48
|
-
get '/'
|
49
|
-
assert_equal 'looks good', body
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'dumps errors to rack.errors when dump_errors is enabled' do
|
53
|
-
mock_app {
|
54
|
-
set :raise_errors, false
|
55
|
-
set :dump_errors, true
|
56
|
-
get('/') { raise FooError, 'BOOM!' }
|
57
|
-
}
|
58
|
-
|
59
|
-
get '/'
|
60
|
-
assert_equal 500, status
|
61
|
-
assert @response.errors =~ /FooError - BOOM!:/
|
62
|
-
end
|
63
|
-
|
64
|
-
it "raises without calling the handler when the raise_errors options is set" do
|
65
|
-
mock_app {
|
66
|
-
set :raise_errors, true
|
67
|
-
error(FooError) { "she's not there." }
|
68
|
-
get '/' do
|
69
|
-
raise FooError
|
70
|
-
end
|
71
|
-
}
|
72
|
-
assert_raise(FooError) { get '/' }
|
73
|
-
end
|
74
|
-
|
75
|
-
it "never raises Sinatra::NotFound beyond the application" do
|
76
|
-
mock_app {
|
77
|
-
set :raise_errors, true
|
78
|
-
get '/' do
|
79
|
-
raise Sinatra::NotFound
|
80
|
-
end
|
81
|
-
}
|
82
|
-
assert_nothing_raised { get '/' }
|
83
|
-
assert_equal 404, status
|
84
|
-
end
|
85
|
-
|
86
|
-
it "cascades for subclasses of Sinatra::NotFound" do
|
87
|
-
mock_app {
|
88
|
-
set :raise_errors, true
|
89
|
-
error(FooNotFound) { "foo! not found." }
|
90
|
-
get '/' do
|
91
|
-
raise FooNotFound
|
92
|
-
end
|
93
|
-
}
|
94
|
-
assert_nothing_raised { get '/' }
|
95
|
-
assert_equal 404, status
|
96
|
-
assert_equal 'foo! not found.', body
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'has a not_found method for backwards compatibility' do
|
100
|
-
mock_app {
|
101
|
-
not_found do
|
102
|
-
"Lost, are we?"
|
103
|
-
end
|
104
|
-
}
|
105
|
-
|
106
|
-
get '/test'
|
107
|
-
assert_equal 404, status
|
108
|
-
assert_equal "Lost, are we?", body
|
109
|
-
end
|
110
|
-
end
|
111
32
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
33
|
+
get '/'
|
34
|
+
assert_equal 500, status
|
35
|
+
assert_equal 'Exception!', body
|
36
|
+
end
|
37
|
+
|
38
|
+
it "sets env['sinatra.error'] to the rescued exception" do
|
39
|
+
mock_app {
|
40
|
+
set :raise_errors, false
|
41
|
+
error(FooError) {
|
42
|
+
assert env.include?('sinatra.error')
|
43
|
+
assert env['sinatra.error'].kind_of?(FooError)
|
44
|
+
'looks good'
|
45
|
+
}
|
46
|
+
get '/' do
|
47
|
+
raise FooError
|
48
|
+
end
|
49
|
+
}
|
50
|
+
get '/'
|
51
|
+
assert_equal 'looks good', body
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'dumps errors to rack.errors when dump_errors is enabled' do
|
55
|
+
mock_app {
|
56
|
+
set :raise_errors, false
|
57
|
+
set :dump_errors, true
|
58
|
+
get('/') { raise FooError, 'BOOM!' }
|
59
|
+
}
|
125
60
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
61
|
+
get '/'
|
62
|
+
assert_equal 500, status
|
63
|
+
assert @response.errors =~ /FooError - BOOM!:/
|
64
|
+
end
|
65
|
+
|
66
|
+
it "raises without calling the handler when the raise_errors options is set" do
|
67
|
+
mock_app {
|
68
|
+
set :raise_errors, true
|
69
|
+
error(FooError) { "she's not there." }
|
70
|
+
get '/' do
|
71
|
+
raise FooError
|
72
|
+
end
|
73
|
+
}
|
74
|
+
assert_raise(FooError) { get '/' }
|
75
|
+
end
|
76
|
+
|
77
|
+
it "never raises Sinatra::NotFound beyond the application" do
|
78
|
+
mock_app {
|
79
|
+
set :raise_errors, true
|
80
|
+
get '/' do
|
81
|
+
raise Sinatra::NotFound
|
82
|
+
end
|
83
|
+
}
|
84
|
+
assert_nothing_raised { get '/' }
|
85
|
+
assert_equal 404, status
|
86
|
+
end
|
87
|
+
|
88
|
+
it "cascades for subclasses of Sinatra::NotFound" do
|
89
|
+
mock_app {
|
90
|
+
set :raise_errors, true
|
91
|
+
error(FooNotFound) { "foo! not found." }
|
92
|
+
get '/' do
|
93
|
+
raise FooNotFound
|
94
|
+
end
|
95
|
+
}
|
96
|
+
assert_nothing_raised { get '/' }
|
97
|
+
assert_equal 404, status
|
98
|
+
assert_equal 'foo! not found.', body
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'has a not_found method for backwards compatibility' do
|
102
|
+
mock_app {
|
103
|
+
not_found do
|
104
|
+
"Lost, are we?"
|
105
|
+
end
|
106
|
+
}
|
138
107
|
|
139
|
-
|
108
|
+
get '/test'
|
109
|
+
assert_equal 404, status
|
110
|
+
assert_equal "Lost, are we?", body
|
111
|
+
end
|
140
112
|
end
|
141
113
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
'
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
114
|
+
describe 'Custom Error Pages' do
|
115
|
+
it 'allows numeric status code mappings to be registered with ::error' do
|
116
|
+
mock_app {
|
117
|
+
set :raise_errors, false
|
118
|
+
error(500) { 'Foo!' }
|
119
|
+
get '/' do
|
120
|
+
[500, {}, 'Internal Foo Error']
|
121
|
+
end
|
122
|
+
}
|
123
|
+
get '/'
|
124
|
+
assert_equal 500, status
|
125
|
+
assert_equal 'Foo!', body
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'allows ranges of status code mappings to be registered with :error' do
|
129
|
+
mock_app {
|
130
|
+
set :raise_errors, false
|
131
|
+
error(500..550) { "Error: #{response.status}" }
|
132
|
+
get '/' do
|
133
|
+
[507, {}, 'A very special error']
|
134
|
+
end
|
135
|
+
}
|
136
|
+
get '/'
|
137
|
+
assert_equal 507, status
|
138
|
+
assert_equal 'Error: 507', body
|
139
|
+
end
|
140
|
+
|
141
|
+
class FooError < RuntimeError
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'runs after exception mappings and overwrites body' do
|
145
|
+
mock_app {
|
146
|
+
set :raise_errors, false
|
147
|
+
error FooError do
|
148
|
+
response.status = 502
|
149
|
+
'from exception mapping'
|
150
|
+
end
|
151
|
+
error(500) { 'from 500 handler' }
|
152
|
+
error(502) { 'from custom error page' }
|
153
|
+
|
154
|
+
get '/' do
|
155
|
+
raise FooError
|
156
|
+
end
|
157
|
+
}
|
158
|
+
get '/'
|
159
|
+
assert_equal 502, status
|
160
|
+
assert_equal 'from custom error page', body
|
161
|
+
end
|
159
162
|
end
|
160
163
|
end
|
data/test/middleware_test.rb
CHANGED
data/test/options_test.rb
CHANGED
@@ -1,37 +1,39 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
@
|
3
|
+
class OptionsTest < Test::Unit::TestCase
|
4
|
+
setup do
|
5
|
+
@base = Sinatra.new(Sinatra::Base)
|
6
|
+
@default = Sinatra.new(Sinatra::Default)
|
7
|
+
@base.set :environment, :development
|
8
|
+
@default.set :environment, :development
|
7
9
|
end
|
8
10
|
|
9
11
|
it 'sets options to literal values' do
|
10
|
-
@
|
11
|
-
assert @
|
12
|
-
assert_equal 'bar', @
|
12
|
+
@base.set(:foo, 'bar')
|
13
|
+
assert @base.respond_to?(:foo)
|
14
|
+
assert_equal 'bar', @base.foo
|
13
15
|
end
|
14
16
|
|
15
17
|
it 'sets options to Procs' do
|
16
|
-
@
|
17
|
-
assert @
|
18
|
-
assert_equal 'baz', @
|
18
|
+
@base.set(:foo, Proc.new { 'baz' })
|
19
|
+
assert @base.respond_to?(:foo)
|
20
|
+
assert_equal 'baz', @base.foo
|
19
21
|
end
|
20
22
|
|
21
23
|
it "sets multiple options with a Hash" do
|
22
|
-
@
|
24
|
+
@base.set :foo => 1234,
|
23
25
|
:bar => 'Hello World',
|
24
26
|
:baz => Proc.new { 'bizzle' }
|
25
|
-
assert_equal 1234, @
|
26
|
-
assert_equal 'Hello World', @
|
27
|
-
assert_equal 'bizzle', @
|
27
|
+
assert_equal 1234, @base.foo
|
28
|
+
assert_equal 'Hello World', @base.bar
|
29
|
+
assert_equal 'bizzle', @base.baz
|
28
30
|
end
|
29
31
|
|
30
32
|
it 'inherits option methods when subclassed' do
|
31
|
-
@
|
32
|
-
@
|
33
|
+
@base.set :foo, 'bar'
|
34
|
+
@base.set :biz, Proc.new { 'baz' }
|
33
35
|
|
34
|
-
sub = Class.new(@
|
36
|
+
sub = Class.new(@base)
|
35
37
|
assert sub.respond_to?(:foo)
|
36
38
|
assert_equal 'bar', sub.foo
|
37
39
|
assert sub.respond_to?(:biz)
|
@@ -39,31 +41,31 @@ describe 'Options' do
|
|
39
41
|
end
|
40
42
|
|
41
43
|
it 'overrides options in subclass' do
|
42
|
-
@
|
43
|
-
@
|
44
|
-
sub = Class.new(@
|
44
|
+
@base.set :foo, 'bar'
|
45
|
+
@base.set :biz, Proc.new { 'baz' }
|
46
|
+
sub = Class.new(@base)
|
45
47
|
sub.set :foo, 'bling'
|
46
48
|
assert_equal 'bling', sub.foo
|
47
|
-
assert_equal 'bar', @
|
49
|
+
assert_equal 'bar', @base.foo
|
48
50
|
end
|
49
51
|
|
50
52
|
it 'creates setter methods when first defined' do
|
51
|
-
@
|
52
|
-
assert @
|
53
|
-
@
|
54
|
-
assert_equal 'biz', @
|
53
|
+
@base.set :foo, 'bar'
|
54
|
+
assert @base.respond_to?('foo=')
|
55
|
+
@base.foo = 'biz'
|
56
|
+
assert_equal 'biz', @base.foo
|
55
57
|
end
|
56
58
|
|
57
59
|
it 'creates predicate methods when first defined' do
|
58
|
-
@
|
59
|
-
assert @
|
60
|
-
assert @
|
61
|
-
@
|
62
|
-
assert !@
|
60
|
+
@base.set :foo, 'hello world'
|
61
|
+
assert @base.respond_to?(:foo?)
|
62
|
+
assert @base.foo?
|
63
|
+
@base.set :foo, nil
|
64
|
+
assert !@base.foo?
|
63
65
|
end
|
64
66
|
|
65
67
|
it 'uses existing setter methods if detected' do
|
66
|
-
class << @
|
68
|
+
class << @base
|
67
69
|
def foo
|
68
70
|
@foo
|
69
71
|
end
|
@@ -72,255 +74,294 @@ describe 'Options' do
|
|
72
74
|
end
|
73
75
|
end
|
74
76
|
|
75
|
-
@
|
76
|
-
assert_equal 'oops', @
|
77
|
+
@base.set :foo, 'bam'
|
78
|
+
assert_equal 'oops', @base.foo
|
77
79
|
end
|
78
80
|
|
79
81
|
it "sets multiple options to true with #enable" do
|
80
|
-
@
|
81
|
-
assert @
|
82
|
-
assert @
|
83
|
-
assert @
|
82
|
+
@base.enable :sessions, :foo, :bar
|
83
|
+
assert @base.sessions
|
84
|
+
assert @base.foo
|
85
|
+
assert @base.bar
|
84
86
|
end
|
85
87
|
|
86
88
|
it "sets multiple options to false with #disable" do
|
87
|
-
@
|
88
|
-
assert !@
|
89
|
-
assert !@
|
90
|
-
assert !@
|
89
|
+
@base.disable :sessions, :foo, :bar
|
90
|
+
assert !@base.sessions
|
91
|
+
assert !@base.foo
|
92
|
+
assert !@base.bar
|
91
93
|
end
|
92
94
|
|
93
95
|
it 'enables MethodOverride middleware when :methodoverride is enabled' do
|
94
|
-
@
|
95
|
-
@
|
96
|
+
@base.set :methodoverride, true
|
97
|
+
@base.put('/') { 'okay' }
|
98
|
+
@app = @base
|
96
99
|
post '/', {'_method'=>'PUT'}, {}
|
97
100
|
assert_equal 200, status
|
98
101
|
assert_equal 'okay', body
|
99
102
|
end
|
100
|
-
end
|
101
103
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
104
|
+
describe 'clean_trace' do
|
105
|
+
def clean_backtrace(trace)
|
106
|
+
Sinatra::Base.new.send(:clean_backtrace, trace)
|
107
|
+
end
|
106
108
|
|
107
|
-
|
108
|
-
|
109
|
-
|
109
|
+
it 'is enabled on Base' do
|
110
|
+
assert @base.clean_trace?
|
111
|
+
end
|
110
112
|
|
111
|
-
|
112
|
-
|
113
|
-
|
113
|
+
it 'is enabled on Default' do
|
114
|
+
assert @default.clean_trace?
|
115
|
+
end
|
114
116
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
@base.set :clean_trace, false
|
122
|
-
assert_equal backtrace, clean_backtrace(backtrace)
|
123
|
-
end
|
117
|
+
it 'does nothing when disabled' do
|
118
|
+
backtrace = [
|
119
|
+
"./lib/sinatra/base.rb",
|
120
|
+
"./myapp:42",
|
121
|
+
("#{Gem.dir}/some/lib.rb" if defined?(Gem))
|
122
|
+
].compact
|
124
123
|
|
125
|
-
|
126
|
-
|
127
|
-
"./lib/sinatra/base.rb",
|
128
|
-
"./lib/sinatra/compat.rb:42",
|
129
|
-
"./lib/sinatra/main.rb:55 in `foo'"
|
130
|
-
]
|
131
|
-
assert clean_backtrace(backtrace).empty?
|
132
|
-
end
|
124
|
+
klass = Class.new(Sinatra::Base)
|
125
|
+
klass.disable :clean_trace
|
133
126
|
|
134
|
-
|
135
|
-
|
136
|
-
end
|
127
|
+
assert_equal backtrace, klass.new.send(:clean_backtrace, backtrace)
|
128
|
+
end
|
137
129
|
|
138
|
-
|
139
|
-
|
140
|
-
|
130
|
+
it 'removes sinatra lib paths from backtrace when enabled' do
|
131
|
+
backtrace = [
|
132
|
+
"./lib/sinatra/base.rb",
|
133
|
+
"./lib/sinatra/compat.rb:42",
|
134
|
+
"./lib/sinatra/main.rb:55 in `foo'"
|
135
|
+
]
|
136
|
+
assert clean_backtrace(backtrace).empty?
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'removes ./ prefix from backtrace paths when enabled' do
|
140
|
+
assert_equal ['myapp.rb:42'], clean_backtrace(['./myapp.rb:42'])
|
141
141
|
end
|
142
|
-
end
|
143
|
-
end
|
144
142
|
|
145
|
-
|
146
|
-
|
147
|
-
|
143
|
+
if defined?(Gem)
|
144
|
+
it 'removes gem lib paths from backtrace when enabled' do
|
145
|
+
assert clean_backtrace(["#{Gem.dir}/some/lib"]).empty?
|
146
|
+
end
|
147
|
+
end
|
148
148
|
end
|
149
149
|
|
150
|
-
|
151
|
-
|
152
|
-
|
150
|
+
describe 'run' do
|
151
|
+
it 'is disabled on Base' do
|
152
|
+
assert ! @base.run?
|
153
|
+
end
|
153
154
|
|
154
|
-
|
155
|
-
|
156
|
-
|
155
|
+
it 'is enabled on Default when not in test environment' do
|
156
|
+
@default.set :environment, :development
|
157
|
+
assert @default.development?
|
158
|
+
assert @default.run?
|
157
159
|
|
158
|
-
|
159
|
-
|
160
|
+
@default.set :environment, :development
|
161
|
+
assert @default.run?
|
162
|
+
end
|
160
163
|
|
161
|
-
|
162
|
-
it 'is enabled on Base' do
|
163
|
-
assert @base.raise_errors?
|
164
|
+
# TODO: it 'is enabled when $0 == app_file'
|
164
165
|
end
|
165
166
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
167
|
+
describe 'raise_errors' do
|
168
|
+
it 'is enabled on Base' do
|
169
|
+
assert @base.raise_errors?
|
170
|
+
end
|
170
171
|
|
171
|
-
|
172
|
-
|
172
|
+
it 'is enabled on Default only in test' do
|
173
|
+
@default.set(:environment, :development)
|
174
|
+
assert @default.development?
|
175
|
+
assert ! @default.raise_errors?
|
173
176
|
|
174
|
-
|
175
|
-
|
176
|
-
end
|
177
|
-
end
|
177
|
+
@default.set(:environment, :production)
|
178
|
+
assert ! @default.raise_errors?
|
178
179
|
|
179
|
-
|
180
|
-
|
181
|
-
|
180
|
+
@default.set(:environment, :test)
|
181
|
+
assert @default.raise_errors?
|
182
|
+
end
|
182
183
|
end
|
183
184
|
|
184
|
-
|
185
|
-
|
186
|
-
|
185
|
+
describe 'show_exceptions' do
|
186
|
+
it 'is enabled on Default only in development' do
|
187
|
+
@base.set(:environment, :development)
|
188
|
+
assert @base.show_exceptions?
|
187
189
|
|
188
|
-
|
189
|
-
|
190
|
+
assert @default.development?
|
191
|
+
assert @default.show_exceptions?
|
190
192
|
|
191
|
-
|
192
|
-
|
193
|
-
error = @env['rack.errors'].instance_variable_get(:@error)
|
194
|
-
error.rewind
|
193
|
+
@default.set(:environment, :test)
|
194
|
+
assert ! @default.show_exceptions?
|
195
195
|
|
196
|
-
|
197
|
-
|
196
|
+
@base.set(:environment, :production)
|
197
|
+
assert ! @base.show_exceptions?
|
198
|
+
end
|
198
199
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
200
|
+
it 'returns a friendly 500' do
|
201
|
+
klass = Sinatra.new(Sinatra::Default)
|
202
|
+
mock_app(klass) {
|
203
|
+
enable :show_exceptions
|
203
204
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
205
|
+
get '/' do
|
206
|
+
raise StandardError
|
207
|
+
end
|
208
|
+
}
|
208
209
|
|
209
|
-
|
210
|
-
|
211
|
-
|
210
|
+
get '/'
|
211
|
+
assert_equal 500, status
|
212
|
+
assert body.include?("StandardError")
|
213
|
+
assert body.include?("<code>show_exceptions</code> option")
|
214
|
+
end
|
212
215
|
end
|
213
216
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
+
describe 'dump_errors' do
|
218
|
+
it 'is disabled on Base' do
|
219
|
+
assert ! @base.dump_errors?
|
220
|
+
end
|
217
221
|
|
218
|
-
|
219
|
-
|
222
|
+
it 'is enabled on Default' do
|
223
|
+
assert @default.dump_errors?
|
224
|
+
end
|
220
225
|
|
221
|
-
|
222
|
-
|
223
|
-
assert ! @base.logging?
|
224
|
-
end
|
226
|
+
it 'dumps exception with backtrace to rack.errors' do
|
227
|
+
klass = Sinatra.new(Sinatra::Default)
|
225
228
|
|
226
|
-
|
227
|
-
|
229
|
+
mock_app(klass) {
|
230
|
+
disable :raise_errors
|
228
231
|
|
229
|
-
|
230
|
-
|
232
|
+
error do
|
233
|
+
error = @env['rack.errors'].instance_variable_get(:@error)
|
234
|
+
error.rewind
|
235
|
+
|
236
|
+
error.read
|
237
|
+
end
|
238
|
+
|
239
|
+
get '/' do
|
240
|
+
raise
|
241
|
+
end
|
242
|
+
}
|
243
|
+
|
244
|
+
get '/'
|
245
|
+
assert body.include?("RuntimeError") && body.include?("options_test.rb")
|
246
|
+
end
|
231
247
|
end
|
232
248
|
|
233
|
-
|
234
|
-
|
249
|
+
describe 'sessions' do
|
250
|
+
it 'is disabled on Base' do
|
251
|
+
assert ! @base.sessions?
|
252
|
+
end
|
253
|
+
|
254
|
+
it 'is disabled on Default' do
|
255
|
+
assert ! @default.sessions?
|
256
|
+
end
|
235
257
|
|
236
|
-
|
237
|
-
it 'is disabled on Base' do
|
238
|
-
assert ! @base.static?
|
258
|
+
# TODO: it 'uses Rack::Session::Cookie when enabled' do
|
239
259
|
end
|
240
260
|
|
241
|
-
|
242
|
-
|
261
|
+
describe 'logging' do
|
262
|
+
it 'is disabled on Base' do
|
263
|
+
assert ! @base.logging?
|
264
|
+
end
|
265
|
+
|
266
|
+
it 'is enabled on Default when not in test environment' do
|
267
|
+
assert @default.logging?
|
268
|
+
|
269
|
+
@default.set :environment, :test
|
270
|
+
assert ! @default.logging
|
271
|
+
end
|
272
|
+
|
273
|
+
# TODO: it 'uses Rack::CommonLogger when enabled' do
|
243
274
|
end
|
244
275
|
|
245
|
-
|
246
|
-
|
247
|
-
|
276
|
+
describe 'static' do
|
277
|
+
it 'is disabled on Base' do
|
278
|
+
assert ! @base.static?
|
279
|
+
end
|
248
280
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
281
|
+
it 'is enabled on Default' do
|
282
|
+
assert @default.static?
|
283
|
+
end
|
284
|
+
|
285
|
+
# TODO: it setup static routes if public is enabled
|
286
|
+
# TODO: however, that's already tested in static_test so...
|
253
287
|
end
|
254
|
-
end
|
255
288
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
289
|
+
describe 'host' do
|
290
|
+
it 'defaults to 0.0.0.0' do
|
291
|
+
assert_equal '0.0.0.0', @base.host
|
292
|
+
assert_equal '0.0.0.0', @default.host
|
293
|
+
end
|
260
294
|
end
|
261
|
-
end
|
262
295
|
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
296
|
+
describe 'port' do
|
297
|
+
it 'defaults to 4567' do
|
298
|
+
assert_equal 4567, @base.port
|
299
|
+
assert_equal 4567, @default.port
|
300
|
+
end
|
267
301
|
end
|
268
|
-
end
|
269
302
|
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
303
|
+
describe 'server' do
|
304
|
+
it 'is one of thin, mongrel, webrick' do
|
305
|
+
assert_equal %w[thin mongrel webrick], @base.server
|
306
|
+
assert_equal %w[thin mongrel webrick], @default.server
|
307
|
+
end
|
274
308
|
end
|
275
|
-
end
|
276
309
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
310
|
+
describe 'app_file' do
|
311
|
+
it 'is nil' do
|
312
|
+
assert @base.app_file.nil?
|
313
|
+
assert @default.app_file.nil?
|
314
|
+
end
|
281
315
|
end
|
282
316
|
|
283
|
-
|
284
|
-
|
285
|
-
|
317
|
+
describe 'root' do
|
318
|
+
it 'is nil if app_file is not set' do
|
319
|
+
assert @base.root.nil?
|
320
|
+
assert @default.root.nil?
|
321
|
+
end
|
286
322
|
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
end
|
323
|
+
it 'is equal to the expanded basename of app_file' do
|
324
|
+
@base.app_file = __FILE__
|
325
|
+
assert_equal File.expand_path(File.dirname(__FILE__)), @base.root
|
291
326
|
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
assert @default.views.nil?
|
327
|
+
@default.app_file = __FILE__
|
328
|
+
assert_equal File.expand_path(File.dirname(__FILE__)), @default.root
|
329
|
+
end
|
296
330
|
end
|
297
331
|
|
298
|
-
|
299
|
-
|
300
|
-
|
332
|
+
describe 'views' do
|
333
|
+
it 'is nil if root is not set' do
|
334
|
+
assert @base.views.nil?
|
335
|
+
assert @default.views.nil?
|
336
|
+
end
|
301
337
|
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
end
|
338
|
+
it 'is set to root joined with views/' do
|
339
|
+
@base.root = File.dirname(__FILE__)
|
340
|
+
assert_equal File.dirname(__FILE__) + "/views", @base.views
|
306
341
|
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
assert @default.public.nil?
|
342
|
+
@default.root = File.dirname(__FILE__)
|
343
|
+
assert_equal File.dirname(__FILE__) + "/views", @default.views
|
344
|
+
end
|
311
345
|
end
|
312
346
|
|
313
|
-
|
314
|
-
|
315
|
-
|
347
|
+
describe 'public' do
|
348
|
+
it 'is nil if root is not set' do
|
349
|
+
assert @base.public.nil?
|
350
|
+
assert @default.public.nil?
|
351
|
+
end
|
316
352
|
|
317
|
-
|
318
|
-
|
353
|
+
it 'is set to root joined with public/' do
|
354
|
+
@base.root = File.dirname(__FILE__)
|
355
|
+
assert_equal File.dirname(__FILE__) + "/public", @base.public
|
356
|
+
|
357
|
+
@default.root = File.dirname(__FILE__)
|
358
|
+
assert_equal File.dirname(__FILE__) + "/public", @default.public
|
359
|
+
end
|
319
360
|
end
|
320
|
-
end
|
321
361
|
|
322
|
-
|
323
|
-
|
324
|
-
|
362
|
+
describe 'lock' do
|
363
|
+
it 'is disabled by default' do
|
364
|
+
assert ! @base.lock?
|
365
|
+
end
|
325
366
|
end
|
326
367
|
end
|