eactionpack 2.1.2

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 (338) hide show
  1. data/CHANGELOG +7 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +469 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +146 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller.rb +79 -0
  8. data/lib/action_controller/assertions.rb +69 -0
  9. data/lib/action_controller/assertions/dom_assertions.rb +39 -0
  10. data/lib/action_controller/assertions/model_assertions.rb +20 -0
  11. data/lib/action_controller/assertions/response_assertions.rb +172 -0
  12. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  13. data/lib/action_controller/assertions/selector_assertions.rb +491 -0
  14. data/lib/action_controller/assertions/tag_assertions.rb +130 -0
  15. data/lib/action_controller/base.rb +1288 -0
  16. data/lib/action_controller/benchmarking.rb +94 -0
  17. data/lib/action_controller/caching.rb +72 -0
  18. data/lib/action_controller/caching/actions.rb +144 -0
  19. data/lib/action_controller/caching/fragments.rb +138 -0
  20. data/lib/action_controller/caching/pages.rb +154 -0
  21. data/lib/action_controller/caching/sql_cache.rb +18 -0
  22. data/lib/action_controller/caching/sweeping.rb +97 -0
  23. data/lib/action_controller/cgi_ext.rb +16 -0
  24. data/lib/action_controller/cgi_ext/cookie.rb +110 -0
  25. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  26. data/lib/action_controller/cgi_ext/session.rb +73 -0
  27. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  28. data/lib/action_controller/cgi_process.rb +223 -0
  29. data/lib/action_controller/components.rb +166 -0
  30. data/lib/action_controller/cookies.rb +96 -0
  31. data/lib/action_controller/dispatcher.rb +162 -0
  32. data/lib/action_controller/filters.rb +642 -0
  33. data/lib/action_controller/flash.rb +172 -0
  34. data/lib/action_controller/headers.rb +31 -0
  35. data/lib/action_controller/helpers.rb +221 -0
  36. data/lib/action_controller/http_authentication.rb +124 -0
  37. data/lib/action_controller/integration.rb +634 -0
  38. data/lib/action_controller/layout.rb +309 -0
  39. data/lib/action_controller/mime_responds.rb +173 -0
  40. data/lib/action_controller/mime_type.rb +186 -0
  41. data/lib/action_controller/mime_types.rb +20 -0
  42. data/lib/action_controller/polymorphic_routes.rb +191 -0
  43. data/lib/action_controller/record_identifier.rb +102 -0
  44. data/lib/action_controller/request.rb +764 -0
  45. data/lib/action_controller/request_forgery_protection.rb +140 -0
  46. data/lib/action_controller/request_profiler.rb +169 -0
  47. data/lib/action_controller/rescue.rb +258 -0
  48. data/lib/action_controller/resources.rb +572 -0
  49. data/lib/action_controller/response.rb +76 -0
  50. data/lib/action_controller/routing.rb +387 -0
  51. data/lib/action_controller/routing/builder.rb +203 -0
  52. data/lib/action_controller/routing/optimisations.rb +120 -0
  53. data/lib/action_controller/routing/recognition_optimisation.rb +162 -0
  54. data/lib/action_controller/routing/route.rb +240 -0
  55. data/lib/action_controller/routing/route_set.rb +436 -0
  56. data/lib/action_controller/routing/routing_ext.rb +46 -0
  57. data/lib/action_controller/routing/segments.rb +283 -0
  58. data/lib/action_controller/session/active_record_store.rb +340 -0
  59. data/lib/action_controller/session/cookie_store.rb +166 -0
  60. data/lib/action_controller/session/drb_server.rb +32 -0
  61. data/lib/action_controller/session/drb_store.rb +35 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +98 -0
  63. data/lib/action_controller/session_management.rb +158 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +155 -0
  66. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  67. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  68. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  69. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  70. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  71. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  72. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  73. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  74. data/lib/action_controller/test_case.rb +83 -0
  75. data/lib/action_controller/test_process.rb +526 -0
  76. data/lib/action_controller/url_rewriter.rb +142 -0
  77. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  78. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  79. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  80. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  81. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  82. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  83. data/lib/action_controller/verification.rb +130 -0
  84. data/lib/action_pack.rb +24 -0
  85. data/lib/action_pack/version.rb +9 -0
  86. data/lib/action_view.rb +44 -0
  87. data/lib/action_view/base.rb +335 -0
  88. data/lib/action_view/helpers/active_record_helper.rb +276 -0
  89. data/lib/action_view/helpers/asset_tag_helper.rb +599 -0
  90. data/lib/action_view/helpers/atom_feed_helper.rb +143 -0
  91. data/lib/action_view/helpers/benchmark_helper.rb +33 -0
  92. data/lib/action_view/helpers/cache_helper.rb +40 -0
  93. data/lib/action_view/helpers/capture_helper.rb +161 -0
  94. data/lib/action_view/helpers/date_helper.rb +711 -0
  95. data/lib/action_view/helpers/debug_helper.rb +31 -0
  96. data/lib/action_view/helpers/form_helper.rb +767 -0
  97. data/lib/action_view/helpers/form_options_helper.rb +458 -0
  98. data/lib/action_view/helpers/form_tag_helper.rb +458 -0
  99. data/lib/action_view/helpers/javascript_helper.rb +148 -0
  100. data/lib/action_view/helpers/number_helper.rb +186 -0
  101. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  102. data/lib/action_view/helpers/record_tag_helper.rb +59 -0
  103. data/lib/action_view/helpers/sanitize_helper.rb +229 -0
  104. data/lib/action_view/helpers/tag_helper.rb +134 -0
  105. data/lib/action_view/helpers/text_helper.rb +507 -0
  106. data/lib/action_view/helpers/url_helper.rb +573 -0
  107. data/lib/action_view/inline_template.rb +20 -0
  108. data/lib/action_view/partial_template.rb +70 -0
  109. data/lib/action_view/partials.rb +158 -0
  110. data/lib/action_view/template.rb +125 -0
  111. data/lib/action_view/template_error.rb +110 -0
  112. data/lib/action_view/template_finder.rb +176 -0
  113. data/lib/action_view/template_handler.rb +34 -0
  114. data/lib/action_view/template_handlers/builder.rb +27 -0
  115. data/lib/action_view/template_handlers/compilable.rb +128 -0
  116. data/lib/action_view/template_handlers/erb.rb +56 -0
  117. data/lib/action_view/test_case.rb +58 -0
  118. data/lib/actionpack.rb +1 -0
  119. data/test/abstract_unit.rb +36 -0
  120. data/test/active_record_unit.rb +105 -0
  121. data/test/activerecord/active_record_store_test.rb +141 -0
  122. data/test/activerecord/render_partial_with_record_identification_test.rb +191 -0
  123. data/test/adv_attr_test.rb +20 -0
  124. data/test/controller/action_pack_assertions_test.rb +543 -0
  125. data/test/controller/addresses_render_test.rb +43 -0
  126. data/test/controller/assert_select_test.rb +331 -0
  127. data/test/controller/base_test.rb +219 -0
  128. data/test/controller/benchmark_test.rb +32 -0
  129. data/test/controller/caching_test.rb +581 -0
  130. data/test/controller/capture_test.rb +89 -0
  131. data/test/controller/cgi_test.rb +116 -0
  132. data/test/controller/components_test.rb +140 -0
  133. data/test/controller/content_type_test.rb +139 -0
  134. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  135. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  136. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  137. data/test/controller/cookie_test.rb +146 -0
  138. data/test/controller/custom_handler_test.rb +45 -0
  139. data/test/controller/deprecation/deprecated_base_methods_test.rb +37 -0
  140. data/test/controller/dispatcher_test.rb +105 -0
  141. data/test/controller/fake_controllers.rb +33 -0
  142. data/test/controller/fake_models.rb +11 -0
  143. data/test/controller/filter_params_test.rb +49 -0
  144. data/test/controller/filters_test.rb +881 -0
  145. data/test/controller/flash_test.rb +146 -0
  146. data/test/controller/header_test.rb +14 -0
  147. data/test/controller/helper_test.rb +210 -0
  148. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  149. data/test/controller/html-scanner/document_test.rb +148 -0
  150. data/test/controller/html-scanner/node_test.rb +89 -0
  151. data/test/controller/html-scanner/sanitizer_test.rb +269 -0
  152. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  153. data/test/controller/html-scanner/text_node_test.rb +50 -0
  154. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  155. data/test/controller/http_authentication_test.rb +54 -0
  156. data/test/controller/integration_test.rb +252 -0
  157. data/test/controller/integration_upload_test.rb +43 -0
  158. data/test/controller/layout_test.rb +255 -0
  159. data/test/controller/mime_responds_test.rb +514 -0
  160. data/test/controller/mime_type_test.rb +84 -0
  161. data/test/controller/new_render_test.rb +843 -0
  162. data/test/controller/polymorphic_routes_test.rb +174 -0
  163. data/test/controller/record_identifier_test.rb +139 -0
  164. data/test/controller/redirect_test.rb +289 -0
  165. data/test/controller/render_test.rb +484 -0
  166. data/test/controller/request_forgery_protection_test.rb +305 -0
  167. data/test/controller/request_test.rb +928 -0
  168. data/test/controller/rescue_test.rb +517 -0
  169. data/test/controller/resources_test.rb +873 -0
  170. data/test/controller/routing_test.rb +2464 -0
  171. data/test/controller/selector_test.rb +628 -0
  172. data/test/controller/send_file_test.rb +138 -0
  173. data/test/controller/session/cookie_store_test.rb +258 -0
  174. data/test/controller/session/mem_cache_store_test.rb +181 -0
  175. data/test/controller/session_fixation_test.rb +89 -0
  176. data/test/controller/session_management_test.rb +178 -0
  177. data/test/controller/test_test.rb +695 -0
  178. data/test/controller/url_rewriter_test.rb +310 -0
  179. data/test/controller/verification_test.rb +270 -0
  180. data/test/controller/view_paths_test.rb +140 -0
  181. data/test/controller/webservice_test.rb +229 -0
  182. data/test/fixtures/addresses/list.erb +1 -0
  183. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  184. data/test/fixtures/companies.yml +24 -0
  185. data/test/fixtures/company.rb +10 -0
  186. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  187. data/test/fixtures/content_type/render_default_for_js.js.erb +1 -0
  188. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  189. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  190. data/test/fixtures/customers/_customer.html.erb +1 -0
  191. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  192. data/test/fixtures/developer.rb +9 -0
  193. data/test/fixtures/developers.yml +21 -0
  194. data/test/fixtures/developers_projects.yml +13 -0
  195. data/test/fixtures/fun/games/hello_world.erb +1 -0
  196. data/test/fixtures/functional_caching/_partial.erb +3 -0
  197. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  198. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  199. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  200. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  201. data/test/fixtures/helpers/abc_helper.rb +5 -0
  202. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  203. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  204. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  205. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  206. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  207. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  208. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  209. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  210. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  211. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  212. data/test/fixtures/layouts/builder.builder +3 -0
  213. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  214. data/test/fixtures/layouts/standard.erb +1 -0
  215. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  216. data/test/fixtures/layouts/yield.erb +2 -0
  217. data/test/fixtures/mascot.rb +3 -0
  218. data/test/fixtures/mascots.yml +4 -0
  219. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  220. data/test/fixtures/multipart/binary_file +0 -0
  221. data/test/fixtures/multipart/boundary_problem_file +10 -0
  222. data/test/fixtures/multipart/bracketed_param +5 -0
  223. data/test/fixtures/multipart/large_text_file +10 -0
  224. data/test/fixtures/multipart/mixed_files +0 -0
  225. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  226. data/test/fixtures/multipart/single_parameter +5 -0
  227. data/test/fixtures/multipart/text_file +10 -0
  228. data/test/fixtures/override/test/hello_world.erb +1 -0
  229. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  230. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  231. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  232. data/test/fixtures/post_test/post/index.html.erb +1 -0
  233. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  234. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  235. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  236. data/test/fixtures/project.rb +3 -0
  237. data/test/fixtures/projects.yml +7 -0
  238. data/test/fixtures/public/404.html +1 -0
  239. data/test/fixtures/public/500.html +1 -0
  240. data/test/fixtures/public/images/rails.png +0 -0
  241. data/test/fixtures/public/javascripts/application.js +1 -0
  242. data/test/fixtures/public/javascripts/bank.js +1 -0
  243. data/test/fixtures/public/javascripts/robber.js +1 -0
  244. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  245. data/test/fixtures/public/stylesheets/bank.css +1 -0
  246. data/test/fixtures/public/stylesheets/robber.css +1 -0
  247. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  248. data/test/fixtures/replies.yml +15 -0
  249. data/test/fixtures/reply.rb +7 -0
  250. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  251. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  252. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  253. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  254. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  255. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  256. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  257. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  258. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  259. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  260. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  261. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  262. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  263. data/test/fixtures/scope/test/modgreet.erb +1 -0
  264. data/test/fixtures/shared.html.erb +1 -0
  265. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  266. data/test/fixtures/test/_customer.erb +1 -0
  267. data/test/fixtures/test/_customer_counter.erb +1 -0
  268. data/test/fixtures/test/_customer_greeting.erb +1 -0
  269. data/test/fixtures/test/_form.erb +1 -0
  270. data/test/fixtures/test/_hash_greeting.erb +1 -0
  271. data/test/fixtures/test/_hash_object.erb +2 -0
  272. data/test/fixtures/test/_hello.builder +1 -0
  273. data/test/fixtures/test/_labelling_form.erb +1 -0
  274. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  275. data/test/fixtures/test/_partial.erb +1 -0
  276. data/test/fixtures/test/_partial.html.erb +1 -0
  277. data/test/fixtures/test/_partial.js.erb +1 -0
  278. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  279. data/test/fixtures/test/_partial_only.erb +1 -0
  280. data/test/fixtures/test/_person.erb +2 -0
  281. data/test/fixtures/test/_raise.html.erb +1 -0
  282. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  283. data/test/fixtures/test/block_content_for.erb +2 -0
  284. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  285. data/test/fixtures/test/capturing.erb +4 -0
  286. data/test/fixtures/test/content_for.erb +2 -0
  287. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  288. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  289. data/test/fixtures/test/delete_with_js.rjs +2 -0
  290. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  291. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  292. data/test/fixtures/test/erb_content_for.erb +2 -0
  293. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  294. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  295. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  296. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  297. data/test/fixtures/test/greeting.erb +1 -0
  298. data/test/fixtures/test/greeting.js.rjs +1 -0
  299. data/test/fixtures/test/hello.builder +4 -0
  300. data/test/fixtures/test/hello_world.erb +1 -0
  301. data/test/fixtures/test/hello_world_container.builder +3 -0
  302. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  303. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  304. data/test/fixtures/test/hello_xml_world.builder +11 -0
  305. data/test/fixtures/test/list.erb +1 -0
  306. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  307. data/test/fixtures/test/potential_conflicts.erb +4 -0
  308. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  309. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  310. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  311. data/test/fixtures/test/render_to_string_test.erb +1 -0
  312. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  313. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  314. data/test/fixtures/topic.rb +3 -0
  315. data/test/fixtures/topics.yml +22 -0
  316. data/test/fixtures/topics/_topic.html.erb +1 -0
  317. data/test/template/active_record_helper_test.rb +268 -0
  318. data/test/template/asset_tag_helper_test.rb +514 -0
  319. data/test/template/atom_feed_helper_test.rb +179 -0
  320. data/test/template/benchmark_helper_test.rb +60 -0
  321. data/test/template/date_helper_test.rb +1791 -0
  322. data/test/template/deprecated_erb_variable_test.rb +9 -0
  323. data/test/template/erb_util_test.rb +24 -0
  324. data/test/template/form_helper_test.rb +885 -0
  325. data/test/template/form_options_helper_test.rb +1333 -0
  326. data/test/template/form_tag_helper_test.rb +272 -0
  327. data/test/template/javascript_helper_test.rb +73 -0
  328. data/test/template/number_helper_test.rb +97 -0
  329. data/test/template/record_tag_helper_test.rb +54 -0
  330. data/test/template/sanitize_helper_test.rb +48 -0
  331. data/test/template/tag_helper_test.rb +77 -0
  332. data/test/template/template_finder_test.rb +73 -0
  333. data/test/template/template_object_test.rb +95 -0
  334. data/test/template/test_test.rb +56 -0
  335. data/test/template/text_helper_test.rb +367 -0
  336. data/test/template/url_helper_test.rb +544 -0
  337. data/test/testing_sandbox.rb +15 -0
  338. metadata +469 -0
