rack 1.6.13 → 2.0.0.alpha

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rack might be problematic. Click here for more details.

Files changed (138) hide show
  1. checksums.yaml +5 -5
  2. data/HISTORY.md +139 -18
  3. data/README.rdoc +17 -25
  4. data/Rakefile +6 -14
  5. data/SPEC +8 -9
  6. data/contrib/rack_logo.svg +164 -111
  7. data/lib/rack.rb +70 -21
  8. data/lib/rack/auth/digest/request.rb +1 -1
  9. data/lib/rack/body_proxy.rb +14 -9
  10. data/lib/rack/builder.rb +3 -3
  11. data/lib/rack/chunked.rb +5 -5
  12. data/lib/rack/{commonlogger.rb → common_logger.rb} +2 -2
  13. data/lib/rack/{conditionalget.rb → conditional_get.rb} +0 -0
  14. data/lib/rack/content_length.rb +2 -2
  15. data/lib/rack/deflater.rb +4 -4
  16. data/lib/rack/directory.rb +49 -55
  17. data/lib/rack/etag.rb +2 -1
  18. data/lib/rack/events.rb +154 -0
  19. data/lib/rack/file.rb +55 -40
  20. data/lib/rack/handler.rb +2 -24
  21. data/lib/rack/handler/cgi.rb +15 -16
  22. data/lib/rack/handler/fastcgi.rb +13 -14
  23. data/lib/rack/handler/lsws.rb +11 -11
  24. data/lib/rack/handler/scgi.rb +15 -15
  25. data/lib/rack/handler/thin.rb +3 -0
  26. data/lib/rack/handler/webrick.rb +22 -24
  27. data/lib/rack/head.rb +15 -17
  28. data/lib/rack/lint.rb +38 -38
  29. data/lib/rack/lobster.rb +1 -1
  30. data/lib/rack/lock.rb +6 -10
  31. data/lib/rack/logger.rb +2 -2
  32. data/lib/rack/media_type.rb +38 -0
  33. data/lib/rack/{methodoverride.rb → method_override.rb} +4 -11
  34. data/lib/rack/mime.rb +18 -5
  35. data/lib/rack/mock.rb +35 -52
  36. data/lib/rack/multipart.rb +35 -6
  37. data/lib/rack/multipart/generator.rb +4 -4
  38. data/lib/rack/multipart/parser.rb +273 -158
  39. data/lib/rack/multipart/uploaded_file.rb +1 -2
  40. data/lib/rack/{nulllogger.rb → null_logger.rb} +1 -1
  41. data/lib/rack/query_parser.rb +174 -0
  42. data/lib/rack/recursive.rb +8 -8
  43. data/lib/rack/reloader.rb +1 -2
  44. data/lib/rack/request.rb +370 -304
  45. data/lib/rack/response.rb +129 -56
  46. data/lib/rack/rewindable_input.rb +1 -12
  47. data/lib/rack/runtime.rb +10 -18
  48. data/lib/rack/sendfile.rb +5 -7
  49. data/lib/rack/server.rb +31 -25
  50. data/lib/rack/session/abstract/id.rb +93 -135
  51. data/lib/rack/session/cookie.rb +26 -28
  52. data/lib/rack/session/memcache.rb +8 -14
  53. data/lib/rack/session/pool.rb +14 -21
  54. data/lib/rack/show_exceptions.rb +386 -0
  55. data/lib/rack/{showstatus.rb → show_status.rb} +3 -3
  56. data/lib/rack/static.rb +30 -5
  57. data/lib/rack/tempfile_reaper.rb +2 -2
  58. data/lib/rack/urlmap.rb +13 -14
  59. data/lib/rack/utils.rb +128 -221
  60. data/rack.gemspec +9 -5
  61. data/test/builder/an_underscore_app.rb +5 -0
  62. data/test/builder/options.ru +1 -1
  63. data/test/cgi/test.fcgi +1 -0
  64. data/test/cgi/test.gz +0 -0
  65. data/test/helper.rb +31 -0
  66. data/test/multipart/filename_with_encoded_words +7 -0
  67. data/test/multipart/{filename_with_null_byte → filename_with_single_quote} +1 -1
  68. data/test/multipart/quoted +15 -0
  69. data/test/multipart/rack-logo.png +0 -0
  70. data/test/registering_handler/rack/handler/registering_myself.rb +1 -1
  71. data/test/spec_auth_basic.rb +20 -19
  72. data/test/spec_auth_digest.rb +47 -46
  73. data/test/spec_body_proxy.rb +27 -27
  74. data/test/spec_builder.rb +51 -41
  75. data/test/spec_cascade.rb +24 -22
  76. data/test/spec_cgi.rb +49 -67
  77. data/test/spec_chunked.rb +36 -34
  78. data/test/{spec_commonlogger.rb → spec_common_logger.rb} +23 -21
  79. data/test/{spec_conditionalget.rb → spec_conditional_get.rb} +29 -28
  80. data/test/spec_config.rb +3 -2
  81. data/test/spec_content_length.rb +18 -17
  82. data/test/spec_content_type.rb +13 -12
  83. data/test/spec_deflater.rb +66 -40
  84. data/test/spec_directory.rb +72 -27
  85. data/test/spec_etag.rb +32 -31
  86. data/test/spec_events.rb +133 -0
  87. data/test/spec_fastcgi.rb +50 -72
  88. data/test/spec_file.rb +96 -77
  89. data/test/spec_handler.rb +19 -34
  90. data/test/spec_head.rb +15 -14
  91. data/test/spec_lint.rb +162 -197
  92. data/test/spec_lobster.rb +24 -23
  93. data/test/spec_lock.rb +69 -39
  94. data/test/spec_logger.rb +4 -3
  95. data/test/spec_media_type.rb +42 -0
  96. data/test/spec_method_override.rb +83 -0
  97. data/test/spec_mime.rb +19 -19
  98. data/test/spec_mock.rb +196 -151
  99. data/test/spec_multipart.rb +310 -202
  100. data/test/{spec_nulllogger.rb → spec_null_logger.rb} +5 -4
  101. data/test/spec_recursive.rb +17 -14
  102. data/test/spec_request.rb +763 -607
  103. data/test/spec_response.rb +209 -156
  104. data/test/spec_rewindable_input.rb +50 -40
  105. data/test/spec_runtime.rb +11 -10
  106. data/test/spec_sendfile.rb +30 -35
  107. data/test/spec_server.rb +78 -52
  108. data/test/spec_session_abstract_id.rb +11 -33
  109. data/test/spec_session_cookie.rb +97 -65
  110. data/test/spec_session_memcache.rb +63 -101
  111. data/test/spec_session_pool.rb +48 -84
  112. data/test/spec_show_exceptions.rb +80 -0
  113. data/test/{spec_showstatus.rb → spec_show_status.rb} +36 -35
  114. data/test/spec_static.rb +71 -32
  115. data/test/spec_tempfile_reaper.rb +11 -10
  116. data/test/spec_thin.rb +55 -50
  117. data/test/spec_urlmap.rb +79 -78
  118. data/test/spec_utils.rb +417 -345
  119. data/test/spec_version.rb +2 -8
  120. data/test/spec_webrick.rb +77 -67
  121. data/test/static/foo.html +1 -0
  122. data/test/testrequest.rb +1 -1
  123. data/test/unregistered_handler/rack/handler/unregistered.rb +1 -1
  124. data/test/unregistered_handler/rack/handler/unregistered_long_one.rb +1 -1
  125. metadata +116 -71
  126. data/KNOWN-ISSUES +0 -44
  127. data/lib/rack/backports/uri/common_18.rb +0 -56
  128. data/lib/rack/backports/uri/common_192.rb +0 -52
  129. data/lib/rack/backports/uri/common_193.rb +0 -29
  130. data/lib/rack/handler/evented_mongrel.rb +0 -8
  131. data/lib/rack/handler/mongrel.rb +0 -106
  132. data/lib/rack/handler/swiftiplied_mongrel.rb +0 -8
  133. data/lib/rack/showexceptions.rb +0 -387
  134. data/lib/rack/utils/okjson.rb +0 -600
  135. data/test/spec_methodoverride.rb +0 -111
  136. data/test/spec_mongrel.rb +0 -182
  137. data/test/spec_session_persisted_secure_secure_session_hash.rb +0 -73
  138. data/test/spec_showexceptions.rb +0 -98
