sinatra 0.9.1.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- data/CHANGES +81 -0
- data/LICENSE +1 -1
- data/README.rdoc +63 -23
- data/Rakefile +25 -23
- data/compat/haml_test.rb +7 -4
- data/compat/helper.rb +3 -0
- data/compat/sass_test.rb +10 -0
- data/lib/sinatra/base.rb +240 -148
- data/lib/sinatra/compat.rb +16 -0
- data/lib/sinatra/main.rb +2 -14
- data/lib/sinatra/showexceptions.rb +303 -0
- data/lib/sinatra/test.rb +2 -0
- data/sinatra.gemspec +13 -4
- data/test/base_test.rb +123 -93
- data/test/builder_test.rb +2 -1
- data/test/contest.rb +64 -0
- data/test/erb_test.rb +1 -1
- data/test/extensions_test.rb +17 -1
- data/test/filter_test.rb +1 -1
- data/test/haml_test.rb +25 -3
- data/test/helper.rb +43 -48
- data/test/helpers_test.rb +446 -440
- data/test/mapped_error_test.rb +138 -143
- data/test/middleware_test.rb +2 -2
- data/test/options_test.rb +241 -248
- 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 +94 -22
- data/test/sass_test.rb +44 -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 +15 -7
- 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 +32 -4
- data/test/reload_test.rb +0 -68
data/test/mapped_error_test.rb
CHANGED
@@ -6,155 +6,150 @@ end
|
|
6
6
|
class FooNotFound < Sinatra::NotFound
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
set :raise_errors, false
|
13
|
-
error(FooError) { 'Foo!' }
|
14
|
-
get '/' do
|
15
|
-
raise FooError
|
16
|
-
end
|
17
|
-
}
|
18
|
-
get '/'
|
19
|
-
assert_equal 500, status
|
20
|
-
assert_equal 'Foo!', body
|
9
|
+
class MappedErrorTest < Test::Unit::TestCase
|
10
|
+
def test_default
|
11
|
+
assert true
|
21
12
|
end
|
22
13
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
14
|
+
describe 'Exception Mappings' do
|
15
|
+
it 'invokes handlers registered with ::error when raised' do
|
16
|
+
mock_app {
|
17
|
+
set :raise_errors, false
|
18
|
+
error(FooError) { 'Foo!' }
|
19
|
+
get '/' do
|
20
|
+
raise FooError
|
21
|
+
end
|
22
|
+
}
|
23
|
+
get '/'
|
24
|
+
assert_equal 500, status
|
25
|
+
assert_equal 'Foo!', body
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'uses the Exception handler if no matching handler found' do
|
29
|
+
mock_app {
|
30
|
+
set :raise_errors, false
|
31
|
+
error(Exception) { 'Exception!' }
|
32
|
+
get '/' do
|
33
|
+
raise FooError
|
34
|
+
end
|
43
35
|
}
|
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
|
-
|
112
|
-
describe 'Custom Error Pages' do
|
113
|
-
it 'allows numeric status code mappings to be registered with ::error' do
|
114
|
-
mock_app {
|
115
|
-
set :raise_errors, false
|
116
|
-
error(500) { 'Foo!' }
|
117
|
-
get '/' do
|
118
|
-
[500, {}, 'Internal Foo Error']
|
119
|
-
end
|
120
|
-
}
|
121
|
-
get '/'
|
122
|
-
assert_equal 500, status
|
123
|
-
assert_equal 'Foo!', body
|
124
|
-
end
|
125
36
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
37
|
+
get '/'
|
38
|
+
assert_equal 500, status
|
39
|
+
assert_equal 'Exception!', body
|
40
|
+
end
|
41
|
+
|
42
|
+
it "sets env['sinatra.error'] to the rescued exception" do
|
43
|
+
mock_app {
|
44
|
+
set :raise_errors, false
|
45
|
+
error(FooError) {
|
46
|
+
assert env.include?('sinatra.error')
|
47
|
+
assert env['sinatra.error'].kind_of?(FooError)
|
48
|
+
'looks good'
|
49
|
+
}
|
50
|
+
get '/' do
|
51
|
+
raise FooError
|
52
|
+
end
|
53
|
+
}
|
54
|
+
get '/'
|
55
|
+
assert_equal 'looks good', body
|
56
|
+
end
|
57
|
+
|
58
|
+
it "raises without calling the handler when the raise_errors options is set" do
|
59
|
+
mock_app {
|
60
|
+
set :raise_errors, true
|
61
|
+
error(FooError) { "she's not there." }
|
62
|
+
get '/' do
|
63
|
+
raise FooError
|
64
|
+
end
|
65
|
+
}
|
66
|
+
assert_raise(FooError) { get '/' }
|
67
|
+
end
|
68
|
+
|
69
|
+
it "never raises Sinatra::NotFound beyond the application" do
|
70
|
+
mock_app {
|
71
|
+
set :raise_errors, true
|
72
|
+
get '/' do
|
73
|
+
raise Sinatra::NotFound
|
74
|
+
end
|
75
|
+
}
|
76
|
+
assert_nothing_raised { get '/' }
|
77
|
+
assert_equal 404, status
|
78
|
+
end
|
79
|
+
|
80
|
+
it "cascades for subclasses of Sinatra::NotFound" do
|
81
|
+
mock_app {
|
82
|
+
set :raise_errors, true
|
83
|
+
error(FooNotFound) { "foo! not found." }
|
84
|
+
get '/' do
|
85
|
+
raise FooNotFound
|
86
|
+
end
|
87
|
+
}
|
88
|
+
assert_nothing_raised { get '/' }
|
89
|
+
assert_equal 404, status
|
90
|
+
assert_equal 'foo! not found.', body
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'has a not_found method for backwards compatibility' do
|
94
|
+
mock_app {
|
95
|
+
not_found do
|
96
|
+
"Lost, are we?"
|
97
|
+
end
|
98
|
+
}
|
138
99
|
|
139
|
-
|
100
|
+
get '/test'
|
101
|
+
assert_equal 404, status
|
102
|
+
assert_equal "Lost, are we?", body
|
103
|
+
end
|
140
104
|
end
|
141
105
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
'
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
106
|
+
describe 'Custom Error Pages' do
|
107
|
+
it 'allows numeric status code mappings to be registered with ::error' do
|
108
|
+
mock_app {
|
109
|
+
set :raise_errors, false
|
110
|
+
error(500) { 'Foo!' }
|
111
|
+
get '/' do
|
112
|
+
[500, {}, 'Internal Foo Error']
|
113
|
+
end
|
114
|
+
}
|
115
|
+
get '/'
|
116
|
+
assert_equal 500, status
|
117
|
+
assert_equal 'Foo!', body
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'allows ranges of status code mappings to be registered with :error' do
|
121
|
+
mock_app {
|
122
|
+
set :raise_errors, false
|
123
|
+
error(500..550) { "Error: #{response.status}" }
|
124
|
+
get '/' do
|
125
|
+
[507, {}, 'A very special error']
|
126
|
+
end
|
127
|
+
}
|
128
|
+
get '/'
|
129
|
+
assert_equal 507, status
|
130
|
+
assert_equal 'Error: 507', body
|
131
|
+
end
|
132
|
+
|
133
|
+
class FooError < RuntimeError
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'runs after exception mappings and overwrites body' do
|
137
|
+
mock_app {
|
138
|
+
set :raise_errors, false
|
139
|
+
error FooError do
|
140
|
+
response.status = 502
|
141
|
+
'from exception mapping'
|
142
|
+
end
|
143
|
+
error(500) { 'from 500 handler' }
|
144
|
+
error(502) { 'from custom error page' }
|
145
|
+
|
146
|
+
get '/' do
|
147
|
+
raise FooError
|
148
|
+
end
|
149
|
+
}
|
150
|
+
get '/'
|
151
|
+
assert_equal 502, status
|
152
|
+
assert_equal 'from custom error page', body
|
153
|
+
end
|
159
154
|
end
|
160
155
|
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,303 +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
|
-
|
231
|
-
|
232
|
+
error do
|
233
|
+
error = @env['rack.errors'].instance_variable_get(:@error)
|
234
|
+
error.rewind
|
232
235
|
|
233
|
-
|
234
|
-
end
|
236
|
+
error.read
|
237
|
+
end
|
235
238
|
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
239
|
+
get '/' do
|
240
|
+
raise
|
241
|
+
end
|
242
|
+
}
|
240
243
|
|
241
|
-
|
242
|
-
|
244
|
+
get '/'
|
245
|
+
assert body.include?("RuntimeError") && body.include?("options_test.rb")
|
246
|
+
end
|
243
247
|
end
|
244
248
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
describe_option 'host' do
|
250
|
-
it 'defaults to 0.0.0.0' do
|
251
|
-
assert_equal '0.0.0.0', @base.host
|
252
|
-
assert_equal '0.0.0.0', @default.host
|
253
|
-
end
|
254
|
-
end
|
249
|
+
describe 'sessions' do
|
250
|
+
it 'is disabled on Base' do
|
251
|
+
assert ! @base.sessions?
|
252
|
+
end
|
255
253
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
assert_equal 4567, @default.port
|
260
|
-
end
|
261
|
-
end
|
254
|
+
it 'is disabled on Default' do
|
255
|
+
assert ! @default.sessions?
|
256
|
+
end
|
262
257
|
|
263
|
-
|
264
|
-
it 'is one of thin, mongrel, webrick' do
|
265
|
-
assert_equal %w[thin mongrel webrick], @base.server
|
266
|
-
assert_equal %w[thin mongrel webrick], @default.server
|
258
|
+
# TODO: it 'uses Rack::Session::Cookie when enabled' do
|
267
259
|
end
|
268
|
-
end
|
269
260
|
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
end
|
275
|
-
end
|
261
|
+
describe 'logging' do
|
262
|
+
it 'is disabled on Base' do
|
263
|
+
assert ! @base.logging?
|
264
|
+
end
|
276
265
|
|
277
|
-
|
278
|
-
|
279
|
-
assert @base.root.nil?
|
280
|
-
assert @default.root.nil?
|
281
|
-
end
|
266
|
+
it 'is enabled on Default when not in test environment' do
|
267
|
+
assert @default.logging?
|
282
268
|
|
283
|
-
|
284
|
-
|
285
|
-
|
269
|
+
@default.set :environment, :test
|
270
|
+
assert ! @default.logging
|
271
|
+
end
|
286
272
|
|
287
|
-
|
288
|
-
assert_equal File.expand_path(File.dirname(__FILE__)), @default.root
|
273
|
+
# TODO: it 'uses Rack::CommonLogger when enabled' do
|
289
274
|
end
|
290
|
-
end
|
291
275
|
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
end
|
276
|
+
describe 'static' do
|
277
|
+
it 'is disabled on Base' do
|
278
|
+
assert ! @base.static?
|
279
|
+
end
|
297
280
|
|
298
|
-
|
299
|
-
|
300
|
-
|
281
|
+
it 'is enabled on Default' do
|
282
|
+
assert @default.static?
|
283
|
+
end
|
301
284
|
|
302
|
-
|
303
|
-
|
285
|
+
# TODO: it setup static routes if public is enabled
|
286
|
+
# TODO: however, that's already tested in static_test so...
|
304
287
|
end
|
305
|
-
end
|
306
288
|
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
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
|
311
294
|
end
|
312
295
|
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
assert_equal File.dirname(__FILE__) + "/public", @default.public
|
296
|
+
describe 'port' do
|
297
|
+
it 'defaults to 4567' do
|
298
|
+
assert_equal 4567, @base.port
|
299
|
+
assert_equal 4567, @default.port
|
300
|
+
end
|
319
301
|
end
|
320
|
-
end
|
321
302
|
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
@base.app_file = __FILE__
|
328
|
-
@base.set(:environment, :development)
|
329
|
-
assert @base.reload?
|
330
|
-
|
331
|
-
@default.app_file = __FILE__
|
332
|
-
@default.set(:environment, :development)
|
333
|
-
assert @default.reload?
|
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
|
334
308
|
end
|
335
309
|
|
336
|
-
|
337
|
-
|
338
|
-
|
310
|
+
describe 'app_file' do
|
311
|
+
it 'is nil' do
|
312
|
+
assert @base.app_file.nil?
|
313
|
+
assert @default.app_file.nil?
|
314
|
+
end
|
339
315
|
end
|
340
316
|
|
341
|
-
|
342
|
-
|
343
|
-
|
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
|
322
|
+
|
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
|
344
326
|
|
345
|
-
|
346
|
-
|
327
|
+
@default.app_file = __FILE__
|
328
|
+
assert_equal File.expand_path(File.dirname(__FILE__)), @default.root
|
329
|
+
end
|
347
330
|
end
|
348
331
|
|
349
|
-
|
350
|
-
|
351
|
-
|
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
|
337
|
+
|
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
|
352
341
|
|
353
|
-
|
354
|
-
|
342
|
+
@default.root = File.dirname(__FILE__)
|
343
|
+
assert_equal File.dirname(__FILE__) + "/views", @default.views
|
344
|
+
end
|
355
345
|
end
|
356
|
-
end
|
357
346
|
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
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
|
362
352
|
|
363
|
-
|
364
|
-
|
365
|
-
|
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
|
366
356
|
|
367
|
-
|
368
|
-
|
369
|
-
|
357
|
+
@default.root = File.dirname(__FILE__)
|
358
|
+
assert_equal File.dirname(__FILE__) + "/public", @default.public
|
359
|
+
end
|
360
|
+
end
|
370
361
|
|
371
|
-
|
372
|
-
|
362
|
+
describe 'lock' do
|
363
|
+
it 'is disabled by default' do
|
364
|
+
assert ! @base.lock?
|
365
|
+
end
|
373
366
|
end
|
374
367
|
end
|