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,265 @@
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 rescue_action(e) raise e end
27
+ end
28
+
29
+ # sample controllers
30
+ class RequestForgeryProtectionController < ActionController::Base
31
+ include RequestForgeryProtectionActions
32
+ protect_from_forgery :only => :index
33
+ end
34
+
35
+ class FreeCookieController < RequestForgeryProtectionController
36
+ self.allow_forgery_protection = false
37
+
38
+ def index
39
+ render :inline => "<%= form_tag('/') {} %>"
40
+ end
41
+
42
+ def show_button
43
+ render :inline => "<%= button_to('New', '/') {} %>"
44
+ end
45
+ end
46
+
47
+ class CustomAuthenticityParamController < RequestForgeryProtectionController
48
+ def form_authenticity_param
49
+ 'foobar'
50
+ end
51
+ end
52
+
53
+
54
+ # common test methods
55
+
56
+ module RequestForgeryProtectionTests
57
+ def teardown
58
+ ActionController::Base.request_forgery_protection_token = nil
59
+ end
60
+
61
+
62
+ def test_should_render_form_with_token_tag
63
+ get :index
64
+ assert_select 'form>div>input[name=?][value=?]', 'authenticity_token', @token
65
+ end
66
+
67
+ def test_should_render_button_to_with_token_tag
68
+ get :show_button
69
+ assert_select 'form>div>input[name=?][value=?]', 'authenticity_token', @token
70
+ end
71
+
72
+ def test_should_render_remote_form_with_only_one_token_parameter
73
+ get :remote_form
74
+ assert_equal 1, @response.body.scan(@token).size
75
+ end
76
+
77
+ def test_should_allow_get
78
+ get :index
79
+ assert_response :success
80
+ end
81
+
82
+ def test_should_allow_post_without_token_on_unsafe_action
83
+ post :unsafe
84
+ assert_response :success
85
+ end
86
+
87
+ def test_should_not_allow_html_post_without_token
88
+ @request.env['CONTENT_TYPE'] = Mime::URL_ENCODED_FORM.to_s
89
+ assert_raise(ActionController::InvalidAuthenticityToken) { post :index, :format => :html }
90
+ end
91
+
92
+ def test_should_not_allow_html_put_without_token
93
+ @request.env['CONTENT_TYPE'] = Mime::URL_ENCODED_FORM.to_s
94
+ assert_raise(ActionController::InvalidAuthenticityToken) { put :index, :format => :html }
95
+ end
96
+
97
+ def test_should_not_allow_html_delete_without_token
98
+ @request.env['CONTENT_TYPE'] = Mime::URL_ENCODED_FORM.to_s
99
+ assert_raise(ActionController::InvalidAuthenticityToken) { delete :index, :format => :html }
100
+ end
101
+
102
+ def test_should_allow_api_formatted_post_without_token
103
+ assert_nothing_raised do
104
+ post :index, :format => 'xml'
105
+ end
106
+ end
107
+
108
+ def test_should_not_allow_api_formatted_put_without_token
109
+ assert_nothing_raised do
110
+ put :index, :format => 'xml'
111
+ end
112
+ end
113
+
114
+ def test_should_allow_api_formatted_delete_without_token
115
+ assert_nothing_raised do
116
+ delete :index, :format => 'xml'
117
+ end
118
+ end
119
+
120
+ def test_should_not_allow_api_formatted_post_sent_as_url_encoded_form_without_token
121
+ assert_raise(ActionController::InvalidAuthenticityToken) do
122
+ @request.env['CONTENT_TYPE'] = Mime::URL_ENCODED_FORM.to_s
123
+ post :index, :format => 'xml'
124
+ end
125
+ end
126
+
127
+ def test_should_not_allow_api_formatted_put_sent_as_url_encoded_form_without_token
128
+ assert_raise(ActionController::InvalidAuthenticityToken) do
129
+ @request.env['CONTENT_TYPE'] = Mime::URL_ENCODED_FORM.to_s
130
+ put :index, :format => 'xml'
131
+ end
132
+ end
133
+
134
+ def test_should_not_allow_api_formatted_delete_sent_as_url_encoded_form_without_token
135
+ assert_raise(ActionController::InvalidAuthenticityToken) do
136
+ @request.env['CONTENT_TYPE'] = Mime::URL_ENCODED_FORM.to_s
137
+ delete :index, :format => 'xml'
138
+ end
139
+ end
140
+
141
+ def test_should_not_allow_api_formatted_post_sent_as_multipart_form_without_token
142
+ assert_raise(ActionController::InvalidAuthenticityToken) do
143
+ @request.env['CONTENT_TYPE'] = Mime::MULTIPART_FORM.to_s
144
+ post :index, :format => 'xml'
145
+ end
146
+ end
147
+
148
+ def test_should_not_allow_api_formatted_put_sent_as_multipart_form_without_token
149
+ assert_raise(ActionController::InvalidAuthenticityToken) do
150
+ @request.env['CONTENT_TYPE'] = Mime::MULTIPART_FORM.to_s
151
+ put :index, :format => 'xml'
152
+ end
153
+ end
154
+
155
+ def test_should_not_allow_api_formatted_delete_sent_as_multipart_form_without_token
156
+ assert_raise(ActionController::InvalidAuthenticityToken) do
157
+ @request.env['CONTENT_TYPE'] = Mime::MULTIPART_FORM.to_s
158
+ delete :index, :format => 'xml'
159
+ end
160
+ end
161
+
162
+ def test_should_allow_xhr_post_without_token
163
+ assert_nothing_raised { xhr :post, :index }
164
+ end
165
+
166
+ def test_should_allow_xhr_put_without_token
167
+ assert_nothing_raised { xhr :put, :index }
168
+ end
169
+
170
+ def test_should_allow_xhr_delete_without_token
171
+ assert_nothing_raised { xhr :delete, :index }
172
+ end
173
+
174
+ def test_should_allow_xhr_post_with_encoded_form_content_type_without_token
175
+ @request.env['CONTENT_TYPE'] = Mime::URL_ENCODED_FORM.to_s
176
+ assert_nothing_raised { xhr :post, :index }
177
+ end
178
+
179
+ def test_should_allow_post_with_token
180
+ post :index, :authenticity_token => @token
181
+ assert_response :success
182
+ end
183
+
184
+ def test_should_allow_put_with_token
185
+ put :index, :authenticity_token => @token
186
+ assert_response :success
187
+ end
188
+
189
+ def test_should_allow_delete_with_token
190
+ delete :index, :authenticity_token => @token
191
+ assert_response :success
192
+ end
193
+
194
+ def test_should_allow_post_with_xml
195
+ @request.env['CONTENT_TYPE'] = Mime::XML.to_s
196
+ post :index, :format => 'xml'
197
+ assert_response :success
198
+ end
199
+
200
+ def test_should_allow_put_with_xml
201
+ @request.env['CONTENT_TYPE'] = Mime::XML.to_s
202
+ put :index, :format => 'xml'
203
+ assert_response :success
204
+ end
205
+
206
+ def test_should_allow_delete_with_xml
207
+ @request.env['CONTENT_TYPE'] = Mime::XML.to_s
208
+ delete :index, :format => 'xml'
209
+ assert_response :success
210
+ end
211
+ end
212
+
213
+ # OK let's get our test on
214
+
215
+ class RequestForgeryProtectionControllerTest < ActionController::TestCase
216
+ include RequestForgeryProtectionTests
217
+ def setup
218
+ @controller = RequestForgeryProtectionController.new
219
+ @request = ActionController::TestRequest.new
220
+ @request.format = :html
221
+ @response = ActionController::TestResponse.new
222
+ @token = "cf50faa3fe97702ca1ae"
223
+
224
+ ActiveSupport::SecureRandom.stubs(:base64).returns(@token)
225
+ ActionController::Base.request_forgery_protection_token = :authenticity_token
226
+ end
227
+ end
228
+
229
+ class FreeCookieControllerTest < ActionController::TestCase
230
+ def setup
231
+ @controller = FreeCookieController.new
232
+ @request = ActionController::TestRequest.new
233
+ @response = ActionController::TestResponse.new
234
+ @token = "cf50faa3fe97702ca1ae"
235
+
236
+ ActiveSupport::SecureRandom.stubs(:base64).returns(@token)
237
+ end
238
+
239
+ def test_should_not_render_form_with_token_tag
240
+ get :index
241
+ assert_select 'form>div>input[name=?][value=?]', 'authenticity_token', @token, false
242
+ end
243
+
244
+ def test_should_not_render_button_to_with_token_tag
245
+ get :show_button
246
+ assert_select 'form>div>input[name=?][value=?]', 'authenticity_token', @token, false
247
+ end
248
+
249
+ def test_should_allow_all_methods_without_token
250
+ [:post, :put, :delete].each do |method|
251
+ assert_nothing_raised { send(method, :index)}
252
+ end
253
+ end
254
+ end
255
+
256
+ class CustomAuthenticityParamControllerTest < ActionController::TestCase
257
+ def setup
258
+ ActionController::Base.request_forgery_protection_token = :authenticity_token
259
+ end
260
+
261
+ def test_should_allow_custom_token
262
+ post :index, :authenticity_token => 'foobar'
263
+ assert_response :ok
264
+ end
265
+ 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