@@ -0,0 +1,80 @@
1
+ require 'minitest/autorun'
2
+ require 'rack/show_exceptions'
3
+ require 'rack/lint'
4
+ require 'rack/mock'
5
+
6
+ describe Rack::ShowExceptions do
7
+ def show_exceptions(app)
8
+ Rack::Lint.new Rack::ShowExceptions.new(app)
9
+ end
10
+
11
+ it "catches exceptions" do
12
+ res = nil
13
+
14
+ req = Rack::MockRequest.new(
15
+ show_exceptions(
16
+ lambda{|env| raise RuntimeError }
17
+ ))
18
+
19
+ res = req.get("/", "HTTP_ACCEPT" => "text/html")
20
+
21
+ res.must_be :server_error?
22
+ res.status.must_equal 500
23
+
24
+ assert_match(res, /RuntimeError/)
25
+ assert_match(res, /ShowExceptions/)
26
+ end
27
+
28
+ it "responds with HTML only to requests accepting HTML" do
29
+ res = nil
30
+
31
+ req = Rack::MockRequest.new(
32
+ show_exceptions(
33
+ lambda{|env| raise RuntimeError, "It was never supposed to work" }
34
+ ))
35
+
36
+ [
37
+ # Serve text/html when the client accepts text/html
38
+ ["text/html", ["/", {"HTTP_ACCEPT" => "text/html"}]],
39
+ ["text/html", ["/", {"HTTP_ACCEPT" => "*/*"}]],
40
+ # Serve text/plain when the client does not accept text/html
41
+ ["text/plain", ["/"]],
42
+ ["text/plain", ["/", {"HTTP_ACCEPT" => "application/json"}]]
43
+ ].each do |exmime, rargs|
44
+ res = req.get(*rargs)
45
+
46
+ res.must_be :server_error?
47
+ res.status.must_equal 500
48
+
49
+ res.content_type.must_equal exmime
50
+
51
+ res.body.must_include "RuntimeError"
52
+ res.body.must_include "It was never supposed to work"
53
+
54
+ if exmime == "text/html"
55
+ res.body.must_include '</html>'
56
+ else
57
+ res.body.wont_include '</html>'
58
+ end
59
+ end
60
+ end
61
+
62
+ it "handles exceptions without a backtrace" do
63
+ res = nil
64
+
65
+ req = Rack::MockRequest.new(
66
+ show_exceptions(
67
+ lambda{|env| raise RuntimeError, "", [] }
68
+ )
69
+ )
70
+
71
+ res = req.get("/", "HTTP_ACCEPT" => "text/html")
72
+
73
+ res.must_be :server_error?
74
+ res.status.must_equal 500
75
+
76
+ assert_match(res, /RuntimeError/)
77
+ assert_match(res, /ShowExceptions/)
78
+ assert_match(res, /unknown location/)
79
+ end
80
+ end
@@ -1,4 +1,5 @@
1
- require 'rack/showstatus'
1
+ require 'minitest/autorun'
2
+ require 'rack/show_status'
2
3
  require 'rack/lint'
