Skip to content

Commit 694b53c

Browse files
authored
Merge pull request rails#25818 from kaspth/backport-25771-to-5-0-stable
Backport rails#25771 to 5-0-stable
2 parents 54f11a9 + f890331 commit 694b53c

File tree

4 files changed

+72
-54
lines changed

4 files changed

+72
-54
lines changed

actionpack/lib/action_dispatch/testing/integration.rb

Lines changed: 3 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
require 'rack/test'
77
require 'minitest'
88

9+
require 'action_dispatch/testing/request_encoder'
10+
911
module ActionDispatch
1012
module Integration #:nodoc:
1113
module RequestHelpers
@@ -385,7 +387,6 @@ def process(method, path, params: nil, headers: nil, env: nil, xhr: false, as: n
385387
response = _mock_session.last_response
386388
@response = ActionDispatch::TestResponse.from_response(response)
387389
@response.request = @request
388-
@response.response_parser = RequestEncoder.parser(@response.content_type)
389390
@html_document = nil
390391
@url_options = nil
391392

@@ -397,56 +398,6 @@ def process(method, path, params: nil, headers: nil, env: nil, xhr: false, as: n
397398
def build_full_uri(path, env)
398399
"#{env['rack.url_scheme']}://#{env['SERVER_NAME']}:#{env['SERVER_PORT']}#{path}"
399400
end
400-
401-
class RequestEncoder # :nodoc:
402-
@encoders = {}
403-
404-
attr_reader :response_parser
405-
406-
def initialize(mime_name, param_encoder, response_parser, url_encoded_form = false)
407-
@mime = Mime[mime_name]
408-
409-
unless @mime
410-
raise ArgumentError, "Can't register a request encoder for " \
411-
"unregistered MIME Type: #{mime_name}. See `Mime::Type.register`."
412-
end
413-
414-
@url_encoded_form = url_encoded_form
415-
@path_format = ".#{@mime.symbol}" unless @url_encoded_form
416-
@response_parser = response_parser || -> body { body }
417-
@param_encoder = param_encoder || :"to_#{@mime.symbol}".to_proc
418-
end
419-
420-
def append_format_to(path)
421-
path += @path_format unless @url_encoded_form
422-
path
423-
end
424-
425-
def content_type
426-
@mime.to_s
427-
end
428-
429-
def encode_params(params)
430-
@param_encoder.call(params)
431-
end
432-
433-
def self.parser(content_type)
434-
mime = Mime::Type.lookup(content_type)
435-
encoder(mime ? mime.ref : nil).response_parser
436-
end
437-
438-
def self.encoder(name)
439-
@encoders[name] || WWWFormEncoder
440-
end
441-
442-
def self.register_encoder(mime_name, param_encoder: nil, response_parser: nil)
443-
@encoders[mime_name] = new(mime_name, param_encoder, response_parser)
444-
end
445-
446-
register_encoder :json, response_parser: -> body { JSON.parse(body) }
447-
448-
WWWFormEncoder = new(:url_encoded_form, -> params { params }, nil, true)
449-
end
450401
end
451402

452403
module Runner
@@ -769,7 +720,7 @@ def app=(app)
769720
end
770721

771722
def register_encoder(*args)
772-
Integration::Session::RequestEncoder.register_encoder(*args)
723+
RequestEncoder.register_encoder(*args)
773724
end
774725
end
775726

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
module ActionDispatch
2+
class RequestEncoder # :nodoc:
3+
@encoders = {}
4+
5+
attr_reader :response_parser
6+
7+
def initialize(mime_name, param_encoder, response_parser, url_encoded_form = false)
8+
@mime = Mime[mime_name]
9+
10+
unless @mime
11+
raise ArgumentError, "Can't register a request encoder for " \
12+
"unregistered MIME Type: #{mime_name}. See `Mime::Type.register`."
13+
end
14+
15+
@url_encoded_form = url_encoded_form
16+
@path_format = ".#{@mime.symbol}" unless @url_encoded_form
17+
@response_parser = response_parser || -> body { body }
18+
@param_encoder = param_encoder || :"to_#{@mime.symbol}".to_proc
19+
end
20+
21+
def append_format_to(path)
22+
if @url_encoded_form
23+
path
24+
else
25+
path + @path_format
26+
end
27+
end
28+
29+
def content_type
30+
@mime.to_s
31+
end
32+
33+
def encode_params(params)
34+
@param_encoder.call(params)
35+
end
36+
37+
def self.parser(content_type)
38+
mime = Mime::Type.lookup(content_type)
39+
encoder(mime ? mime.ref : nil).response_parser
40+
end
41+
42+
def self.encoder(name)
43+
@encoders[name] || WWWFormEncoder
44+
end
45+
46+
def self.register_encoder(mime_name, param_encoder: nil, response_parser: nil)
47+
@encoders[mime_name] = new(mime_name, param_encoder, response_parser)
48+
end
49+
50+
register_encoder :json, response_parser: -> body { JSON.parse(body) }
51+
52+
WWWFormEncoder = new(:url_encoded_form, -> params { params }, nil, true)
53+
end
54+
end

actionpack/lib/action_dispatch/testing/test_response.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
require 'action_dispatch/testing/request_encoder'
2+
13
module ActionDispatch
24
# Integration test methods such as ActionDispatch::Integration::Session#get
35
# and ActionDispatch::Integration::Session#post return objects of class
@@ -10,6 +12,11 @@ def self.from_response(response)
1012
new response.status, response.headers, response.body
1113
end
1214

15+
def initialize(*) # :nodoc:
16+
super
17+
@response_parser = RequestEncoder.parser(content_type)
18+
end
19+
1320
# Was the response successful?
1421
alias_method :success?, :successful?
1522

@@ -19,8 +26,6 @@ def self.from_response(response)
1926
# Was there a server-side error?
2027
alias_method :error?, :server_error?
2128

22-
attr_writer :response_parser # :nodoc:
23-
2429
def parsed_body
2530
@parsed_body ||= @response_parser.call(body)
2631
end

actionpack/test/dispatch/test_response_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,12 @@ def assert_response_code_range(range, predicate)
1717
assert_response_code_range 500..599, :server_error?
1818
assert_response_code_range 400..499, :client_error?
1919
end
20+
21+
test "response parsing" do
22+
response = ActionDispatch::TestResponse.create(200, {}, '')
23+
assert_equal response.body, response.parsed_body
24+
25+
response = ActionDispatch::TestResponse.create(200, { 'Content-Type' => 'application/json' }, '{ "foo": "fighters" }')
26+
assert_equal({ 'foo' => 'fighters' }, response.parsed_body)
27+
end
2028
end

0 commit comments

Comments
 (0)