rack-test 0.6.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ module Rack
2
+ module Test
3
+ VERSION = '1.0.0'.freeze
4
+ end
5
+ end
data/lib/rack/test.rb CHANGED
@@ -1,18 +1,17 @@
1
- require "uri"
2
- require "rack"
3
- require "rack/mock_session"
4
- require "rack/test/cookie_jar"
5
- require "rack/test/mock_digest_request"
6
- require "rack/test/utils"
7
- require "rack/test/methods"
8
- require "rack/test/uploaded_file"
1
+ require 'uri'
2
+ require 'rack'
3
+ require 'rack/mock_session'
4
+ require 'rack/test/cookie_jar'
5
+ require 'rack/test/mock_digest_request'
6
+ require 'rack/test/utils'
7
+ require 'rack/test/methods'
8
+ require 'rack/test/uploaded_file'
9
+ require 'rack/test/version'
9
10
 
10
11
  module Rack
11
12
  module Test
12
- VERSION = "0.6.3"
13
-
14
- DEFAULT_HOST = "example.org"
15
- MULTIPART_BOUNDARY = "----------XnJLe9ZIbbGUYtzPQJ16u1"
13
+ DEFAULT_HOST = 'example.org'.freeze
14
+ MULTIPART_BOUNDARY = '----------XnJLe9ZIbbGUYtzPQJ16u1'.freeze
16
15
 
17
16
  # The common base class for exceptions raised by Rack::Test
18
17
  class Error < StandardError; end
@@ -36,11 +35,13 @@ module Rack
36
35
  def initialize(mock_session)
37
36
  @headers = {}
38
37
  @env = {}
38
+ @digest_username = nil
39
+ @digest_password = nil
39
40
 
40
- if mock_session.is_a?(MockSession)
41
- @rack_mock_session = mock_session
41
+ @rack_mock_session = if mock_session.is_a?(MockSession)
42
+ mock_session
42
43
  else
43
- @rack_mock_session = MockSession.new(mock_session)
44
+ MockSession.new(mock_session)
44
45
  end
45
46
 
46
47
  @default_host = @rack_mock_session.default_host
@@ -54,8 +55,7 @@ module Rack
54
55
  # Example:
55
56
  # get "/"
56
57
  def get(uri, params = {}, env = {}, &block)
57
- env = env_for(uri, env.merge(:method => "GET", :params => params))
58
- process_request(uri, env, &block)
58
+ custom_request('GET', uri, params, env, &block)
59
59
  end
60
60
 
61
61
  # Issue a POST request for the given URI. See #get
@@ -63,8 +63,7 @@ module Rack
63
63
  # Example:
64
64
  # post "/signup", "name" => "Bryan"
65
65
  def post(uri, params = {}, env = {}, &block)
66
- env = env_for(uri, env.merge(:method => "POST", :params => params))
67
- process_request(uri, env, &block)
66
+ custom_request('POST', uri, params, env, &block)
68
67
  end
69
68
 
70
69
  # Issue a PUT request for the given URI. See #get
@@ -72,8 +71,7 @@ module Rack
72
71
  # Example:
73
72
  # put "/"
74
73
  def put(uri, params = {}, env = {}, &block)
75
- env = env_for(uri, env.merge(:method => "PUT", :params => params))
76
- process_request(uri, env, &block)
74
+ custom_request('PUT', uri, params, env, &block)
77
75
  end
78
76
 
79
77
  # Issue a PATCH request for the given URI. See #get
@@ -81,8 +79,7 @@ module Rack
81
79
  # Example:
82
80
  # patch "/"
83
81
  def patch(uri, params = {}, env = {}, &block)
84
- env = env_for(uri, env.merge(:method => "PATCH", :params => params))
85
- process_request(uri, env, &block)
82
+ custom_request('PATCH', uri, params, env, &block)
86
83
  end
87
84
 
88
85
  # Issue a DELETE request for the given URI. See #get
@@ -90,8 +87,7 @@ module Rack
90
87
  # Example:
91
88
  # delete "/"
92
89
  def delete(uri, params = {}, env = {}, &block)