3
4
  require 'rack/mock'
4
5
  require 'rack/utils'
@@ -7,23 +8,23 @@ describe Rack::ShowStatus do
7
8
  def show_status(app)
8
9
  Rack::Lint.new Rack::ShowStatus.new(app)
9
10
  end
10
-
11
- should "provide a default status message" do
11
+
12
+ it "provide a default status message" do
12
13
  req = Rack::MockRequest.new(
13
14
  show_status(lambda{|env|
14
15
  [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []]
15
16
  }))
16
17
 
17
18
  res = req.get("/", :lint => true)
18
- res.should.be.not_found
19
- res.should.be.not.empty
19
+ res.must_be :not_found?
20
+ res.wont_be_empty
20
21
 
21
- res["Content-Type"].should.equal("text/html")
22
- res.should =~ /404/
23
- res.should =~ /Not Found/
22
+ res["Content-Type"].must_equal "text/html"
23
+ assert_match(res, /404/)
24
+ assert_match(res, /Not Found/)
24
25
  end
25
26
 
26
- should "let the app provide additional information" do
27
+ it "let the app provide additional information" do
27
28
  req = Rack::MockRequest.new(
28
29
  show_status(
29
30
  lambda{|env|
@@ -32,16 +33,16 @@ describe Rack::ShowStatus do
32
33
  }))
