Skip to content

Commit

Permalink
Fix broken params_wrapper_test on 1.8.7 💣
Browse files Browse the repository at this point in the history
I have to keep in mind that 1.8.7 does *not* preserve the hash order.

Guys, let's move to use 1.9.2 in production!
  • Loading branch information
sikachu committed May 3, 2011
1 parent 8bf5d68 commit 31f412f
Showing 1 changed file with 80 additions and 36 deletions.
116 changes: 80 additions & 36 deletions actionpack/test/controller/params_wrapper_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Expand All @@ -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

Expand All @@ -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

Expand All @@ -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

Expand All @@ -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

Expand All @@ -67,25 +76,25 @@ 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

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

Expand All @@ -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' => '&#9731;', 'username' => 'sikachu' }
assert_equal '{"authenticity_token":"pwned","_method":"put","utf8":"&#9731;","username":"sikachu","user":{"username":"sikachu"}}', @response.body
post :parse, { 'authenticity_token' => 'pwned', '_method' => 'put', 'utf8' => '&#9731;', 'username' => 'sikachu' }
assert_parameters({ 'authenticity_token' => 'pwned', '_method' => 'put', 'utf8' => '&#9731;', '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

Expand All @@ -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

Expand All @@ -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

Expand All @@ -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
Expand All @@ -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

Expand All @@ -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

0 comments on commit 31f412f

Please sign in to comment.