93
- env = env_for(uri, env.merge(:method => "DELETE", :params => params))
94
- process_request(uri, env, &block)
90
+ custom_request('DELETE', uri, params, env, &block)
95
91
  end
96
92
 
97
93
  # Issue an OPTIONS request for the given URI. See #get
@@ -99,8 +95,7 @@ module Rack
99
95
  # Example:
100
96
  # options "/"
101
97
  def options(uri, params = {}, env = {}, &block)
102
- env = env_for(uri, env.merge(:method => "OPTIONS", :params => params))
103
- process_request(uri, env, &block)
98
+ custom_request('OPTIONS', uri, params, env, &block)
104
99
  end
105
100
 
106
101
  # Issue a HEAD request for the given URI. See #get
@@ -108,8 +103,7 @@ module Rack
108
103
  # Example:
109
104
  # head "/"
110
105
  def head(uri, params = {}, env = {}, &block)
111
- env = env_for(uri, env.merge(:method => "HEAD", :params => params))
112
- process_request(uri, env, &block)
106
+ custom_request('HEAD', uri, params, env, &block)
113
107
  end
114
108
 
115
109
  # Issue a request to the Rack app for the given URI and optional Rack
@@ -120,10 +114,21 @@ module Rack
120
114
  # Example:
121
115
  # request "/"
122
116
  def request(uri, env = {}, &block)
117
+ uri = parse_uri(uri, env)
123
118
  env = env_for(uri, env)
124
119
  process_request(uri, env, &block)
125
120
  end
126
121
 
122
+ # Issue a request using the given verb for the given URI. See #get
123
+ #
124
+ # Example:
125
+ # custom_request "LINK", "/"
126
+ def custom_request(verb, uri, params = {}, env = {}, &block)
127
+ uri = parse_uri(uri, env)
128
+ env = env_for(uri, env.merge(method: verb.to_s.upcase, params: params))
129
+ process_request(uri, env, &block)
130
+ end
131
+
127
132
  # Set a header to be included on all subsequent requests through the
128
133
  # session. Use a value of nil to remove a previously configured header.
129
134
  #
@@ -159,11 +164,11 @@ module Rack
159
164
  # Example:
160
165
  # basic_authorize "bryan", "secret"
161
166
  def basic_authorize(username, password)
162
- encoded_login = ["#{username}:#{password}"].pack("m*")
167
+ encoded_login = ["#{username}:#{password}"].pack('m0')
163
168
  header('Authorization', "Basic #{encoded_login}")
164
169
  end
165
170
 
166
- alias_method :authorize, :basic_authorize
171
+ alias authorize basic_authorize
167
172
 
168
173
  # Set the username and password for HTTP Digest authorization, to be
169
174
  # included in subsequent requests in the HTTP_AUTHORIZATION header.
@@ -181,73 +186,81 @@ module Rack
181
186
  # a redirect, an error will be raised.
182
187
  def follow_redirect!
183
188
  unless last_response.redirect?
184
- raise Error.new("Last response was not a redirect. Cannot follow_redirect!")
189
+ raise Error, 'Last response was not a redirect. Cannot follow_redirect!'
185
190
  end
186
-
187
- get(last_response["Location"], {}, { "HTTP_REFERER" => last_request.url })
191
+ request_method, params =
192
+ if last_response.status == 307
193
+ [last_request.request_method.downcase.to_sym, last_request.params]
194
+ else
195
+ [:get, {}]
196
+ end
197
+ send(
198
+ request_method, last_response['Location'], params,
199
+ 'HTTP_REFERER' => last_request.url,
200
+ 'rack.session' => last_request.session
201
+ )
188
202
  end
189
203
 
190
- private
204
+ private
191
205
 
192
- def env_for(path, env)
193
- uri = URI.parse(path)
194
- uri.path = "/#{uri.path}" unless uri.path[0] == ?/
195
- uri.host ||= @default_host
206
+ def parse_uri(path, env)
207
+ URI.parse(path).tap do |uri|
208
+ uri.path = "/#{uri.path}" unless uri.path[0] == '/'
209
+ uri.host ||= @default_host
210
+ uri.scheme ||= 'https' if env['HTTPS'] == 'on'
211
+ end
212
+ end
196
213
 
