sinatra-sinatra 0.9.0.4 → 0.9.0.5
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/AUTHORS +1 -1
- data/CHANGES +44 -0
- data/README.rdoc +12 -0
- data/Rakefile +2 -1
- data/compat/app_test.rb +3 -2
- data/compat/compat_test.rb +12 -0
- data/lib/sinatra/base.rb +206 -114
- data/lib/sinatra/compat.rb +18 -16
- data/lib/sinatra/main.rb +4 -4
- data/lib/sinatra/test.rb +10 -8
- data/sinatra.gemspec +7 -2
- data/test/base_test.rb +13 -0
- data/test/extensions_test.rb +63 -0
- data/test/helper.rb +13 -2
- data/test/helpers_test.rb +58 -0
- data/test/mapped_error_test.rb +6 -6
- data/test/middleware_test.rb +3 -1
- data/test/response_test.rb +42 -0
- data/test/routing_test.rb +166 -0
- data/test/server_test.rb +41 -0
- data/test/static_test.rb +8 -10
- data/test/test_test.rb +21 -0
- metadata +11 -2
data/lib/sinatra/test.rb
CHANGED
@@ -7,7 +7,7 @@ module Sinatra
|
|
7
7
|
|
8
8
|
attr_reader :app, :request, :response
|
9
9
|
|
10
|
-
def
|
10
|
+
def make_request(verb, path, *args)
|
11
11
|
@app = Sinatra::Application if @app.nil? && defined?(Sinatra::Application)
|
12
12
|
fail "@app not set - cannot make request" if @app.nil?
|
13
13
|
@request = Rack::MockRequest.new(@app)
|
@@ -38,14 +38,14 @@ module Sinatra
|
|
38
38
|
@response = @request.request(verb, path, opts)
|
39
39
|
end
|
40
40
|
|
41
|
-
def get(path, *args, &b) ;
|
42
|
-
def head(path, *args, &b) ;
|
43
|
-
def post(path, *args, &b) ;
|
44
|
-
def put(path, *args, &b) ;
|
45
|
-
def delete(path, *args, &b) ;
|
41
|
+
def get(path, *args, &b) ; make_request('GET', path, *args, &b) ; end
|
42
|
+
def head(path, *args, &b) ; make_request('HEAD', path, *args, &b) ; end
|
43
|
+
def post(path, *args, &b) ; make_request('POST', path, *args, &b) ; end
|
44
|
+
def put(path, *args, &b) ; make_request('PUT', path, *args, &b) ; end
|
45
|
+
def delete(path, *args, &b) ; make_request('DELETE', path, *args, &b) ; end
|
46
46
|
|
47
47
|
def follow!
|
48
|
-
|
48
|
+
make_request 'GET', @response.location
|
49
49
|
end
|
50
50
|
|
51
51
|
def body ; @response.body ; end
|
@@ -65,6 +65,8 @@ module Sinatra
|
|
65
65
|
super || (@response && @response.respond_to?(symbol, include_private))
|
66
66
|
end
|
67
67
|
|
68
|
+
private
|
69
|
+
|
68
70
|
RACK_OPT_NAMES = {
|
69
71
|
:accept => "HTTP_ACCEPT",
|
70
72
|
:agent => "HTTP_USER_AGENT",
|
@@ -103,7 +105,7 @@ module Sinatra
|
|
103
105
|
eval <<-RUBY, binding, __FILE__, __LINE__
|
104
106
|
def #{verb}_it(*args, &block)
|
105
107
|
sinatra_warn "The #{verb}_it method is deprecated; use #{verb} instead."
|
106
|
-
|
108
|
+
make_request('#{verb.upcase}', *args, &block)
|
107
109
|
end
|
108
110
|
RUBY
|
109
111
|
end
|
data/sinatra.gemspec
CHANGED
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
4
4
|
|
5
5
|
s.name = 'sinatra'
|
6
|
-
s.version = '0.9.0.
|
7
|
-
s.date = '2009-
|
6
|
+
s.version = '0.9.0.5'
|
7
|
+
s.date = '2009-02-10'
|
8
8
|
|
9
9
|
s.description = "Classy web-development dressed in a DSL"
|
10
10
|
s.summary = "Classy web-development dressed in a DSL"
|
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
compat/app_test.rb
|
23
23
|
compat/application_test.rb
|
24
24
|
compat/builder_test.rb
|
25
|
+
compat/compat_test.rb
|
25
26
|
compat/custom_error_test.rb
|
26
27
|
compat/erb_test.rb
|
27
28
|
compat/events_test.rb
|
@@ -69,6 +70,7 @@ Gem::Specification.new do |s|
|
|
69
70
|
test/builder_test.rb
|
70
71
|
test/data/reload_app_file.rb
|
71
72
|
test/erb_test.rb
|
73
|
+
test/extensions_test.rb
|
72
74
|
test/filter_test.rb
|
73
75
|
test/haml_test.rb
|
74
76
|
test/helper.rb
|
@@ -78,12 +80,15 @@ Gem::Specification.new do |s|
|
|
78
80
|
test/options_test.rb
|
79
81
|
test/reload_test.rb
|
80
82
|
test/request_test.rb
|
83
|
+
test/response_test.rb
|
81
84
|
test/result_test.rb
|
82
85
|
test/routing_test.rb
|
83
86
|
test/sass_test.rb
|
87
|
+
test/server_test.rb
|
84
88
|
test/sinatra_test.rb
|
85
89
|
test/static_test.rb
|
86
90
|
test/templates_test.rb
|
91
|
+
test/test_test.rb
|
87
92
|
test/views/hello.builder
|
88
93
|
test/views/hello.erb
|
89
94
|
test/views/hello.haml
|
data/test/base_test.rb
CHANGED
@@ -65,4 +65,17 @@ describe 'Sinatra::Base' do
|
|
65
65
|
assert response.ok?
|
66
66
|
assert_equal 'not foo', response.body
|
67
67
|
end
|
68
|
+
|
69
|
+
it "makes redirecting back pretty" do
|
70
|
+
app = mock_app {
|
71
|
+
get '/foo' do
|
72
|
+
redirect back
|
73
|
+
end
|
74
|
+
}
|
75
|
+
|
76
|
+
request = Rack::MockRequest.new(app)
|
77
|
+
response = request.get('/foo', 'HTTP_REFERER' => 'http://github.com')
|
78
|
+
assert response.redirect?
|
79
|
+
assert_equal "http://github.com", response.location
|
80
|
+
end
|
68
81
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
describe 'Registering extensions' do
|
4
|
+
module FooExtensions
|
5
|
+
def foo
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
def im_hiding_in_ur_foos
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module BarExtensions
|
14
|
+
def bar
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module BazExtensions
|
19
|
+
def baz
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module QuuxExtensions
|
24
|
+
def quux
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'will add the methods to the DSL for the class in which you register them and its subclasses' do
|
29
|
+
Sinatra::Base.register FooExtensions
|
30
|
+
assert Sinatra::Base.respond_to?(:foo)
|
31
|
+
|
32
|
+
Sinatra::Default.register BarExtensions
|
33
|
+
assert Sinatra::Default.respond_to?(:bar)
|
34
|
+
assert Sinatra::Default.respond_to?(:foo)
|
35
|
+
assert !Sinatra::Base.respond_to?(:bar)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'allows extending by passing a block' do
|
39
|
+
Sinatra::Base.register {
|
40
|
+
def im_in_ur_anonymous_module; end
|
41
|
+
}
|
42
|
+
assert Sinatra::Base.respond_to?(:im_in_ur_anonymous_module)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'will make sure any public methods added via Default#register are delegated to Sinatra::Delegator' do
|
46
|
+
Sinatra::Default.register FooExtensions
|
47
|
+
assert Sinatra::Delegator.private_instance_methods.
|
48
|
+
map { |m| m.to_sym }.include?(:foo)
|
49
|
+
assert !Sinatra::Delegator.private_instance_methods.
|
50
|
+
map { |m| m.to_sym }.include?(:im_hiding_in_ur_foos)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'will not delegate methods on Base#register' do
|
54
|
+
Sinatra::Base.register QuuxExtensions
|
55
|
+
assert !Sinatra::Delegator.private_instance_methods.include?("quux")
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'will extend the Sinatra::Default application by default' do
|
59
|
+
Sinatra.register BazExtensions
|
60
|
+
assert !Sinatra::Base.respond_to?(:baz)
|
61
|
+
assert Sinatra::Default.respond_to?(:baz)
|
62
|
+
end
|
63
|
+
end
|
data/test/helper.rb
CHANGED
@@ -32,9 +32,12 @@ end
|
|
32
32
|
#
|
33
33
|
def describe(*args, &block)
|
34
34
|
return super unless (name = args.first) && block
|
35
|
-
|
35
|
+
name = "#{name.gsub(/\W/, '')}Test"
|
36
|
+
Object.send :const_set, name, Class.new(Test::Unit::TestCase)
|
37
|
+
klass = Object.const_get(name)
|
38
|
+
klass.class_eval do
|
36
39
|
def self.it(name, &block)
|
37
|
-
define_method("test_#{name.gsub(/\W/,'_')}", &block)
|
40
|
+
define_method("test_#{name.gsub(/\W/,'_').downcase}", &block)
|
38
41
|
end
|
39
42
|
def self.xspecify(*args) end
|
40
43
|
def self.before(&block) define_method(:setup, &block) end
|
@@ -42,3 +45,11 @@ def describe(*args, &block)
|
|
42
45
|
end
|
43
46
|
klass.class_eval &block
|
44
47
|
end
|
48
|
+
|
49
|
+
# Do not output warnings for the duration of the block.
|
50
|
+
def silence_warnings
|
51
|
+
$VERBOSE, v = nil, $VERBOSE
|
52
|
+
yield
|
53
|
+
ensure
|
54
|
+
$VERBOSE = v
|
55
|
+
end
|
data/test/helpers_test.rb
CHANGED
@@ -379,3 +379,61 @@ describe 'Helpers#etag' do
|
|
379
379
|
assert_equal 'W/"FOO"', response['ETag']
|
380
380
|
end
|
381
381
|
end
|
382
|
+
|
383
|
+
module HelperOne; def one; '1'; end; end
|
384
|
+
module HelperTwo; def two; '2'; end; end
|
385
|
+
|
386
|
+
describe 'Adding new helpers' do
|
387
|
+
it 'takes a list of modules to mix into the app' do
|
388
|
+
mock_app {
|
389
|
+
helpers HelperOne, HelperTwo
|
390
|
+
|
391
|
+
get '/one' do
|
392
|
+
one
|
393
|
+
end
|
394
|
+
|
395
|
+
get '/two' do
|
396
|
+
two
|
397
|
+
end
|
398
|
+
}
|
399
|
+
|
400
|
+
get '/one'
|
401
|
+
assert_equal '1', body
|
402
|
+
|
403
|
+
get '/two'
|
404
|
+
assert_equal '2', body
|
405
|
+
end
|
406
|
+
|
407
|
+
it 'takes a block to mix into the app' do
|
408
|
+
mock_app {
|
409
|
+
helpers do
|
410
|
+
def foo
|
411
|
+
'foo'
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
get '/' do
|
416
|
+
foo
|
417
|
+
end
|
418
|
+
}
|
419
|
+
|
420
|
+
get '/'
|
421
|
+
assert_equal 'foo', body
|
422
|
+
end
|
423
|
+
|
424
|
+
it 'evaluates the block in class context so that methods can be aliased' do
|
425
|
+
mock_app {
|
426
|
+
helpers do
|
427
|
+
alias_method :h, :escape_html
|
428
|
+
end
|
429
|
+
|
430
|
+
get '/' do
|
431
|
+
h('42 < 43')
|
432
|
+
end
|
433
|
+
}
|
434
|
+
|
435
|
+
get '/'
|
436
|
+
assert ok?
|
437
|
+
assert_equal '42 < 43', body
|
438
|
+
end
|
439
|
+
end
|
data/test/mapped_error_test.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
end
|
3
|
+
class FooError < RuntimeError
|
4
|
+
end
|
6
5
|
|
6
|
+
class FooNotFound < Sinatra::NotFound
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'Exception Mappings' do
|
7
10
|
it 'invokes handlers registered with ::error when raised' do
|
8
11
|
mock_app {
|
9
12
|
set :raise_errors, false
|
@@ -80,9 +83,6 @@ describe 'Exception Mappings' do
|
|
80
83
|
assert_equal 404, status
|
81
84
|
end
|
82
85
|
|
83
|
-
class FooNotFound < Sinatra::NotFound
|
84
|
-
end
|
85
|
-
|
86
86
|
it "cascades for subclasses of Sinatra::NotFound" do
|
87
87
|
mock_app {
|
88
88
|
set :raise_errors, true
|
data/test/middleware_test.rb
CHANGED
@@ -4,7 +4,9 @@ describe "Middleware" do
|
|
4
4
|
before do
|
5
5
|
@app = mock_app(Sinatra::Default) {
|
6
6
|
get '/*' do
|
7
|
-
response.headers['X-Tests'] = env['test.ran'].
|
7
|
+
response.headers['X-Tests'] = env['test.ran'].
|
8
|
+
map { |n| n.split('::').last }.
|
9
|
+
join(', ')
|
8
10
|
env['PATH_INFO']
|
9
11
|
end
|
10
12
|
}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/helper'
|
4
|
+
|
5
|
+
describe 'Sinatra::Response' do
|
6
|
+
before do
|
7
|
+
@response = Sinatra::Response.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "initializes with 200, text/html, and empty body" do
|
11
|
+
assert_equal 200, @response.status
|
12
|
+
assert_equal 'text/html', @response['Content-Type']
|
13
|
+
assert_equal [], @response.body
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'uses case insensitive headers' do
|
17
|
+
@response['content-type'] = 'application/foo'
|
18
|
+
assert_equal 'application/foo', @response['Content-Type']
|
19
|
+
assert_equal 'application/foo', @response['CONTENT-TYPE']
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'writes to body' do
|
23
|
+
@response.body = 'Hello'
|
24
|
+
@response.write ' World'
|
25
|
+
assert_equal 'Hello World', @response.body
|
26
|
+
end
|
27
|
+
|
28
|
+
[204, 304].each do |status_code|
|
29
|
+
it "removes the Content-Type header and body when response status is #{status_code}" do
|
30
|
+
@response.status = status_code
|
31
|
+
@response.body = ['Hello World']
|
32
|
+
assert_equal [status_code, {}, []], @response.finish
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'Calculates the Content-Length using the bytesize of the body' do
|
37
|
+
@response.body = ['Hello', 'World!', '✈']
|
38
|
+
status, headers, body = @response.finish
|
39
|
+
assert_equal '14', headers['Content-Length']
|
40
|
+
assert_equal @response.body, body
|
41
|
+
end
|
42
|
+
end
|
data/test/routing_test.rb
CHANGED
@@ -484,4 +484,170 @@ describe "Routing" do
|
|
484
484
|
assert_equal type, response.headers['Content-Type']
|
485
485
|
end
|
486
486
|
end
|
487
|
+
|
488
|
+
it 'degrades gracefully when optional accept header is not provided' do
|
489
|
+
mock_app {
|
490
|
+
get '/', :provides => :xml do
|
491
|
+
request.env['HTTP_ACCEPT']
|
492
|
+
end
|
493
|
+
get '/' do
|
494
|
+
'default'
|
495
|
+
end
|
496
|
+
}
|
497
|
+
get '/'
|
498
|
+
assert ok?
|
499
|
+
assert_equal 'default', body
|
500
|
+
end
|
501
|
+
|
502
|
+
it 'passes a single url param as block parameters when one param is specified' do
|
503
|
+
mock_app {
|
504
|
+
get '/:foo' do |foo|
|
505
|
+
assert_equal 'bar', foo
|
506
|
+
end
|
507
|
+
}
|
508
|
+
|
509
|
+
get '/bar'
|
510
|
+
assert ok?
|
511
|
+
end
|
512
|
+
|
513
|
+
it 'passes multiple params as block parameters when many are specified' do
|
514
|
+
mock_app {
|
515
|
+
get '/:foo/:bar/:baz' do |foo, bar, baz|
|
516
|
+
assert_equal 'abc', foo
|
517
|
+
assert_equal 'def', bar
|
518
|
+
assert_equal 'ghi', baz
|
519
|
+
end
|
520
|
+
}
|
521
|
+
|
522
|
+
get '/abc/def/ghi'
|
523
|
+
assert ok?
|
524
|
+
end
|
525
|
+
|
526
|
+
it 'passes regular expression captures as block parameters' do
|
527
|
+
mock_app {
|
528
|
+
get(/^\/fo(.*)\/ba(.*)/) do |foo, bar|
|
529
|
+
assert_equal 'orooomma', foo
|
530
|
+
assert_equal 'f', bar
|
531
|
+
'looks good'
|
532
|
+
end
|
533
|
+
}
|
534
|
+
|
535
|
+
get '/foorooomma/baf'
|
536
|
+
assert ok?
|
537
|
+
assert_equal 'looks good', body
|
538
|
+
end
|
539
|
+
|
540
|
+
it "supports mixing multiple splat params like /*/foo/*/* as block parameters" do
|
541
|
+
mock_app {
|
542
|
+
get '/*/foo/*/*' do |foo, bar, baz|
|
543
|
+
assert_equal 'bar', foo
|
544
|
+
assert_equal 'bling', bar
|
545
|
+
assert_equal 'baz/boom', baz
|
546
|
+
'looks good'
|
547
|
+
end
|
548
|
+
}
|
549
|
+
|
550
|
+
get '/bar/foo/bling/baz/boom'
|
551
|
+
assert ok?
|
552
|
+
assert_equal 'looks good', body
|
553
|
+
end
|
554
|
+
|
555
|
+
it 'raises an ArgumentError with block arity > 1 and too many values' do
|
556
|
+
mock_app {
|
557
|
+
get '/:foo/:bar/:baz' do |foo, bar|
|
558
|
+
'quux'
|
559
|
+
end
|
560
|
+
}
|
561
|
+
|
562
|
+
assert_raise(ArgumentError) { get '/a/b/c' }
|
563
|
+
end
|
564
|
+
|
565
|
+
it 'raises an ArgumentError with block param arity > 1 and too few values' do
|
566
|
+
mock_app {
|
567
|
+
get '/:foo/:bar' do |foo, bar, baz|
|
568
|
+
'quux'
|
569
|
+
end
|
570
|
+
}
|
571
|
+
|
572
|
+
assert_raise(ArgumentError) { get '/a/b' }
|
573
|
+
end
|
574
|
+
|
575
|
+
it 'succeeds if no block parameters are specified' do
|
576
|
+
mock_app {
|
577
|
+
get '/:foo/:bar' do
|
578
|
+
'quux'
|
579
|
+
end
|
580
|
+
}
|
581
|
+
|
582
|
+
get '/a/b'
|
583
|
+
assert ok?
|
584
|
+
assert_equal 'quux', body
|
585
|
+
end
|
586
|
+
|
587
|
+
it 'passes all params with block param arity -1 (splat args)' do
|
588
|
+
mock_app {
|
589
|
+
get '/:foo/:bar' do |*args|
|
590
|
+
args.join
|
591
|
+
end
|
592
|
+
}
|
593
|
+
|
594
|
+
get '/a/b'
|
595
|
+
assert ok?
|
596
|
+
assert_equal 'ab', body
|
597
|
+
end
|
598
|
+
|
599
|
+
# NOTE Block params behaves differently under 1.8 and 1.9. Under 1.8, block
|
600
|
+
# param arity is lax: declaring a mismatched number of block params results
|
601
|
+
# in a warning. Under 1.9, block param arity is strict: mismatched block
|
602
|
+
# arity raises an ArgumentError.
|
603
|
+
|
604
|
+
if RUBY_VERSION >= '1.9'
|
605
|
+
|
606
|
+
it 'raises an ArgumentError with block param arity 1 and no values' do
|
607
|
+
mock_app {
|
608
|
+
get '/foo' do |foo|
|
609
|
+
'quux'
|
610
|
+
end
|
611
|
+
}
|
612
|
+
|
613
|
+
assert_raise(ArgumentError) { get '/foo' }
|
614
|
+
end
|
615
|
+
|
616
|
+
it 'raises an ArgumentError with block param arity 1 and too many values' do
|
617
|
+
mock_app {
|
618
|
+
get '/:foo/:bar/:baz' do |foo|
|
619
|
+
'quux'
|
620
|
+
end
|
621
|
+
}
|
622
|
+
|
623
|
+
assert_raise(ArgumentError) { get '/a/b/c' }
|
624
|
+
end
|
625
|
+
|
626
|
+
else
|
627
|
+
|
628
|
+
it 'does not raise an ArgumentError with block param arity 1 and no values' do
|
629
|
+
mock_app {
|
630
|
+
get '/foo' do |foo|
|
631
|
+
'quux'
|
632
|
+
end
|
633
|
+
}
|
634
|
+
|
635
|
+
silence_warnings { get '/foo' }
|
636
|
+
assert ok?
|
637
|
+
assert_equal 'quux', body
|
638
|
+
end
|
639
|
+
|
640
|
+
it 'does not raise an ArgumentError with block param arity 1 and too many values' do
|
641
|
+
mock_app {
|
642
|
+
get '/:foo/:bar/:baz' do |foo|
|
643
|
+
'quux'
|
644
|
+
end
|
645
|
+
}
|
646
|
+
|
647
|
+
silence_warnings { get '/a/b/c' }
|
648
|
+
assert ok?
|
649
|
+
assert_equal 'quux', body
|
650
|
+
end
|
651
|
+
|
652
|
+
end
|
487
653
|
end
|
data/test/server_test.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
class Rack::Handler::Mock
|
4
|
+
extend Test::Unit::Assertions
|
5
|
+
|
6
|
+
def self.run(app, options={})
|
7
|
+
assert(app < Sinatra::Base)
|
8
|
+
assert_equal 9001, options[:Port]
|
9
|
+
assert_equal 'foo.local', options[:Host]
|
10
|
+
yield new
|
11
|
+
end
|
12
|
+
|
13
|
+
def stop
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'Sinatra::Base.run!' do
|
18
|
+
before do
|
19
|
+
mock_app {
|
20
|
+
set :server, 'mock'
|
21
|
+
set :host, 'foo.local'
|
22
|
+
set :port, 9001
|
23
|
+
}
|
24
|
+
$stdout = File.open('/dev/null', 'wb')
|
25
|
+
end
|
26
|
+
|
27
|
+
after { $stdout = STDOUT }
|
28
|
+
|
29
|
+
it "locates the appropriate Rack handler and calls ::run" do
|
30
|
+
@app.run!
|
31
|
+
end
|
32
|
+
|
33
|
+
it "sets options on the app before running" do
|
34
|
+
@app.run! :sessions => true
|
35
|
+
assert @app.sessions?
|
36
|
+
end
|
37
|
+
|
38
|
+
it "falls back on the next server handler when not found" do
|
39
|
+
@app.run! :server => %w[foo bar mock]
|
40
|
+
end
|
41
|
+
end
|
data/test/static_test.rb
CHANGED
@@ -1,17 +1,15 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
3
|
describe 'Static' do
|
4
|
-
F = ::File
|
5
|
-
|
6
4
|
before do
|
7
5
|
mock_app {
|
8
6
|
set :static, true
|
9
|
-
set :public,
|
7
|
+
set :public, File.dirname(__FILE__)
|
10
8
|
}
|
11
9
|
end
|
12
10
|
|
13
11
|
it 'serves GET requests for files in the public directory' do
|
14
|
-
get "/#{
|
12
|
+
get "/#{File.basename(__FILE__)}"
|
15
13
|
assert ok?
|
16
14
|
assert_equal File.read(__FILE__), body
|
17
15
|
assert_equal File.size(__FILE__).to_s, response['Content-Length']
|
@@ -19,7 +17,7 @@ describe 'Static' do
|
|
19
17
|
end
|
20
18
|
|
21
19
|
it 'produces a body that can be iterated over multiple times' do
|
22
|
-
env = Rack::MockRequest.env_for("/#{
|
20
|
+
env = Rack::MockRequest.env_for("/#{File.basename(__FILE__)}")
|
23
21
|
status, headers, body = @app.call(env)
|
24
22
|
buf1, buf2 = [], []
|
25
23
|
body.each { |part| buf1 << part }
|
@@ -29,7 +27,7 @@ describe 'Static' do
|
|
29
27
|
end
|
30
28
|
|
31
29
|
it 'serves HEAD requests for files in the public directory' do
|
32
|
-
head "/#{
|
30
|
+
head "/#{File.basename(__FILE__)}"
|
33
31
|
assert ok?
|
34
32
|
assert_equal '', body
|
35
33
|
assert_equal File.size(__FILE__).to_s, response['Content-Length']
|
@@ -37,8 +35,8 @@ describe 'Static' do
|
|
37
35
|
end
|
38
36
|
|
39
37
|
it 'serves files in preference to custom routes' do
|
40
|
-
@app.get("/#{
|
41
|
-
get "/#{
|
38
|
+
@app.get("/#{File.basename(__FILE__)}") { 'Hello World' }
|
39
|
+
get "/#{File.basename(__FILE__)}"
|
42
40
|
assert ok?
|
43
41
|
assert body != 'Hello World'
|
44
42
|
end
|
@@ -50,13 +48,13 @@ describe 'Static' do
|
|
50
48
|
|
51
49
|
it 'passes to the next handler when the static option is disabled' do
|
52
50
|
@app.set :static, false
|
53
|
-
get "/#{
|
51
|
+
get "/#{File.basename(__FILE__)}"
|
54
52
|
assert not_found?
|
55
53
|
end
|
56
54
|
|
57
55
|
it 'passes to the next handler when the public option is nil' do
|
58
56
|
@app.set :public, nil
|
59
|
-
get "/#{
|
57
|
+
get "/#{File.basename(__FILE__)}"
|
60
58
|
assert not_found?
|
61
59
|
end
|
62
60
|
|
data/test/test_test.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
describe "Sinatra::Test" do
|
4
|
+
it "support nested parameters" do
|
5
|
+
mock_app {
|
6
|
+
get '/' do
|
7
|
+
params[:post][:title]
|
8
|
+
end
|
9
|
+
|
10
|
+
post '/' do
|
11
|
+
params[:post][:content]
|
12
|
+
end
|
13
|
+
}
|
14
|
+
|
15
|
+
get '/', :post => { :title => 'My Post Title' }
|
16
|
+
assert_equal 'My Post Title', body
|
17
|
+
|
18
|
+
post '/', :post => { :content => 'Post Content' }
|
19
|
+
assert_equal 'Post Content', body
|
20
|
+
end
|
21
|
+
end
|