PageRenderTime 44ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/actionpack/test/controller/params_wrapper_test.rb

https://github.com/zoltan-nz/docrails
Ruby | 330 lines | 272 code | 58 blank | 0 comment | 0 complexity | 3b8e3e380eefcfd6fc50fc41b31d3d5c 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. end
  157. class NamespacedParamsWrapperTest < ActionController::TestCase
  158. include ParamsWrapperTestHelp
  159. module Admin
  160. module Users
  161. class UsersController < ActionController::Base;
  162. class << self
  163. attr_accessor :last_parameters
  164. end
  165. def parse
  166. self.class.last_parameters = request.params.except(:controller, :action)
  167. head :ok
  168. end
  169. end
  170. end
  171. end
  172. class SampleOne
  173. def self.attribute_names
  174. ["username"]
  175. end
  176. end
  177. class SampleTwo
  178. def self.attribute_names
  179. ["title"]
  180. end
  181. end
  182. tests Admin::Users::UsersController
  183. def teardown
  184. Admin::Users::UsersController.last_parameters = nil
  185. end
  186. def test_derived_name_from_controller
  187. with_default_wrapper_options do
  188. @request.env['CONTENT_TYPE'] = 'application/json'
  189. post :parse, { 'username' => 'sikachu' }
  190. assert_parameters({'username' => 'sikachu', 'user' => { 'username' => 'sikachu' }})
  191. end
  192. end
  193. def test_namespace_lookup_from_model
  194. Admin.const_set(:User, Class.new(SampleOne))
  195. begin
  196. with_default_wrapper_options do
  197. @request.env['CONTENT_TYPE'] = 'application/json'
  198. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  199. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'username' => 'sikachu' }})
  200. end
  201. ensure
  202. Admin.send :remove_const, :User
  203. end
  204. end
  205. def test_hierarchy_namespace_lookup_from_model
  206. Object.const_set(:User, Class.new(SampleTwo))
  207. begin
  208. with_default_wrapper_options do
  209. @request.env['CONTENT_TYPE'] = 'application/json'
  210. post :parse, { 'username' => 'sikachu', 'title' => 'Developer' }
  211. assert_parameters({ 'username' => 'sikachu', 'title' => 'Developer', 'user' => { 'title' => 'Developer' }})
  212. end
  213. ensure
  214. Object.send :remove_const, :User
  215. end
  216. end
  217. end
  218. class AnonymousControllerParamsWrapperTest < ActionController::TestCase
  219. include ParamsWrapperTestHelp
  220. tests(Class.new(ActionController::Base) do
  221. class << self
  222. attr_accessor :last_parameters
  223. end
  224. def parse
  225. self.class.last_parameters = request.params.except(:controller, :action)
  226. head :ok
  227. end
  228. end)
  229. def test_does_not_implicitly_wrap_params
  230. with_default_wrapper_options do
  231. @request.env['CONTENT_TYPE'] = 'application/json'
  232. post :parse, { 'username' => 'sikachu' }
  233. assert_parameters({ 'username' => 'sikachu' })
  234. end
  235. end
  236. def test_does_wrap_params_if_name_provided
  237. with_default_wrapper_options do
  238. @controller.class.wrap_parameters(:name => "guest")
  239. @request.env['CONTENT_TYPE'] = 'application/json'
  240. post :parse, { 'username' => 'sikachu' }
  241. assert_parameters({ 'username' => 'sikachu', 'guest' => { 'username' => 'sikachu' }})
  242. end
  243. end
  244. end
  245. class IrregularInflectionParamsWrapperTest < ActionController::TestCase
  246. include ParamsWrapperTestHelp
  247. class ParamswrappernewsItem
  248. def self.attribute_names
  249. ['test_attr']
  250. end
  251. end
  252. class ParamswrappernewsController < ActionController::Base
  253. class << self
  254. attr_accessor :last_parameters
  255. end
  256. def parse
  257. self.class.last_parameters = request.params.except(:controller, :action)
  258. head :ok
  259. end
  260. end
  261. tests ParamswrappernewsController
  262. def test_uses_model_attribute_names_with_irregular_inflection
  263. ActiveSupport::Inflector.inflections do |inflect|
  264. inflect.irregular 'paramswrappernews_item', 'paramswrappernews'
  265. end
  266. with_default_wrapper_options do
  267. @request.env['CONTENT_TYPE'] = 'application/json'
  268. post :parse, { 'username' => 'sikachu', 'test_attr' => 'test_value' }
  269. assert_parameters({ 'username' => 'sikachu', 'test_attr' => 'test_value', 'paramswrappernews_item' => { 'test_attr' => 'test_value' }})
  270. end
  271. end
  272. end