params_wrapper_test.rb 8.4 KB
Newer Older
1 2 3 4 5 6
require 'abstract_unit'

module Admin; class User; end; end

class ParamsWrapperTest < ActionController::TestCase
  class UsersController < ActionController::Base
7 8 9 10 11 12 13
    class << self
      attr_accessor :last_parameters
    end

    def parse
      self.class.last_parameters = request.params.except(:controller, :action)
      head :ok
14 15 16 17 18 19 20 21
    end
  end

  class User; end
  class Person; end

  tests UsersController

22 23 24 25
  def teardown
    UsersController.last_parameters = nil
  end

V
Vijay Dev 已提交
26
  def test_derived_name_from_controller
27 28
    with_default_wrapper_options do
      @request.env['CONTENT_TYPE'] = 'application/json'
29 30
      post :parse, { 'username' => 'sikachu' }
      assert_parameters({ 'username' => 'sikachu', 'user' => { 'username' => 'sikachu' }})
31 32 33 34 35 36 37 38
    end
  end

  def test_specify_wrapper_name
    with_default_wrapper_options do
      UsersController.wrap_parameters :person

      @request.env['CONTENT_TYPE'] = 'application/json'
39 40
      post :parse, { 'username' => 'sikachu' }
      assert_parameters({ 'username' => 'sikachu', 'person' => { 'username' => 'sikachu' }})
41 42 43 44 45 46 47 48
    end
  end

  def test_specify_wrapper_model
    with_default_wrapper_options do
      UsersController.wrap_parameters Person

      @request.env['CONTENT_TYPE'] = 'application/json'
49 50
      post :parse, { 'username' => 'sikachu' }
      assert_parameters({ 'username' => 'sikachu', 'person' => { 'username' => 'sikachu' }})
51 52 53 54 55 56 57 58
    end
  end

  def test_specify_only_option
    with_default_wrapper_options do
      UsersController.wrap_parameters :only => :username

      @request.env['CONTENT_TYPE'] = 'application/json'
59 60
      post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
      assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
61 62 63 64 65 66 67 68
    end
  end

  def test_specify_except_option
    with_default_wrapper_options do
      UsersController.wrap_parameters :except => :title

      @request.env['CONTENT_TYPE'] = 'application/json'
69 70
      post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
      assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
71 72 73 74 75 76 77 78
    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'
79 80
      post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
      assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'person' => { 'username' => 'sikachu' }})
81 82 83 84 85 86
    end
  end

  def test_not_enabled_format
    with_default_wrapper_options do
      @request.env['CONTENT_TYPE'] = 'application/xml'
87 88
      post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
      assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer' })
89 90 91
    end
  end

92 93 94 95
  def test_wrap_parameters_false
    with_default_wrapper_options do
      UsersController.wrap_parameters false
      @request.env['CONTENT_TYPE'] = 'application/json'
96 97
      post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
      assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer' })
98 99 100
    end
  end

101 102 103 104 105
  def test_specify_format
    with_default_wrapper_options do
      UsersController.wrap_parameters :format => :xml

      @request.env['CONTENT_TYPE'] = 'application/xml'
106 107
      post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
      assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu', 'title' => 'Developer' }})
108 109 110 111 112 113
    end
  end

  def test_not_wrap_reserved_parameters
    with_default_wrapper_options do
      @request.env['CONTENT_TYPE'] = 'application/json'
114 115
      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' }})
116 117 118 119 120 121
    end
  end

  def test_no_double_wrap_if_key_exists
    with_default_wrapper_options do
      @request.env['CONTENT_TYPE'] = 'application/json'
122 123
      post :parse, { 'user' => { 'username' => 'sikachu' }}
      assert_parameters({ 'user' => { 'username' => 'sikachu' }})
124 125 126 127 128 129
    end
  end

  def test_nested_params
    with_default_wrapper_options do
      @request.env['CONTENT_TYPE'] = 'application/json'
