PageRenderTime 58ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/actionpack/test/controller/params_wrapper_test.rb

https://github.com/eguweb/rails
Ruby | 362 lines | 297 code | 65 blank | 0 comment | 0 complexity | 3ec6880715b1d336715eedb753ed442d MD5 | raw file
  1. require 'abstract_unit'
  2. module Admin; class User; end; end
  3. module ParamsWrapperTestHelp
  4. def with_default_wrapper_options(&block)
  5. @controller.class._wrapper_options = {:format => [:json]}
  6. @controller.class.inherited(@controller.class)
  7. yield
  8. end
  9. def assert_parameters(expected)
  10. assert_equal expected, self.class.controller_class.last_parameters
  11. end
  12. end
  13. class ParamsWrapperTest < ActionController::TestCase
  14. include ParamsWrapperTestHelp
  15. class UsersController < ActionController::Base
  16. class << self
  17. attr_accessor :last_parameters
  18. end
  19. def parse
  20. self.class.last_parameters = request.params.except(:controller, :action)
  21. head :ok
  22. end
  23. end
  24. class User; end
  25. class Person; end
  26. tests UsersController
  27. def teardown
  28. UsersController.last_parameters = nil
  29. end
  30. def test_derived_name_from_controller
  31. with_default_wrapper_options do
  32. @request.env['CONTENT_TYPE'] = 'application/json'
  33. post :parse, { 'username' => 'sikachu' }
  34. assert_parameters({ 'username' => 'sikachu', 'user' => { 'username' => 'sikachu' }})
  35. end
  36. end
  37. def test_specify_wrapper_name
  38. with_default_wrapper_options do
  39. UsersController.wrap_parameters :person
  40. @request.env['CONTENT_TYPE'] = 'application/json'
  41. post :parse, { 'username' => 'sikachu' }
  42. assert_parameters({ 'username' => 'sikachu', 'person' => { 'username' => 'sikachu' }})
  43. end
  44. end
  45. def test_specify_wrapper_model
  46. with_default_wrapper_options do
  47. UsersController.wrap_parameters Person
  48. @request.env['CONTENT_TYPE'] = 'application/json'
  49. post :parse, { 'username' => 'sikachu' }
  50. assert_parameters({ 'username' => 'sikachu', 'person' => { 'username' => 'sikachu' }})
  51. end
  52. end
  53. def test_specify_include_option
  54. with_default_wrapper_options do
  55. UsersController.wrap_parameters :include => :username
  56. @request.env['CONTENT_TYPE'] = 'application/json'
  57. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  58. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
  59. end
  60. end
  61. def test_specify_exclude_option
  62. with_default_wrapper_options do
  63. UsersController.wrap_parameters :exclude => :title
  64. @request.env['CONTENT_TYPE'] = 'application/json'
  65. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  66. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
  67. end
  68. end
  69. def test_specify_both_wrapper_name_and_include_option
  70. with_default_wrapper_options do
  71. UsersController.wrap_parameters :person, :include => :username
  72. @request.env['CONTENT_TYPE'] = 'application/json'
  73. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  74. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'person' => { 'username' => 'sikachu' }})
  75. end
  76. end
  77. def test_not_enabled_format
  78. with_default_wrapper_options do
  79. @request.env['CONTENT_TYPE'] = 'application/xml'
  80. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  81. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer' })
  82. end
  83. end
  84. def test_wrap_parameters_false
  85. with_default_wrapper_options do
  86. UsersController.wrap_parameters false
  87. @request.env['CONTENT_TYPE'] = 'application/json'
  88. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  89. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer' })
  90. end
  91. end
  92. def test_specify_format
  93. with_default_wrapper_options do
  94. UsersController.wrap_parameters :format => :xml
  95. @request.env['CONTENT_TYPE'] = 'application/xml'
  96. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  97. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu', 'title' => 'Developer' }})
  98. end
  99. end
  100. def test_not_wrap_reserved_parameters
  101. with_default_wrapper_options do
  102. @request.env['CONTENT_TYPE'] = 'application/json'
  103. post :parse, { 'authenticity_token' => 'pwned', '_method' => 'put', 'utf8' => '&#9731;', 'username' => 'sikachu' }
  104. assert_parameters({ 'authenticity_token' => 'pwned', '_method' => 'put', 'utf8' => '&#9731;', 'username' => 'sikachu', 'user' => { 'username' => 'sikachu' }})
  105. end
  106. end
  107. def test_no_double_wrap_if_key_exists
  108. with_default_wrapper_options do
  109. @request.env['CONTENT_TYPE'] = 'application/json'
  110. post :parse, { 'user' => { 'username' => 'sikachu' }}
  111. assert_parameters({ 'user' => { 'username' => 'sikachu' }})
  112. end
  113. end
  114. def test_nested_params
  115. with_default_wrapper_options do
  116. @request.env['CONTENT_TYPE'] = 'application/json'
  117. post :parse, { 'person' => { 'username' => 'sikachu' }}
  118. assert_parameters({ 'person' => { 'username' => 'sikachu' }, 'user' => {'person' => { 'username' => 'sikachu' }}})
  119. end
  120. end
  121. def test_derived_wrapped_keys_from_matching_model
  122. User.expects(:respond_to?).with(:accessible_attributes).returns(false)
  123. User.expects(:respond_to?).with(:attribute_names).returns(true)
  124. User.expects(:attribute_names).twice.returns(["username"])
  125. with_default_wrapper_options do
  126. @request.env['CONTENT_TYPE'] = 'application/json'
  127. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  128. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
  129. end
  130. end
  131. def test_derived_wrapped_keys_from_specified_model
  132. with_default_wrapper_options do
  133. Person.expects(:respond_to?).with(:accessible_attributes).returns(false)
  134. Person.expects(:respond_to?).with(:attribute_names).returns(true)
  135. Person.expects(:attribute_names).twice.returns(["username"])
  136. UsersController.wrap_parameters Person
  137. @request.env['CONTENT_TYPE'] = 'application/json'
  138. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  139. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'person' => { 'username' => 'sikachu' }})
  140. end
  141. end
  142. def test_accessible_wrapped_keys_from_matching_model
  143. User.expects(:respond_to?).with(:accessible_attributes).returns(true)
  144. User.expects(:accessible_attributes).with(:default).twice.returns(["username"])
  145. with_default_wrapper_options do
  146. @request.env['CONTENT_TYPE'] = 'application/json'
  147. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  148. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
  149. end
  150. end
  151. def test_accessible_wrapped_keys_from_specified_model
  152. with_default_wrapper_options do
  153. Person.expects(:respond_to?).with(:accessible_attributes).returns(true)
  154. Person.expects(:accessible_attributes).with(:default).twice.returns(["username"])
  155. UsersController.wrap_parameters Person
  156. @request.env['CONTENT_TYPE'] = 'application/json'
  157. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  158. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'person' => { 'username' => 'sikachu' }})
  159. end
  160. end
  161. def test_accessible_wrapped_keys_with_role_from_specified_model
  162. with_default_wrapper_options do
  163. Person.expects(:respond_to?).with(:accessible_attributes).returns(true)
  164. Person.expects(:accessible_attributes).with(:admin).twice.returns(["username"])
  165. UsersController.wrap_parameters Person, :as => :admin
  166. @request.env['CONTENT_TYPE'] = 'application/json'
  167. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  168. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'person' => { 'username' => 'sikachu' }})
  169. end
  170. end
  171. def test_not_wrapping_abstract_model
  172. User.expects(:respond_to?).with(:accessible_attributes).returns(false)
  173. User.expects(:respond_to?).with(:attribute_names).returns(true)
  174. User.expects(:attribute_names).returns([])
  175. with_default_wrapper_options do
  176. @request.env['CONTENT_TYPE'] = 'application/json'
  177. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  178. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu', 'title' => 'Developer' }})
  179. end
  180. end
  181. end
  182. class NamespacedParamsWrapperTest < ActionController::TestCase
  183. include ParamsWrapperTestHelp
  184. module Admin
  185. module Users
  186. class UsersController < ActionController::Base;
  187. class << self
  188. attr_accessor :last_parameters
  189. end
  190. def parse
  191. self.class.last_parameters = request.params.except(:controller, :action)
  192. head :ok
  193. end
  194. end
  195. end
  196. end
  197. class SampleOne
  198. def self.attribute_names
  199. ["username"]
  200. end
  201. end
  202. class SampleTwo
  203. def self.attribute_names
  204. ["title"]
  205. end
  206. end
  207. tests Admin::Users::UsersController
  208. def teardown
  209. Admin::Users::UsersController.last_parameters = nil
  210. end
  211. def test_derived_name_from_controller
  212. with_default_wrapper_options do
  213. @request.env['CONTENT_TYPE'] = 'application/json'
  214. post :parse, { 'username' => 'sikachu' }
  215. assert_parameters({'username' => 'sikachu', 'user' => { 'username' => 'sikachu' }})
  216. end
  217. end
  218. def test_namespace_lookup_from_model
  219. Admin.const_set(:User, Class.new(SampleOne))
  220. begin
  221. with_default_wrapper_options do
  222. @request.env['CONTENT_TYPE'] = 'application/json'
  223. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  224. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
  225. end
  226. ensure
  227. Admin.send :remove_const, :User
  228. end
  229. end
  230. def test_hierarchy_namespace_lookup_from_model
  231. Object.const_set(:User, Class.new(SampleTwo))
  232. begin
  233. with_default_wrapper_options do
  234. @request.env['CONTENT_TYPE'] = 'application/json'
  235. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  236. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'title' => 'Developer' }})
  237. end
  238. ensure
  239. Object.send :remove_const, :User
  240. end
  241. end
  242. end
  243. class AnonymousControllerParamsWrapperTest < ActionController::TestCase
  244. include ParamsWrapperTestHelp
  245. tests(Class.new(ActionController::Base) do
  246. class << self
  247. attr_accessor :last_parameters
  248. end
  249. def parse
  250. self.class.last_parameters = request.params.except(:controller, :action)
  251. head :ok
  252. end
  253. end)
  254. def test_does_not_implicitly_wrap_params
  255. with_default_wrapper_options do
  256. @request.env['CONTENT_TYPE'] = 'application/json'
  257. post :parse, { 'username' => 'sikachu' }
  258. assert_parameters({ 'username' => 'sikachu' })
  259. end
  260. end
  261. def test_does_wrap_params_if_name_provided
  262. with_default_wrapper_options do
  263. @controller.class.wrap_parameters(:name => "guest")
  264. @request.env['CONTENT_TYPE'] = 'application/json'
  265. post :parse, { 'username' => 'sikachu' }
  266. assert_parameters({ 'username' => 'sikachu', 'guest' => { 'username' => 'sikachu' }})
  267. end
  268. end
  269. end
  270. class IrregularInflectionParamsWrapperTest < ActionController::TestCase
  271. include ParamsWrapperTestHelp
  272. class ParamswrappernewsItem
  273. def self.attribute_names
  274. ['test_attr']
  275. end
  276. end
  277. class ParamswrappernewsController < ActionController::Base
  278. class << self
  279. attr_accessor :last_parameters
  280. end
  281. def parse
  282. self.class.last_parameters = request.params.except(:controller, :action)
  283. head :ok
  284. end
  285. end
  286. tests ParamswrappernewsController
  287. def test_uses_model_attribute_names_with_irregular_inflection
  288. ActiveSupport::Inflector.inflections do |inflect|
  289. inflect.irregular 'paramswrappernews_item', 'paramswrappernews'
  290. end
  291. with_default_wrapper_options do
  292. @request.env['CONTENT_TYPE'] = 'application/json'
  293. post :parse, { 'username' => 'sikachu', 'test_attr' => 'test_value' }
  294. assert_parameters({ 'username' => 'sikachu', 'test_attr' => 'test_value', 'paramswrappernews_item' => { 'test_attr' => 'test_value' }})
  295. end
  296. end
  297. end