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,885 @@
1
+ require 'abstract_unit'
2
+
3
+ # FIXME: crashes Ruby 1.9
4
+ class FilterTest < Test::Unit::TestCase
5
+ class TestController < ActionController::Base
6
+ before_filter :ensure_login
7
+ after_filter :clean_up
8
+
9
+ def show
10
+ render :inline => "ran action"
11
+ end
12
+
13
+ private
14
+ def ensure_login
15
+ @ran_filter ||= []
16
+ @ran_filter << "ensure_login"
17
+ end
18
+
19
+ def clean_up
20
+ @ran_after_filter ||= []
21
+ @ran_after_filter << "clean_up"
22
+ end
23
+ end
24
+
25
+ class ChangingTheRequirementsController < TestController
26
+ before_filter :ensure_login, :except => [:go_wild]
27
+
28
+ def go_wild
29
+ render :text => "gobble"
30
+ end
31
+ end
32
+
33
+ class TestMultipleFiltersController < ActionController::Base
34
+ before_filter :try_1
35
+ before_filter :try_2
36
+ before_filter :try_3
37
+
38
+ (1..3).each do |i|
39
+ define_method "fail_#{i}" do
40
+ render :text => i.to_s
41
+ end
42
+ end
43
+
44
+ protected
45
+ (1..3).each do |i|
46
+ define_method "try_#{i}" do
47
+ instance_variable_set :@try, i
48
+ if action_name == "fail_#{i}"
49
+ head(404)
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ class RenderingController < ActionController::Base
56
+ before_filter :render_something_else
57
+
58
+ def show
59
+ @ran_action = true
60
+ render :inline => "ran action"
61
+ end
62
+
63
+ private
64
+ def render_something_else
65
+ render :inline => "something else"
66
+ end
67
+ end
68
+
69
+ class ConditionalFilterController < ActionController::Base
70
+ def show
71
+ render :inline => "ran action"
72
+ end
73
+
74
+ def another_action
75
+ render :inline => "ran action"
76
+ end
77
+
78
+ def show_without_filter
79
+ render :inline => "ran action without filter"
80
+ end
81
+
82
+ private
83
+ def ensure_login
84
+ @ran_filter ||= []
85
+ @ran_filter << "ensure_login"
86
+ end
87
+
88
+ def clean_up_tmp
89
+ @ran_filter ||= []
90
+ @ran_filter << "clean_up_tmp"
91
+ end
92
+
93
+ def rescue_action(e) raise(e) end
94
+ end
95
+
96
+ class ConditionalCollectionFilterController < ConditionalFilterController
97
+ before_filter :ensure_login, :except => [ :show_without_filter, :another_action ]
98
+ end
99
+
100
+ class OnlyConditionSymController < ConditionalFilterController
101
+ before_filter :ensure_login, :only => :show
102
+ end
103
+
104
+ class ExceptConditionSymController < ConditionalFilterController
105
+ before_filter :ensure_login, :except => :show_without_filter
106
+ end
107
+
108
+ class BeforeAndAfterConditionController < ConditionalFilterController
109
+ before_filter :ensure_login, :only => :show
110
+ after_filter :clean_up_tmp, :only => :show
111
+ end
112
+
113
+ class OnlyConditionProcController < ConditionalFilterController
114
+ before_filter(:only => :show) {|c| c.instance_variable_set(:"@ran_proc_filter", true) }
115
+ end
116
+
117
+ class ExceptConditionProcController < ConditionalFilterController
118
+ before_filter(:except => :show_without_filter) {|c| c.instance_variable_set(:"@ran_proc_filter", true) }
119
+ end
120
+
121
+ class ConditionalClassFilter
122
+ def self.filter(controller) controller.instance_variable_set(:"@ran_class_filter", true) end
123
+ end
124
+
125
+ class OnlyConditionClassController < ConditionalFilterController
126
+ before_filter ConditionalClassFilter, :only => :show
127
+ end
128
+
129
+ class ExceptConditionClassController < ConditionalFilterController
130
+ before_filter ConditionalClassFilter, :except => :show_without_filter
131
+ end
132
+
133
+ class AnomolousYetValidConditionController < ConditionalFilterController
134
+ before_filter(ConditionalClassFilter, :ensure_login, Proc.new {|c| c.instance_variable_set(:"@ran_proc_filter1", true)}, :except => :show_without_filter) { |c| c.instance_variable_set(:"@ran_proc_filter2", true)}
135
+ end
136
+
137
+ class ConditionalOptionsFilter < ConditionalFilterController
138
+ before_filter :ensure_login, :if => Proc.new { |c| true }
139
+ before_filter :clean_up_tmp, :if => Proc.new { |c| false }
140
+ end
141
+
142
+ class EmptyFilterChainController < TestController
143
+ self.filter_chain.clear
144
+ def show
145
+ @action_executed = true
146
+ render :text => "yawp!"
147
+ end
148
+ end
149
+
150
+ class PrependingController < TestController
151
+ prepend_before_filter :wonderful_life
152
+ # skip_before_filter :fire_flash
153
+
154
+ private
155
+ def wonderful_life
156
+ @ran_filter ||= []
157
+ @ran_filter << "wonderful_life"
158
+ end
159
+ end
160
+
161
+ class SkippingAndLimitedController < TestController
162
+ skip_before_filter :ensure_login
163
+ before_filter :ensure_login, :only => :index
164
+
165
+ def index
166
+ render :text => 'ok'
167
+ end
168
+
169
+ def public
170
+ end
171
+ end
172
+
173
+ class SkippingAndReorderingController < TestController
174
+ skip_before_filter :ensure_login
175
+ before_filter :find_record
176
+ before_filter :ensure_login
177
+
178
+ private
179
+ def find_record
180
+ @ran_filter ||= []
181
+ @ran_filter << "find_record"
182
+ end
183
+ end
184
+
185
+ class ConditionalSkippingController < TestController
186
+ skip_before_filter :ensure_login, :only => [ :login ]
187
+ skip_after_filter :clean_up, :only => [ :login ]
188
+
189
+ before_filter :find_user, :only => [ :change_password ]
190
+
191
+ def login
192
+ render :inline => "ran action"
193
+ end
194
+
195
+ def change_password
196
+ render :inline => "ran action"
197
+ end
198
+
199
+ protected
200
+ def find_user
201
+ @ran_filter ||= []
202
+ @ran_filter << "find_user"
203
+ end
204
+ end
205
+
206
+ class ConditionalParentOfConditionalSkippingController < ConditionalFilterController
207
+ before_filter :conditional_in_parent, :only => [:show, :another_action]
208
+ after_filter :conditional_in_parent, :only => [:show, :another_action]
209
+
210
+ private
211
+
212
+ def conditional_in_parent
213
+ @ran_filter ||= []
214
+ @ran_filter << 'conditional_in_parent'
215
+ end
216
+ end
217
+
218
+ class ChildOfConditionalParentController < ConditionalParentOfConditionalSkippingController
219
+ skip_before_filter :conditional_in_parent, :only => :another_action
220
+ skip_after_filter :conditional_in_parent, :only => :another_action
221
+ end
222
+
223
+ class AnotherChildOfConditionalParentController < ConditionalParentOfConditionalSkippingController
224
+ skip_before_filter :conditional_in_parent, :only => :show
225
+ end
226
+
227
+ class ProcController < PrependingController
228
+ before_filter(proc { |c| c.instance_variable_set(:"@ran_proc_filter", true) })
229
+ end
230
+
231
+ class ImplicitProcController < PrependingController
232
+ before_filter { |c| c.instance_variable_set(:"@ran_proc_filter", true) }
233
+ end
234
+
235
+ class AuditFilter
236
+ def self.filter(controller)
237
+ controller.instance_variable_set(:"@was_audited", true)
238
+ end
239
+ end
240
+
241
+ class AroundFilter
242
+ def before(controller)
243
+ @execution_log = "before"
244
+ controller.class.execution_log << " before aroundfilter " if controller.respond_to? :execution_log
245
+ controller.instance_variable_set(:"@before_ran", true)
246
+ end
247
+
248
+ def after(controller)
249
+ controller.instance_variable_set(:"@execution_log", @execution_log + " and after")
250
+ controller.instance_variable_set(:"@after_ran", true)
251
+ controller.class.execution_log << " after aroundfilter " if controller.respond_to? :execution_log
252
+ end
253
+ end
254
+
255
+ class AppendedAroundFilter
256
+ def before(controller)
257
+ controller.class.execution_log << " before appended aroundfilter "
258
+ end
259
+
260
+ def after(controller)
261
+ controller.class.execution_log << " after appended aroundfilter "
262
+ end
263
+ end
264
+
265
+ class AuditController < ActionController::Base
266
+ before_filter(AuditFilter)
267
+
268
+ def show
269
+ render :text => "hello"
270
+ end
271
+ end
272
+
273
+ class AroundFilterController < PrependingController
274
+ around_filter AroundFilter.new
275
+ end
276
+
277
+ class BeforeAfterClassFilterController < PrependingController
278
+ begin
279
+ filter = AroundFilter.new
280
+ before_filter filter
281
+ after_filter filter
282
+ end
283
+ end
284
+
285
+ class MixedFilterController < PrependingController
286
+ cattr_accessor :execution_log
287
+
288
+ def initialize
289
+ @@execution_log = ""
290
+ end
291
+
292
+ before_filter { |c| c.class.execution_log << " before procfilter " }
293
+ prepend_around_filter AroundFilter.new
294
+
295
+ after_filter { |c| c.class.execution_log << " after procfilter " }
296
+ append_around_filter AppendedAroundFilter.new
297
+ end
298
+
299
+ class MixedSpecializationController < ActionController::Base
300
+ class OutOfOrder < StandardError; end
301
+
302
+ before_filter :first
303
+ before_filter :second, :only => :foo
304
+
305
+ def foo
306
+ render :text => 'foo'
307
+ end
308
+
309
+ def bar
310
+ render :text => 'bar'
311
+ end
312
+
313
+ protected
314
+ def first
315
+ @first = true
316
+ end
317
+
318
+ def second
319
+ raise OutOfOrder unless @first
320
+ end
321
+ end
322
+
323
+ class DynamicDispatchController < ActionController::Base
324
+ before_filter :choose
325
+
326
+ %w(foo bar baz).each do |action|
327
+ define_method(action) { render :text => action }
328
+ end
329
+
330
+ private
331
+ def choose
332
+ self.action_name = params[:choose]
333
+ end
334
+ end
335
+
336
+ class PrependingBeforeAndAfterController < ActionController::Base
337
+ prepend_before_filter :before_all
338
+ prepend_after_filter :after_all
339
+ before_filter :between_before_all_and_after_all
340
+
341
+ def before_all
342
+ @ran_filter ||= []
343
+ @ran_filter << 'before_all'
344
+ end
345
+
346
+ def after_all
347
+ @ran_filter ||= []
348
+ @ran_filter << 'after_all'
349
+ end
350
+
351
+ def between_before_all_and_after_all
352
+ @ran_filter ||= []
353
+ @ran_filter << 'between_before_all_and_after_all'
354
+ end
355
+ def show
356
+ render :text => 'hello'
357
+ end
358
+ end
359
+
360
+ class ErrorToRescue < Exception; end
361
+
362
+ class RescuingAroundFilterWithBlock
363
+ def filter(controller)
364
+ begin
365
+ yield
366
+ rescue ErrorToRescue => ex
367
+ controller.__send__ :render, :text => "I rescued this: #{ex.inspect}"
368
+ end
369
+ end
370
+ end
371
+
372
+ class RescuedController < ActionController::Base
373
+ around_filter RescuingAroundFilterWithBlock.new
374
+
375
+ def show
376
+ raise ErrorToRescue.new("Something made the bad noise.")
377
+ end
378
+
379
+ private
380
+ def rescue_action(exception)
381
+ raise exception
382
+ end
383
+ end
384
+
385
+ class NonYieldingAroundFilterController < ActionController::Base
386
+
387
+ before_filter :filter_one
388
+ around_filter :non_yielding_filter
389
+ before_filter :filter_two
390
+ after_filter :filter_three
391
+
392
+ def index
393
+ render :inline => "index"
394
+ end
395
+
396
+ #make sure the controller complains
397
+ def rescue_action(e); raise e; end
398
+
399
+ private
400
+
401
+ def filter_one
402
+ @filters ||= []
403
+ @filters << "filter_one"
404
+ end
405
+
406
+ def filter_two
407
+ @filters << "filter_two"
408
+ end
409
+
410
+ def non_yielding_filter
411
+ @filters << "zomg it didn't yield"
412
+ @filter_return_value
413
+ end
414
+
415
+ def filter_three
416
+ @filters << "filter_three"
417
+ end
418
+
419
+ end
420
+
421
+ def test_non_yielding_around_filters_not_returning_false_do_not_raise
422
+ controller = NonYieldingAroundFilterController.new
423
+ controller.instance_variable_set "@filter_return_value", true
424
+ assert_nothing_raised do
425
+ test_process(controller, "index")
426
+ end
427
+ end
428
+
429
+ def test_non_yielding_around_filters_returning_false_do_not_raise
430
+ controller = NonYieldingAroundFilterController.new
431
+ controller.instance_variable_set "@filter_return_value", false
432
+ assert_nothing_raised do
433
+ test_process(controller, "index")
434
+ end
435
+ end
436
+
437
+ def test_after_filters_are_not_run_if_around_filter_returns_false
438
+ controller = NonYieldingAroundFilterController.new
439
+ controller.instance_variable_set "@filter_return_value", false
440
+ test_process(controller, "index")
441
+ assert_equal ["filter_one", "zomg it didn't yield"], controller.assigns['filters']
442
+ end
443
+
444
+ def test_after_filters_are_not_run_if_around_filter_does_not_yield
445
+ controller = NonYieldingAroundFilterController.new
446
+ controller.instance_variable_set "@filter_return_value", true
447
+ test_process(controller, "index")
448
+ assert_equal ["filter_one", "zomg it didn't yield"], controller.assigns['filters']
449
+ end
450
+
451
+ def test_empty_filter_chain
452
+ assert_equal 0, EmptyFilterChainController.filter_chain.size
453
+ assert test_process(EmptyFilterChainController).template.assigns['action_executed']
454
+ end
455
+
456
+ def test_added_filter_to_inheritance_graph
457
+ assert_equal [ :ensure_login ], TestController.before_filters
458
+ end
459
+
460
+ def test_base_class_in_isolation
461
+ assert_equal [ ], ActionController::Base.before_filters
462
+ end
463
+
464
+ def test_prepending_filter
465
+ assert_equal [ :wonderful_life, :ensure_login ], PrependingController.before_filters
466
+ end
467
+
468
+ def test_running_filters
469
+ assert_equal %w( wonderful_life ensure_login ), test_process(PrependingController).template.assigns["ran_filter"]
470
+ end
471
+
472
+ def test_running_filters_with_proc
473
+ assert test_process(ProcController).template.assigns["ran_proc_filter"]
474
+ end
475
+
476
+ def test_running_filters_with_implicit_proc
477
+ assert test_process(ImplicitProcController).template.assigns["ran_proc_filter"]
478
+ end
479
+
480
+ def test_running_filters_with_class
481
+ assert test_process(AuditController).template.assigns["was_audited"]
482
+ end
483
+
484
+ def test_running_anomolous_yet_valid_condition_filters
485
+ response = test_process(AnomolousYetValidConditionController)
486
+ assert_equal %w( ensure_login ), response.template.assigns["ran_filter"]
487
+ assert response.template.assigns["ran_class_filter"]
488
+ assert response.template.assigns["ran_proc_filter1"]
489
+ assert response.template.assigns["ran_proc_filter2"]
490
+
491
+ response = test_process(AnomolousYetValidConditionController, "show_without_filter")
492
+ assert_equal nil, response.template.assigns["ran_filter"]
493
+ assert !response.template.assigns["ran_class_filter"]
494
+ assert !response.template.assigns["ran_proc_filter1"]
495
+ assert !response.template.assigns["ran_proc_filter2"]
496
+ end
497
+
498
+ def test_running_conditional_options
499
+ response = test_process(ConditionalOptionsFilter)
500
+ assert_equal %w( ensure_login ), response.template.assigns["ran_filter"]
501
+ end
502
+
503
+ def test_running_collection_condition_filters
504
+ assert_equal %w( ensure_login ), test_process(ConditionalCollectionFilterController).template.assigns["ran_filter"]
505
+ assert_equal nil, test_process(ConditionalCollectionFilterController, "show_without_filter").template.assigns["ran_filter"]
506
+ assert_equal nil, test_process(ConditionalCollectionFilterController, "another_action").template.assigns["ran_filter"]
507
+ end
508
+
509
+ def test_running_only_condition_filters
510
+ assert_equal %w( ensure_login ), test_process(OnlyConditionSymController).template.assigns["ran_filter"]
511
+ assert_equal nil, test_process(OnlyConditionSymController, "show_without_filter").template.assigns["ran_filter"]
512
+
513
+ assert test_process(OnlyConditionProcController).template.assigns["ran_proc_filter"]
514
+ assert !test_process(OnlyConditionProcController, "show_without_filter").template.assigns["ran_proc_filter"]
515
+
516
+ assert test_process(OnlyConditionClassController).template.assigns["ran_class_filter"]
517
+ assert !test_process(OnlyConditionClassController, "show_without_filter").template.assigns["ran_class_filter"]
518
+ end
519
+
520
+ def test_running_except_condition_filters
521
+ assert_equal %w( ensure_login ), test_process(ExceptConditionSymController).template.assigns["ran_filter"]
522
+ assert_equal nil, test_process(ExceptConditionSymController, "show_without_filter").template.assigns["ran_filter"]
523
+
524
+ assert test_process(ExceptConditionProcController).template.assigns["ran_proc_filter"]
525
+ assert !test_process(ExceptConditionProcController, "show_without_filter").template.assigns["ran_proc_filter"]
526
+
527
+ assert test_process(ExceptConditionClassController).template.assigns["ran_class_filter"]
528
+ assert !test_process(ExceptConditionClassController, "show_without_filter").template.assigns["ran_class_filter"]
529
+ end
530
+
531
+ def test_running_before_and_after_condition_filters
532
+ assert_equal %w( ensure_login clean_up_tmp), test_process(BeforeAndAfterConditionController).template.assigns["ran_filter"]
533
+ assert_equal nil, test_process(BeforeAndAfterConditionController, "show_without_filter").template.assigns["ran_filter"]
534
+ end
535
+
536
+ def test_around_filter
537
+ controller = test_process(AroundFilterController)
538
+ assert controller.template.assigns["before_ran"]
539
+ assert controller.template.assigns["after_ran"]
540
+ end
541
+
542
+ def test_before_after_class_filter
543
+ controller = test_process(BeforeAfterClassFilterController)
544
+ assert controller.template.assigns["before_ran"]
545
+ assert controller.template.assigns["after_ran"]
546
+ end
547
+
548
+ def test_having_properties_in_around_filter
549
+ controller = test_process(AroundFilterController)
550
+ assert_equal "before and after", controller.template.assigns["execution_log"]
551
+ end
552
+
553
+ def test_prepending_and_appending_around_filter
554
+ controller = test_process(MixedFilterController)
555
+ assert_equal " before aroundfilter before procfilter before appended aroundfilter " +
556
+ " after appended aroundfilter after aroundfilter after procfilter ",
557
+ MixedFilterController.execution_log
558
+ end
559
+
560
+ def test_rendering_breaks_filtering_chain
561
+ response = test_process(RenderingController)
562
+ assert_equal "something else", response.body
563
+ assert !response.template.assigns["ran_action"]
564
+ end
565
+
566
+ def test_filters_with_mixed_specialization_run_in_order
567
+ assert_nothing_raised do
568
+ response = test_process(MixedSpecializationController, 'bar')
569
+ assert_equal 'bar', response.body
570
+ end
571
+
572
+ assert_nothing_raised do
573
+ response = test_process(MixedSpecializationController, 'foo')
574
+ assert_equal 'foo', response.body
575
+ end
576
+ end
577
+
578
+ def test_dynamic_dispatch
579
+ %w(foo bar baz).each do |action|
580
+ request = ActionController::TestRequest.new
581
+ request.query_parameters[:choose] = action
582
+ response = DynamicDispatchController.process(request, ActionController::TestResponse.new)
583
+ assert_equal action, response.body
584
+ end
585
+ end
586
+
587
+ def test_running_prepended_before_and_after_filter
588
+ assert_equal 3, PrependingBeforeAndAfterController.filter_chain.length
589
+ response = test_process(PrependingBeforeAndAfterController)
590
+ assert_equal %w( before_all between_before_all_and_after_all after_all ), response.template.assigns["ran_filter"]
591
+ end
592
+
593
+ def test_skipping_and_limiting_controller
594
+ assert_equal %w( ensure_login ), test_process(SkippingAndLimitedController, "index").template.assigns["ran_filter"]
595
+ assert_nil test_process(SkippingAndLimitedController, "public").template.assigns["ran_filter"]
596
+ end
597
+
598
+ def test_skipping_and_reordering_controller
599
+ assert_equal %w( find_record ensure_login ), test_process(SkippingAndReorderingController, "index").template.assigns["ran_filter"]
600
+ end
601
+
602
+ def test_conditional_skipping_of_filters
603
+ assert_nil test_process(ConditionalSkippingController, "login").template.assigns["ran_filter"]
604
+ assert_equal %w( ensure_login find_user ), test_process(ConditionalSkippingController, "change_password").template.assigns["ran_filter"]
605
+
606
+ assert_nil test_process(ConditionalSkippingController, "login").template.controller.instance_variable_get("@ran_after_filter")
607
+ assert_equal %w( clean_up ), test_process(ConditionalSkippingController, "change_password").template.controller.instance_variable_get("@ran_after_filter")
608
+ end
609
+
610
+ def test_conditional_skipping_of_filters_when_parent_filter_is_also_conditional
611
+ assert_equal %w( conditional_in_parent conditional_in_parent ), test_process(ChildOfConditionalParentController).template.assigns['ran_filter']
612
+ assert_nil test_process(ChildOfConditionalParentController, 'another_action').template.assigns['ran_filter']
613
+ end
614
+
615
+ def test_condition_skipping_of_filters_when_siblings_also_have_conditions
616
+ assert_equal %w( conditional_in_parent conditional_in_parent ), test_process(ChildOfConditionalParentController).template.assigns['ran_filter'], "1"
617
+ assert_equal nil, test_process(AnotherChildOfConditionalParentController).template.assigns['ran_filter']
618
+ assert_equal %w( conditional_in_parent conditional_in_parent ), test_process(ChildOfConditionalParentController).template.assigns['ran_filter']
619
+ end
620
+
621
+ def test_changing_the_requirements
622
+ assert_equal nil, test_process(ChangingTheRequirementsController, "go_wild").template.assigns['ran_filter']
623
+ end
624
+
625
+ def test_a_rescuing_around_filter
626
+ response = nil
627
+ assert_nothing_raised do
628
+ response = test_process(RescuedController)
629
+ end
630
+
631
+ assert response.success?
632
+ assert_equal("I rescued this: #<FilterTest::ErrorToRescue: Something made the bad noise.>", response.body)
633
+ end
634
+
635
+ private
636
+ def test_process(controller, action = "show")
637
+ ActionController::Base.class_eval { include ActionController::ProcessWithTest } unless ActionController::Base < ActionController::ProcessWithTest
638
+ request = ActionController::TestRequest.new
639
+ request.action = action
640
+ controller = controller.new if controller.is_a?(Class)
641
+ controller.process_with_test(request, ActionController::TestResponse.new)
642
+ end
643
+ end
644
+
645
+
646
+
647
+ class PostsController < ActionController::Base
648
+ def rescue_action(e); raise e; end
649
+
650
+ module AroundExceptions
651
+ class Error < StandardError ; end
652
+ class Before < Error ; end
653
+ class After < Error ; end
654
+ end
655
+ include AroundExceptions
656
+
657
+ class DefaultFilter
658
+ include AroundExceptions
659
+ end
660
+
661
+ module_eval %w(raises_before raises_after raises_both no_raise no_filter).map { |action| "def #{action}; default_action end" }.join("\n")
662
+
663
+ private
664
+ def default_action
665
+ render :inline => "#{action_name} called"
666
+ end
667
+ end
668
+
669
+ class ControllerWithSymbolAsFilter < PostsController
670
+ around_filter :raise_before, :only => :raises_before
671
+ around_filter :raise_after, :only => :raises_after
672
+ around_filter :without_exception, :only => :no_raise
673
+
674
+ private
675
+ def raise_before
676
+ raise Before
677
+ yield
678
+ end
679
+
680
+ def raise_after
681
+ yield
682
+ raise After
683
+ end
684
+
685
+ def without_exception
686
+ # Do stuff...
687
+ 1 + 1
688
+
689
+ yield
690
+
691
+ # Do stuff...
692
+ 1 + 1
693
+ end
694
+ end
695
+
696
+ class ControllerWithFilterClass < PostsController
697
+ class YieldingFilter < DefaultFilter
698
+ def self.filter(controller)
699
+ yield
700
+ raise After
701
+ end
702
+ end
703
+
704
+ around_filter YieldingFilter, :only => :raises_after
705
+ end
706
+
707
+ class ControllerWithFilterInstance < PostsController
708
+ class YieldingFilter < DefaultFilter
709
+ def filter(controller)
710
+ yield
711
+ raise After
712
+ end
713
+ end
714
+
715
+ around_filter YieldingFilter.new, :only => :raises_after
716
+ end
717
+
718
+ class ControllerWithFilterMethod < PostsController
719
+ class YieldingFilter < DefaultFilter
720
+ def filter(controller)
721
+ yield
722
+ raise After
723
+ end
724
+ end
725
+
726
+ around_filter YieldingFilter.new.method(:filter), :only => :raises_after
727
+ end
728
+
729
+ class ControllerWithProcFilter < PostsController
730
+ around_filter(:only => :no_raise) do |c,b|
731
+ c.instance_variable_set(:"@before", true)
732
+ b.call
733
+ c.instance_variable_set(:"@after", true)
734
+ end
735
+ end
736
+
737
+ class ControllerWithNestedFilters < ControllerWithSymbolAsFilter
738
+ around_filter :raise_before, :raise_after, :without_exception, :only => :raises_both
739
+ end
740
+
741
+ class ControllerWithAllTypesOfFilters < PostsController
742
+ before_filter :before
743
+ around_filter :around
744
+ after_filter :after
745
+ around_filter :around_again
746
+
747
+ private
748
+ def before
749
+ @ran_filter ||= []
750
+ @ran_filter << 'before'
751
+ end
752
+
753
+ def around
754
+ @ran_filter << 'around (before yield)'
755
+ yield
756
+ @ran_filter << 'around (after yield)'
757
+ end
758
+
759
+ def after
760
+ @ran_filter << 'after'
761
+ end
762
+
763
+ def around_again
764
+ @ran_filter << 'around_again (before yield)'
765
+ yield
766
+ @ran_filter << 'around_again (after yield)'
767
+ end
768
+ end
769
+
770
+ class ControllerWithTwoLessFilters < ControllerWithAllTypesOfFilters
771
+ skip_filter :around_again
772
+ skip_filter :after
773
+ end
774
+
775
+ class YieldingAroundFiltersTest < Test::Unit::TestCase
776
+ include PostsController::AroundExceptions
777
+
778
+ def test_filters_registering
779
+ assert_equal 1, ControllerWithFilterMethod.filter_chain.size
780
+ assert_equal 1, ControllerWithFilterClass.filter_chain.size
781
+ assert_equal 1, ControllerWithFilterInstance.filter_chain.size
782
+ assert_equal 3, ControllerWithSymbolAsFilter.filter_chain.size
783
+ assert_equal 6, ControllerWithNestedFilters.filter_chain.size
784
+ assert_equal 4, ControllerWithAllTypesOfFilters.filter_chain.size
785
+ end
786
+
787
+ def test_base
788
+ controller = PostsController
789
+ assert_nothing_raised { test_process(controller,'no_raise') }
790
+ assert_nothing_raised { test_process(controller,'raises_before') }
791
+ assert_nothing_raised { test_process(controller,'raises_after') }
792
+ assert_nothing_raised { test_process(controller,'no_filter') }
793
+ end
794
+
795
+ def test_with_symbol
796
+ controller = ControllerWithSymbolAsFilter
797
+ assert_nothing_raised { test_process(controller,'no_raise') }
798
+ assert_raise(Before) { test_process(controller,'raises_before') }
799
+ assert_raise(After) { test_process(controller,'raises_after') }
800
+ assert_nothing_raised { test_process(controller,'no_raise') }
801
+ end
802
+
803
+ def test_with_class
804
+ controller = ControllerWithFilterClass
805
+ assert_nothing_raised { test_process(controller,'no_raise') }
806
+ assert_raise(After) { test_process(controller,'raises_after') }
807
+ end
808
+
809
+ def test_with_instance
810
+ controller = ControllerWithFilterInstance
811
+ assert_nothing_raised { test_process(controller,'no_raise') }
812
+ assert_raise(After) { test_process(controller,'raises_after') }
813
+ end
814
+
815
+ def test_with_method
816
+ controller = ControllerWithFilterMethod
817
+ assert_nothing_raised { test_process(controller,'no_raise') }
818
+ assert_raise(After) { test_process(controller,'raises_after') }
819
+ end
820
+
821
+ def test_with_proc
822
+ controller = test_process(ControllerWithProcFilter,'no_raise')
823
+ assert controller.template.assigns['before']
824
+ assert controller.template.assigns['after']
825
+ end
826
+
827
+ def test_nested_filters
828
+ controller = ControllerWithNestedFilters
829
+ assert_nothing_raised do
830
+ begin
831
+ test_process(controller,'raises_both')
832
+ rescue Before, After
833
+ end
834
+ end
835
+ assert_raise Before do
836
+ begin
837
+ test_process(controller,'raises_both')
838
+ rescue After
839
+ end
840
+ end
841
+ end
842
+
843
+ def test_filter_order_with_all_filter_types
844
+ controller = test_process(ControllerWithAllTypesOfFilters,'no_raise')
845
+ assert_equal 'before around (before yield) around_again (before yield) around_again (after yield) around (after yield) after',controller.template.assigns['ran_filter'].join(' ')
846
+ end
847
+
848
+ def test_filter_order_with_skip_filter_method
849
+ controller = test_process(ControllerWithTwoLessFilters,'no_raise')
850
+ assert_equal 'before around (before yield) around (after yield)',controller.template.assigns['ran_filter'].join(' ')
851
+ end
852
+
853
+ def test_first_filter_in_multiple_before_filter_chain_halts
854
+ controller = ::FilterTest::TestMultipleFiltersController.new
855
+ response = test_process(controller, 'fail_1')
856
+ assert_equal ' ', response.body
857
+ assert_equal 1, controller.instance_variable_get(:@try)
858
+ assert controller.instance_variable_get(:@before_filter_chain_aborted)
859
+ end
860
+
861
+ def test_second_filter_in_multiple_before_filter_chain_halts
862
+ controller = ::FilterTest::TestMultipleFiltersController.new
863
+ response = test_process(controller, 'fail_2')
864
+ assert_equal ' ', response.body
865
+ assert_equal 2, controller.instance_variable_get(:@try)
866
+ assert controller.instance_variable_get(:@before_filter_chain_aborted)
867
+ end
868
+
869
+ def test_last_filter_in_multiple_before_filter_chain_halts
870
+ controller = ::FilterTest::TestMultipleFiltersController.new
871
+ response = test_process(controller, 'fail_3')
872
+ assert_equal ' ', response.body
873
+ assert_equal 3, controller.instance_variable_get(:@try)
874
+ assert controller.instance_variable_get(:@before_filter_chain_aborted)
875
+ end
876
+
877
+ protected
878
+ def test_process(controller, action = "show")
879
+ ActionController::Base.class_eval { include ActionController::ProcessWithTest } unless ActionController::Base < ActionController::ProcessWithTest
880
+ request = ActionController::TestRequest.new
881
+ request.action = action
882
+ controller = controller.new if controller.is_a?(Class)
883
+ controller.process_with_test(request, ActionController::TestResponse.new)
884
+ end
885
+ end