130 131
      post :parse, { 'person' => { 'username' => 'sikachu' }}
      assert_parameters({ 'person' => { 'username' => 'sikachu' }, 'user' => {'person' => { 'username' => 'sikachu' }}})
132 133 134 135
    end
  end

  def test_derived_wrapped_keys_from_matching_model
136 137
    User.expects(:respond_to?).with(:attribute_names).returns(true)
    User.expects(:attribute_names).twice.returns(["username"])
138

139
    with_default_wrapper_options do
140
      @request.env['CONTENT_TYPE'] = 'application/json'
141 142
      post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
      assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
143 144 145 146 147
    end
  end

  def test_derived_wrapped_keys_from_specified_model
    with_default_wrapper_options do
148 149
      Person.expects(:respond_to?).with(:attribute_names).returns(true)
      Person.expects(:attribute_names).twice.returns(["username"])
150 151 152 153

      UsersController.wrap_parameters Person

      @request.env['CONTENT_TYPE'] = 'application/json'
154 155
      post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
      assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'person' => { 'username' => 'sikachu' }})
156 157 158
    end
  end

159
  def test_not_wrapping_abstract_model
160 161
    User.expects(:respond_to?).with(:attribute_names).returns(true)
    User.expects(:attribute_names).returns([])
162 163 164 165 166 167 168 169

    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', 'title' => 'Developer' }})
    end
  end

170 171 172 173 174 175
  private
    def with_default_wrapper_options(&block)
      @controller.class._wrapper_options = {:format => [:json]}
      @controller.class.inherited(@controller.class)
      yield
    end
176 177 178 179

    def assert_parameters(expected)
      assert_equal expected, UsersController.last_parameters
    end
180 181 182 183
end

class NamespacedParamsWrapperTest < ActionController::TestCase
  module Admin
184 185 186 187 188 189 190 191 192 193
    module Users
      class UsersController < ActionController::Base;
        class << self
          attr_accessor :last_parameters
        end

        def parse
          self.class.last_parameters = request.params.except(:controller, :action)
          head :ok
        end
194 195
      end
    end
196
  end
197

198
  class SampleOne
199
    def self.attribute_names
200 201
      ["username"]
    end
202 203
  end

204
  class SampleTwo
205
    def self.attribute_names
206 207 208 209 210
      ["title"]
    end
  end

  tests Admin::Users::UsersController
211

212
  def teardown
213
    Admin::Users::UsersController.last_parameters = nil
214 215
  end

V
Vijay Dev 已提交
216
  def test_derived_name_from_controller
217 218
    with_default_wrapper_options do
      @request.env['CONTENT_TYPE'] = 'application/json'
219 220
      post :parse, { 'username' => 'sikachu' }
      assert_parameters({'username' => 'sikachu', 'user' => { 'username' => 'sikachu' }})
221 222 223
    end
  end

224
  def test_namespace_lookup_from_model
225
    Admin.const_set(:User, Class.new(SampleOne))
226 227 228
    begin
      with_default_wrapper_options do
        @request.env['CONTENT_TYPE'] = 'application/json'
229 230
        post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
        assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
231 232 233
      end
    ensure
      Admin.send :remove_const, :User
234 235 236
    end
  end

V
Vijay Dev 已提交
237
  def test_hierarchy_namespace_lookup_from_model
238
    Object.const_set(:User, Class.new(SampleTwo))
239 240 241 242
    begin
      with_default_wrapper_options do
        @request.env['CONTENT_TYPE'] = 'application/json'
        post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
243
        assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'title' => 'Developer' }})
244 245 246 247 248 249
      end
    ensure
      Object.send :remove_const, :User
    end
  end

250 251 252 253 254 255
  private
    def with_default_wrapper_options(&block)
      @controller.class._wrapper_options = {:format => [:json]}
      @controller.class.inherited(@controller.class)
      yield
    end
256 257

    def assert_parameters(expected)
258
      assert_equal expected, Admin::Users::UsersController.last_parameters
259
    end
260
end