33
34
 
34
35
  res = req.get("/", :lint => true)
35
- res.should.be.not_found
36
- res.should.be.not.empty
36
+ res.must_be :not_found?
37
+ res.wont_be_empty
37
38
 
38
- res["Content-Type"].should.equal("text/html")
39
- res.should =~ /404/
40
- res.should =~ /Not Found/
41
- res.should =~ /too meta/
39
+ res["Content-Type"].must_equal "text/html"
40
+ assert_match(res, /404/)
41
+ assert_match(res, /Not Found/)
42
+ assert_match(res, /too meta/)
42
43
  end
43
44
 
44
- should "escape error" do
45
+ it "escape error" do
45
46
  detail = "<script>alert('hi \"')</script>"
46
47
  req = Rack::MockRequest.new(
47
48
  show_status(
@@ -51,15 +52,15 @@ describe Rack::ShowStatus do
51
52
  }))
52
53
 
53
54
  res = req.get("/", :lint => true)
54
- res.should.be.not.empty
55
+ res.wont_be_empty
55
56
 
56
- res["Content-Type"].should.equal("text/html")
57
- res.should =~ /500/
58
- res.should.not.include detail
59
- res.body.should.include Rack::Utils.escape_html(detail)
57
+ res["Content-Type"].must_equal "text/html"
58
+ assert_match(res, /500/)
59
+ res.wont_include detail
60
+ res.body.must_include Rack::Utils.escape_html(detail)
60
61
  end
61
62
 
62
- should "not replace existing messages" do
63
+ it "not replace existing messages" do
63
64
  req = Rack::MockRequest.new(
64
65
  show_status(
65
66
  lambda{|env|
@@ -67,22 +68,22 @@ describe Rack::ShowStatus do
67
68
  }))
68
69
 
69
70
  res = req.get("/", :lint => true)
70
- res.should.be.not_found
71
+ res.must_be :not_found?
71
72
 
72
- res.body.should == "foo!"
73
+ res.body.must_equal "foo!"
73
74
  end
74
75
 
75
- should "pass on original headers" do
76
+ it "pass on original headers" do
76
77
  headers = {"WWW-Authenticate" => "Basic blah"}
77
78
 
78
79
  req = Rack::MockRequest.new(
79
80
  show_status(lambda{|env| [401, headers, []] }))
80
81
  res = req.get("/", :lint => true)
81
82
 
82
- res["WWW-Authenticate"].should.equal("Basic blah")
83
+ res["WWW-Authenticate"].must_equal "Basic blah"
83
84
  end
84
85
 
85
- should "replace existing messages if there is detail" do
86
+ it "replace existing messages if there is detail" do
86
87
  req = Rack::MockRequest.new(
87
88
  show_status(
88
89
  lambda{|env|
@@ -91,13 +92,13 @@ describe Rack::ShowStatus do
91
92
  }))
92
93
 
93
94
  res = req.get("/", :lint => true)
94
- res.should.be.not_found
95
- res.should.be.not.empty
96
-
97
- res["Content-Type"].should.equal("text/html")
98
- res["Content-Length"].should.not.equal("4")
99
- res.should =~ /404/
100
- res.should =~ /too meta/
101
- res.body.should.not =~ /foo/
95
+ res.must_be :not_found?
96
+ res.wont_be_empty
97
+
98
+ res["Content-Type"].must_equal "text/html"
99
+ res["Content-Length"].wont_equal "4"
100
+ assert_match(res, /404/)
101
+ assert_match(res, /too meta/)
102
+ res.body.wont_match(/foo/)
102
103
  end
103
104
  end