214
+ def env_for(uri, env)
197
215
  env = default_env.merge(env)
198
216
 
199
- env["HTTP_HOST"] ||= [uri.host, (uri.port if uri.port != uri.default_port)].compact.join(":")
217
+ env['HTTP_HOST'] ||= [uri.host, (uri.port if uri.port != uri.default_port)].compact.join(':')
200
218
 
201
- env.update("HTTPS" => "on") if URI::HTTPS === uri
202
- env["HTTP_X_REQUESTED_WITH"] = "XMLHttpRequest" if env[:xhr]
219
+ env.update('HTTPS' => 'on') if URI::HTTPS === uri
220
+ env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest' if env[:xhr]
203
221
 
204
222
  # TODO: Remove this after Rack 1.1 has been released.
205
223
  # Stringifying and upcasing methods has be commit upstream
206
- env["REQUEST_METHOD"] ||= env[:method] ? env[:method].to_s.upcase : "GET"
224
+ env['REQUEST_METHOD'] ||= env[:method] ? env[:method].to_s.upcase : 'GET'
225
+
226
+ params = env.delete(:params) do {} end
207
227
 
208
- if env["REQUEST_METHOD"] == "GET"
228
+ if env['REQUEST_METHOD'] == 'GET'
209
229
  # merge :params with the query string
210
- if params = env[:params]
230
+ if params
211
231
  params = parse_nested_query(params) if params.is_a?(String)
212
- params.update(parse_nested_query(uri.query))
213
- uri.query = build_nested_query(params)
232
+
233
+ uri.query = [uri.query, build_nested_query(params)].compact.reject { |v| v == '' }.join('&')
214
234
  end
215
- elsif !env.has_key?(:input)
216
- env["CONTENT_TYPE"] ||= "application/x-www-form-urlencoded"
235
+ elsif !env.key?(:input)
236
+ env['CONTENT_TYPE'] ||= 'application/x-www-form-urlencoded'
217
237
 
218
- if env[:params].is_a?(Hash)
219
- if data = build_multipart(env[:params])
238
+ if params.is_a?(Hash)
239
+ if data = build_multipart(params)
220
240
  env[:input] = data
221
- env["CONTENT_LENGTH"] ||= data.length.to_s
222
- env["CONTENT_TYPE"] = "multipart/form-data; boundary=#{MULTIPART_BOUNDARY}"
241
+ env['CONTENT_LENGTH'] ||= data.length.to_s
242
+ env['CONTENT_TYPE'] = "multipart/form-data; boundary=#{MULTIPART_BOUNDARY}"
223
243
  else
224
- env[:input] = params_to_string(env[:params])
244
+ # NB: We do not need to set CONTENT_LENGTH here;
245
+ # Rack::ContentLength will determine it automatically.
246
+ env[:input] = params_to_string(params)
225
247
  end
226
248
  else
227
- env[:input] = env[:params]
249
+ env[:input] = params
228
250
  end
229
251
  end
230
252
 
231
- env.delete(:params)
232
-
233
- if env.has_key?(:cookie)
234
- set_cookie(env.delete(:cookie), uri)
235
- end
253
+ set_cookie(env.delete(:cookie), uri) if env.key?(:cookie)
236
254
 
237
255
  Rack::MockRequest.env_for(uri.to_s, env)
238
256
  end
239
257
 
240
258
  def process_request(uri, env)
241
- uri = URI.parse(uri)
242
- uri.host ||= @default_host
243
-
244
259
  @rack_mock_session.request(uri, env)
245
260
 
246
261
  if retry_with_digest_auth?(env)
247
- auth_env = env.merge({
248
- "HTTP_AUTHORIZATION" => digest_auth_header,
249
- "rack-test.digest_auth_retry" => true
250
- })
262
+ auth_env = env.merge('HTTP_AUTHORIZATION' => digest_auth_header,
263
+ 'rack-test.digest_auth_retry' => true)
251
264
  auth_env.delete('rack.request')
252
265
  process_request(uri.path, auth_env)
253
266
  else
@@ -258,26 +271,24 @@ module Rack
258
271
  end
