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::Type[: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::Type[: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