actionpack-rack-upgrade 2.3.14

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 (441) hide show
  1. data/CHANGELOG +5250 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +158 -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 +169 -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 +1425 -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 +197 -0
  27. data/lib/action_controller/dispatcher.rb +133 -0
  28. data/lib/action_controller/failsafe.rb +87 -0
  29. data/lib/action_controller/filters.rb +680 -0
  30. data/lib/action_controller/flash.rb +213 -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 +708 -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 +495 -0
  48. data/lib/action_controller/request_forgery_protection.rb +116 -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 +237 -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 +503 -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 +276 -0
  61. data/lib/action_controller/session/cookie_store.rb +240 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +60 -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 +229 -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/helpers/active_record_helper.rb +305 -0
  93. data/lib/action_view/helpers/asset_tag_helper.rb +695 -0
  94. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  95. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  96. data/lib/action_view/helpers/cache_helper.rb +39 -0
  97. data/lib/action_view/helpers/capture_helper.rb +136 -0
  98. data/lib/action_view/helpers/csrf_helper.rb +14 -0
  99. data/lib/action_view/helpers/date_helper.rb +989 -0
  100. data/lib/action_view/helpers/debug_helper.rb +38 -0
  101. data/lib/action_view/helpers/form_helper.rb +1118 -0
  102. data/lib/action_view/helpers/form_options_helper.rb +599 -0
  103. data/lib/action_view/helpers/form_tag_helper.rb +490 -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 +251 -0
  111. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  112. data/lib/action_view/helpers/tag_helper.rb +151 -0
  113. data/lib/action_view/helpers/text_helper.rb +597 -0
  114. data/lib/action_view/helpers/translation_helper.rb +67 -0
  115. data/lib/action_view/helpers/url_helper.rb +637 -0
  116. data/lib/action_view/helpers.rb +61 -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 +241 -0
  120. data/lib/action_view/paths.rb +77 -0
  121. data/lib/action_view/reloadable_template.rb +117 -0
  122. data/lib/action_view/renderable.rb +109 -0
  123. data/lib/action_view/renderable_partial.rb +53 -0
  124. data/lib/action_view/template.rb +252 -0
  125. data/lib/action_view/template_error.rb +99 -0
  126. data/lib/action_view/template_handler.rb +34 -0
  127. data/lib/action_view/template_handlers/builder.rb +17 -0
  128. data/lib/action_view/template_handlers/erb.rb +25 -0
  129. data/lib/action_view/template_handlers/rjs.rb +13 -0
  130. data/lib/action_view/template_handlers.rb +48 -0
  131. data/lib/action_view/test_case.rb +162 -0
  132. data/lib/action_view.rb +58 -0
  133. data/lib/actionpack.rb +2 -0
  134. data/test/abstract_unit.rb +78 -0
  135. data/test/active_record_unit.rb +104 -0
  136. data/test/activerecord/active_record_store_test.rb +221 -0
  137. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  138. data/test/adv_attr_test.rb +20 -0
  139. data/test/controller/action_pack_assertions_test.rb +545 -0
  140. data/test/controller/addresses_render_test.rb +37 -0
  141. data/test/controller/assert_select_test.rb +735 -0
  142. data/test/controller/base_test.rb +217 -0
  143. data/test/controller/benchmark_test.rb +32 -0
  144. data/test/controller/caching_test.rb +743 -0
  145. data/test/controller/capture_test.rb +66 -0
  146. data/test/controller/content_type_test.rb +178 -0
  147. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  148. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  150. data/test/controller/cookie_test.rb +208 -0
  151. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  152. data/test/controller/dispatcher_test.rb +144 -0
  153. data/test/controller/dom_assertions_test.rb +53 -0
  154. data/test/controller/failsafe_test.rb +60 -0
  155. data/test/controller/fake_controllers.rb +33 -0
  156. data/test/controller/fake_models.rb +19 -0
  157. data/test/controller/filter_params_test.rb +52 -0
  158. data/test/controller/filters_test.rb +885 -0
  159. data/test/controller/flash_test.rb +174 -0
  160. data/test/controller/header_test.rb +14 -0
  161. data/test/controller/helper_test.rb +224 -0
  162. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  163. data/test/controller/html-scanner/document_test.rb +148 -0
  164. data/test/controller/html-scanner/node_test.rb +89 -0
  165. data/test/controller/html-scanner/sanitizer_test.rb +281 -0
  166. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  167. data/test/controller/html-scanner/text_node_test.rb +50 -0
  168. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  169. data/test/controller/http_basic_authentication_test.rb +113 -0
  170. data/test/controller/http_digest_authentication_test.rb +254 -0
  171. data/test/controller/integration_test.rb +526 -0
  172. data/test/controller/layout_test.rb +215 -0
  173. data/test/controller/localized_templates_test.rb +24 -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/output_escaping_test.rb +19 -0
  179. data/test/controller/polymorphic_routes_test.rb +297 -0
  180. data/test/controller/rack_test.rb +308 -0
  181. data/test/controller/record_identifier_test.rb +139 -0
  182. data/test/controller/redirect_test.rb +285 -0
  183. data/test/controller/reloader_test.rb +125 -0
  184. data/test/controller/render_test.rb +1783 -0
  185. data/test/controller/request/json_params_parsing_test.rb +65 -0
  186. data/test/controller/request/multipart_params_parsing_test.rb +177 -0
  187. data/test/controller/request/query_string_parsing_test.rb +120 -0
  188. data/test/controller/request/test_request_test.rb +35 -0
  189. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  190. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  191. data/test/controller/request_forgery_protection_test.rb +233 -0
  192. data/test/controller/request_test.rb +395 -0
  193. data/test/controller/rescue_test.rb +541 -0
  194. data/test/controller/resources_test.rb +1393 -0
  195. data/test/controller/routing_test.rb +2592 -0
  196. data/test/controller/selector_test.rb +628 -0
  197. data/test/controller/send_file_test.rb +171 -0
  198. data/test/controller/session/abstract_store_test.rb +64 -0
  199. data/test/controller/session/cookie_store_test.rb +354 -0
  200. data/test/controller/session/mem_cache_store_test.rb +187 -0
  201. data/test/controller/session/test_session_test.rb +58 -0
  202. data/test/controller/test_test.rb +700 -0
  203. data/test/controller/translation_test.rb +26 -0
  204. data/test/controller/url_rewriter_test.rb +395 -0
  205. data/test/controller/verification_test.rb +270 -0
  206. data/test/controller/view_paths_test.rb +141 -0
  207. data/test/controller/webservice_test.rb +260 -0
  208. data/test/fixtures/_top_level_partial.html.erb +1 -0
  209. data/test/fixtures/_top_level_partial_only.erb +1 -0
  210. data/test/fixtures/addresses/list.erb +1 -0
  211. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  212. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  213. data/test/fixtures/companies.yml +24 -0
  214. data/test/fixtures/company.rb +10 -0
  215. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  216. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  217. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  218. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  219. data/test/fixtures/customers/_customer.html.erb +1 -0
  220. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  221. data/test/fixtures/developer.rb +9 -0
  222. data/test/fixtures/developers/_developer.erb +1 -0
  223. data/test/fixtures/developers.yml +21 -0
  224. data/test/fixtures/developers_projects.yml +13 -0
  225. data/test/fixtures/failsafe/500.html +1 -0
  226. data/test/fixtures/fun/games/_game.erb +1 -0
  227. data/test/fixtures/fun/games/hello_world.erb +1 -0
  228. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  229. data/test/fixtures/functional_caching/_partial.erb +3 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  231. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  232. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  233. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  235. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  236. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  237. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  238. data/test/fixtures/helpers/abc_helper.rb +5 -0
  239. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  240. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  241. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  242. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  243. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  244. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  246. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  247. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  248. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  249. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  250. data/test/fixtures/layouts/_column.html.erb +2 -0
  251. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  252. data/test/fixtures/layouts/builder.builder +3 -0
  253. data/test/fixtures/layouts/default_html.html.erb +1 -0
  254. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  255. data/test/fixtures/layouts/standard.erb +1 -0
  256. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  257. data/test/fixtures/layouts/xhr.html.erb +2 -0
  258. data/test/fixtures/layouts/yield.erb +2 -0
  259. data/test/fixtures/localized/hello_world.de.html +1 -0
  260. data/test/fixtures/localized/hello_world.en.html +1 -0
  261. data/test/fixtures/mascot.rb +3 -0
  262. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  263. data/test/fixtures/mascots.yml +4 -0
  264. data/test/fixtures/multipart/binary_file +0 -0
  265. data/test/fixtures/multipart/boundary_problem_file +10 -0
  266. data/test/fixtures/multipart/bracketed_param +5 -0
  267. data/test/fixtures/multipart/empty +10 -0
  268. data/test/fixtures/multipart/hello.txt +1 -0
  269. data/test/fixtures/multipart/large_text_file +10 -0
  270. data/test/fixtures/multipart/mixed_files +0 -0
  271. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  272. data/test/fixtures/multipart/none +9 -0
  273. data/test/fixtures/multipart/single_parameter +5 -0
  274. data/test/fixtures/multipart/text_file +10 -0
  275. data/test/fixtures/override/test/hello_world.erb +1 -0
  276. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  277. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  278. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  279. data/test/fixtures/post_test/post/index.html.erb +1 -0
  280. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  281. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  282. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  283. data/test/fixtures/project.rb +3 -0
  284. data/test/fixtures/projects/_project.erb +1 -0
  285. data/test/fixtures/projects.yml +7 -0
  286. data/test/fixtures/public/404.html +1 -0
  287. data/test/fixtures/public/500.da.html +1 -0
  288. data/test/fixtures/public/500.html +1 -0
  289. data/test/fixtures/public/absolute/test.css +23 -0
  290. data/test/fixtures/public/absolute/test.js +63 -0
  291. data/test/fixtures/public/images/rails.png +0 -0
  292. data/test/fixtures/public/javascripts/application.js +1 -0
  293. data/test/fixtures/public/javascripts/bank.js +1 -0
  294. data/test/fixtures/public/javascripts/controls.js +1 -0
  295. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  296. data/test/fixtures/public/javascripts/effects.js +1 -0
  297. data/test/fixtures/public/javascripts/prototype.js +1 -0
  298. data/test/fixtures/public/javascripts/robber.js +1 -0
  299. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  300. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  301. data/test/fixtures/public/stylesheets/bank.css +1 -0
  302. data/test/fixtures/public/stylesheets/robber.css +1 -0
  303. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  304. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  305. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  306. data/test/fixtures/replies/_reply.erb +1 -0
  307. data/test/fixtures/replies.yml +15 -0
  308. data/test/fixtures/reply.rb +7 -0
  309. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  310. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  311. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  312. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  313. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  314. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  315. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  316. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  318. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  319. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  320. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  321. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  322. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  323. data/test/fixtures/scope/test/modgreet.erb +1 -0
  324. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +10 -0
  325. data/test/fixtures/shared.html.erb +1 -0
  326. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  327. data/test/fixtures/test/_counter.html.erb +1 -0
  328. data/test/fixtures/test/_customer.erb +1 -0
  329. data/test/fixtures/test/_customer_counter.erb +1 -0
  330. data/test/fixtures/test/_customer_counter_with_as.erb +1 -0
  331. data/test/fixtures/test/_customer_greeting.erb +1 -0
  332. data/test/fixtures/test/_customer_with_var.erb +1 -0
  333. data/test/fixtures/test/_form.erb +1 -0
  334. data/test/fixtures/test/_from_helper.erb +1 -0
  335. data/test/fixtures/test/_hash_greeting.erb +1 -0
  336. data/test/fixtures/test/_hash_object.erb +2 -0
  337. data/test/fixtures/test/_hello.builder +1 -0
  338. data/test/fixtures/test/_labelling_form.erb +1 -0
  339. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  340. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  341. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  342. data/test/fixtures/test/_one.html.erb +1 -0
  343. data/test/fixtures/test/_partial.erb +1 -0
  344. data/test/fixtures/test/_partial.html.erb +1 -0
  345. data/test/fixtures/test/_partial.js.erb +1 -0
  346. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  347. data/test/fixtures/test/_partial_only.erb +1 -0
  348. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  349. data/test/fixtures/test/_person.erb +2 -0
  350. data/test/fixtures/test/_raise.html.erb +1 -0
  351. data/test/fixtures/test/_two.html.erb +1 -0
  352. data/test/fixtures/test/_utf8_partial.html.erb +1 -0
  353. data/test/fixtures/test/_utf8_partial_magic.html.erb +2 -0
  354. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  355. data/test/fixtures/test/array_translation.erb +1 -0
  356. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  357. data/test/fixtures/test/capturing.erb +4 -0
  358. data/test/fixtures/test/content_for.erb +2 -0
  359. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  360. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  361. data/test/fixtures/test/delete_with_js.rjs +2 -0
  362. data/test/fixtures/test/dont_pick_me +1 -0
  363. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  364. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  365. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  366. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  367. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  368. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  369. data/test/fixtures/test/greeting.erb +1 -0
  370. data/test/fixtures/test/greeting.js.rjs +1 -0
  371. data/test/fixtures/test/hello.builder +4 -0
  372. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  373. data/test/fixtures/test/hello_world.erb +1 -0
  374. data/test/fixtures/test/hello_world.erb~ +1 -0
  375. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  376. data/test/fixtures/test/hello_world_container.builder +3 -0
  377. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  378. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  379. data/test/fixtures/test/hello_xml_world.builder +11 -0
  380. data/test/fixtures/test/hyphen-ated.erb +1 -0
  381. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  382. data/test/fixtures/test/list.erb +1 -0
  383. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  384. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  385. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  386. data/test/fixtures/test/nested_layout.erb +3 -0
  387. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  388. data/test/fixtures/test/potential_conflicts.erb +4 -0
  389. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  390. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  391. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  392. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  393. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  394. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  395. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  396. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  397. data/test/fixtures/test/render_to_string_test.erb +1 -0
  398. data/test/fixtures/test/scoped_array_translation.erb +1 -0
  399. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  400. data/test/fixtures/test/template.erb +1 -0
  401. data/test/fixtures/test/translation.erb +1 -0
  402. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  403. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  404. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  405. data/test/fixtures/test/utf8.html.erb +4 -0
  406. data/test/fixtures/test/utf8_magic.html.erb +5 -0
  407. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +5 -0
  408. data/test/fixtures/topic.rb +3 -0
  409. data/test/fixtures/topics/_topic.html.erb +1 -0
  410. data/test/fixtures/topics.yml +22 -0
  411. data/test/template/active_record_helper_i18n_test.rb +51 -0
  412. data/test/template/active_record_helper_test.rb +302 -0
  413. data/test/template/asset_tag_helper_test.rb +770 -0
  414. data/test/template/atom_feed_helper_test.rb +315 -0
  415. data/test/template/benchmark_helper_test.rb +86 -0
  416. data/test/template/compiled_templates_test.rb +204 -0
  417. data/test/template/date_helper_i18n_test.rb +121 -0
  418. data/test/template/date_helper_test.rb +2603 -0
  419. data/test/template/erb_util_test.rb +36 -0
  420. data/test/template/form_helper_test.rb +1447 -0
  421. data/test/template/form_options_helper_i18n_test.rb +27 -0
  422. data/test/template/form_options_helper_test.rb +811 -0
  423. data/test/template/form_tag_helper_test.rb +356 -0
  424. data/test/template/javascript_helper_test.rb +106 -0
  425. data/test/template/number_helper_i18n_test.rb +69 -0
  426. data/test/template/number_helper_test.rb +132 -0
  427. data/test/template/prototype_helper_test.rb +639 -0
  428. data/test/template/raw_output_helper_test.rb +21 -0
  429. data/test/template/record_tag_helper_test.rb +58 -0
  430. data/test/template/render_test.rb +329 -0
  431. data/test/template/sanitize_helper_test.rb +57 -0
  432. data/test/template/scriptaculous_helper_test.rb +90 -0
  433. data/test/template/tag_helper_test.rb +98 -0
  434. data/test/template/template_test.rb +32 -0
  435. data/test/template/test_test.rb +54 -0
  436. data/test/template/text_helper_test.rb +597 -0
  437. data/test/template/translation_helper_test.rb +95 -0
  438. data/test/template/url_helper_test.rb +641 -0
  439. data/test/testing_sandbox.rb +15 -0
  440. data/test/view/test_case_test.rb +176 -0
  441. metadata +519 -0