259
272
 
260
273
  def digest_auth_header
261
- challenge = last_response["WWW-Authenticate"].split(" ", 2).last
274
+ challenge = last_response['WWW-Authenticate'].split(' ', 2).last
262
275
  params = Rack::Auth::Digest::Params.parse(challenge)
263
276
 
264
- params.merge!({
265
- "username" => @digest_username,
266
- "nc" => "00000001",
267
- "cnonce" => "nonsensenonce",
268
- "uri" => last_request.fullpath,
269
- "method" => last_request.env["REQUEST_METHOD"],
270
- })
277
+ params.merge!('username' => @digest_username,
278
+ 'nc' => '00000001',
279
+ 'cnonce' => 'nonsensenonce',
280
+ 'uri' => last_request.fullpath,
281
+ 'method' => last_request.env['REQUEST_METHOD'])
271
282
 
272
- params["response"] = MockDigestRequest.new(params).response(@digest_password)
283
+ params['response'] = MockDigestRequest.new(params).response(@digest_password)
273
284
 
274
285
  "Digest #{params}"
275
286
  end
276
287
 
277
288
  def retry_with_digest_auth?(env)
278
289
  last_response.status == 401 &&
279
- digest_auth_configured? &&
280
- !env["rack-test.digest_auth_retry"]
290
+ digest_auth_configured? &&
291
+ !env['rack-test.digest_auth_retry']
281
292
  end
282
293
 
283
294
  def digest_auth_configured?
@@ -285,15 +296,15 @@ module Rack
285
296
  end
286
297
 
287
298
  def default_env
288
- { "rack.test" => true, "REMOTE_ADDR" => "127.0.0.1" }.merge(@env).merge(headers_for_env)
299
+ { 'rack.test' => true, 'REMOTE_ADDR' => '127.0.0.1' }.merge(@env).merge(headers_for_env)
289
300
  end
290
301
 
291
302
  def headers_for_env
292
303
  converted_headers = {}
293
304
 
294
305
  @headers.each do |name, value|
295
- env_key = name.upcase.gsub("-", "_")
296
- env_key = "HTTP_" + env_key unless "CONTENT_TYPE" == env_key
306
+ env_key = name.upcase.tr('-', '_')
307
+ env_key = 'HTTP_' + env_key unless env_key == 'CONTENT_TYPE'
297
308
  converted_headers[env_key] = value
298
309
  end
299
310
 
@@ -303,16 +314,14 @@ module Rack
303
314
  def params_to_string(params)
304
315
  case params
305
316
  when Hash then build_nested_query(params)
306
- when nil then ""
317
+ when nil then ''
307
318
  else params
308
319
  end
309
320
  end
310
-
311
321
  end
312
322
 
313
323
  def self.encoding_aware_strings?
314
- defined?(Encoding) && "".respond_to?(:encode)
324
+ defined?(Encoding) && ''.respond_to?(:encode)
315
325
  end
316
-
317
326
  end
318
327
  end
metadata CHANGED
@@ -1,56 +1,158 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-test
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Bryan Helmkamp
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2015-01-09 00:00:00.000000000 Z
11
+ date: 2018-03-27 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rack
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3'
22
23
  type: :runtime
23
24
  prerelease: false
24
25
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - ">="
28
28
  - !ruby/object:Gem::Version
29
29
  version: '1.0'
30
- description: ! 'Rack::Test is a small, simple testing API for Rack apps. It can be
31
- used on its
32
-
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '12.0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '12.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.6'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.6'
61
+ - !ruby/object:Gem::Dependency
62
+ name: sinatra
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '1.0'
68
+ - - "<"
69
+ - !ruby/object:Gem::Version
70
+ version: '3'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '1.0'
78
+ - - "<"
79
+ - !ruby/object:Gem::Version
80
+ version: '3'
81
+ - !ruby/object:Gem::Dependency
82
+ name: rdoc
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '5.1'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '5.1'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rubocop
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0.49'
102
+ - - "<"
103
+ - !ruby/object:Gem::Version
104
+ version: '0.50'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0.49'
112
+ - - "<"
113
+ - !ruby/object:Gem::Version
114
+ version: '0.50'
115
+ - !ruby/object:Gem::Dependency
116
+ name: codeclimate-test-reporter
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '0.6'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '0.6'
129
+ - !ruby/object:Gem::Dependency
130
+ name: thor
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '0.19'
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '0.19'
143
+ description: |-
144
+ Rack::Test is a small, simple testing API for Rack apps. It can be used on its
33
145
  own or as a reusable starting point for Web frameworks and testing libraries
