actionpack_csi 2.3.5.p6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. data/CHANGELOG +5184 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +160 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller/assertions/dom_assertions.rb +55 -0
  8. data/lib/action_controller/assertions/model_assertions.rb +21 -0
  9. data/lib/action_controller/assertions/response_assertions.rb +160 -0
  10. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  11. data/lib/action_controller/assertions/selector_assertions.rb +638 -0
  12. data/lib/action_controller/assertions/tag_assertions.rb +127 -0
  13. data/lib/action_controller/base.rb +1423 -0
  14. data/lib/action_controller/benchmarking.rb +107 -0
  15. data/lib/action_controller/caching/actions.rb +177 -0
  16. data/lib/action_controller/caching/fragments.rb +120 -0
  17. data/lib/action_controller/caching/pages.rb +152 -0
  18. data/lib/action_controller/caching/sweeper.rb +45 -0
  19. data/lib/action_controller/caching/sweeping.rb +55 -0
  20. data/lib/action_controller/caching.rb +71 -0
  21. data/lib/action_controller/cgi_ext/cookie.rb +112 -0
  22. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  23. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  24. data/lib/action_controller/cgi_ext.rb +15 -0
  25. data/lib/action_controller/cgi_process.rb +77 -0
  26. data/lib/action_controller/cookies.rb +95 -0
  27. data/lib/action_controller/dispatcher.rb +133 -0
  28. data/lib/action_controller/failsafe.rb +86 -0
  29. data/lib/action_controller/filters.rb +680 -0
  30. data/lib/action_controller/flash.rb +171 -0
  31. data/lib/action_controller/headers.rb +33 -0
  32. data/lib/action_controller/helpers.rb +225 -0
  33. data/lib/action_controller/http_authentication.rb +309 -0
  34. data/lib/action_controller/integration.rb +692 -0
  35. data/lib/action_controller/layout.rb +286 -0
  36. data/lib/action_controller/middleware_stack.rb +119 -0
  37. data/lib/action_controller/middlewares.rb +14 -0
  38. data/lib/action_controller/mime_responds.rb +193 -0
  39. data/lib/action_controller/mime_type.rb +212 -0
  40. data/lib/action_controller/mime_types.rb +21 -0
  41. data/lib/action_controller/params_parser.rb +77 -0
  42. data/lib/action_controller/performance_test.rb +15 -0
  43. data/lib/action_controller/polymorphic_routes.rb +189 -0
  44. data/lib/action_controller/rack_lint_patch.rb +36 -0
  45. data/lib/action_controller/record_identifier.rb +104 -0
  46. data/lib/action_controller/reloader.rb +54 -0
  47. data/lib/action_controller/request.rb +493 -0
  48. data/lib/action_controller/request_forgery_protection.rb +113 -0
  49. data/lib/action_controller/rescue.rb +183 -0
  50. data/lib/action_controller/resources.rb +682 -0
  51. data/lib/action_controller/response.rb +239 -0
  52. data/lib/action_controller/routing/builder.rb +197 -0
  53. data/lib/action_controller/routing/optimisations.rb +130 -0
  54. data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  55. data/lib/action_controller/routing/route.rb +265 -0
  56. data/lib/action_controller/routing/route_set.rb +502 -0
  57. data/lib/action_controller/routing/routing_ext.rb +49 -0
  58. data/lib/action_controller/routing/segments.rb +343 -0
  59. data/lib/action_controller/routing.rb +388 -0
  60. data/lib/action_controller/session/abstract_store.rb +181 -0
  61. data/lib/action_controller/session/cookie_store.rb +221 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +51 -0
  63. data/lib/action_controller/session_management.rb +54 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +181 -0
  66. data/lib/action_controller/string_coercion.rb +29 -0
  67. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  68. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  69. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  70. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  71. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  72. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  73. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  74. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  75. data/lib/action_controller/test_case.rb +209 -0
  76. data/lib/action_controller/test_process.rb +580 -0
  77. data/lib/action_controller/translation.rb +13 -0
  78. data/lib/action_controller/uploaded_file.rb +44 -0
  79. data/lib/action_controller/url_rewriter.rb +216 -0
  80. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  81. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  82. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  83. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  84. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  85. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  86. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  87. data/lib/action_controller/verification.rb +130 -0
  88. data/lib/action_controller.rb +113 -0
  89. data/lib/action_pack/version.rb +9 -0
  90. data/lib/action_pack.rb +24 -0
  91. data/lib/action_view/base.rb +362 -0
  92. data/lib/action_view/erb/util.rb +44 -0
  93. data/lib/action_view/helpers/active_record_helper.rb +305 -0
  94. data/lib/action_view/helpers/asset_tag_helper.rb +694 -0
  95. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  96. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  97. data/lib/action_view/helpers/cache_helper.rb +39 -0
  98. data/lib/action_view/helpers/capture_helper.rb +136 -0
  99. data/lib/action_view/helpers/date_helper.rb +988 -0
  100. data/lib/action_view/helpers/debug_helper.rb +38 -0
  101. data/lib/action_view/helpers/form_helper.rb +1074 -0
  102. data/lib/action_view/helpers/form_options_helper.rb +600 -0
  103. data/lib/action_view/helpers/form_tag_helper.rb +487 -0
  104. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  105. data/lib/action_view/helpers/number_helper.rb +308 -0
  106. data/lib/action_view/helpers/prototype_helper.rb +1305 -0
  107. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  108. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  109. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  110. data/lib/action_view/helpers/sanitize_helper.rb +259 -0
  111. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  112. data/lib/action_view/helpers/tag_helper.rb +150 -0
  113. data/lib/action_view/helpers/text_helper.rb +587 -0
  114. data/lib/action_view/helpers/translation_helper.rb +39 -0
  115. data/lib/action_view/helpers/url_helper.rb +639 -0
  116. data/lib/action_view/helpers.rb +59 -0
  117. data/lib/action_view/inline_template.rb +19 -0
  118. data/lib/action_view/locale/en.yml +117 -0
  119. data/lib/action_view/partials.rb +240 -0
  120. data/lib/action_view/paths.rb +69 -0
  121. data/lib/action_view/reloadable_template.rb +117 -0
  122. data/lib/action_view/renderable.rb +95 -0
  123. data/lib/action_view/renderable_partial.rb +47 -0
  124. data/lib/action_view/safe_buffer.rb +28 -0
  125. data/lib/action_view/template.rb +252 -0
  126. data/lib/action_view/template_error.rb +99 -0
  127. data/lib/action_view/template_handler.rb +34 -0
  128. data/lib/action_view/template_handlers/builder.rb +17 -0
  129. data/lib/action_view/template_handlers/erb.rb +22 -0
  130. data/lib/action_view/template_handlers/rjs.rb +13 -0
  131. data/lib/action_view/template_handlers.rb +48 -0
  132. data/lib/action_view/test_case.rb +162 -0
  133. data/lib/action_view.rb +58 -0
  134. data/lib/actionpack.rb +2 -0
  135. data/test/abstract_unit.rb +61 -0
  136. data/test/active_record_unit.rb +104 -0
  137. data/test/activerecord/active_record_store_test.rb +174 -0
  138. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  139. data/test/adv_attr_test.rb +20 -0
  140. data/test/controller/action_pack_assertions_test.rb +543 -0
  141. data/test/controller/addresses_render_test.rb +37 -0
  142. data/test/controller/assert_select_test.rb +734 -0
  143. data/test/controller/base_test.rb +217 -0
  144. data/test/controller/benchmark_test.rb +32 -0
  145. data/test/controller/caching_test.rb +729 -0
  146. data/test/controller/capture_test.rb +66 -0
  147. data/test/controller/content_type_test.rb +168 -0
  148. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  150. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  151. data/test/controller/cookie_test.rb +134 -0
  152. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  153. data/test/controller/dispatcher_test.rb +144 -0
  154. data/test/controller/dom_assertions_test.rb +53 -0
  155. data/test/controller/failsafe_test.rb +60 -0
  156. data/test/controller/fake_controllers.rb +33 -0
  157. data/test/controller/fake_models.rb +19 -0
  158. data/test/controller/filter_params_test.rb +52 -0
  159. data/test/controller/filters_test.rb +885 -0
  160. data/test/controller/flash_test.rb +147 -0
  161. data/test/controller/header_test.rb +14 -0
  162. data/test/controller/helper_test.rb +224 -0
  163. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  164. data/test/controller/html-scanner/document_test.rb +148 -0
  165. data/test/controller/html-scanner/node_test.rb +89 -0
  166. data/test/controller/html-scanner/sanitizer_test.rb +274 -0
  167. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  168. data/test/controller/html-scanner/text_node_test.rb +50 -0
  169. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  170. data/test/controller/http_basic_authentication_test.rb +113 -0
  171. data/test/controller/http_digest_authentication_test.rb +254 -0
  172. data/test/controller/integration_test.rb +483 -0
  173. data/test/controller/layout_test.rb +215 -0
  174. data/test/controller/logging_test.rb +46 -0
  175. data/test/controller/middleware_stack_test.rb +90 -0
  176. data/test/controller/mime_responds_test.rb +536 -0
  177. data/test/controller/mime_type_test.rb +93 -0
  178. data/test/controller/polymorphic_routes_test.rb +297 -0
  179. data/test/controller/rack_test.rb +311 -0
  180. data/test/controller/record_identifier_test.rb +139 -0
  181. data/test/controller/redirect_test.rb +285 -0
  182. data/test/controller/reloader_test.rb +124 -0
  183. data/test/controller/render_test.rb +1762 -0
  184. data/test/controller/request/json_params_parsing_test.rb +65 -0
  185. data/test/controller/request/multipart_params_parsing_test.rb +162 -0
  186. data/test/controller/request/query_string_parsing_test.rb +120 -0
  187. data/test/controller/request/test_request_test.rb +35 -0
  188. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  189. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  190. data/test/controller/request_forgery_protection_test.rb +265 -0
  191. data/test/controller/request_test.rb +395 -0
  192. data/test/controller/rescue_test.rb +536 -0
  193. data/test/controller/resources_test.rb +1393 -0
  194. data/test/controller/routing_test.rb +2591 -0
  195. data/test/controller/selector_test.rb +628 -0
  196. data/test/controller/send_file_test.rb +171 -0
  197. data/test/controller/session/cookie_store_test.rb +216 -0
  198. data/test/controller/session/mem_cache_store_test.rb +127 -0
  199. data/test/controller/session/test_session_test.rb +58 -0
  200. data/test/controller/test_test.rb +700 -0
  201. data/test/controller/translation_test.rb +26 -0
  202. data/test/controller/url_rewriter_test.rb +385 -0
  203. data/test/controller/verification_test.rb +270 -0
  204. data/test/controller/view_paths_test.rb +141 -0
  205. data/test/controller/webservice_test.rb +273 -0
  206. data/test/fixtures/_top_level_partial.html.erb +1 -0
  207. data/test/fixtures/_top_level_partial_only.erb +1 -0
  208. data/test/fixtures/addresses/list.erb +1 -0
  209. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  210. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  211. data/test/fixtures/companies.yml +24 -0
  212. data/test/fixtures/company.rb +10 -0
  213. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  214. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  215. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  216. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  217. data/test/fixtures/customers/_customer.html.erb +1 -0
  218. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  219. data/test/fixtures/developer.rb +9 -0
  220. data/test/fixtures/developers/_developer.erb +1 -0
  221. data/test/fixtures/developers.yml +21 -0
  222. data/test/fixtures/developers_projects.yml +13 -0
  223. data/test/fixtures/failsafe/500.html +1 -0
  224. data/test/fixtures/fun/games/_game.erb +1 -0
  225. data/test/fixtures/fun/games/hello_world.erb +1 -0
  226. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  227. data/test/fixtures/functional_caching/_partial.erb +3 -0
  228. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  229. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  231. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  232. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  233. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  235. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  236. data/test/fixtures/helpers/abc_helper.rb +5 -0
  237. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  238. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  239. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  240. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  241. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  242. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  243. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  244. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  246. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  247. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  248. data/test/fixtures/layouts/_column.html.erb +2 -0
  249. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  250. data/test/fixtures/layouts/builder.builder +3 -0
  251. data/test/fixtures/layouts/default_html.html.erb +1 -0
  252. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  253. data/test/fixtures/layouts/standard.erb +1 -0
  254. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  255. data/test/fixtures/layouts/xhr.html.erb +2 -0
  256. data/test/fixtures/layouts/yield.erb +2 -0
  257. data/test/fixtures/mascot.rb +3 -0
  258. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  259. data/test/fixtures/mascots.yml +4 -0
  260. data/test/fixtures/multipart/binary_file +0 -0
  261. data/test/fixtures/multipart/boundary_problem_file +10 -0
  262. data/test/fixtures/multipart/bracketed_param +5 -0
  263. data/test/fixtures/multipart/empty +10 -0
  264. data/test/fixtures/multipart/hello.txt +1 -0
  265. data/test/fixtures/multipart/large_text_file +10 -0
  266. data/test/fixtures/multipart/mixed_files +0 -0
  267. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  268. data/test/fixtures/multipart/none +9 -0
  269. data/test/fixtures/multipart/single_parameter +5 -0
  270. data/test/fixtures/multipart/text_file +10 -0
  271. data/test/fixtures/override/test/hello_world.erb +1 -0
  272. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  273. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  274. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  275. data/test/fixtures/post_test/post/index.html.erb +1 -0
  276. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  277. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  278. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  279. data/test/fixtures/project.rb +3 -0
  280. data/test/fixtures/projects/_project.erb +1 -0
  281. data/test/fixtures/projects.yml +7 -0
  282. data/test/fixtures/public/404.html +1 -0
  283. data/test/fixtures/public/500.da.html +1 -0
  284. data/test/fixtures/public/500.html +1 -0
  285. data/test/fixtures/public/absolute/test.css +23 -0
  286. data/test/fixtures/public/absolute/test.js +63 -0
  287. data/test/fixtures/public/images/rails.png +0 -0
  288. data/test/fixtures/public/javascripts/application.js +1 -0
  289. data/test/fixtures/public/javascripts/bank.js +1 -0
  290. data/test/fixtures/public/javascripts/controls.js +1 -0
  291. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  292. data/test/fixtures/public/javascripts/effects.js +1 -0
  293. data/test/fixtures/public/javascripts/prototype.js +1 -0
  294. data/test/fixtures/public/javascripts/robber.js +1 -0
  295. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  296. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  297. data/test/fixtures/public/stylesheets/bank.css +1 -0
  298. data/test/fixtures/public/stylesheets/robber.css +1 -0
  299. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  300. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  301. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  302. data/test/fixtures/replies/_reply.erb +1 -0
  303. data/test/fixtures/replies.yml +15 -0
  304. data/test/fixtures/reply.rb +7 -0
  305. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  306. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  307. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  308. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  309. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  310. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  311. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  312. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  313. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  314. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  315. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  316. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  318. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  319. data/test/fixtures/scope/test/modgreet.erb +1 -0
  320. data/test/fixtures/shared.html.erb +1 -0
  321. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  322. data/test/fixtures/test/_counter.html.erb +1 -0
  323. data/test/fixtures/test/_customer.erb +1 -0
  324. data/test/fixtures/test/_customer_counter.erb +1 -0
  325. data/test/fixtures/test/_customer_greeting.erb +1 -0
  326. data/test/fixtures/test/_customer_with_var.erb +1 -0
  327. data/test/fixtures/test/_form.erb +1 -0
  328. data/test/fixtures/test/_from_helper.erb +1 -0
  329. data/test/fixtures/test/_hash_greeting.erb +1 -0
  330. data/test/fixtures/test/_hash_object.erb +2 -0
  331. data/test/fixtures/test/_hello.builder +1 -0
  332. data/test/fixtures/test/_labelling_form.erb +1 -0
  333. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  334. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  335. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  336. data/test/fixtures/test/_one.html.erb +1 -0
  337. data/test/fixtures/test/_partial.erb +1 -0
  338. data/test/fixtures/test/_partial.html.erb +1 -0
  339. data/test/fixtures/test/_partial.js.erb +1 -0
  340. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  341. data/test/fixtures/test/_partial_only.erb +1 -0
  342. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  343. data/test/fixtures/test/_person.erb +2 -0
  344. data/test/fixtures/test/_raise.html.erb +1 -0
  345. data/test/fixtures/test/_two.html.erb +1 -0
  346. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  347. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  348. data/test/fixtures/test/capturing.erb +4 -0
  349. data/test/fixtures/test/content_for.erb +2 -0
  350. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  351. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  352. data/test/fixtures/test/delete_with_js.rjs +2 -0
  353. data/test/fixtures/test/dont_pick_me +1 -0
  354. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  355. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  356. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  357. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  358. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  359. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  360. data/test/fixtures/test/greeting.erb +1 -0
  361. data/test/fixtures/test/greeting.js.rjs +1 -0
  362. data/test/fixtures/test/hello.builder +4 -0
  363. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  364. data/test/fixtures/test/hello_world.erb +1 -0
  365. data/test/fixtures/test/hello_world.erb~ +1 -0
  366. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  367. data/test/fixtures/test/hello_world_container.builder +3 -0
  368. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  369. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  370. data/test/fixtures/test/hello_xml_world.builder +11 -0
  371. data/test/fixtures/test/hyphen-ated.erb +1 -0
  372. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  373. data/test/fixtures/test/list.erb +1 -0
  374. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  375. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  376. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  377. data/test/fixtures/test/nested_layout.erb +3 -0
  378. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  379. data/test/fixtures/test/potential_conflicts.erb +4 -0
  380. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  381. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  382. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  383. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  384. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  385. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  386. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  387. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  388. data/test/fixtures/test/render_to_string_test.erb +1 -0
  389. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  390. data/test/fixtures/test/template.erb +1 -0
  391. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  392. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  393. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  394. data/test/fixtures/test/utf8.html.erb +2 -0
  395. data/test/fixtures/topic.rb +3 -0
  396. data/test/fixtures/topics/_topic.html.erb +1 -0
  397. data/test/fixtures/topics.yml +22 -0
  398. data/test/template/active_record_helper_i18n_test.rb +44 -0
  399. data/test/template/active_record_helper_test.rb +302 -0
  400. data/test/template/asset_tag_helper_test.rb +771 -0
  401. data/test/template/atom_feed_helper_test.rb +315 -0
  402. data/test/template/benchmark_helper_test.rb +86 -0
  403. data/test/template/compiled_templates_test.rb +204 -0
  404. data/test/template/date_helper_i18n_test.rb +121 -0
  405. data/test/template/date_helper_test.rb +2485 -0
  406. data/test/template/erb_util_test.rb +24 -0
  407. data/test/template/form_helper_test.rb +1393 -0
  408. data/test/template/form_options_helper_i18n_test.rb +27 -0
  409. data/test/template/form_options_helper_test.rb +807 -0
  410. data/test/template/form_tag_helper_test.rb +344 -0
  411. data/test/template/javascript_helper_test.rb +106 -0
  412. data/test/template/number_helper_i18n_test.rb +69 -0
  413. data/test/template/number_helper_test.rb +132 -0
  414. data/test/template/prototype_helper_test.rb +639 -0
  415. data/test/template/raw_output_helper_test.rb +21 -0
  416. data/test/template/record_tag_helper_test.rb +58 -0
  417. data/test/template/render_test.rb +290 -0
  418. data/test/template/sanitize_helper_test.rb +57 -0
  419. data/test/template/scriptaculous_helper_test.rb +90 -0
  420. data/test/template/tag_helper_test.rb +98 -0
  421. data/test/template/template_test.rb +32 -0
  422. data/test/template/test_test.rb +54 -0
  423. data/test/template/text_helper_test.rb +543 -0
  424. data/test/template/translation_helper_test.rb +32 -0
  425. data/test/template/url_helper_test.rb +622 -0
  426. data/test/testing_sandbox.rb +15 -0
  427. data/test/view/safe_buffer_test.rb +36 -0
  428. data/test/view/test_case_test.rb +176 -0
  429. metadata +531 -0
