PageRenderTime 42ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/actionpack/test/controller/params_wrapper_test.rb

https://github.com/zooks-zz/rails
Ruby | 287 lines | 237 code | 50 blank | 0 comment | 0 complexity | 4243ad3a656f72a574205f23a172fd38 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(:attribute_names).returns(true)
  123. User.expects(:attribute_names).twice.returns(["username"])
  124. with_default_wrapper_options do
  125. @request.env['CONTENT_TYPE'] = 'application/json'
  126. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  127. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
  128. end
  129. end
  130. def test_derived_wrapped_keys_from_specified_model
  131. with_default_wrapper_options do
  132. Person.expects(:respond_to?).with(:attribute_names).returns(true)
  133. Person.expects(:attribute_names).twice.returns(["username"])
  134. UsersController.wrap_parameters Person
  135. @request.env['CONTENT_TYPE'] = 'application/json'
  136. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  137. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'person' => { 'username' => 'sikachu' }})
  138. end
  139. end
  140. def test_not_wrapping_abstract_model
  141. User.expects(:respond_to?).with(:attribute_names).returns(true)
  142. User.expects(:attribute_names).returns([])
  143. with_default_wrapper_options do
  144. @request.env['CONTENT_TYPE'] = 'application/json'
  145. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  146. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu', 'title' => 'Developer' }})
  147. end
  148. end
  149. end
  150. class NamespacedParamsWrapperTest < ActionController::TestCase
  151. include ParamsWrapperTestHelp
  152. module Admin
  153. module Users
  154. class UsersController < ActionController::Base;
  155. class << self
  156. attr_accessor :last_parameters
  157. end
  158. def parse
  159. self.class.last_parameters = request.params.except(:controller, :action)
  160. head :ok
  161. end
  162. end
  163. end
  164. end
  165. class SampleOne
  166. def self.attribute_names
  167. ["username"]
  168. end
  169. end
  170. class SampleTwo
  171. def self.attribute_names
  172. ["title"]
  173. end
  174. end
  175. tests Admin::Users::UsersController
  176. def teardown
  177. Admin::Users::UsersController.last_parameters = nil
  178. end
  179. def test_derived_name_from_controller
  180. with_default_wrapper_options do
  181. @request.env['CONTENT_TYPE'] = 'application/json'
  182. post :parse, { 'username' => 'sikachu' }
  183. assert_parameters({'username' => 'sikachu', 'user' => { 'username' => 'sikachu' }})
  184. end
  185. end
  186. def test_namespace_lookup_from_model
  187. Admin.const_set(:User, Class.new(SampleOne))
  188. begin
  189. with_default_wrapper_options do
  190. @request.env['CONTENT_TYPE'] = 'application/json'
  191. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  192. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
  193. end
  194. ensure
  195. Admin.send :remove_const, :User
  196. end
  197. end
  198. def test_hierarchy_namespace_lookup_from_model
  199. Object.const_set(:User, Class.new(SampleTwo))
  200. begin
  201. with_default_wrapper_options do
  202. @request.env['CONTENT_TYPE'] = 'application/json'
  203. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  204. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'title' => 'Developer' }})
  205. end
  206. ensure
  207. Object.send :remove_const, :User
  208. end
  209. end
  210. end
  211. class AnonymousControllerParamsWrapperTest < ActionController::TestCase
  212. include ParamsWrapperTestHelp
  213. tests(Class.new(ActionController::Base) do
  214. class << self
  215. attr_accessor :last_parameters
  216. end
  217. def parse
  218. self.class.last_parameters = request.params.except(:controller, :action)
  219. head :ok
  220. end
  221. end)
  222. def test_does_not_implicitly_wrap_params
  223. with_default_wrapper_options do
  224. @request.env['CONTENT_TYPE'] = 'application/json'
  225. post :parse, { 'username' => 'sikachu' }
  226. assert_parameters({ 'username' => 'sikachu' })
  227. end
  228. end
  229. def test_does_wrap_params_if_name_provided
  230. with_default_wrapper_options do
  231. @controller.class.wrap_parameters(:name => "guest")
  232. @request.env['CONTENT_TYPE'] = 'application/json'
  233. post :parse, { 'username' => 'sikachu' }
  234. assert_parameters({ 'username' => 'sikachu', 'guest' => { 'username' => 'sikachu' }})
  235. end
  236. end
  237. end