34
-
35
- to build on. Most of its initial functionality is an extraction of Merb 1.0''s
36
-
37
- request helpers feature.'
146
+ to build on. Most of its initial functionality is an extraction of Merb 1.0's
147
+ request helpers feature.
38
148
  email: bryan@brynary.com
39
149
  executables: []
40
150
  extensions: []
41
- extra_rdoc_files:
42
- - README.rdoc
43
- - MIT-LICENSE.txt
151
+ extra_rdoc_files: []
44
152
  files:
45
- - .document
46
- - .gitignore
47
- - Gemfile
48
- - Gemfile.lock
49
- - History.txt
153
+ - History.md
50
154
  - MIT-LICENSE.txt
51
- - README.rdoc
52
- - Rakefile
53
- - Thorfile
155
+ - README.md
54
156
  - lib/rack/mock_session.rb
55
157
  - lib/rack/test.rb
56
158
  - lib/rack/test/cookie_jar.rb
@@ -58,52 +160,29 @@ files:
58
160
  - lib/rack/test/mock_digest_request.rb
59
161
  - lib/rack/test/uploaded_file.rb
60
162
  - lib/rack/test/utils.rb
61
- - rack-test.gemspec
62
- - spec/fixtures/bar.txt
63
- - spec/fixtures/config.ru
64
- - spec/fixtures/fake_app.rb
65
- - spec/fixtures/foo.txt
66
- - spec/rack/test/cookie_spec.rb
67
- - spec/rack/test/digest_auth_spec.rb
68
- - spec/rack/test/multipart_spec.rb
69
- - spec/rack/test/uploaded_file_spec.rb
70
- - spec/rack/test/utils_spec.rb
71
- - spec/rack/test_spec.rb
72
- - spec/spec_helper.rb
73
- - spec/support/matchers/body.rb
74
- - spec/support/matchers/challenge.rb
75
- homepage: http://github.com/brynary/rack-test
76
- licenses: []
163
+ - lib/rack/test/version.rb
164
+ homepage: http://github.com/rack-test/rack-test
165
+ licenses:
166
+ - MIT
167
+ metadata: {}
77
168
  post_install_message:
78
169
  rdoc_options: []
79
170
  require_paths:
80
171
  - lib
81
172
  required_ruby_version: !ruby/object:Gem::Requirement
82
- none: false
83
173
  requirements:
84
- - - ! '>='
174
+ - - ">="
85
175
  - !ruby/object:Gem::Version
86
- version: '0'
176
+ version: 2.2.2
87
177
  required_rubygems_version: !ruby/object:Gem::Requirement
88
- none: false
89
178
  requirements:
90
- - - ! '>='
179
+ - - ">="
91
180
  - !ruby/object:Gem::Version
92
181
  version: '0'
93
182
  requirements: []
94
- rubyforge_project: rack-test
95
- rubygems_version: 1.8.23.2
183
+ rubyforge_project:
184
+ rubygems_version: 2.7.6
96
185
  signing_key:
97
- specification_version: 3
186
+ specification_version: 4
98
187
  summary: Simple testing API built on Rack
99
- test_files:
100
- - spec/fixtures/fake_app.rb
101
- - spec/rack/test/cookie_spec.rb
102
- - spec/rack/test/digest_auth_spec.rb
103
- - spec/rack/test/multipart_spec.rb
104
- - spec/rack/test/uploaded_file_spec.rb
105
- - spec/rack/test/utils_spec.rb
106
- - spec/rack/test_spec.rb
107
- - spec/spec_helper.rb
108
- - spec/support/matchers/body.rb
109
- - spec/support/matchers/challenge.rb
188
+ test_files: []