aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/test/controller
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2011-05-02 19:21:03 -0500
committerDavid Heinemeier Hansson <david@loudthinking.com>2011-05-02 19:21:03 -0500
commitb359f9fe7cc3f664e145fae7b0d5b5c309587ef8 (patch)
tree386bac9ca264c2355741ba967334030f518b73fa /actionpack/test/controller
parentb29a905f949dbed5052c55184bd5e0838517ec8d (diff)
parent35d0d82ae3edf8fe959624999c858a63b2b4ed52 (diff)
downloadrails-b359f9fe7cc3f664e145fae7b0d5b5c309587ef8.tar.gz
rails-b359f9fe7cc3f664e145fae7b0d5b5c309587ef8.tar.bz2
rails-b359f9fe7cc3f664e145fae7b0d5b5c309587ef8.zip
Merge branch 'master' of github.com:rails/rails
Diffstat (limited to 'actionpack/test/controller')
-rw-r--r--actionpack/test/controller/log_subscriber_test.rb11
-rw-r--r--actionpack/test/controller/params_wrapper_test.rb202
2 files changed, 213 insertions, 0 deletions
diff --git a/actionpack/test/controller/log_subscriber_test.rb b/actionpack/test/controller/log_subscriber_test.rb
index ddfa3df552..5d7a51e902 100644
--- a/actionpack/test/controller/log_subscriber_test.rb
+++ b/actionpack/test/controller/log_subscriber_test.rb
@@ -4,6 +4,8 @@ require "action_controller/log_subscriber"
module Another
class LogSubscribersController < ActionController::Base
+ wrap_parameters :person, :only => :name, :format => :json
+
def show
render :nothing => true
end
@@ -95,6 +97,15 @@ class ACLogSubscriberTest < ActionController::TestCase
assert_equal 'Parameters: {"id"=>"10"}', logs[1]
end
+ def test_process_action_with_wrapped_parameters
+ @request.env['CONTENT_TYPE'] = 'application/json'
+ post :show, :id => '10', :name => 'jose'
+ wait
+
+ assert_equal 3, logs.size
+ assert_match '"person"=>{"name"=>"jose"}', logs[1]
+ end
+
def test_process_action_with_view_runtime
get :show
wait
diff --git a/actionpack/test/controller/params_wrapper_test.rb b/actionpack/test/controller/params_wrapper_test.rb
new file mode 100644
index 0000000000..314b27cf47
--- /dev/null
+++ b/actionpack/test/controller/params_wrapper_test.rb
@@ -0,0 +1,202 @@
+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_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
+ 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' => '&#9731;', 'username' => 'sikachu' }
+ assert_equal '{"authenticity_token":"pwned","_method":"put","utf8":"&#9731;","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
+ User.expects(:respond_to?).with(:column_names).returns(true)
+ User.expects(:column_names).returns(["username"])
+
+ 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
+ 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
+ end
+
+ class Sample
+ def self.column_names
+ ["username"]
+ end
+ 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_from_model
+ Admin.const_set(:User, Class.new(Sample))
+ 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
+ end
+ ensure
+ Admin.send :remove_const, :User
+ end
+ end
+
+ private
+ def with_default_wrapper_options(&block)
+ @controller.class._wrapper_options = {:format => [:json]}
+ @controller.class.inherited(@controller.class)
+ yield
+ end
+end