@@ -0,0 +1,65 @@
1
+ require 'abstract_unit'
2
+
3
+ class JsonParamsParsingTest < ActionController::IntegrationTest
4
+ class TestController < ActionController::Base
5
+ class << self
6
+ attr_accessor :last_request_parameters
7
+ end
8
+
9
+ def parse
10
+ self.class.last_request_parameters = request.request_parameters
11
+ head :ok
12
+ end
13
+ end
14
+
15
+ def teardown
16
+ TestController.last_request_parameters = nil
17
+ end
18
+
19
+ test "parses json params for application json" do
20
+ assert_parses(
21
+ {"person" => {"name" => "David"}},
22
+ "{\"person\": {\"name\": \"David\"}}", { 'CONTENT_TYPE' => 'application/json' }
23
+ )
24
+ end
25
+
26
+ test "parses json params for application jsonrequest" do
27
+ assert_parses(
28
+ {"person" => {"name" => "David"}},
29
+ "{\"person\": {\"name\": \"David\"}}", { 'CONTENT_TYPE' => 'application/jsonrequest' }
30
+ )
31
+ end
32
+
33
+ test "logs error if parsing unsuccessful" do
34
+ with_test_routing do
35
+ begin
36
+ $stderr = StringIO.new
37
+ json = "[\"person]\": {\"name\": \"David\"}}"
38
+ post "/parse", json, {'CONTENT_TYPE' => 'application/json'}
39
+ assert_response :error
40
+ $stderr.rewind && err = $stderr.read
41
+ assert err =~ /Error occurred while parsing request parameters/
42
+ ensure
43
+ $stderr = STDERR
44
+ end
45
+ end
46
+ end
47
+
48
+ private
49
+ def assert_parses(expected, actual, headers = {})
50
+ with_test_routing do
51
+ post "/parse", actual, headers
52
+ assert_response :ok
53
+ assert_equal(expected, TestController.last_request_parameters)
54
+ end
55
+ end
56
+
57
+ def with_test_routing
58
+ with_routing do |set|
59
+ set.draw do |map|
60
+ map.connect ':action', :controller => "json_params_parsing_test/test"
61
+ end
62
+ yield
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,162 @@
1
+ require 'abstract_unit'
2
+
3
+ class MultipartParamsParsingTest < ActionController::IntegrationTest
4
+ class TestController < ActionController::Base
5
+ class << self
6
+ attr_accessor :last_request_parameters
7
+ end
8
+
9
+ def parse
10
+ self.class.last_request_parameters = request.request_parameters
11
+ head :ok
12
+ end
13
+
14
+ def read
15
+ render :text => "File: #{params[:uploaded_data].read}"
16
+ end
17
+ end
18
+
19
+ FIXTURE_PATH = File.dirname(__FILE__) + '/../../fixtures/multipart'
20
+
21
+ def teardown
22
+ TestController.last_request_parameters = nil
23
+ end
24
+
25
+ test "parses single parameter" do
26
+ assert_equal({ 'foo' => 'bar' }, parse_multipart('single_parameter'))
27
+ end
28
+
29
+ test "parses bracketed parameters" do
30
+ assert_equal({ 'foo' => { 'baz' => 'bar'}}, parse_multipart('bracketed_param'))
31
+ end
32
+
33
+ test "parses text file" do
34
+ params = parse_multipart('text_file')
35
+ assert_equal %w(file foo), params.keys.sort
36
+ assert_equal 'bar', params['foo']
37
+
38
+ file = params['file']
39
+ assert_kind_of Tempfile, file
40
+ assert_equal 'file.txt', file.original_filename
41
+ assert_equal "text/plain", file.content_type
42
+ assert_equal 'contents', file.read
43
+ end
44
+
45
+ test "parses boundary problem file" do
46
+ params = parse_multipart('boundary_problem_file')
47
+ assert_equal %w(file foo), params.keys.sort
48
+
49
+ file = params['file']
50
+ foo = params['foo']
51
+
52
+ assert_kind_of Tempfile, file
53
+
54
+ assert_equal 'file.txt', file.original_filename
55
+ assert_equal "text/plain", file.content_type
56
+
57
+ assert_equal 'bar', foo
58
+ end
59
+
60
+ test "parses large text file" do
61
+ params = parse_multipart('large_text_file')
62
+ assert_equal %w(file foo), params.keys.sort
63
+ assert_equal 'bar', params['foo']
64
+
65
+ file = params['file']
66
+
67
+ assert_kind_of Tempfile, file
68
+
69
+ assert_equal 'file.txt', file.original_filename
70
+ assert_equal "text/plain", file.content_type
71
+ assert ('a' * 20480) == file.read
72
+ end
73
+
74
+ test "parses binary file" do
75
+ params = parse_multipart('binary_file')
76
+ assert_equal %w(file flowers foo), params.keys.sort
77
+ assert_equal 'bar', params['foo']
78
+
79
+ file = params['file']
80
+ assert_kind_of Tempfile, file
81
+ assert_equal 'file.csv', file.original_filename
82
+ assert_nil file.content_type
83
+ assert_equal 'contents', file.read
84
+
85
+ file = params['flowers']
86
+ assert_kind_of Tempfile, file
87
+ assert_equal 'flowers.jpg', file.original_filename
88
+ assert_equal "image/jpeg", file.content_type
89
+ assert_equal 19512, file.size
90
+ end
91
+
92
+ test "parses mixed files" do
93
+ params = parse_multipart('mixed_files')
94
+ assert_equal %w(files foo), params.keys.sort
95
+ assert_equal 'bar', params['foo']
96
+
97
+ # Ruby CGI doesn't handle multipart/mixed for us.
98
+ files = params['files']
99
+ assert_kind_of Tempfile, files
100
+ files.force_encoding('ASCII-8BIT') if files.respond_to?(:force_encoding)
101
+ assert_equal 19756, files.size
102
+ end
103
+
104
+ test "does not create tempfile if no file has been selected" do
105
+ params = parse_multipart('none')
106
+ assert_equal %w(submit-name), params.keys.sort
107
+ assert_equal 'Larry', params['submit-name']
108
+ assert_equal nil, params['files']
109
+ end
110
+
111
+ test "parses empty upload file" do
112
+ params = parse_multipart('empty')
113
+ assert_equal %w(files submit-name), params.keys.sort
114
+ assert_equal 'Larry', params['submit-name']
115
+ assert params['files']
116
+ assert_equal "", params['files'].read
117
+ end
118
+
119
+ test "uploads and reads binary file" do
120
+ with_test_routing do
121
+ fixture = FIXTURE_PATH + "/mona_lisa.jpg"
122
+ params = { :uploaded_data => fixture_file_upload(fixture, "image/jpg") }
123
+ post '/read', params
124
+ expected_length = 'File: '.length + File.size(fixture)
125
+ assert_equal expected_length, response.content_length
126
+ end
127
+ end
128
+
129
+ test "uploads and reads file" do
130
+ with_test_routing do
131
+ post '/read', :uploaded_data => fixture_file_upload(FIXTURE_PATH + "/hello.txt", "text/plain")
132
+ assert_equal "File: Hello", response.body
133
+ end
134
+ end
135
+
136
+ private
137
+ def fixture(name)
138
+ File.open(File.join(FIXTURE_PATH, name), 'rb') do |file|
139
+ { "rack.input" => file.read,
140
+ "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
141
+ "CONTENT_LENGTH" => file.stat.size.to_s }
142
+ end
143
+ end
144
+
145
+ def parse_multipart(name)
146
+ with_test_routing do
147
+ headers = fixture(name)
148
+ post "/parse", headers.delete("rack.input"), headers
149
+ assert_response :ok
150
+ TestController.last_request_parameters
151
+ end
152
+ end
153
+
154
+ def with_test_routing
155
+ with_routing do |set|
156
+ set.draw do |map|
157
+ map.connect ':action', :controller => "multipart_params_parsing_test/test"
158
+ end
159
+ yield
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,120 @@
1
+ require 'abstract_unit'
2
+
3
+ class QueryStringParsingTest < ActionController::IntegrationTest
4
+ class TestController < ActionController::Base
5
+ class << self
6
+ attr_accessor :last_query_parameters
7
+ end
8
+
9
+ def parse
10
+ self.class.last_query_parameters = request.query_parameters
11
+ head :ok
12
+ end
13
+ end
14
+
15
+ def teardown
16
+ TestController.last_query_parameters = nil
17
+ end
18
+
19
+ test "query string" do
20
+ assert_parses(
21
+ {"action" => "create_customer", "full_name" => "David Heinemeier Hansson", "customerId" => "1"},
22
+ "action=create_customer&full_name=David%20Heinemeier%20Hansson&customerId=1"
23
+ )
24
+ end
25
+
26
+ test "deep query string" do
27
+ assert_parses(
28
+ {'x' => {'y' => {'z' => '10'}}},
29
+ "x[y][z]=10"
30
+ )
31
+ end
32
+
33
+ test "deep query string with array" do
34
+ assert_parses({'x' => {'y' => {'z' => ['10']}}}, 'x[y][z][]=10')
35
+ assert_parses({'x' => {'y' => {'z' => ['10', '5']}}}, 'x[y][z][]=10&x[y][z][]=5')
36
+ end
37
+
38
+ test "deep query string with array of hash" do
39
+ assert_parses({'x' => {'y' => [{'z' => '10'}]}}, 'x[y][][z]=10')
40
+ assert_parses({'x' => {'y' => [{'z' => '10', 'w' => '10'}]}}, 'x[y][][z]=10&x[y][][w]=10')
41
+ assert_parses({'x' => {'y' => [{'z' => '10', 'v' => {'w' => '10'}}]}}, 'x[y][][z]=10&x[y][][v][w]=10')
42
+ end
43
+
44
+ test "deep query string with array of hashes with one pair" do
45
+ assert_parses({'x' => {'y' => [{'z' => '10'}, {'z' => '20'}]}}, 'x[y][][z]=10&x[y][][z]=20')
46
+ end
47
+
48
+ test "deep query string with array of hashes with multiple pairs" do
49
+ assert_parses(
50
+ {'x' => {'y' => [{'z' => '10', 'w' => 'a'}, {'z' => '20', 'w' => 'b'}]}},
51
+ 'x[y][][z]=10&x[y][][w]=a&x[y][][z]=20&x[y][][w]=b'
52
+ )
53
+ end
54
+
55
+ test "query string with nil" do
56
+ assert_parses(
57
+ { "action" => "create_customer", "full_name" => ''},
58
+ "action=create_customer&full_name="
59
+ )
60
+ end
61
+
62
+ test "query string with array" do
63
+ assert_parses(
64
+ { "action" => "create_customer", "selected" => ["1", "2", "3"]},
65
+ "action=create_customer&selected[]=1&selected[]=2&selected[]=3"
66
+ )
67
+ end
68
+
69
+ test "query string with amps" do
70
+ assert_parses(
71
+ { "action" => "create_customer", "name" => "Don't & Does"},
72
+ "action=create_customer&name=Don%27t+%26+Does"
73
+ )
74
+ end
75
+
76
+ test "query string with many equal" do
77
+ assert_parses(
78
+ { "action" => "create_customer", "full_name" => "abc=def=ghi"},
79
+ "action=create_customer&full_name=abc=def=ghi"
80
+ )
81
+ end
82
+
83
+ test "query string without equal" do
84
+ assert_parses({ "action" => nil }, "action")
85
+ end
86
+
87
+ test "query string with empty key" do
88
+ assert_parses(
89
+ { "action" => "create_customer", "full_name" => "David Heinemeier Hansson" },
90
+ "action=create_customer&full_name=David%20Heinemeier%20Hansson&=Save"
91
+ )
92
+ end
93
+
94
+ test "query string with many ampersands" do
95
+ assert_parses(
96
+ { "action" => "create_customer", "full_name" => "David Heinemeier Hansson"},
97
+ "&action=create_customer&&&full_name=David%20Heinemeier%20Hansson"
98
+ )
99
+ end
100
+
101
+ test "unbalanced query string with array" do
102
+ assert_parses(
103
+ {'location' => ["1", "2"], 'age_group' => ["2"]},
104
+ "location[]=1&location[]=2&age_group[]=2"
105
+ )
106
+ end
107
+
108
+ private
109
+ def assert_parses(expected, actual)
110
+ with_routing do |set|
111
+ set.draw do |map|
112
+ map.connect ':action', :controller => "query_string_parsing_test/test"
113
+ end
114
+
115
+ get "/parse", actual
116
+ assert_response :ok
117
+ assert_equal(expected, TestController.last_query_parameters)
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,35 @@
1
+ require 'abstract_unit'
2
+ require 'stringio'
3
+
4
+ class ActionController::TestRequestTest < ActiveSupport::TestCase
5
+
6
+ def setup
7
+ @request = ActionController::TestRequest.new
8
+ end
9
+
10
+ def test_test_request_has_session_options_initialized
11
+ assert @request.session_options
12
+ end
13
+
14
+ Rack::Session::Abstract::ID::DEFAULT_OPTIONS.each_key do |option|
15
+ test "test_rack_default_session_options_#{option}_exists_in_session_options_and_is_default" do
16
+ assert_equal(Rack::Session::Abstract::ID::DEFAULT_OPTIONS[option],
17
+ @request.session_options[option],
18
+ "Missing rack session default option #{option} in request.session_options")
19
+ end
20
+ test "test_rack_default_session_options_#{option}_exists_in_session_options" do
21
+ assert(@request.session_options.has_key?(option),
22
+ "Missing rack session option #{option} in request.session_options")
23
+ end
24
+ end
25
+
26
+ def test_session_id_exists_by_default
27
+ assert_not_nil(@request.session_options[:id])
28
+ end
29
+
30
+ def test_session_id_different_on_each_call
31
+ prev_id =
32
+ assert_not_equal(@request.session_options[:id], ActionController::TestRequest.new.session_options[:id])
33
+ end
34
+
35
+ end
@@ -0,0 +1,146 @@
1
+ require 'abstract_unit'
2
+
3
+ class UrlEncodedParamsParsingTest < ActionController::IntegrationTest
4
+ class TestController < ActionController::Base
5
+ class << self
6
+ attr_accessor :last_request_parameters, :last_request_type
7
+ end
8
+
9
+ def parse
10
+ self.class.last_request_parameters = request.request_parameters
11
+ head :ok
12
+ end
13
+ end
14
+
15
+ def teardown
16
+ TestController.last_request_parameters = nil
17
+ end
18
+
19
+ test "parses unbalanced query string with array" do
20
+ assert_parses(
21
+ {'location' => ["1", "2"], 'age_group' => ["2"]},
22
+ "location[]=1&location[]=2&age_group[]=2"
23
+ )
24
+ end
25
+
26
+ test "parses nested hash" do
27
+ query = [
28
+ "note[viewers][viewer][][type]=User",
29
+ "note[viewers][viewer][][id]=1",
30
+ "note[viewers][viewer][][type]=Group",
31
+ "note[viewers][viewer][][id]=2"
32
+ ].join("&")
33
+
34
+ expected = { "note" => { "viewers"=>{"viewer"=>[{ "id"=>"1", "type"=>"User"}, {"type"=>"Group", "id"=>"2"} ]} } }
35
+ assert_parses(expected, query)
36
+ end
37
+
38
+ test "parses more complex nesting" do
39
+ query = [
40
+ "customers[boston][first][name]=David",
41
+ "customers[boston][first][url]=http://David",
42
+ "customers[boston][second][name]=Allan",
43
+ "customers[boston][second][url]=http://Allan",
44
+ "something_else=blah",
45
+ "something_nil=",
46
+ "something_empty=",
47
+ "products[first]=Apple Computer",
48
+ "products[second]=Pc",
49
+ "=Save"
50
+ ].join("&")
51
+
52
+ expected = {
53
+ "customers" => {
54
+ "boston" => {
55
+ "first" => {
56
+ "name" => "David",
57
+ "url" => "http://David"
58
+ },
59
+ "second" => {
60
+ "name" => "Allan",
61
+ "url" => "http://Allan"
62
+ }
63
+ }
64
+ },
65
+ "something_else" => "blah",
66
+ "something_empty" => "",
67
+ "something_nil" => "",
68
+ "products" => {
69
+ "first" => "Apple Computer",
70
+ "second" => "Pc"
71
+ }
72
+ }
73
+
74
+ assert_parses expected, query
75
+ end
76
+
77
+ test "parses params with array" do
78
+ query = "selected[]=1&selected[]=2&selected[]=3"
79
+ expected = { "selected" => [ "1", "2", "3" ] }
80
+ assert_parses expected, query
81
+ end
82
+
83
+ test "parses params with nil key" do
84
+ query = "=&test2=value1"
85
+ expected = { "test2" => "value1" }
86
+ assert_parses expected, query
87
+ end
88
+
89
+ test "parses params with array prefix and hashes" do
90
+ query = "a[][b][c]=d"
91
+ expected = {"a" => [{"b" => {"c" => "d"}}]}
92
+ assert_parses expected, query
93
+ end
94
+
95
+ test "parses params with complex nesting" do
96
+ query = "a[][b][c][][d][]=e"
97
+ expected = {"a" => [{"b" => {"c" => [{"d" => ["e"]}]}}]}
98
+ assert_parses expected, query
99
+ end
100
+
101
+ test "parses params with file path" do
102
+ query = [
103
+ "customers[boston][first][name]=David",
104
+ "something_else=blah",
105
+ "logo=#{File.expand_path(__FILE__)}"
106
+ ].join("&")
107
+
108
+ expected = {
109
+ "customers" => {
110
+ "boston" => {
111
+ "first" => {
112
+ "name" => "David"
113
+ }
114
+ }
115
+ },
116
+ "something_else" => "blah",
117
+ "logo" => File.expand_path(__FILE__),
118
+ }
119
+
120
+ assert_parses expected, query
121
+ end
122
+
123
+ test "parses params with Safari 2 trailing null character" do
124
+ query = "selected[]=1&selected[]=2&selected[]=3\0"
125
+ expected = { "selected" => [ "1", "2", "3" ] }
126
+ assert_parses expected, query
127
+ end
128
+
129
+ private
130
+ def with_test_routing
131
+ with_routing do |set|
132
+ set.draw do |map|
133
+ map.connect ':action', :controller => "url_encoded_params_parsing_test/test"
134
+ end
135
+ yield
136
+ end
137
+ end
138
+
139
+ def assert_parses(expected, actual)
140
+ with_test_routing do
141
+ post "/parse", actual
142
+ assert_response :ok
143
+ assert_equal(expected, TestController.last_request_parameters)
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,103 @@
1
+ require 'abstract_unit'
2
+
3
+ class XmlParamsParsingTest < ActionController::IntegrationTest
4
+ class TestController < ActionController::Base
5
+ class << self
6
+ attr_accessor :last_request_parameters
7
+ end
8
+
9
+ def parse
10
+ self.class.last_request_parameters = request.request_parameters
11
+ head :ok
12
+ end
13
+ end
14
+
15
+ def teardown
16
+ TestController.last_request_parameters = nil
17
+ end
18
+
19
+ test "parses hash params" do
20
+ with_test_routing do
21
+ xml = "<person><name>David</name></person>"
22
+ post "/parse", xml, default_headers
23
+ assert_response :ok
24
+ assert_equal({"person" => {"name" => "David"}}, TestController.last_request_parameters)
25
+ end
26
+ end
27
+
28
+ test "parses single file" do
29
+ with_test_routing do
30
+ xml = "<person><name>David</name><avatar type='file' name='me.jpg' content_type='image/jpg'>#{ActiveSupport::Base64.encode64('ABC')}</avatar></person>"
31
+ post "/parse", xml, default_headers
32
+ assert_response :ok
33
+
34
+ person = TestController.last_request_parameters
35
+ assert_equal "image/jpg", person['person']['avatar'].content_type
36
+ assert_equal "me.jpg", person['person']['avatar'].original_filename
37
+ assert_equal "ABC", person['person']['avatar'].read
38
+ end
39
+ end
40
+
41
+ test "logs error if parsing unsuccessful" do
42
+ with_test_routing do
43
+ begin
44
+ $stderr = StringIO.new
45
+ xml = "<person><name>David</name><avatar type='file' name='me.jpg' content_type='image/jpg'>#{ActiveSupport::Base64.encode64('ABC')}</avatar></pineapple>"
46
+ post "/parse", xml, default_headers
47
+ assert_response :error
48
+ $stderr.rewind && err = $stderr.read
49
+ assert err =~ /Error occurred while parsing request parameters/
50
+ ensure
51
+ $stderr = STDERR
52
+ end
53
+ end
54
+ end
55
+
56
+ test "parses multiple files" do
57
+ xml = <<-end_body
58
+ <person>
59
+ <name>David</name>
60
+ <avatars>
61
+ <avatar type='file' name='me.jpg' content_type='image/jpg'>#{ActiveSupport::Base64.encode64('ABC')}</avatar>
62
+ <avatar type='file' name='you.gif' content_type='image/gif'>#{ActiveSupport::Base64.encode64('DEF')}</avatar>
63
+ </avatars>
64
+ </person>
65
+ end_body
66
+
67
+ with_test_routing do
68
+ post "/parse", xml, default_headers
69
+ assert_response :ok
70
+ end
71
+
72
+ person = TestController.last_request_parameters
73
+
74
+ assert_equal "image/jpg", person['person']['avatars']['avatar'].first.content_type
75
+ assert_equal "me.jpg", person['person']['avatars']['avatar'].first.original_filename
76
+ assert_equal "ABC", person['person']['avatars']['avatar'].first.read
77
+
78
+ assert_equal "image/gif", person['person']['avatars']['avatar'].last.content_type
79
+ assert_equal "you.gif", person['person']['avatars']['avatar'].last.original_filename
80
+ assert_equal "DEF", person['person']['avatars']['avatar'].last.read
81
+ end
82
+
83
+ private
84
+ def with_test_routing
85
+ with_routing do |set|
86
+ set.draw do |map|
87
+ map.connect ':action', :controller => "xml_params_parsing_test/test"
88
+ end
89
+ yield
90
+ end
91
+ end
92
+
93
+ def default_headers
94
+ {'CONTENT_TYPE' => 'application/xml'}
95
+ end
96
+ end
97
+
98
+ class LegacyXmlParamsParsingTest < XmlParamsParsingTest
99
+ private
100
+ def default_headers
101
+ {'HTTP_X_POST_DATA_FORMAT' => 'xml'}
102
+ end
103
+ end