rack-test 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9c4264ddd984ab1b662efcc68423ca74bc65927f4751cc8ac68a0f1cfe94375c
4
- data.tar.gz: 7f4af2a9203533fae754b99db4e577cae6be7170fab447a238a2f266a8183e1b
3
+ metadata.gz: 98bb9656717c512790c5f65b20a8f0cfc7c2f14e4d9d98d5069e6e5910b256e5
4
+ data.tar.gz: 6305cac1636eef820a082a1431cef2bc24b445b1f902b65c550f976ba84f08e6
5
5
  SHA512:
6
- metadata.gz: 7b4986db539c73a5776e15941a7393b14ebb31afe79068756c2b561211907e013b66a1a7a9980864431b029b71ec0c8180e2dbfe7b4942987ca6d59f01877cb5
7
- data.tar.gz: f1c7d0733a7ed4d64e0a9ad51c753485c0472233667181c6fbf2ba09be40936de9a411558be90a49ef9aa5e4804c44dfc3d5c90deda05a22286916e6c7d16e90
6
+ metadata.gz: 420e60a08ec2fa5fd92a358d28c0b17e0a943eb30962756360185091753bdd4eb55b7b58005aa84bb1907cfb7e8129166d1aed6282596f45b8b0f42dd1003306
7
+ data.tar.gz: b7446d71bf41a0f69b9812e867f7b472488ee0534d6206435b77e8266617486687044a814dd6c085003b823e0e349c83b1ca47ea296f1f23346957d66cbed0bc
data/History.md CHANGED
@@ -1,3 +1,29 @@
1
+ ## 2.1.0 / 2023-03-14
2
+
3
+ * Breaking changes:
4
+ * Digest authentication support, deprecated in 2.0.0, has been
5
+ removed (Jeremy Evans #307)
6
+ * requiring rack/mock_session, deprecated in 2.0.0, has been removed
7
+ (Jeremy Evans #307)
8
+
9
+ * Minor enhancements:
10
+ * The `original_filename` for `Rack::Test::UploadedFile` can now be
11
+ set even if the content of the file comes from a file path
12
+ (Stuart Chinery #314)
13
+ * Add `Rack::Test::Session#restore_state`, for executing a block
14
+ and restoring current state (last request, last response, and
15
+ cookies) after the block (Jeremy Evans #316)
16
+ * Make `Rack::Test::Methods` support `default_host` method similar to
17
+ `app`, which will set the default host used for requests to the app
18
+ (Jeremy Evans #317 #318)
19
+ * Allow responses to set cookie paths not matching the current
20
+ request URI. Such cookies will only be sent for paths matching
21
+ the cookie path (Chris Waters #322)
22
+ * Ignore leading dot for cookie domains, per RFC 6265 (Stephen Crosby
23
+ #329)
24
+ * Avoid creating empty multipart body if params is empty in
25
+ `Rack::Test::Session#env_for` (Ryunosuke Sato #331)
26
+
1
27
  ## 2.0.2 / 2022-06-28
2
28
 
3
29
  * Bug fixes:
data/README.md CHANGED
@@ -41,7 +41,7 @@ class HomepageTest < Test::Unit::TestCase
41
41
  get '/'
42
42
 
43
43
  assert last_response.ok?
44
- assert_equal last_response.body, 'All responses are OK'
44
+ assert_equal 'All responses are OK', last_response.body
45
45
  end
46
46
 
47
47
  def delete_with_url_params_and_body
@@ -30,8 +30,9 @@ module Rack
30
30
  @name, @value = parse_query(@raw, ';').to_a.first
31
31
  @options = parse_query(options, ';')
32
32
 
33
- if @options['domain']
33
+ if domain = @options['domain']
34
34
  @exact_domain_match = false
35
+ domain[0] = '' if domain[0] == '.'
35
36
  else
36
37
  # If the domain attribute is not present in the cookie,
37
38
  # the domain must match exactly.
@@ -94,13 +95,12 @@ module Rack
94
95
 
95
96
  real_domain = domain =~ /^\./ ? domain[1..-1] : domain
96
97
  !!((!secure? || (secure? && uri.scheme == 'https')) &&
97
- uri.host =~ Regexp.new("#{'^' if @exact_domain_match}#{Regexp.escape(real_domain)}$", Regexp::IGNORECASE) &&
98
- uri.path =~ Regexp.new("^#{Regexp.escape(path)}"))
98
+ uri.host =~ Regexp.new("#{'^' if @exact_domain_match}#{Regexp.escape(real_domain)}$", Regexp::IGNORECASE))
99
99
  end
100
100
 
101
101
  # Cookies that do not match the URI will not be sent in requests to the URI.
102
102
  def matches?(uri)
103
- !expired? && valid?(uri)
103
+ !expired? && valid?(uri) && uri.path.start_with?(path)
104
104
  end
105
105
 
106
106
  # Order cookies by name, path, and domain.
@@ -138,6 +138,12 @@ module Rack
138
138
  @cookies = cookies.sort!
139
139
  end
140
140
 
141
+ # Ensure the copy uses a distinct cookies array.
142
+ def initialize_copy(other)
143
+ super
144
+ @cookies = @cookies.dup
145
+ end
146
+
141
147
  # Return the value for first cookie with the given name, or nil
142
148
  # if no such cookie exists.
143
149
  def [](name)
@@ -42,7 +42,11 @@ module Rack
42
42
  # Backwards compatibility for capybara
43
43
  build_rack_mock_session
44
44
  else
45
- Session.new(app)
45
+ if respond_to?(:default_host)
46
+ Session.new(app, default_host)
47
+ else
48
+ Session.new(app)
49
+ end
46
50
  end
47
51
  end
48
52
 
@@ -61,11 +65,6 @@ module Rack
61
65
  @_rack_test_current_session = session
62
66
  end
63
67
 
64
- def digest_authorize(username, password) # :nodoc:
65
- warn 'digest authentication support will be removed in rack-test 2.1', uplevel: 1
66
- current_session._digest_authorize(username, password)
67
- end
68
-
69
68
  def_delegators(:current_session,
70
69
  :request,
71
70
  :get,
@@ -27,16 +27,18 @@ module Rack
27
27
  # content :: is a path to a file, or an {IO} or {StringIO} object representing the content.
28
28
  # content_type :: MIME type of the file
29
29
  # binary :: Whether the file should be set to binmode (content treated as binary).
30
- # original_filename :: The filename to use for the file if +content+ is a StringIO.
30
+ # original_filename :: The filename to use for the file. Required if content is StringIO, optional override if not
31
31
  def initialize(content, content_type = 'text/plain', binary = false, original_filename: nil)
32
+ @content_type = content_type
33
+ @original_filename = original_filename
34
+
32
35
  case content
33
36
  when StringIO
34
- initialize_from_stringio(content, original_filename)
37
+ initialize_from_stringio(content)
35
38
  else
36
39
  initialize_from_file_path(content)
37
40
  end
38
41
 
39
- @content_type = content_type
40
42
  @tempfile.binmode if binary
41
43
  end
42
44
 
@@ -85,16 +87,18 @@ module Rack
85
87
  private
86
88
 
87
89
  # Use the StringIO as the tempfile.
88
- def initialize_from_stringio(stringio, original_filename)
90
+ def initialize_from_stringio(stringio)
91
+ raise(ArgumentError, 'Missing `original_filename` for StringIO object') unless @original_filename
92
+
89
93
  @tempfile = stringio
90
- @original_filename = original_filename || raise(ArgumentError, 'Missing `original_filename` for StringIO object')
91
94
  end
92
95
 
93
- # Create a tempfile and copy the content from the given path into the tempfile.
96
+ # Create a tempfile and copy the content from the given path into the tempfile, optionally renaming if
97
+ # original_filename has been set.
94
98
  def initialize_from_file_path(path)
95
99
  raise "#{path} file does not exist" unless ::File.exist?(path)
96
100
 
97
- @original_filename = ::File.basename(path)
101
+ @original_filename ||= ::File.basename(path)
98
102
  extension = ::File.extname(@original_filename)
99
103
 
100
104
  @tempfile = Tempfile.new([::File.basename(@original_filename, extension), extension])
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  module Test
3
- VERSION = '2.0.2'.freeze
3
+ VERSION = '2.1.0'.freeze
4
4
  end
5
5
  end
data/lib/rack/test.rb CHANGED
@@ -98,8 +98,6 @@ module Rack
98
98
  # If a block is given, #last_response is also yielded to the block.
99
99
  def initialize(app, default_host = DEFAULT_HOST)
100
100
  @env = {}
101
- @digest_username = nil
102
- @digest_password = nil
103
101
  @app = app
104
102
  @after_request = []
105
103
  @default_host = default_host
@@ -204,21 +202,6 @@ module Rack
204
202
 
205
203
  alias authorize basic_authorize
206
204
 
207
- # Set the username and password for HTTP Digest authorization, to be
208
- # included in subsequent requests in the HTTP_AUTHORIZATION header.
209
- # This method is deprecated and will be removed in rack-test 2.1
210
- #
211
- # Example:
212
- # digest_authorize "bryan", "secret"
213
- def digest_authorize(username, password)
214
- warn 'digest authentication support will be removed in rack-test 2.1', uplevel: 1
215
- _digest_authorize(username, password)
216
- end
217
- def _digest_authorize(username, password) # :nodoc:
218
- @digest_username = username
219
- @digest_password = password
220
- end
221
-
222
205
  # Rack::Test will not follow any redirects automatically. This method
223
206
  # will follow the redirect returned (including setting the Referer header
224
207
  # on the new request) in the last response. If the last response was not
@@ -251,6 +234,25 @@ module Rack
251
234
  )
252
235
  end
253
236
 
237
+ # Yield to the block, and restore the last request, last response, and
238
+ # cookie jar to the state they were prior to block execution upon
239
+ # exiting the block.
240
+ def restore_state
241
+ request = @last_request
242
+ response = @last_response
243
+ cookie_jar = @cookie_jar.dup
244
+ after_request = @after_request.dup
245
+
246
+ begin
247
+ yield
248
+ ensure
249
+ @last_request = request
250
+ @last_response = response
251
+ @cookie_jar = cookie_jar
252
+ @after_request = after_request
253
+ end
254
+ end
255
+
254
256
  private
255
257
 
256
258
  # :nocov:
@@ -310,7 +312,7 @@ module Rack
310
312
  multipart = env.has_key?(:multipart) ? env.delete(:multipart) : env['CONTENT_TYPE'].start_with?('multipart/')
311
313
 
312
314
  if params.is_a?(Hash)
313
- if data = build_multipart(params, false, multipart)
315
+ if !params.empty? && data = build_multipart(params, false, multipart)
314
316
  env[:input] = data
315
317
  env['CONTENT_LENGTH'] ||= data.length.to_s
316
318
  env['CONTENT_TYPE'] = "#{multipart_content_type(env)}; boundary=#{MULTIPART_BOUNDARY}"
@@ -363,43 +365,9 @@ module Rack
363
365
  @after_request.each(&:call)
364
366
  @last_response.finish
365
367
 
366
- if retry_with_digest_auth?(env)
367
- auth_env = env.merge('HTTP_AUTHORIZATION' => digest_auth_header,
368
- 'rack-test.digest_auth_retry' => true)
369
- auth_env.delete('rack.request')
370
- process_request(uri, auth_env)
371
- else
372
- yield last_response if block_given?
373
-
374
- last_response
375
- end
376
- end
377
-
378
- def digest_auth_header
379
- require_relative 'test/mock_digest_request'
380
-
381
- challenge = last_response['WWW-Authenticate'].split(' ', 2).last
382
- params = Rack::Auth::Digest::Params.parse(challenge)
383
-
384
- params.merge!('username' => @digest_username,
385
- 'nc' => '00000001',
386
- 'cnonce' => 'nonsensenonce',
387
- 'uri' => last_request.fullpath,
388
- 'method' => last_request.env['REQUEST_METHOD'])
389
-
390
- params['response'] = MockDigestRequest_.new(params).response(@digest_password)
368
+ yield @last_response if block_given?
391
369
 
392
- "Digest #{params}"
393
- end
394
-
395
- def retry_with_digest_auth?(env)
396
- last_response.status == 401 &&
397
- digest_auth_configured? &&
398
- !env['rack-test.digest_auth_retry']
399
- end
400
-
401
- def digest_auth_configured?
402
- @digest_username
370
+ @last_response
403
371
  end
404
372
  end
405
373
 
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-test
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  - Bryan Helmkamp
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-06-28 00:00:00.000000000 Z
12
+ date: 2023-03-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -81,11 +81,9 @@ files:
81
81
  - History.md
82
82
  - MIT-LICENSE.txt
83
83
  - README.md
84
- - lib/rack/mock_session.rb
85
84
  - lib/rack/test.rb
86
85
  - lib/rack/test/cookie_jar.rb
87
86
  - lib/rack/test/methods.rb
88
- - lib/rack/test/mock_digest_request.rb
89
87
  - lib/rack/test/uploaded_file.rb
90
88
  - lib/rack/test/utils.rb
91
89
  - lib/rack/test/version.rb
@@ -97,7 +95,7 @@ metadata:
97
95
  bug_tracker_uri: https://github.com/rack/rack-test/issues
98
96
  mailing_list_uri: https://github.com/rack/rack-test/discussions
99
97
  changelog_uri: https://github.com/rack/rack-test/blob/main/History.md
100
- post_install_message:
98
+ post_install_message:
101
99
  rdoc_options: []
102
100
  require_paths:
103
101
  - lib
@@ -112,8 +110,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
112
110
  - !ruby/object:Gem::Version
113
111
  version: '0'
114
112
  requirements: []
115
- rubygems_version: 3.3.7
116
- signing_key:
113
+ rubygems_version: 3.4.6
114
+ signing_key:
117
115
  specification_version: 4
118
116
  summary: Simple testing API built on Rack
119
117
  test_files: []
@@ -1,2 +0,0 @@
1
- warn("requiring rack/mock_session is deprecated, require rack/test and use Rack::Test::Session", uplevel: 1)
2
- require_relative 'test'
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # :nocov:
4
- require 'rack/auth/digest' unless defined?(Rack::Auth::Digest)
5
- # :nocov:
6
-
7
- module Rack
8
- module Test
9
- class MockDigestRequest_ # :nodoc:
10
- def initialize(params)
11
- @params = params
12
- end
13
-
14
- def method_missing(sym)
15
- if @params.key? k = sym.to_s
16
- return @params[k]
17
- end
18
-
19
- super
20
- end
21
-
22
- def method
23
- @params['method']
24
- end
25
-
26
- def response(password)
27
- Rack::Auth::Digest::MD5.new(nil).send :digest, self, password
28
- end
29
- end
30
- MockDigestRequest = MockDigestRequest_
31
- # :nocov:
32
- deprecate_constant :MockDigestRequest if respond_to?(:deprecate_constant, true)
33
- # :nocov:
34
- end
35
- end