Skip to content

Commit

Permalink
Merge pull request #26212 from evmunro/as-json-sets-request-to-json-f…
Browse files Browse the repository at this point in the history
…or-controller-test

Allow setting of request CONTENT-TYPE with as: in controller tests
  • Loading branch information
rafaelfranca committed Aug 19, 2016
1 parent ef2594b commit 09d313a
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
7 changes: 7 additions & 0 deletions actionpack/CHANGELOG.md
@@ -1,3 +1,10 @@
* Add `:as` option to `ActionController:TestCase#process` and related methods.

Specifying `as: mime_type` allows the `CONTENT_TYPE` header to be specified
in controller tests without manually doing this through `@request.headers['CONTENT_TYPE']`.

*Everest Stefan Munro-Zeisberger*

* Don't override the `Accept` header in integration tests when called with `xhr: true`.

Fixes #25859.
Expand Down
9 changes: 8 additions & 1 deletion actionpack/lib/action_controller/test_case.rb
Expand Up @@ -447,6 +447,8 @@ def xml_http_request(*args)
# - +session+: A hash of parameters to store in the session. This may be +nil+.
# - +flash+: A hash of parameters to store in the flash. This may be +nil+.
# - +format+: Request format. Defaults to +nil+. Can be string or symbol.
# - +as+: Content type. Defaults to +nil+. Must be a symbol that corresponds
# to a mime type.
#
# Example calling +create+ action and sending two params:
#
Expand All @@ -467,7 +469,7 @@ def process(action, *args)
check_required_ivars

if kwarg_request?(args)
parameters, session, body, flash, http_method, format, xhr = args[0].values_at(:params, :session, :body, :flash, :method, :format, :xhr)
parameters, session, body, flash, http_method, format, xhr, as = args[0].values_at(:params, :session, :body, :flash, :method, :format, :xhr, :as)
else
http_method, parameters, session, flash = args
format = nil
Expand Down Expand Up @@ -512,6 +514,11 @@ def process(action, *args)

@request.set_header 'REQUEST_METHOD', http_method

if as
@request.content_type = Mime[as].to_s
format ||= as
end

parameters = parameters.symbolize_keys

generated_extras = @routes.generate_extras(parameters.merge(controller: controller_class_name, action: action.to_s))
Expand Down
9 changes: 9 additions & 0 deletions actionpack/test/controller/test_case_test.rb
Expand Up @@ -637,6 +637,15 @@ def test_params_passing_doesnt_modify_in_place
assert_equal "application/json", parsed_env["CONTENT_TYPE"]
end

def test_using_as_json_sets_request_content_type_to_json
post :render_body, params: { bool_value: true, str_value: "string", num_value: 2 }, as: :json

assert_equal "application/json", @request.headers["CONTENT_TYPE"]
assert_equal true, @request.request_parameters[:bool_value]
assert_equal "string", @request.request_parameters[:str_value]
assert_equal 2, @request.request_parameters[:num_value]
end

def test_mutating_content_type_headers_for_plain_text_files_sets_the_header
@request.headers['Content-Type'] = 'text/plain'
post :render_body, params: { name: 'foo.txt' }
Expand Down

0 comments on commit 09d313a

Please sign in to comment.