diff --git a/actionpack/test/controller/params_wrapper_test.rb b/actionpack/test/controller/params_wrapper_test.rb index 314b27cf47c..d6f8f28d0d3 100644 --- a/actionpack/test/controller/params_wrapper_test.rb +++ b/actionpack/test/controller/params_wrapper_test.rb @@ -4,8 +4,13 @@ module Admin; class User; end; end class ParamsWrapperTest < ActionController::TestCase class UsersController < ActionController::Base - def test - render :json => params.except(:controller, :action) + class << self + attr_accessor :last_parameters + end + + def parse + self.class.last_parameters = request.params.except(:controller, :action) + head :ok end end @@ -14,11 +19,15 @@ class Person; end tests UsersController + def teardown + UsersController.last_parameters = nil + end + def test_derivered_name_from_controller with_default_wrapper_options do @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'username' => 'sikachu' } - assert_equal '{"username":"sikachu","user":{"username":"sikachu"}}', @response.body + post :parse, { 'username' => 'sikachu' } + assert_parameters({ 'username' => 'sikachu', 'user' => { 'username' => 'sikachu' }}) end end @@ -27,8 +36,8 @@ def test_specify_wrapper_name UsersController.wrap_parameters :person @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'username' => 'sikachu' } - assert_equal '{"username":"sikachu","person":{"username":"sikachu"}}', @response.body + post :parse, { 'username' => 'sikachu' } + assert_parameters({ 'username' => 'sikachu', 'person' => { 'username' => 'sikachu' }}) end end @@ -37,8 +46,8 @@ def test_specify_wrapper_model UsersController.wrap_parameters Person @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'username' => 'sikachu' } - assert_equal '{"username":"sikachu","person":{"username":"sikachu"}}', @response.body + post :parse, { 'username' => 'sikachu' } + assert_parameters({ 'username' => 'sikachu', 'person' => { 'username' => 'sikachu' }}) end end @@ -47,8 +56,8 @@ def test_specify_only_option UsersController.wrap_parameters :only => :username @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'username' => 'sikachu', 'title' => 'Developer' } - assert_equal '{"username":"sikachu","title":"Developer","user":{"username":"sikachu"}}', @response.body + post :parse, { 'username' => 'sikachu', 'title' => 'Developer' } + assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }}) end end @@ -57,8 +66,8 @@ def test_specify_except_option UsersController.wrap_parameters :except => :title @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'username' => 'sikachu', 'title' => 'Developer' } - assert_equal '{"username":"sikachu","title":"Developer","user":{"username":"sikachu"}}', @response.body + post :parse, { 'username' => 'sikachu', 'title' => 'Developer' } + assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }}) end end @@ -67,16 +76,16 @@ def test_specify_both_wrapper_name_and_only_option UsersController.wrap_parameters :person, :only => :username @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'username' => 'sikachu', 'title' => 'Developer' } - assert_equal '{"username":"sikachu","title":"Developer","person":{"username":"sikachu"}}', @response.body + post :parse, { 'username' => 'sikachu', 'title' => 'Developer' } + assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'person' => { 'username' => 'sikachu' }}) end end def test_not_enabled_format with_default_wrapper_options do @request.env['CONTENT_TYPE'] = 'application/xml' - post :test, { 'username' => 'sikachu', 'title' => 'Developer' } - assert_equal '{"username":"sikachu","title":"Developer"}', @response.body + post :parse, { 'username' => 'sikachu', 'title' => 'Developer' } + assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer' }) end end @@ -84,8 +93,8 @@ def test_wrap_parameters_false with_default_wrapper_options do UsersController.wrap_parameters false @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'username' => 'sikachu', 'title' => 'Developer' } - assert_equal '{"username":"sikachu","title":"Developer"}', @response.body + post :parse, { 'username' => 'sikachu', 'title' => 'Developer' } + assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer' }) end end @@ -94,32 +103,32 @@ def test_specify_format UsersController.wrap_parameters :format => :xml @request.env['CONTENT_TYPE'] = 'application/xml' - post :test, { 'username' => 'sikachu', 'title' => 'Developer' } - assert_equal '{"username":"sikachu","title":"Developer","user":{"username":"sikachu","title":"Developer"}}', @response.body + post :parse, { 'username' => 'sikachu', 'title' => 'Developer' } + assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu', 'title' => 'Developer' }}) end end def test_not_wrap_reserved_parameters with_default_wrapper_options do @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'authenticity_token' => 'pwned', '_method' => 'put', 'utf8' => '☃', 'username' => 'sikachu' } - assert_equal '{"authenticity_token":"pwned","_method":"put","utf8":"☃","username":"sikachu","user":{"username":"sikachu"}}', @response.body + post :parse, { 'authenticity_token' => 'pwned', '_method' => 'put', 'utf8' => '☃', 'username' => 'sikachu' } + assert_parameters({ 'authenticity_token' => 'pwned', '_method' => 'put', 'utf8' => '☃', 'username' => 'sikachu', 'user' => { 'username' => 'sikachu' }}) end end def test_no_double_wrap_if_key_exists with_default_wrapper_options do @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'user' => { 'username' => 'sikachu' }} - assert_equal '{"user":{"username":"sikachu"}}', @response.body + post :parse, { 'user' => { 'username' => 'sikachu' }} + assert_parameters({ 'user' => { 'username' => 'sikachu' }}) end end def test_nested_params with_default_wrapper_options do @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'person' => { 'username' => 'sikachu' }} - assert_equal '{"person":{"username":"sikachu"},"user":{"person":{"username":"sikachu"}}}', @response.body + post :parse, { 'person' => { 'username' => 'sikachu' }} + assert_parameters({ 'person' => { 'username' => 'sikachu' }, 'user' => {'person' => { 'username' => 'sikachu' }}}) end end @@ -129,8 +138,8 @@ def test_derived_wrapped_keys_from_matching_model with_default_wrapper_options do @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'username' => 'sikachu', 'title' => 'Developer' } - assert_equal '{"username":"sikachu","title":"Developer","user":{"username":"sikachu"}}', @response.body + post :parse, { 'username' => 'sikachu', 'title' => 'Developer' } + assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }}) end end @@ -142,8 +151,8 @@ def test_derived_wrapped_keys_from_specified_model UsersController.wrap_parameters Person @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'username' => 'sikachu', 'title' => 'Developer' } - assert_equal '{"username":"sikachu","title":"Developer","person":{"username":"sikachu"}}', @response.body + post :parse, { 'username' => 'sikachu', 'title' => 'Developer' } + assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'person' => { 'username' => 'sikachu' }}) end end @@ -153,13 +162,22 @@ def with_default_wrapper_options(&block) @controller.class.inherited(@controller.class) yield end + + def assert_parameters(expected) + assert_equal expected, UsersController.last_parameters + end end class NamespacedParamsWrapperTest < ActionController::TestCase module Admin class UsersController < ActionController::Base - def test - render :json => params.except(:controller, :action) + class << self + attr_accessor :last_parameters + end + + def parse + self.class.last_parameters = request.params.except(:controller, :action) + head :ok end end end @@ -172,11 +190,15 @@ def self.column_names tests Admin::UsersController + def teardown + Admin::UsersController.last_parameters = nil + end + def test_derivered_name_from_controller with_default_wrapper_options do @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'username' => 'sikachu' } - assert_equal '{"username":"sikachu","user":{"username":"sikachu"}}', @response.body + post :parse, { 'username' => 'sikachu' } + assert_parameters({'username' => 'sikachu', 'user' => { 'username' => 'sikachu' }}) end end @@ -185,18 +207,40 @@ def test_namespace_lookup_from_model begin with_default_wrapper_options do @request.env['CONTENT_TYPE'] = 'application/json' - post :test, { 'username' => 'sikachu', 'title' => 'Developer' } - assert_equal '{"username":"sikachu","title":"Developer","user":{"username":"sikachu"}}', @response.body + post :parse, { 'username' => 'sikachu', 'title' => 'Developer' } + assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }}) end ensure Admin.send :remove_const, :User end end + def test_heirarchy_namespace_lookup_from_model + # Make sure that we cleanup ::Admin::User + admin_user_constant = ::Admin::User + ::Admin.send :remove_const, :User + + Object.const_set(:User, Class.new(Sample)) + begin + with_default_wrapper_options do + @request.env['CONTENT_TYPE'] = 'application/json' + post :parse, { 'username' => 'sikachu', 'title' => 'Developer' } + assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }}) + end + ensure + Object.send :remove_const, :User + ::Admin.const_set(:User, admin_user_constant) + end + end + private def with_default_wrapper_options(&block) @controller.class._wrapper_options = {:format => [:json]} @controller.class.inherited(@controller.class) yield end + + def assert_parameters(expected) + assert_equal expected, Admin::UsersController.last_parameters + end end