mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
565094a8b5
Rails 4.x and earlier didn't support `Mime::Type[:FOO]`, so libraries
that support multiple Rails versions would've had to feature-detect
whether to use `Mime::Type[:FOO]` or `Mime::FOO`.
`Mime[:foo]` has been around for ages to look up registered MIME types
by symbol / extension, though, so libraries and plugins can safely
switch to that without breaking backward- or forward-compatibility.
Note: `Mime::ALL` isn't a real MIME type and isn't registered for lookup
by type or extension, so it's not available as `Mime[:all]`. We use it
internally as a wildcard for `respond_to` negotiation. If you use this
internal constant, continue to reference it with `Mime::ALL`.
Ref. efc6dd550e
133 lines
3.9 KiB
Ruby
133 lines
3.9 KiB
Ruby
require 'abstract_unit'
|
|
require 'active_support/json/decoding'
|
|
|
|
class WebServiceTest < ActionDispatch::IntegrationTest
|
|
class TestController < ActionController::Base
|
|
def assign_parameters
|
|
if params[:full]
|
|
render plain: dump_params_keys
|
|
else
|
|
render plain: (params.keys - ['controller', 'action']).sort.join(", ")
|
|
end
|
|
end
|
|
|
|
def dump_params_keys(hash = params)
|
|
hash.keys.sort.inject("") do |s, k|
|
|
value = hash[k]
|
|
|
|
if value.is_a?(Hash) || value.is_a?(ActionController::Parameters)
|
|
value = "(#{dump_params_keys(value)})"
|
|
else
|
|
value = ""
|
|
end
|
|
|
|
s << ", " unless s.empty?
|
|
s << "#{k}#{value}"
|
|
end
|
|
end
|
|
end
|
|
|
|
def setup
|
|
@controller = TestController.new
|
|
@integration_session = nil
|
|
end
|
|
|
|
def test_check_parameters
|
|
with_test_route_set do
|
|
get "/"
|
|
assert_equal '', @controller.response.body
|
|
end
|
|
end
|
|
|
|
def test_post_json
|
|
with_test_route_set do
|
|
post "/",
|
|
params: '{"entry":{"summary":"content..."}}',
|
|
headers: { 'CONTENT_TYPE' => 'application/json' }
|
|
|
|
assert_equal 'entry', @controller.response.body
|
|
assert @controller.params.has_key?(:entry)
|
|
assert_equal 'content...', @controller.params["entry"]['summary']
|
|
end
|
|
end
|
|
|
|
def test_put_json
|
|
with_test_route_set do
|
|
put "/",
|
|
params: '{"entry":{"summary":"content..."}}',
|
|
headers: { 'CONTENT_TYPE' => 'application/json' }
|
|
|
|
assert_equal 'entry', @controller.response.body
|
|
assert @controller.params.has_key?(:entry)
|
|
assert_equal 'content...', @controller.params["entry"]['summary']
|
|
end
|
|
end
|
|
|
|
def test_register_and_use_json_simple
|
|
with_test_route_set do
|
|
with_params_parsers Mime[:json] => Proc.new { |data| ActiveSupport::JSON.decode(data)['request'].with_indifferent_access } do
|
|
post "/",
|
|
params: '{"request":{"summary":"content...","title":"JSON"}}',
|
|
headers: { 'CONTENT_TYPE' => 'application/json' }
|
|
|
|
assert_equal 'summary, title', @controller.response.body
|
|
assert @controller.params.has_key?(:summary)
|
|
assert @controller.params.has_key?(:title)
|
|
assert_equal 'content...', @controller.params["summary"]
|
|
assert_equal 'JSON', @controller.params["title"]
|
|
end
|
|
end
|
|
end
|
|
|
|
def test_use_json_with_empty_request
|
|
with_test_route_set do
|
|
assert_nothing_raised { post "/", headers: { 'CONTENT_TYPE' => 'application/json' } }
|
|
assert_equal '', @controller.response.body
|
|
end
|
|
end
|
|
|
|
def test_dasherized_keys_as_json
|
|
with_test_route_set do
|
|
post "/?full=1",
|
|
params: '{"first-key":{"sub-key":"..."}}',
|
|
headers: { 'CONTENT_TYPE' => 'application/json' }
|
|
assert_equal 'action, controller, first-key(sub-key), full', @controller.response.body
|
|
assert_equal "...", @controller.params['first-key']['sub-key']
|
|
end
|
|
end
|
|
|
|
def test_parsing_json_doesnot_rescue_exception
|
|
req = Class.new(ActionDispatch::Request) do
|
|
def params_parsers
|
|
{ Mime[:json] => Proc.new { |data| raise Interrupt } }
|
|
end
|
|
|
|
def content_length; get_header('rack.input').length; end
|
|
end.new({ 'rack.input' => StringIO.new('{"title":"JSON"}}'), 'CONTENT_TYPE' => 'application/json' })
|
|
|
|
assert_raises(Interrupt) do
|
|
req.request_parameters
|
|
end
|
|
end
|
|
|
|
private
|
|
def with_params_parsers(parsers = {})
|
|
old_session = @integration_session
|
|
original_parsers = ActionDispatch::Request.parameter_parsers
|
|
ActionDispatch::Request.parameter_parsers = original_parsers.merge parsers
|
|
reset!
|
|
yield
|
|
ensure
|
|
ActionDispatch::Request.parameter_parsers = original_parsers
|
|
@integration_session = old_session
|
|
end
|
|
|
|
def with_test_route_set
|
|
with_routing do |set|
|
|
set.draw do
|
|
match '/', :to => 'web_service_test/test#assign_parameters', :via => :all
|
|
end
|
|
yield
|
|
end
|
|
end
|
|
end
|