@@ -0,0 +1,233 @@
1
+ require 'abstract_unit'
2
+ require 'digest/sha1'
3
+
4
+ ActionController::Routing::Routes.draw do |map|
5
+ map.connect ':controller/:action/:id'
6
+ end
7
+
8
+ # common controller actions
9
+ module RequestForgeryProtectionActions
10
+ def index
11
+ render :inline => "<%= form_tag('/') {} %>"
12
+ end
13
+
14
+ def show_button
15
+ render :inline => "<%= button_to('New', '/') {} %>"
16
+ end
17
+
18
+ def remote_form
19
+ render :inline => "<% form_remote_tag(:url => '/') {} %>"
20
+ end
21
+
22
+ def unsafe
23
+ render :text => 'pwn'
24
+ end
25
+
26
+ def meta
27
+ render :inline => "<%= csrf_meta_tag %>"
28
+ end
29
+
30
+ def rescue_action(e) raise e end
31
+ end
32
+
33
+ # sample controllers
34
+ class RequestForgeryProtectionController < ActionController::Base
35
+ include RequestForgeryProtectionActions
36
+ protect_from_forgery :only => :index
37
+ end
38
+
39
+ class RequestForgeryProtectionControllerUsingOldBehaviour < ActionController::Base
40
+ include RequestForgeryProtectionActions
41
+ protect_from_forgery :only => %w(index meta)
42
+
43
+ def handle_unverified_request
44
+ raise(ActionController::InvalidAuthenticityToken)
45
+ end
46
+ end
47
+
48
+
49
+ class FreeCookieController < RequestForgeryProtectionController
50
+ self.allow_forgery_protection = false
51
+
52
+ def index
53
+ render :inline => "<%= form_tag('/') {} %>"
54
+ end
55
+
56
+ def show_button
57
+ render :inline => "<%= button_to('New', '/') {} %>"
58
+ end
59
+ end
60
+
61
+ class CustomAuthenticityParamController < RequestForgeryProtectionController
62
+ def form_authenticity_param
63
+ 'foobar'
64
+ end
65
+ end
66
+
67
+
68
+ # common test methods
69
+
70
+ module RequestForgeryProtectionTests
71
+ def setup
72
+ @token = "cf50faa3fe97702ca1ae"
73
+
74
+ ActiveSupport::SecureRandom.stubs(:base64).returns(@token)
75
+ ActionController::Base.request_forgery_protection_token = :authenticity_token
76
+ end
77
+
78
+
79
+ def test_should_render_form_with_token_tag
80
+ assert_not_blocked do
81
+ get :index
82
+ end
83
+ assert_select 'form>div>input[name=?][value=?]', 'authenticity_token', @token
84
+ end
85
+
86
+ def test_should_render_button_to_with_token_tag
87
+ assert_not_blocked do
88
+ get :show_button
89
+ end
90
+ assert_select 'form>div>input[name=?][value=?]', 'authenticity_token', @token
91
+ end
92
+
93
+ def test_should_allow_get
94
+ assert_not_blocked { get :index }
95
+ end
96
+
97
+ def test_should_allow_post_without_token_on_unsafe_action
98
+ assert_not_blocked { post :unsafe }
99
+ end
100
+
101
+ def test_should_not_allow_post_without_token
102
+ assert_blocked { post :index }
103
+ end
104
+
105
+ def test_should_not_allow_post_without_token_irrespective_of_format
106
+ assert_blocked { post :index, :format=>'xml' }
107
+ end
108
+
109
+ def test_should_not_allow_put_without_token
110
+ assert_blocked { put :index }
111
+ end
112
+
113
+ def test_should_not_allow_delete_without_token
114
+ assert_blocked { delete :index }
115
+ end
116
+
117
+ def test_should_not_allow_xhr_post_without_token
118
+ assert_blocked { xhr :post, :index }
119
+ end
120
+
121
+ def test_should_allow_post_with_token
122
+ assert_not_blocked { post :index, :authenticity_token => @token }
123
+ end
124
+
125
+ def test_should_allow_put_with_token
126
+ assert_not_blocked { put :index, :authenticity_token => @token }
127
+ end
128
+
129
+ def test_should_allow_delete_with_token
130
+ assert_not_blocked { delete :index, :authenticity_token => @token }
131
+ end
132
+
133
+ def test_should_allow_post_with_token_in_header
134
+ @request.env['HTTP_X_CSRF_TOKEN'] = @token
135
+ assert_not_blocked { post :index }
136
+ end
137
+
138
+ def test_should_allow_delete_with_token_in_header
139
+ @request.env['HTTP_X_CSRF_TOKEN'] = @token
140
+ assert_not_blocked { delete :index }
141
+ end
142
+
143
+ def test_should_allow_put_with_token_in_header
144
+ @request.env['HTTP_X_CSRF_TOKEN'] = @token
145
+ assert_not_blocked { put :index }
146
+ end
147
+
148
+ def assert_blocked
149
+ session[:something_like_user_id] = 1
150
+ yield
151
+ assert_nil session[:something_like_user_id], "session values are still present"
152
+ assert_response :success
153
+ end
154
+
155
+ def assert_not_blocked
156
+ assert_nothing_raised { yield }
157
+ assert_response :success
158
+ end
159
+ end
160
+
161
+ # OK let's get our test on
162
+
163
+ class RequestForgeryProtectionControllerTest < ActionController::TestCase
164
+ include RequestForgeryProtectionTests
165
+
166
+ test 'should emit a csrf-token meta tag' do
167
+ ActiveSupport::SecureRandom.stubs(:base64).returns(@token + '<=?')
168
+ get :meta
169
+ assert_equal %(<meta name="csrf-param" content="authenticity_token"/>\n<meta name="csrf-token" content="cf50faa3fe97702ca1ae&lt;=?"/>), @response.body
170
+ end
171
+ end
172
+
173
+ class RequestForgeryProtectionControllerUsingOldBehaviourTest < ActionController::TestCase
174
+ include RequestForgeryProtectionTests
175
+ def assert_blocked
176
+ assert_raises(ActionController::InvalidAuthenticityToken) do
177
+ yield
178
+ end
179
+ end
180
+ end
181
+
182
+ class FreeCookieControllerTest < ActionController::TestCase
183
+ def setup
184
+ @controller = FreeCookieController.new
185
+ @request = ActionController::TestRequest.new
186
+ @response = ActionController::TestResponse.new
187
+ @token = "cf50faa3fe97702ca1ae"
188
+
189
+ ActiveSupport::SecureRandom.stubs(:base64).returns(@token)
190
+ end
191
+
192
+ def test_should_not_render_form_with_token_tag
193
+ get :index
194
+ assert_select 'form>div>input[name=?][value=?]', 'authenticity_token', @token, false
195
+ end
196
+
197
+ def test_should_not_render_button_to_with_token_tag
198
+ get :show_button
199
+ assert_select 'form>div>input[name=?][value=?]', 'authenticity_token', @token, false
200
+ end
201
+
202
+ def test_should_allow_all_methods_without_token
203
+ [:post, :put, :delete].each do |method|
204
+ assert_nothing_raised { send(method, :index)}
205
+ end
206
+ end
207
+
208
+ test 'should not emit a csrf-token meta tag' do
209
+ get :meta
210
+ assert_blank @response.body
211
+ end
212
+ end
213
+
214
+
215
+
216
+
217
+
218
+ class CustomAuthenticityParamControllerTest < ActionController::TestCase
219
+ def setup
220
+ ActionController::Base.request_forgery_protection_token = :custom_token_name
221
+ super
222
+ end
223
+
224
+ def teardown
225
+ ActionController::Base.request_forgery_protection_token = :authenticity_token
226
+ super
227
+ end
228
+
229
+ def test_should_allow_custom_token
230
+ post :index, :custom_token_name => 'foobar'
231
+ assert_response :ok
232
+ end
233
+ end
@@ -0,0 +1,395 @@
1
+ require 'abstract_unit'
2
+
3
+ class RequestTest < ActiveSupport::TestCase
4
+ def setup
5
+ ActionController::Base.relative_url_root = nil
6
+ end
7
+
8
+ def teardown
9
+ ActionController::Base.relative_url_root = nil
10
+ end
11
+
12
+ def test_remote_ip
13
+ request = stub_request 'REMOTE_ADDR' => '1.2.3.4'
14
+ assert_equal '1.2.3.4', request.remote_ip
15
+
16
+ request = stub_request 'REMOTE_ADDR' => '1.2.3.4,3.4.5.6'
17
+ assert_equal '1.2.3.4', request.remote_ip
18
+
19
+ request = stub_request 'REMOTE_ADDR' => '1.2.3.4',
20
+ 'HTTP_X_FORWARDED_FOR' => '3.4.5.6'
21
+ assert_equal '1.2.3.4', request.remote_ip
22
+
23
+ request = stub_request 'REMOTE_ADDR' => '127.0.0.1',
24
+ 'HTTP_X_FORWARDED_FOR' => '3.4.5.6'
25
+ assert_equal '3.4.5.6', request.remote_ip
26
+
27
+ request = stub_request 'HTTP_X_FORWARDED_FOR' => 'unknown,3.4.5.6'
28
+ assert_equal '3.4.5.6', request.remote_ip
29
+
30
+ request = stub_request 'HTTP_X_FORWARDED_FOR' => '172.16.0.1,3.4.5.6'
31
+ assert_equal '3.4.5.6', request.remote_ip
32
+
33
+ request = stub_request 'HTTP_X_FORWARDED_FOR' => '192.168.0.1,3.4.5.6'
34
+ assert_equal '3.4.5.6', request.remote_ip
35
+
36
+ request = stub_request 'HTTP_X_FORWARDED_FOR' => '10.0.0.1,3.4.5.6'
37
+ assert_equal '3.4.5.6', request.remote_ip
38
+
39
+ request = stub_request 'HTTP_X_FORWARDED_FOR' => '10.0.0.1, 10.0.0.1, 3.4.5.6'
40
+ assert_equal '3.4.5.6', request.remote_ip
41
+
42
+ request = stub_request 'HTTP_X_FORWARDED_FOR' => '127.0.0.1,3.4.5.6'
43
+ assert_equal '3.4.5.6', request.remote_ip
44
+
45
+ request = stub_request 'HTTP_X_FORWARDED_FOR' => 'unknown,192.168.0.1'
46
+ assert_equal 'unknown', request.remote_ip
47
+
48
+ request = stub_request 'HTTP_X_FORWARDED_FOR' => '9.9.9.9, 3.4.5.6, 10.0.0.1, 172.31.4.4'
49
+ assert_equal '3.4.5.6', request.remote_ip
50
+
51
+ request = stub_request 'HTTP_X_FORWARDED_FOR' => '1.1.1.1',
52
+ 'HTTP_CLIENT_IP' => '2.2.2.2'
53
+ e = assert_raise(ActionController::ActionControllerError) {
54
+ request.remote_ip
55
+ }
56
+ assert_match /IP spoofing attack/, e.message
57
+ assert_match /HTTP_X_FORWARDED_FOR="1.1.1.1"/, e.message
58
+ assert_match /HTTP_CLIENT_IP="2.2.2.2"/, e.message
59
+
60
+ # turn IP Spoofing detection off.
61
+ # This is useful for sites that are aimed at non-IP clients. The typical
62
+ # example is WAP. Since the cellular network is not IP based, it's a
63
+ # leap of faith to assume that their proxies are ever going to set the
64
+ # HTTP_CLIENT_IP/HTTP_X_FORWARDED_FOR headers properly.
65
+ ActionController::Base.ip_spoofing_check = false
66
+ request = stub_request 'HTTP_X_FORWARDED_FOR' => '1.1.1.1',
67
+ 'HTTP_CLIENT_IP' => '2.2.2.2'
68
+ assert_equal '2.2.2.2', request.remote_ip
69
+ ActionController::Base.ip_spoofing_check = true
70
+
71
+ request = stub_request 'HTTP_X_FORWARDED_FOR' => '8.8.8.8, 9.9.9.9'
72
+ assert_equal '9.9.9.9', request.remote_ip
73
+ end
74
+
75
+ def test_domains
76
+ request = stub_request 'HTTP_HOST' => 'www.rubyonrails.org'
77
+ assert_equal "rubyonrails.org", request.domain
78
+
79
+ request = stub_request 'HTTP_HOST' => "www.rubyonrails.co.uk"
80
+ assert_equal "rubyonrails.co.uk", request.domain(2)
81
+
82
+ request = stub_request 'HTTP_HOST' => "192.168.1.200"
83
+ assert_nil request.domain
84
+
85
+ request = stub_request 'HTTP_HOST' => "foo.192.168.1.200"
86
+ assert_nil request.domain
87
+
88
+ request = stub_request 'HTTP_HOST' => "192.168.1.200.com"
89
+ assert_equal "200.com", request.domain
90
+ end
91
+
92
+ def test_subdomains
93
+ request = stub_request 'HTTP_HOST' => "www.rubyonrails.org"
94
+ assert_equal %w( www ), request.subdomains
95
+
96
+ request = stub_request 'HTTP_HOST' => "www.rubyonrails.co.uk"
97
+ assert_equal %w( www ), request.subdomains(2)
98
+
99
+ request = stub_request 'HTTP_HOST' => "dev.www.rubyonrails.co.uk"
100
+ assert_equal %w( dev www ), request.subdomains(2)
101
+
102
+ request = stub_request 'HTTP_HOST' => "foobar.foobar.com"
103
+ assert_equal %w( foobar ), request.subdomains
104
+
105
+ request = stub_request 'HTTP_HOST' => "192.168.1.200"
106
+ assert_equal [], request.subdomains
107
+
108
+ request = stub_request 'HTTP_HOST' => "foo.192.168.1.200"
109
+ assert_equal [], request.subdomains
110
+
111
+ request = stub_request 'HTTP_HOST' => "192.168.1.200.com"
112
+ assert_equal %w( 192 168 1 ), request.subdomains
113
+
114
+ request = stub_request 'HTTP_HOST' => nil
115
+ assert_equal [], request.subdomains
116
+ end
117
+
118
+ def test_port_string
119
+ request = stub_request 'HTTP_HOST' => 'www.example.org:80'
120
+ assert_equal "", request.port_string
121
+
122
+ request = stub_request 'HTTP_HOST' => 'www.example.org:8080'
123
+ assert_equal ":8080", request.port_string
124
+ end
125
+
126
+ def test_request_uri
127
+ request = stub_request 'REQUEST_URI' => "http://www.rubyonrails.org/path/of/some/uri?mapped=1"
128
+ assert_equal "/path/of/some/uri?mapped=1", request.request_uri
129
+ assert_equal "/path/of/some/uri", request.path
130
+
131
+ request = stub_request 'REQUEST_URI' => "http://www.rubyonrails.org/path/of/some/uri"
132
+ assert_equal "/path/of/some/uri", request.request_uri
133
+ assert_equal "/path/of/some/uri", request.path
134
+
135
+ request = stub_request 'REQUEST_URI' => "/path/of/some/uri"
136
+ assert_equal "/path/of/some/uri", request.request_uri
137
+ assert_equal "/path/of/some/uri", request.path
138
+
139
+ request = stub_request 'REQUEST_URI' => "/"
140
+ assert_equal "/", request.request_uri
141
+ assert_equal "/", request.path
142
+
143
+ request = stub_request 'REQUEST_URI' => "/?m=b"
144
+ assert_equal "/?m=b", request.request_uri
145
+ assert_equal "/", request.path
146
+
147
+ request = stub_request 'REQUEST_URI' => "/", 'SCRIPT_NAME' => '/dispatch.cgi'
148
+ assert_equal "/", request.request_uri
149
+ assert_equal "/", request.path
150
+
151
+ ActionController::Base.relative_url_root = "/hieraki"
152
+ request = stub_request 'REQUEST_URI' => "/hieraki/", 'SCRIPT_NAME' => "/hieraki/dispatch.cgi"
153
+ assert_equal "/hieraki/", request.request_uri
154
+ assert_equal "/", request.path
155
+ ActionController::Base.relative_url_root = nil
156
+
157
+ ActionController::Base.relative_url_root = "/collaboration/hieraki"
158
+ request = stub_request 'REQUEST_URI' => "/collaboration/hieraki/books/edit/2",
159
+ 'SCRIPT_NAME' => "/collaboration/hieraki/dispatch.cgi"
160
+ assert_equal "/collaboration/hieraki/books/edit/2", request.request_uri
161
+ assert_equal "/books/edit/2", request.path
162
+ ActionController::Base.relative_url_root = nil
163
+
164
+ # The following tests are for when REQUEST_URI is not supplied (as in IIS)
165
+ request = stub_request 'PATH_INFO' => "/path/of/some/uri?mapped=1",
166
+ 'SCRIPT_NAME' => nil,
167
+ 'REQUEST_URI' => nil
168
+ assert_equal "/path/of/some/uri?mapped=1", request.request_uri
169
+ assert_equal "/path/of/some/uri", request.path
170
+
171
+ ActionController::Base.relative_url_root = '/path'
172
+ request = stub_request 'PATH_INFO' => "/path/of/some/uri?mapped=1",
173
+ 'SCRIPT_NAME' => "/path/dispatch.rb",
174
+ 'REQUEST_URI' => nil
175
+ assert_equal "/path/of/some/uri?mapped=1", request.request_uri
176
+ assert_equal "/of/some/uri", request.path
177
+ ActionController::Base.relative_url_root = nil
178
+
179
+ request = stub_request 'PATH_INFO' => "/path/of/some/uri",
180
+ 'SCRIPT_NAME' => nil,
181
+ 'REQUEST_URI' => nil
182
+ assert_equal "/path/of/some/uri", request.request_uri
183
+ assert_equal "/path/of/some/uri", request.path
184
+
185
+ request = stub_request 'PATH_INFO' => '/', 'REQUEST_URI' => nil
186
+ assert_equal "/", request.request_uri
187
+ assert_equal "/", request.path
188
+
189
+ request = stub_request 'PATH_INFO' => '/?m=b', 'REQUEST_URI' => nil
190
+ assert_equal "/?m=b", request.request_uri
191
+ assert_equal "/", request.path
192
+
193
+ request = stub_request 'PATH_INFO' => "/",
194
+ 'SCRIPT_NAME' => "/dispatch.cgi",
195
+ 'REQUEST_URI' => nil
196
+ assert_equal "/", request.request_uri
197
+ assert_equal "/", request.path
198
+
199
+ ActionController::Base.relative_url_root = '/hieraki'
200
+ request = stub_request 'PATH_INFO' => "/hieraki/",
201
+ 'SCRIPT_NAME' => "/hieraki/dispatch.cgi",
202
+ 'REQUEST_URI' => nil
203
+ assert_equal "/hieraki/", request.request_uri
204
+ assert_equal "/", request.path
205
+ ActionController::Base.relative_url_root = nil
206
+
207
+ request = stub_request 'REQUEST_URI' => '/hieraki/dispatch.cgi'
208
+ ActionController::Base.relative_url_root = '/hieraki'
209
+ assert_equal "/dispatch.cgi", request.path
210
+ ActionController::Base.relative_url_root = nil
211
+
212
+ request = stub_request 'REQUEST_URI' => '/hieraki/dispatch.cgi'
213
+ ActionController::Base.relative_url_root = '/foo'
214
+ assert_equal "/hieraki/dispatch.cgi", request.path
215
+ ActionController::Base.relative_url_root = nil
216
+
217
+ # This test ensures that Rails uses REQUEST_URI over PATH_INFO
218
+ ActionController::Base.relative_url_root = nil
219
+ request = stub_request 'REQUEST_URI' => "/some/path",
220
+ 'PATH_INFO' => "/another/path",
221
+ 'SCRIPT_NAME' => "/dispatch.cgi"
222
+ assert_equal "/some/path", request.request_uri
223
+ assert_equal "/some/path", request.path
224
+ end
225
+
226
+ def test_host_with_default_port
227
+ request = stub_request 'HTTP_HOST' => 'rubyonrails.org:80'
228
+ assert_equal "rubyonrails.org", request.host_with_port
229
+ end
230
+
231
+ def test_host_with_non_default_port
232
+ request = stub_request 'HTTP_HOST' => 'rubyonrails.org:81'
233
+ assert_equal "rubyonrails.org:81", request.host_with_port
234
+ end
235
+
236
+ def test_server_software
237
+ request = stub_request
238
+ assert_equal nil, request.server_software
239
+
240
+ request = stub_request 'SERVER_SOFTWARE' => 'Apache3.422'
241
+ assert_equal 'apache', request.server_software
242
+
243
+ request = stub_request 'SERVER_SOFTWARE' => 'lighttpd(1.1.4)'
244
+ assert_equal 'lighttpd', request.server_software
245
+ end
246
+
247
+ def test_xml_http_request
248
+ request = stub_request
249
+
250
+ assert !request.xml_http_request?
251
+ assert !request.xhr?
252
+
253
+ request = stub_request 'HTTP_X_REQUESTED_WITH' => 'DefinitelyNotAjax1.0'
254
+ assert !request.xml_http_request?
255
+ assert !request.xhr?
256
+
257
+ request = stub_request 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest'
258
+ assert request.xml_http_request?
259
+ assert request.xhr?
260
+ end
261
+
262
+ def test_reports_ssl
263
+ request = stub_request
264
+ assert !request.ssl?
265
+
266
+ request = stub_request 'HTTPS' => 'on'
267
+ assert request.ssl?
268
+ end
269
+
270
+ def test_reports_ssl_when_proxied_via_lighttpd
271
+ request = stub_request
272
+ assert !request.ssl?
273
+
274
+ request = stub_request 'HTTP_X_FORWARDED_PROTO' => 'https'
275
+ assert request.ssl?
276
+ end
277
+
278
+ def test_symbolized_request_methods
279
+ [:get, :post, :put, :delete].each do |method|
280
+ request = stub_request 'REQUEST_METHOD' => method.to_s.upcase
281
+ assert_equal method, request.method
282
+ end
283
+ end
284
+
285
+ def test_invalid_http_method_raises_exception
286
+ assert_raise(ActionController::UnknownHttpMethod) do
287
+ request = stub_request 'REQUEST_METHOD' => 'RANDOM_METHOD'
288
+ request.request_method
289
+ end
290
+ end
291
+
292
+ def test_allow_method_hacking_on_post
293
+ [:get, :head, :options, :put, :post, :delete].each do |method|
294
+ request = stub_request 'REQUEST_METHOD' => method.to_s.upcase
295
+ assert_equal(method == :head ? :get : method, request.method)
296
+ end
297
+ end
298
+
299
+ def test_restrict_method_hacking
300
+ [:get, :put, :delete].each do |method|
301
+ request = stub_request 'REQUEST_METHOD' => method.to_s.upcase,
302
+ 'action_controller.request.request_parameters' => { :_method => 'put' }
303
+ assert_equal method, request.method
304
+ end
305
+ end
306
+
307
+ def test_head_masquerading_as_get
308
+ request = stub_request 'REQUEST_METHOD' => 'HEAD'
309
+ assert_equal :get, request.method
310
+ assert request.get?
311
+ assert request.head?
312
+ end
313
+
314
+ def test_xml_format
315
+ request = stub_request
316
+ request.expects(:parameters).at_least_once.returns({ :format => 'xml' })
317
+ assert_equal Mime::XML, request.format
318
+ end
319
+
320
+ def test_xhtml_format
321
+ request = stub_request
322
+ request.expects(:parameters).at_least_once.returns({ :format => 'xhtml' })
323
+ assert_equal Mime::HTML, request.format
324
+ end
325
+
326
+ def test_txt_format
327
+ request = stub_request
328
+ request.expects(:parameters).at_least_once.returns({ :format => 'txt' })
329
+ assert_equal Mime::TEXT, request.format
330
+ end
331
+
332
+ def test_xml_http_request
333
+ ActionController::Base.use_accept_header, old =
334
+ false, ActionController::Base.use_accept_header
335
+
336
+ request = stub_request 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest'
337
+ request.expects(:parameters).at_least_once.returns({})
338
+ assert request.xhr?
339
+ assert_equal Mime::JS, request.format
340
+ ensure
341
+ ActionController::Base.use_accept_header = old
342
+ end
343
+
344
+ def test_content_type
345
+ request = stub_request 'CONTENT_TYPE' => 'text/html'
346
+ assert_equal Mime::HTML, request.content_type
347
+ end
348
+
349
+ def test_can_override_format_with_parameter
350
+ request = stub_request
351
+ request.expects(:parameters).at_least_once.returns({ :format => :txt })
352
+ assert !request.format.xml?
353
+
354
+ request = stub_request
355
+ request.expects(:parameters).at_least_once.returns({ :format => :xml })
356
+ assert request.format.xml?
357
+ end
358
+
359
+ def test_content_no_type
360
+ request = stub_request
361
+ assert_equal nil, request.content_type
362
+ end
363
+
364
+ def test_content_type_xml
365
+ request = stub_request 'CONTENT_TYPE' => 'application/xml'
366
+ assert_equal Mime::XML, request.content_type
367
+ end
368
+
369
+ def test_content_type_with_charset
370
+ request = stub_request 'CONTENT_TYPE' => 'application/xml; charset=UTF-8'
371
+ assert_equal Mime::XML, request.content_type
372
+ end
373
+
374
+ def test_user_agent
375
+ request = stub_request 'HTTP_USER_AGENT' => 'TestAgent'
376
+ assert_equal 'TestAgent', request.user_agent
377
+ end
378
+
379
+ def test_parameters
380
+ request = stub_request
381
+ request.stubs(:request_parameters).returns({ "foo" => 1 })
382
+ request.stubs(:query_parameters).returns({ "bar" => 2 })
383
+
384
+ assert_equal({"foo" => 1, "bar" => 2}, request.parameters)
385
+ assert_equal({"foo" => 1}, request.request_parameters)
386
+ assert_equal({"bar" => 2}, request.query_parameters)
387
+ end
388
+
389
+ protected
390
+
391
+ def stub_request(env={})
392
+ ActionController::Request.new(env)
393
+ end
394
+
395
+ end