@@ -1,6 +1,9 @@
1
+ require 'minitest/autorun'
1
2
  require 'rack/static'
2
3
  require 'rack/lint'
3
4
  require 'rack/mock'
5
+ require 'zlib'
6
+ require 'stringio'
4
7
 
5
8
  class DummyApp
6
9
  def call(env)
@@ -18,64 +21,101 @@ describe Rack::Static do
18
21
  OPTIONS = {:urls => ["/cgi"], :root => root}
19
22
  STATIC_OPTIONS = {:urls => [""], :root => "#{root}/static", :index => 'index.html'}
20
23
  HASH_OPTIONS = {:urls => {"/cgi/sekret" => 'cgi/test'}, :root => root}
24
+ HASH_ROOT_OPTIONS = {:urls => {"/" => "static/foo.html"}, :root => root}
25
+ GZIP_OPTIONS = {:urls => ["/cgi"], :root => root, :gzip=>true}
21
26
 
27
+ before do
22
28
  @request = Rack::MockRequest.new(static(DummyApp.new, OPTIONS))
23
29
  @static_request = Rack::MockRequest.new(static(DummyApp.new, STATIC_OPTIONS))
24
30
  @hash_request = Rack::MockRequest.new(static(DummyApp.new, HASH_OPTIONS))
31
+ @hash_root_request = Rack::MockRequest.new(static(DummyApp.new, HASH_ROOT_OPTIONS))
32
+ @gzip_request = Rack::MockRequest.new(static(DummyApp.new, GZIP_OPTIONS))
33
+ @header_request = Rack::MockRequest.new(static(DummyApp.new, HEADER_OPTIONS))
34
+ end
25
35
 
26
36
  it "serves files" do
27
37
  res = @request.get("/cgi/test")
28
- res.should.be.ok
29
- res.body.should =~ /ruby/
38
+ res.must_be :ok?
39
+ res.body.must_match(/ruby/)
30
40
  end
31
41
 
32
42
  it "404s if url root is known but it can't find the file" do
33
43
  res = @request.get("/cgi/foo")
34
- res.should.be.not_found
44
+ res.must_be :not_found?
35
45
  end
36
46
 
37
47
  it "calls down the chain if url root is not known" do
38
48
  res = @request.get("/something/else")
39
- res.should.be.ok
40
- res.body.should == "Hello World"
49
+ res.must_be :ok?
50
+ res.body.must_equal "Hello World"
41
51
  end
42
52
 
43
53
  it "calls index file when requesting root in the given folder" do
44
54
  res = @static_request.get("/")
45
- res.should.be.ok
46
- res.body.should =~ /index!/
55
+ res.must_be :ok?
56
+ res.body.must_match(/index!/)
47
57
 
48
58
  res = @static_request.get("/other/")
49
- res.should.be.not_found
59
+ res.must_be :not_found?
50
60
 
51
61
  res = @static_request.get("/another/")
52
- res.should.be.ok
53
- res.body.should =~ /another index!/
62
+ res.must_be :ok?
63
+ res.body.must_match(/another index!/)
54
64
  end
55
65
 
56
66
  it "doesn't call index file if :index option was omitted" do
57
67
  res = @request.get("/")
58
- res.body.should == "Hello World"
68
+ res.body.must_equal "Hello World"
59
69
  end
60
70
 
61
71
  it "serves hidden files" do
62
72
  res = @hash_request.get("/cgi/sekret")
63
- res.should.be.ok
64
- res.body.should =~ /ruby/
73
+ res.must_be :ok?
74
+ res.body.must_match(/ruby/)
65
75
  end
66
76
 
67
77
  it "calls down the chain if the URI is not specified" do
68
78
  res = @hash_request.get("/something/else")
