rack-test 0.6.3 → 1.0.0

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.
@@ -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: []