require 'abstract_unit'
module Admin; class User; end; end
class ParamsWrapperTest < ActionController::TestCase
class UsersController < ActionController::Base
def test
render :json => params.except(:controller, :action)
end
end
class User; end
class Person; end
tests UsersController
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
end
end
def test_specify_wrapper_name
with_default_wrapper_options do
UsersController.wrap_parameters :person
@request.env['CONTENT_TYPE'] = 'application/json'
post :test, { 'username' => 'sikachu' }
assert_equal '{"username":"sikachu","person":{"username":"sikachu"}}', @response.body
end
end
def test_specify_wrapper_model
with_default_wrapper_options do
UsersController.wrap_parameters Person
@request.env['CONTENT_TYPE'] = 'application/json'
post :test, { 'username' => 'sikachu' }
assert_equal '{"username":"sikachu","person":{"username":"sikachu"}}', @response.body
end
end
def test_specify_only_option
with_default_wrapper_options do
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
end
end
def test_specify_except_option
with_default_wrapper_options do
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
end
end
def test_specify_both_wrapper_name_and_only_option
with_default_wrapper_options do
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
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
end
end
def test_specify_format
with_default_wrapper_options do
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
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
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
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
end
end
def test_derived_wrapped_keys_from_matching_model
with_default_wrapper_options do
User.expects(:respond_to?).with(:column_names).returns(true)
User.expects(:column_names).returns(["username"])
@request.env['CONTENT_TYPE'] = 'application/json'
post :test, { 'username' => 'sikachu', 'title' => 'Developer' }
assert_equal '{"username":"sikachu","title":"Developer","user":{"username":"sikachu"}}', @response.body
end
end
def test_derived_wrapped_keys_from_specified_model
with_default_wrapper_options do
Person.expects(:respond_to?).with(:column_names).returns(true)
Person.expects(:column_names).returns(["username"])
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
end
end
private
def with_default_wrapper_options(&block)
@controller.class._wrapper_options = {:format => [:json]}
@controller.class.inherited(@controller.class)
yield
end
end
class NamespacedParamsWrapperTest < ActionController::TestCase
module Admin
class UsersController < ActionController::Base
def test
render :json => params.except(:controller, :action)
end
end
class User; end
end
class User; end
class Person; end
tests Admin::UsersController
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
end
end
def test_namespace_lookup_when_namespaced_model_available
with_default_wrapper_options do
Admin::User.expects(:respond_to?).with(:column_names).returns(false)
@request.env['CONTENT_TYPE'] = 'application/json'
post :test, { 'username' => 'sikachu' }
end
end
private
def with_default_wrapper_options(&block)
@controller.class._wrapper_options = {:format => [:json]}
@controller.class.inherited(@controller.class)
yield
end
end