params_wrapper_test.rb 8.5 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
    User.expects(:respond_to?).with(:abstract_class?).returns(false)
137 138
    User.expects(:respond_to?).with(:column_names).returns(true)
    User.expects(:column_names).returns(["username"])
139

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

  def test_derived_wrapped_keys_from_specified_model
    with_default_wrapper_options do
149
      Person.expects(:respond_to?).with(:abstract_class?).returns(false)
150 151 152 153 154 155
      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'
156 157
      post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
      assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'person' => { 'username' => 'sikachu' }})
158 159 160
    end
  end

161 162 163 164 165 166 167 168 169 170 171
  def test_not_wrapping_abstract_model
    User.expects(:respond_to?).with(:abstract_class?).returns(true)
    User.expects(:abstract_class?).returns(true)

    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

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

    def assert_parameters(expected)
      assert_equal expected, UsersController.last_parameters
    end
182 183 184 185
end

class NamespacedParamsWrapperTest < ActionController::TestCase
  module Admin
186 187 188 189 190 191 192 193 194 195
    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
196 197
      end
    end
198
  end
199

200
  class SampleOne
201 202 203
    def self.column_names
      ["username"]
    end
204 205
  end

206 207 208 209 210 211 212
  class SampleTwo
    def self.column_names
      ["title"]
    end
  end

  tests Admin::Users::UsersController
213

214
  def teardown
215
    Admin::Users::UsersController.last_parameters = nil
216 217
  end

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

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

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

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

    def assert_parameters(expected)
260
      assert_equal expected, Admin::Users::UsersController.last_parameters
261
    end
262
end