69
- res.should.be.ok
70
- res.body.should == "Hello World"
79
+ res.must_be :ok?
80
+ res.body.must_equal "Hello World"
81
+ end
82
+
83
+ it "allows the root URI to be configured via hash options" do
84
+ res = @hash_root_request.get("/")
85
+ res.must_be :ok?
86
+ res.body.must_match(/foo.html!/)
87
+ end
88
+
89
+ it "serves gzipped files if client accepts gzip encoding and gzip files are present" do
90
+ res = @gzip_request.get("/cgi/test", 'HTTP_ACCEPT_ENCODING'=>'deflate, gzip')
91
+ res.must_be :ok?
92
+ res.headers['Content-Encoding'].must_equal 'gzip'
93
+ res.headers['Content-Type'].must_equal 'text/plain'
94
+ Zlib::GzipReader.wrap(StringIO.new(res.body), &:read).must_match(/ruby/)
95
+ end
96
+
97
+ it "serves regular files if client accepts gzip encoding and gzip files are not present" do
98
+ res = @gzip_request.get("/cgi/rackup_stub.rb", 'HTTP_ACCEPT_ENCODING'=>'deflate, gzip')
99
+ res.must_be :ok?
100
+ res.headers['Content-Encoding'].must_equal nil
101
+ res.headers['Content-Type'].must_equal 'text/x-script.ruby'
102
+ res.body.must_match(/ruby/)
103
+ end
104
+
105
+ it "serves regular files if client does not accept gzip encoding" do
106
+ res = @gzip_request.get("/cgi/test")
107
+ res.must_be :ok?
108
+ res.headers['Content-Encoding'].must_equal nil
109
+ res.headers['Content-Type'].must_equal 'text/plain'
110
+ res.body.must_match(/ruby/)
71
111
  end
72
112
 
73
113
  it "supports serving fixed cache-control (legacy option)" do
74
114
  opts = OPTIONS.merge(:cache_control => 'public')
75
115
  request = Rack::MockRequest.new(static(DummyApp.new, opts))
76
116
  res = request.get("/cgi/test")
77
- res.should.be.ok
78
- res.headers['Cache-Control'].should == 'public'
117
+ res.must_be :ok?
118
+ res.headers['Cache-Control'].must_equal 'public'
79
119
  end
80
120
 
81
121
  HEADER_OPTIONS = {:urls => ["/cgi"], :root => root, :header_rules => [
@@ -86,47 +126,46 @@ describe Rack::Static do
86
126
  ['cgi/assets/javascripts', {'Cache-Control' => 'public, max-age=500'}],
87
127
  [/\.(css|erb)\z/, {'Cache-Control' => 'public, max-age=600'}]
88
128
  ]}
89
- @header_request = Rack::MockRequest.new(static(DummyApp.new, HEADER_OPTIONS))
90
129
 
91
130
  it "supports header rule :all" do
92
131
  # Headers for all files via :all shortcut
93
132
  res = @header_request.get('/cgi/assets/index.html')
94
- res.should.be.ok
95
- res.headers['Cache-Control'].should == 'public, max-age=100'
133
+ res.must_be :ok?
134
+ res.headers['Cache-Control'].must_equal 'public, max-age=100'
96
135
  end
97
136
 
98
137
  it "supports header rule :fonts" do
99
138
  # Headers for web fonts via :fonts shortcut
100
139
  res = @header_request.get('/cgi/assets/fonts/font.eot')
101
- res.should.be.ok
102
- res.headers['Cache-Control'].should == 'public, max-age=200'
140
+ res.must_be :ok?
141
+ res.headers['Cache-Control'].must_equal 'public, max-age=200'
103
142
  end
104
143
 
105
144
  it "supports file extension header rules provided as an Array" do
106
145
  # Headers for file extensions via array
107
146
  res = @header_request.get('/cgi/assets/images/image.png')
108
- res.should.be.ok
109
- res.headers['Cache-Control'].should == 'public, max-age=300'
147
+ res.must_be :ok?
148
+ res.headers['Cache-Control'].must_equal 'public, max-age=300'
110
149
  end
111
150
 
112
151
  it "supports folder rules provided as a String" do
113
152
  # Headers for files in folder via string
114
153
  res = @header_request.get('/cgi/assets/folder/test.js')
115
- res.should.be.ok
116
- res.headers['Cache-Control'].should == 'public, max-age=400'
154
+ res.must_be :ok?
155
+ res.headers['Cache-Control'].must_equal 'public, max-age=400'
117
156
  end
118
157
 
