PageRenderTime 27ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/actionpack/test/controller/params_wrapper_test.rb

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