@@ -0,0 +1,517 @@
1
+ require 'abstract_unit'
2
+
3
+ uses_mocha 'rescue' do
4
+
5
+ class RescueController < ActionController::Base
6
+ class NotAuthorized < StandardError
7
+ end
8
+ class NotAuthorizedToRescueAsString < StandardError
9
+ end
10
+
11
+ class RecordInvalid < StandardError
12
+ end
13
+ class RecordInvalidToRescueAsString < StandardError
14
+ end
15
+
16
+ class NotAllowed < StandardError
17
+ end
18
+ class NotAllowedToRescueAsString < StandardError
19
+ end
20
+
21
+ class InvalidRequest < StandardError
22
+ end
23
+ class InvalidRequestToRescueAsString < StandardError
24
+ end
25
+
26
+ class BadGateway < StandardError
27
+ end
28
+ class BadGatewayToRescueAsString < StandardError
29
+ end
30
+
31
+ class ResourceUnavailable < StandardError
32
+ end
33
+ class ResourceUnavailableToRescueAsString < StandardError
34
+ end
35
+
36
+ # We use a fully-qualified name in some strings, and a relative constant
37
+ # name in some other to test correct handling of both cases.
38
+
39
+ rescue_from NotAuthorized, :with => :deny_access
40
+ rescue_from 'RescueController::NotAuthorizedToRescueAsString', :with => :deny_access
41
+
42
+ rescue_from RecordInvalid, :with => :show_errors
43
+ rescue_from 'RescueController::RecordInvalidToRescueAsString', :with => :show_errors
44
+
45
+ rescue_from NotAllowed, :with => proc { head :forbidden }
46
+ rescue_from 'RescueController::NotAllowedToRescueAsString', :with => proc { head :forbidden }
47
+
48
+ rescue_from InvalidRequest, :with => proc { |exception| render :text => exception.message }
49
+ rescue_from 'InvalidRequestToRescueAsString', :with => proc { |exception| render :text => exception.message }
50
+
51
+ rescue_from BadGateway do
52
+ head :status => 502
53
+ end
54
+ rescue_from 'BadGatewayToRescueAsString' do
55
+ head :status => 502
56
+ end
57
+
58
+ rescue_from ResourceUnavailable do |exception|
59
+ render :text => exception.message
60
+ end
61
+ rescue_from 'ResourceUnavailableToRescueAsString' do |exception|
62
+ render :text => exception.message
63
+ end
64
+
65
+ def raises
66
+ render :text => 'already rendered'
67
+ raise "don't panic!"
68
+ end
69
+
70
+ def method_not_allowed
71
+ raise ActionController::MethodNotAllowed.new(:get, :head, :put)
72
+ end
73
+
74
+ def not_implemented
75
+ raise ActionController::NotImplemented.new(:get, :put)
76
+ end
77
+
78
+ def not_authorized
79
+ raise NotAuthorized
80
+ end
81
+ def not_authorized_raise_as_string
82
+ raise NotAuthorizedToRescueAsString
83
+ end
84
+
85
+ def not_allowed
86
+ raise NotAllowed
87
+ end
88
+ def not_allowed_raise_as_string
89
+ raise NotAllowedToRescueAsString
90
+ end
91
+
92
+ def invalid_request
93
+ raise InvalidRequest
94
+ end
95
+ def invalid_request_raise_as_string
96
+ raise InvalidRequestToRescueAsString
97
+ end
98
+
99
+ def record_invalid
100
+ raise RecordInvalid
101
+ end
102
+ def record_invalid_raise_as_string
103
+ raise RecordInvalidToRescueAsString
104
+ end
105
+
106
+ def bad_gateway
107
+ raise BadGateway
108
+ end
109
+ def bad_gateway_raise_as_string
110
+ raise BadGatewayToRescueAsString
111
+ end
112
+
113
+ def resource_unavailable
114
+ raise ResourceUnavailable
115
+ end
116
+ def resource_unavailable_raise_as_string
117
+ raise ResourceUnavailableToRescueAsString
118
+ end
119
+
120
+ def missing_template
121
+ end
122
+
123
+ protected
124
+ def deny_access
125
+ head :forbidden
126
+ end
127
+
128
+ def show_errors(exception)
129
+ head :unprocessable_entity
130
+ end
131
+ end
132
+
133
+ class RescueTest < Test::Unit::TestCase
134
+ FIXTURE_PUBLIC = "#{File.dirname(__FILE__)}/../fixtures".freeze
135
+
136
+ def setup
137
+ @controller = RescueController.new
138
+ @request = ActionController::TestRequest.new
139
+ @response = ActionController::TestResponse.new
140
+
141
+ RescueController.consider_all_requests_local = true
142
+ @request.remote_addr = '1.2.3.4'
143
+ @request.host = 'example.com'
144
+
145
+ begin
146
+ raise 'foo'
147
+ rescue => @exception
148
+ end
149
+ end
150
+
151
+ def test_rescue_action_locally_if_all_requests_local
152
+ @controller.expects(:local_request?).never
153
+ @controller.expects(:rescue_action_locally).with(@exception)
154
+ @controller.expects(:rescue_action_in_public).never
155
+
156
+ with_all_requests_local do
157
+ @controller.send :rescue_action, @exception
158
+ end
159
+ end
160
+
161
+ def test_rescue_action_locally_if_remote_addr_is_localhost
162
+ @controller.expects(:local_request?).returns(true)
163
+ @controller.expects(:rescue_action_locally).with(@exception)
164
+ @controller.expects(:rescue_action_in_public).never
165
+
166
+ with_all_requests_local false do
167
+ @controller.send :rescue_action, @exception
168
+ end
169
+ end
170
+
171
+ def test_rescue_action_in_public_otherwise
172
+ @controller.expects(:local_request?).returns(false)
173
+ @controller.expects(:rescue_action_locally).never
174
+ @controller.expects(:rescue_action_in_public).with(@exception)
175
+
176
+ with_all_requests_local false do
177
+ @controller.send :rescue_action, @exception
178
+ end
179
+ end
180
+
181
+ def test_rescue_action_in_public_with_error_file
182
+ with_rails_root FIXTURE_PUBLIC do
183
+ with_all_requests_local false do
184
+ get :raises
185
+ end
186
+ end
187
+
188
+ assert_response :internal_server_error
189
+ body = File.read("#{FIXTURE_PUBLIC}/public/500.html")
190
+ assert_equal body, @response.body
191
+ end
192
+
193
+ def test_rescue_action_in_public_without_error_file
194
+ with_rails_root '/tmp' do
195
+ with_all_requests_local false do
196
+ get :raises
197
+ end
198
+ end
199
+
200
+ assert_response :internal_server_error
201
+ assert_equal ' ', @response.body
202
+ end
203
+
204
+ def test_rescue_unknown_action_in_public_with_error_file
205
+ with_rails_root FIXTURE_PUBLIC do
206
+ with_all_requests_local false do
207
+ get :foobar_doesnt_exist
208
+ end
209
+ end
210
+
211
+ assert_response :not_found
212
+ body = File.read("#{FIXTURE_PUBLIC}/public/404.html")
213
+ assert_equal body, @response.body
214
+ end
215
+
216
+ def test_rescue_unknown_action_in_public_without_error_file
217
+ with_rails_root '/tmp' do
218
+ with_all_requests_local false do
219
+ get :foobar_doesnt_exist
220
+ end
221
+ end
222
+
223
+ assert_response :not_found
224
+ assert_equal ' ', @response.body
225
+ end
226
+
227
+ def test_rescue_missing_template_in_public
228
+ with_rails_root FIXTURE_PUBLIC do
229
+ with_all_requests_local true do
230
+ get :missing_template
231
+ end
232
+ end
233
+
234
+ assert_response :internal_server_error
235
+ assert @response.body.include?('missing_template'), "Response should include the template name."
236
+ end
237
+
238
+ def test_rescue_action_locally
239
+ get :raises
240
+ assert_response :internal_server_error
241
+ assert_template 'diagnostics.erb'
242
+ assert @response.body.include?('RescueController#raises'), "Response should include controller and action."
243
+ assert @response.body.include?("don't panic"), "Response should include exception message."
244
+ end
245
+
246
+ def test_local_request_when_remote_addr_is_localhost
247
+ @controller.expects(:request).returns(@request).at_least_once
248
+ with_remote_addr '127.0.0.1' do
249
+ assert @controller.send(:local_request?)
250
+ end
251
+ end
252
+
253
+ def test_local_request_when_remote_addr_isnt_locahost
254
+ @controller.expects(:request).returns(@request)
255
+ with_remote_addr '1.2.3.4' do
256
+ assert !@controller.send(:local_request?)
257
+ end
258
+ end
259
+
260
+ def test_rescue_responses
261
+ responses = ActionController::Base.rescue_responses
262
+
263
+ assert_equal ActionController::Rescue::DEFAULT_RESCUE_RESPONSE, responses.default
264
+ assert_equal ActionController::Rescue::DEFAULT_RESCUE_RESPONSE, responses[Exception.new]
265
+
266
+ assert_equal :not_found, responses[ActionController::RoutingError.name]
267
+ assert_equal :not_found, responses[ActionController::UnknownAction.name]
268
+ assert_equal :not_found, responses['ActiveRecord::RecordNotFound']
269
+ assert_equal :conflict, responses['ActiveRecord::StaleObjectError']
270
+ assert_equal :unprocessable_entity, responses['ActiveRecord::RecordInvalid']
271
+ assert_equal :unprocessable_entity, responses['ActiveRecord::RecordNotSaved']
272
+ assert_equal :method_not_allowed, responses['ActionController::MethodNotAllowed']
273
+ assert_equal :not_implemented, responses['ActionController::NotImplemented']
274
+ end
275
+
276
+ def test_rescue_templates
277
+ templates = ActionController::Base.rescue_templates
278
+
279
+ assert_equal ActionController::Rescue::DEFAULT_RESCUE_TEMPLATE, templates.default
280
+ assert_equal ActionController::Rescue::DEFAULT_RESCUE_TEMPLATE, templates[Exception.new]
281
+
282
+ assert_equal 'missing_template', templates[ActionView::MissingTemplate.name]
283
+ assert_equal 'routing_error', templates[ActionController::RoutingError.name]
284
+ assert_equal 'unknown_action', templates[ActionController::UnknownAction.name]
285
+ assert_equal 'template_error', templates[ActionView::TemplateError.name]
286
+ end
287
+
288
+ def test_clean_backtrace
289
+ with_rails_root nil do
290
+ # No action if RAILS_ROOT isn't set.
291
+ cleaned = @controller.send(:clean_backtrace, @exception)
292
+ assert_equal @exception.backtrace, cleaned
293
+ end
294
+
295
+ with_rails_root Dir.pwd do
296
+ # RAILS_ROOT is removed from backtrace.
297
+ cleaned = @controller.send(:clean_backtrace, @exception)
298
+ expected = @exception.backtrace.map { |line| line.sub(RAILS_ROOT, '') }
299
+ assert_equal expected, cleaned
300
+
301
+ # No action if backtrace is nil.
302
+ assert_nil @controller.send(:clean_backtrace, Exception.new)
303
+ end
304
+ end
305
+
306
+ def test_not_implemented
307
+ with_all_requests_local false do
308
+ with_rails_public_path(".") do
309
+ head :not_implemented
310
+ end
311
+ end
312
+ assert_response :not_implemented
313
+ assert_equal "GET, PUT", @response.headers['Allow']
314
+ end
315
+
316
+ def test_method_not_allowed
317
+ with_all_requests_local false do
318
+ with_rails_public_path(".") do
319
+ get :method_not_allowed
320
+ end
321
+ end
322
+ assert_response :method_not_allowed
323
+ assert_equal "GET, HEAD, PUT", @response.headers['Allow']
324
+ end
325
+
326
+ def test_rescue_handler
327
+ get :not_authorized
328
+ assert_response :forbidden
329
+ end
330
+ def test_rescue_handler_string
331
+ get :not_authorized_raise_as_string
332
+ assert_response :forbidden
333
+ end
334
+
335
+ def test_rescue_handler_with_argument
336
+ @controller.expects(:show_errors).once.with { |e| e.is_a?(Exception) }
337
+ get :record_invalid
338
+ end
339
+ def test_rescue_handler_with_argument_as_string
340
+ @controller.expects(:show_errors).once.with { |e| e.is_a?(Exception) }
341
+ get :record_invalid_raise_as_string
342
+ end
343
+
344
+ def test_proc_rescue_handler
345
+ get :not_allowed
346
+ assert_response :forbidden
347
+ end
348
+ def test_proc_rescue_handler_as_string
349
+ get :not_allowed_raise_as_string
350
+ assert_response :forbidden
351
+ end
352
+
353
+ def test_proc_rescue_handle_with_argument
354
+ get :invalid_request
355
+ assert_equal "RescueController::InvalidRequest", @response.body
356
+ end
357
+ def test_proc_rescue_handle_with_argument_as_string
358
+ get :invalid_request_raise_as_string
359
+ assert_equal "RescueController::InvalidRequestToRescueAsString", @response.body
360
+ end
361
+
362
+ def test_block_rescue_handler
363
+ get :bad_gateway
364
+ assert_response 502
365
+ end
366
+ def test_block_rescue_handler_as_string
367
+ get :bad_gateway_raise_as_string
368
+ assert_response 502
369
+ end
370
+
371
+ def test_block_rescue_handler_with_argument
372
+ get :resource_unavailable
373
+ assert_equal "RescueController::ResourceUnavailable", @response.body
374
+ end
375
+
376
+ def test_block_rescue_handler_with_argument_as_string
377
+ get :resource_unavailable_raise_as_string
378
+ assert_equal "RescueController::ResourceUnavailableToRescueAsString", @response.body
379
+ end
380
+
381
+
382
+ protected
383
+ def with_all_requests_local(local = true)
384
+ old_local, ActionController::Base.consider_all_requests_local =
385
+ ActionController::Base.consider_all_requests_local, local
386
+ yield
387
+ ensure
388
+ ActionController::Base.consider_all_requests_local = old_local
389
+ end
390
+
391
+ def with_remote_addr(addr)
392
+ old_remote_addr, @request.remote_addr = @request.remote_addr, addr
393
+ yield
394
+ ensure
395
+ @request.remote_addr = old_remote_addr
396
+ end
397
+
398
+ def with_rails_public_path(rails_root)
399
+ old_rails = Object.const_get(:Rails) rescue nil
400
+ mod = Object.const_set(:Rails, Module.new)
401
+ (class << mod; self; end).instance_eval do
402
+ define_method(:public_path) { "#{rails_root}/public" }
403
+ end
404
+ yield
405
+ ensure
406
+ Object.module_eval { remove_const(:Rails) } if defined?(Rails)
407
+ Object.const_set(:Rails, old_rails) if old_rails
408
+ end
409
+
410
+ def with_rails_root(path = nil,&block)
411
+ old_rails_root = RAILS_ROOT if defined?(RAILS_ROOT)
412
+ if path
413
+ silence_warnings { Object.const_set(:RAILS_ROOT, path) }
414
+ else
415
+ Object.remove_const(:RAILS_ROOT) rescue nil
416
+ end
417
+
418
+ with_rails_public_path(path, &block)
419
+
420
+ ensure
421
+ if old_rails_root
422
+ silence_warnings { Object.const_set(:RAILS_ROOT, old_rails_root) }
423
+ else
424
+ Object.remove_const(:RAILS_ROOT) rescue nil
425
+ end
426
+ end
427
+ end
428
+
429
+ class ExceptionInheritanceRescueController < ActionController::Base
430
+
431
+ class ParentException < StandardError
432
+ end
433
+
434
+ class ChildException < ParentException
435
+ end
436
+
437
+ class GrandchildException < ChildException
438
+ end
439
+
440
+ rescue_from ChildException, :with => lambda { head :ok }
441
+ rescue_from ParentException, :with => lambda { head :created }
442
+ rescue_from GrandchildException, :with => lambda { head :no_content }
443
+
444
+ def raise_parent_exception
445
+ raise ParentException
446
+ end
447
+
448
+ def raise_child_exception
449
+ raise ChildException
450
+ end
451
+
452
+ def raise_grandchild_exception
453
+ raise GrandchildException
454
+ end
455
+ end
456
+
457
+ class ExceptionInheritanceRescueTest < Test::Unit::TestCase
458
+
459
+ def setup
460
+ @controller = ExceptionInheritanceRescueController.new
461
+ @request = ActionController::TestRequest.new
462
+ @response = ActionController::TestResponse.new
463
+ end
464
+
465
+ def test_bottom_first
466
+ get :raise_grandchild_exception
467
+ assert_response :no_content
468
+ end
469
+
470
+ def test_inheritance_works
471
+ get :raise_child_exception
472
+ assert_response :created
473
+ end
474
+ end
475
+
476
+ class ControllerInheritanceRescueController < ExceptionInheritanceRescueController
477
+ class FirstExceptionInChildController < StandardError
478
+ end
479
+
480
+ class SecondExceptionInChildController < StandardError
481
+ end
482
+
483
+ rescue_from FirstExceptionInChildController, 'SecondExceptionInChildController', :with => lambda { head :gone }
484
+
485
+ def raise_first_exception_in_child_controller
486
+ raise FirstExceptionInChildController
487
+ end
488
+
489
+ def raise_second_exception_in_child_controller
490
+ raise SecondExceptionInChildController
491
+ end
492
+ end
493
+
494
+ class ControllerInheritanceRescueControllerTest < Test::Unit::TestCase
495
+
496
+ def setup
497
+ @controller = ControllerInheritanceRescueController.new
498
+ @request = ActionController::TestRequest.new
499
+ @response = ActionController::TestResponse.new
500
+ end
501
+
502
+ def test_first_exception_in_child_controller
503
+ get :raise_first_exception_in_child_controller
504
+ assert_response :gone
505
+ end
506
+
507
+ def test_second_exception_in_child_controller
508
+ get :raise_second_exception_in_child_controller
509
+ assert_response :gone
510
+ end
511
+
512
+ def test_exception_in_parent_controller
513
+ get :raise_parent_exception
514
+ assert_response :created
515
+ end
516
+ end
517
+ end # uses_mocha