119
158
  it "supports folder header rules provided as a String not starting with a slash" do
120
159
  res = @header_request.get('/cgi/assets/javascripts/app.js')
121
- res.should.be.ok
122
- res.headers['Cache-Control'].should == 'public, max-age=500'
160
+ res.must_be :ok?
161
+ res.headers['Cache-Control'].must_equal 'public, max-age=500'
123
162
  end
124
163
 
125
164
  it "supports flexible header rules provided as Regexp" do
126
165
  # Flexible Headers via Regexp
127
166
  res = @header_request.get('/cgi/assets/stylesheets/app.css')
128
- res.should.be.ok
129
- res.headers['Cache-Control'].should == 'public, max-age=600'
167
+ res.must_be :ok?
168
+ res.headers['Cache-Control'].must_equal 'public, max-age=600'
130
169
  end
131
170
 
132
171
  it "prioritizes header rules over fixed cache-control setting (legacy option)" do
@@ -138,8 +177,8 @@ describe Rack::Static do
138
177
 
139
178
  request = Rack::MockRequest.new(static(DummyApp.new, opts))
140
179
  res = request.get("/cgi/test")
141
- res.should.be.ok
142
- res.headers['Cache-Control'].should == 'public, max-age=42'
180
+ res.must_be :ok?
181
+ res.headers['Cache-Control'].must_equal 'public, max-age=42'
143
182
  end
144
183
 
145
184
  end
@@ -1,3 +1,4 @@
1
+ require 'minitest/autorun'
1
2
  require 'rack/tempfile_reaper'
2
3
  require 'rack/lint'
3
4
  require 'rack/mock'
@@ -23,33 +24,33 @@ describe Rack::TempfileReaper do
23
24
  Rack::Lint.new(Rack::TempfileReaper.new(app)).call(@env)
24
25
  end
25
26
 
26
- should 'do nothing (i.e. not bomb out) without env[rack.tempfiles]' do
27
+ it 'do nothing (i.e. not bomb out) without env[rack.tempfiles]' do
27
28
  app = lambda { |_| [200, {}, ['Hello, World!']] }
28
29
  response = call(app)
29
30
  response[2].close
30
- response[0].should.equal(200)
31
+ response[0].must_equal 200
31
32
  end
32
33
 
33
- should 'close env[rack.tempfiles] when body is closed' do
34
+ it 'close env[rack.tempfiles] when body is closed' do
34
35
  tempfile1, tempfile2 = MockTempfile.new, MockTempfile.new
35
36
  @env['rack.tempfiles'] = [ tempfile1, tempfile2 ]
36
37
  app = lambda { |_| [200, {}, ['Hello, World!']] }
37
38
  call(app)[2].close
38
- tempfile1.closed.should.equal true
39
- tempfile2.closed.should.equal true
39
+ tempfile1.closed.must_equal true
40
+ tempfile2.closed.must_equal true
40
41
  end
41
42
 
42
- should 'initialize env[rack.tempfiles] when not already present' do
43
+ it 'initialize env[rack.tempfiles] when not already present' do
43
44
  tempfile = MockTempfile.new
44
45
  app = lambda do |env|
45
46
  env['rack.tempfiles'] << tempfile
46
47
  [200, {}, ['Hello, World!']]
47
48
  end
48
49
  call(app)[2].close
49
- tempfile.closed.should.equal true
50
+ tempfile.closed.must_equal true
50
51
  end
51
52
 
52
- should 'append env[rack.tempfiles] when already present' do
53
+ it 'append env[rack.tempfiles] when already present' do
53
54
  tempfile1, tempfile2 = MockTempfile.new, MockTempfile.new
54
55
  @env['rack.tempfiles'] = [ tempfile1 ]
55
56
  app = lambda do |env|
@@ -57,7 +58,7 @@ describe Rack::TempfileReaper do
57
58
  [200, {}, ['Hello, World!']]
58
59
  end
59
60
  call(app)[2].close
60
- tempfile1.closed.should.equal true
61
- tempfile2.closed.should.equal true
61
+ tempfile1.closed.must_equal true
62
+ tempfile2.closed.must_equal true
62
63
  end
63
64
  end