sinatra-sinatra 0.9.0.5 → 0.9.1
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/CHANGES +40 -2
- data/README.rdoc +3 -3
- data/compat/app_test.rb +0 -19
- data/compat/application_test.rb +0 -72
- data/compat/pipeline_test.rb +0 -26
- data/compat/sessions_test.rb +3 -0
- data/compat/streaming_test.rb +4 -4
- data/lib/sinatra/base.rb +96 -81
- data/lib/sinatra/compat.rb +11 -0
- data/lib/sinatra/test/bacon.rb +2 -0
- data/lib/sinatra/test/rspec.rb +2 -0
- data/lib/sinatra/test/spec.rb +2 -0
- data/lib/sinatra/test/unit.rb +2 -0
- data/lib/sinatra/test.rb +34 -35
- data/sinatra.gemspec +3 -3
- data/test/base_test.rb +105 -56
- data/test/erb_test.rb +31 -0
- data/test/extensions_test.rb +21 -0
- data/test/helper.rb +38 -8
- data/test/helpers_test.rb +28 -0
- data/test/middleware_test.rb +8 -0
- data/test/options_test.rb +243 -9
- data/test/routing_test.rb +61 -2
- data/test/test_test.rb +125 -8
- metadata +6 -2
data/test/options_test.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
3
|
describe 'Options' do
|
4
|
-
before
|
4
|
+
before do
|
5
|
+
restore_default_options
|
6
|
+
@app = Sinatra.new
|
7
|
+
end
|
5
8
|
|
6
9
|
it 'sets options to literal values' do
|
7
10
|
@app.set(:foo, 'bar')
|
@@ -96,17 +99,17 @@ describe 'Options' do
|
|
96
99
|
end
|
97
100
|
end
|
98
101
|
|
99
|
-
|
100
|
-
|
101
|
-
@
|
102
|
+
describe_option 'clean_trace' do
|
103
|
+
def clean_backtrace(trace)
|
104
|
+
@base.new.send(:clean_backtrace, trace)
|
102
105
|
end
|
103
106
|
|
104
|
-
|
105
|
-
@
|
107
|
+
it 'is enabled on Base' do
|
108
|
+
assert @base.clean_trace?
|
106
109
|
end
|
107
110
|
|
108
|
-
it 'is enabled
|
109
|
-
assert @
|
111
|
+
it 'is enabled on Default' do
|
112
|
+
assert @default.clean_trace?
|
110
113
|
end
|
111
114
|
|
112
115
|
it 'does nothing when disabled' do
|
@@ -115,7 +118,7 @@ describe 'Backtrace Cleaning (clean_trace option)' do
|
|
115
118
|
"./myapp:42",
|
116
119
|
("#{Gem.dir}/some/lib.rb" if defined?(Gem))
|
117
120
|
].compact
|
118
|
-
@
|
121
|
+
@base.set :clean_trace, false
|
119
122
|
assert_equal backtrace, clean_backtrace(backtrace)
|
120
123
|
end
|
121
124
|
|
@@ -138,3 +141,234 @@ describe 'Backtrace Cleaning (clean_trace option)' do
|
|
138
141
|
end
|
139
142
|
end
|
140
143
|
end
|
144
|
+
|
145
|
+
describe_option 'run' do
|
146
|
+
it 'is disabled on Base' do
|
147
|
+
assert ! @base.run?
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'is enabled on Default when not in test environment' do
|
151
|
+
assert @default.development?
|
152
|
+
assert @default.run?
|
153
|
+
|
154
|
+
@default.set :environment, :development
|
155
|
+
assert @default.run?
|
156
|
+
end
|
157
|
+
|
158
|
+
# TODO: it 'is enabled when $0 == app_file'
|
159
|
+
end
|
160
|
+
|
161
|
+
describe_option 'raise_errors' do
|
162
|
+
it 'is enabled on Base' do
|
163
|
+
assert @base.raise_errors?
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'is enabled on Default only in test' do
|
167
|
+
@default.set(:environment, :development)
|
168
|
+
assert @default.development?
|
169
|
+
assert ! @default.raise_errors?, "disabled development"
|
170
|
+
|
171
|
+
@default.set(:environment, :production)
|
172
|
+
assert ! @default.raise_errors?
|
173
|
+
|
174
|
+
@default.set(:environment, :test)
|
175
|
+
assert @default.raise_errors?
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
describe_option 'dump_errors' do
|
180
|
+
it 'is disabled on Base' do
|
181
|
+
assert ! @base.dump_errors?
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'is enabled on Default' do
|
185
|
+
assert @default.dump_errors?
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'dumps exception with backtrace to rack.errors' do
|
189
|
+
Sinatra::Default.disable(:raise_errors)
|
190
|
+
|
191
|
+
mock_app(Sinatra::Default) {
|
192
|
+
error do
|
193
|
+
error = @env['rack.errors'].instance_variable_get(:@error)
|
194
|
+
error.rewind
|
195
|
+
|
196
|
+
error.read
|
197
|
+
end
|
198
|
+
|
199
|
+
get '/' do
|
200
|
+
raise
|
201
|
+
end
|
202
|
+
}
|
203
|
+
|
204
|
+
get '/'
|
205
|
+
assert body.include?("RuntimeError") && body.include?("options_test.rb")
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
describe_option 'sessions' do
|
210
|
+
it 'is disabled on Base' do
|
211
|
+
assert ! @base.sessions?
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'is disabled on Default' do
|
215
|
+
assert ! @default.sessions?
|
216
|
+
end
|
217
|
+
|
218
|
+
# TODO: it 'uses Rack::Session::Cookie when enabled' do
|
219
|
+
end
|
220
|
+
|
221
|
+
describe_option 'logging' do
|
222
|
+
it 'is disabled on Base' do
|
223
|
+
assert ! @base.logging?
|
224
|
+
end
|
225
|
+
|
226
|
+
it 'is enabled on Default when not in test environment' do
|
227
|
+
assert @default.logging?
|
228
|
+
|
229
|
+
@default.set :environment, :test
|
230
|
+
assert ! @default.logging
|
231
|
+
end
|
232
|
+
|
233
|
+
# TODO: it 'uses Rack::CommonLogger when enabled' do
|
234
|
+
end
|
235
|
+
|
236
|
+
describe_option 'static' do
|
237
|
+
it 'is disabled on Base' do
|
238
|
+
assert ! @base.static?
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'is enabled on Default' do
|
242
|
+
assert @default.static?
|
243
|
+
end
|
244
|
+
|
245
|
+
# TODO: it setup static routes if public is enabled
|
246
|
+
# TODO: however, that's already tested in static_test so...
|
247
|
+
end
|
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
|
255
|
+
|
256
|
+
describe_option 'port' do
|
257
|
+
it 'defaults to 4567' do
|
258
|
+
assert_equal 4567, @base.port
|
259
|
+
assert_equal 4567, @default.port
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
describe_option 'server' do
|
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
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
describe_option 'app_file' do
|
271
|
+
it 'is nil' do
|
272
|
+
assert @base.app_file.nil?
|
273
|
+
assert @default.app_file.nil?
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
describe_option 'root' do
|
278
|
+
it 'is nil if app_file is not set' do
|
279
|
+
assert @base.root.nil?
|
280
|
+
assert @default.root.nil?
|
281
|
+
end
|
282
|
+
|
283
|
+
it 'is equal to the expanded basename of app_file' do
|
284
|
+
@base.app_file = __FILE__
|
285
|
+
assert_equal File.expand_path(File.dirname(__FILE__)), @base.root
|
286
|
+
|
287
|
+
@default.app_file = __FILE__
|
288
|
+
assert_equal File.expand_path(File.dirname(__FILE__)), @default.root
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
describe_option 'views' do
|
293
|
+
it 'is nil if root is not set' do
|
294
|
+
assert @base.views.nil?
|
295
|
+
assert @default.views.nil?
|
296
|
+
end
|
297
|
+
|
298
|
+
it 'is set to root joined with views/' do
|
299
|
+
@base.root = File.dirname(__FILE__)
|
300
|
+
assert_equal File.dirname(__FILE__) + "/views", @base.views
|
301
|
+
|
302
|
+
@default.root = File.dirname(__FILE__)
|
303
|
+
assert_equal File.dirname(__FILE__) + "/views", @default.views
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
describe_option 'public' do
|
308
|
+
it 'is nil if root is not set' do
|
309
|
+
assert @base.public.nil?
|
310
|
+
assert @default.public.nil?
|
311
|
+
end
|
312
|
+
|
313
|
+
it 'is set to root joined with public/' do
|
314
|
+
@base.root = File.dirname(__FILE__)
|
315
|
+
assert_equal File.dirname(__FILE__) + "/public", @base.public
|
316
|
+
|
317
|
+
@default.root = File.dirname(__FILE__)
|
318
|
+
assert_equal File.dirname(__FILE__) + "/public", @default.public
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
describe_option 'reload' do
|
323
|
+
it 'is enabled when
|
324
|
+
app_file is set,
|
325
|
+
is not a rackup file,
|
326
|
+
and we are in development' do
|
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?
|
334
|
+
end
|
335
|
+
|
336
|
+
it 'is disabled if app_file is not set' do
|
337
|
+
assert ! @base.reload?
|
338
|
+
assert ! @default.reload?
|
339
|
+
end
|
340
|
+
|
341
|
+
it 'is disabled if app_file is a rackup file' do
|
342
|
+
@base.app_file = 'config.ru'
|
343
|
+
assert ! @base.reload?
|
344
|
+
|
345
|
+
@default.app_file = 'config.ru'
|
346
|
+
assert ! @base.reload?
|
347
|
+
end
|
348
|
+
|
349
|
+
it 'is disabled if we are not in development' do
|
350
|
+
@base.set(:environment, :foo)
|
351
|
+
assert ! @base.reload
|
352
|
+
|
353
|
+
@default.set(:environment, :bar)
|
354
|
+
assert ! @default.reload
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
describe_option 'lock' do
|
359
|
+
it 'is enabled when reload is enabled' do
|
360
|
+
@base.enable(:reload)
|
361
|
+
assert @base.lock?
|
362
|
+
|
363
|
+
@default.enable(:reload)
|
364
|
+
assert @default.lock?
|
365
|
+
end
|
366
|
+
|
367
|
+
it 'is disabled when reload is disabled' do
|
368
|
+
@base.disable(:reload)
|
369
|
+
assert ! @base.lock?
|
370
|
+
|
371
|
+
@default.disable(:reload)
|
372
|
+
assert ! @default.lock?
|
373
|
+
end
|
374
|
+
end
|
data/test/routing_test.rb
CHANGED
@@ -44,6 +44,27 @@ describe "Routing" do
|
|
44
44
|
assert_equal 404, status
|
45
45
|
end
|
46
46
|
|
47
|
+
it 'takes multiple definitions of a route' do
|
48
|
+
mock_app {
|
49
|
+
user_agent(/Foo/)
|
50
|
+
get '/foo' do
|
51
|
+
'foo'
|
52
|
+
end
|
53
|
+
|
54
|
+
get '/foo' do
|
55
|
+
'not foo'
|
56
|
+
end
|
57
|
+
}
|
58
|
+
|
59
|
+
get '/foo', {}, 'HTTP_USER_AGENT' => 'Foo'
|
60
|
+
assert ok?
|
61
|
+
assert_equal 'foo', body
|
62
|
+
|
63
|
+
get '/foo'
|
64
|
+
assert ok?
|
65
|
+
assert_equal 'not foo', body
|
66
|
+
end
|
67
|
+
|
47
68
|
it "exposes params with indifferent hash" do
|
48
69
|
mock_app {
|
49
70
|
get '/:foo' do
|
@@ -139,6 +160,32 @@ describe "Routing" do
|
|
139
160
|
assert ok?
|
140
161
|
end
|
141
162
|
|
163
|
+
it "matches a dot ('.') as part of a named param" do
|
164
|
+
mock_app {
|
165
|
+
get '/:foo/:bar' do
|
166
|
+
params[:foo]
|
167
|
+
end
|
168
|
+
}
|
169
|
+
|
170
|
+
get '/user@example.com/name'
|
171
|
+
assert_equal 200, response.status
|
172
|
+
assert_equal 'user@example.com', body
|
173
|
+
end
|
174
|
+
|
175
|
+
it "matches a literal dot ('.') outside of named params" do
|
176
|
+
mock_app {
|
177
|
+
get '/:file.:ext' do
|
178
|
+
assert_equal 'pony', params[:file]
|
179
|
+
assert_equal 'jpg', params[:ext]
|
180
|
+
'right on'
|
181
|
+
end
|
182
|
+
}
|
183
|
+
|
184
|
+
get '/pony.jpg'
|
185
|
+
assert_equal 200, response.status
|
186
|
+
assert_equal 'right on', body
|
187
|
+
end
|
188
|
+
|
142
189
|
it "literally matches . in paths" do
|
143
190
|
route_def '/test.bar'
|
144
191
|
|
@@ -158,7 +205,7 @@ describe "Routing" do
|
|
158
205
|
it "literally matches + in paths" do
|
159
206
|
route_def '/te+st/'
|
160
207
|
|
161
|
-
get '/te
|
208
|
+
get '/te%2Bst/'
|
162
209
|
assert ok?
|
163
210
|
get '/teeeeeeest/'
|
164
211
|
assert not_found?
|
@@ -243,7 +290,7 @@ describe "Routing" do
|
|
243
290
|
assert_equal 'looks good', body
|
244
291
|
end
|
245
292
|
|
246
|
-
it "
|
293
|
+
it "matches paths that include spaces encoded with %20" do
|
247
294
|
mock_app {
|
248
295
|
get '/path with spaces' do
|
249
296
|
'looks good'
|
@@ -255,6 +302,18 @@ describe "Routing" do
|
|
255
302
|
assert_equal 'looks good', body
|
256
303
|
end
|
257
304
|
|
305
|
+
it "matches paths that include spaces encoded with +" do
|
306
|
+
mock_app {
|
307
|
+
get '/path with spaces' do
|
308
|
+
'looks good'
|
309
|
+
end
|
310
|
+
}
|
311
|
+
|
312
|
+
get '/path+with+spaces'
|
313
|
+
assert ok?
|
314
|
+
assert_equal 'looks good', body
|
315
|
+
end
|
316
|
+
|
258
317
|
it "URL decodes named parameters and splats" do
|
259
318
|
mock_app {
|
260
319
|
get '/:foo/*' do
|
data/test/test_test.rb
CHANGED
@@ -1,21 +1,138 @@
|
|
1
|
+
require 'yaml'
|
1
2
|
require File.dirname(__FILE__) + '/helper'
|
2
3
|
|
3
|
-
describe
|
4
|
-
|
4
|
+
describe 'Sinatra::Test' do
|
5
|
+
def request
|
6
|
+
YAML.load(body)
|
7
|
+
end
|
8
|
+
|
9
|
+
def request_body
|
10
|
+
request['test.body']
|
11
|
+
end
|
12
|
+
|
13
|
+
def request_params
|
14
|
+
YAML.load(request['test.params'])
|
15
|
+
end
|
16
|
+
|
17
|
+
before do
|
5
18
|
mock_app {
|
19
|
+
%w[get head post put delete].each { |verb|
|
20
|
+
send(verb, '/') do
|
21
|
+
redirect '/redirected' if params[:redirect]
|
22
|
+
env.update('test.body' => request.body.read)
|
23
|
+
env.update('test.params' => params.to_yaml)
|
24
|
+
env.to_yaml
|
25
|
+
end
|
26
|
+
}
|
27
|
+
|
28
|
+
get '/redirected' do
|
29
|
+
"you've been redirected"
|
30
|
+
end
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'allows GET/HEAD/POST/PUT/DELETE' do
|
35
|
+
get '/'
|
36
|
+
assert_equal('GET', request['REQUEST_METHOD'])
|
37
|
+
|
38
|
+
post '/'
|
39
|
+
assert_equal('POST', request['REQUEST_METHOD'])
|
40
|
+
|
41
|
+
put '/'
|
42
|
+
assert_equal('PUT', request['REQUEST_METHOD'])
|
43
|
+
|
44
|
+
delete '/'
|
45
|
+
assert_equal('DELETE', request['REQUEST_METHOD'])
|
46
|
+
|
47
|
+
head '/'
|
48
|
+
assert_equal('596', response.headers['Content-Length'])
|
49
|
+
assert_equal('', response.body)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'allows to specify a body' do
|
53
|
+
post '/', '42'
|
54
|
+
assert_equal '42', request_body
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'allows to specify params' do
|
58
|
+
get '/', :foo => 'bar'
|
59
|
+
assert_equal 'bar', request_params['foo']
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'supports nested params' do
|
63
|
+
get '/', :foo => { :x => 'y', :chunky => 'bacon' }
|
64
|
+
assert_equal "y", request_params['foo']['x']
|
65
|
+
assert_equal "bacon", request_params['foo']['chunky']
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'provides easy access to response status and body' do
|
69
|
+
get '/'
|
70
|
+
assert_equal 200, status
|
71
|
+
assert body =~ /^---/
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'delegates methods to @response' do
|
75
|
+
get '/'
|
76
|
+
assert ok?
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'follows redirect' do
|
80
|
+
get '/', :redirect => true
|
81
|
+
follow!
|
82
|
+
assert_equal "you've been redirected", body
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'provides sugar for common HTTP headers' do
|
86
|
+
get '/', :env => { :accept => 'text/plain' }
|
87
|
+
assert_equal 'text/plain', request['HTTP_ACCEPT']
|
88
|
+
|
89
|
+
get '/', :env => { :agent => 'TATFT' }
|
90
|
+
assert_equal 'TATFT', request['HTTP_USER_AGENT']
|
91
|
+
|
92
|
+
get '/', :env => { :host => '1.2.3.4' }
|
93
|
+
assert_equal '1.2.3.4', request['HTTP_HOST']
|
94
|
+
|
95
|
+
get '/', :env => { :session => 'foo' }
|
96
|
+
assert_equal 'foo', request['rack.session']
|
97
|
+
|
98
|
+
get '/', :env => { :cookies => 'foo' }
|
99
|
+
assert_equal 'foo', request['HTTP_COOKIE']
|
100
|
+
|
101
|
+
get '/', :env => { :content_type => 'text/plain' }
|
102
|
+
assert_equal 'text/plain', request['CONTENT_TYPE']
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'allow to test session easily' do
|
106
|
+
app = mock_app(Sinatra::Default) {
|
6
107
|
get '/' do
|
7
|
-
|
108
|
+
session['foo'] = 'bar'
|
109
|
+
200
|
8
110
|
end
|
9
111
|
|
10
112
|
post '/' do
|
11
|
-
|
113
|
+
assert_equal 'bar', session['foo']
|
114
|
+
session['foo'] || "blah"
|
12
115
|
end
|
13
116
|
}
|
14
117
|
|
15
|
-
|
16
|
-
|
118
|
+
browser = Sinatra::TestHarness.new(app)
|
119
|
+
browser.get '/'
|
120
|
+
browser.post '/', {}, :session => { 'foo' => 'bar' }
|
121
|
+
assert_equal 'bar', browser.response.body
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'yields the request object to the block before invoking the application' do
|
125
|
+
called = false
|
126
|
+
get '/' do |req|
|
127
|
+
called = true
|
128
|
+
assert req.kind_of?(Rack::MockRequest)
|
129
|
+
end
|
130
|
+
assert called
|
131
|
+
end
|
17
132
|
|
18
|
-
|
19
|
-
|
133
|
+
def test_TestHarness
|
134
|
+
session = Sinatra::TestHarness.new(@app)
|
135
|
+
response = session.get('/')
|
136
|
+
assert_equal 200, response.status
|
20
137
|
end
|
21
138
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-sinatra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Mizerany
|
@@ -9,17 +9,21 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-03-01 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|
17
|
+
type: :runtime
|
17
18
|
version_requirement:
|
18
19
|
version_requirements: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
20
21
|
- - ">="
|
21
22
|
- !ruby/object:Gem::Version
|
22
23
|
version: 0.9.1
|
24
|
+
- - <
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: "1.0"
|
23
27
|
version:
|
24
28
|
description: Classy web-development dressed in a DSL
|
25
29
|
email: sinatrarb@googlegroups.com
|