actionpack-rack-upgrade-2 2.3.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. data/CHANGELOG +5250 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +158 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller.rb +113 -0
  8. data/lib/action_controller/assertions/dom_assertions.rb +55 -0
  9. data/lib/action_controller/assertions/model_assertions.rb +21 -0
  10. data/lib/action_controller/assertions/response_assertions.rb +169 -0
  11. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  12. data/lib/action_controller/assertions/selector_assertions.rb +638 -0
  13. data/lib/action_controller/assertions/tag_assertions.rb +127 -0
  14. data/lib/action_controller/base.rb +1425 -0
  15. data/lib/action_controller/benchmarking.rb +107 -0
  16. data/lib/action_controller/caching.rb +71 -0
  17. data/lib/action_controller/caching/actions.rb +177 -0
  18. data/lib/action_controller/caching/fragments.rb +120 -0
  19. data/lib/action_controller/caching/pages.rb +152 -0
  20. data/lib/action_controller/caching/sweeper.rb +45 -0
  21. data/lib/action_controller/caching/sweeping.rb +55 -0
  22. data/lib/action_controller/cgi_ext.rb +15 -0
  23. data/lib/action_controller/cgi_ext/cookie.rb +112 -0
  24. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  25. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  26. data/lib/action_controller/cgi_process.rb +77 -0
  27. data/lib/action_controller/cookies.rb +197 -0
  28. data/lib/action_controller/dispatcher.rb +133 -0
  29. data/lib/action_controller/failsafe.rb +87 -0
  30. data/lib/action_controller/filters.rb +680 -0
  31. data/lib/action_controller/flash.rb +213 -0
  32. data/lib/action_controller/headers.rb +33 -0
  33. data/lib/action_controller/helpers.rb +225 -0
  34. data/lib/action_controller/http_authentication.rb +309 -0
  35. data/lib/action_controller/integration.rb +708 -0
  36. data/lib/action_controller/layout.rb +286 -0
  37. data/lib/action_controller/middleware_stack.rb +119 -0
  38. data/lib/action_controller/middlewares.rb +14 -0
  39. data/lib/action_controller/mime_responds.rb +193 -0
  40. data/lib/action_controller/mime_type.rb +212 -0
  41. data/lib/action_controller/mime_types.rb +21 -0
  42. data/lib/action_controller/params_parser.rb +77 -0
  43. data/lib/action_controller/performance_test.rb +15 -0
  44. data/lib/action_controller/polymorphic_routes.rb +189 -0
  45. data/lib/action_controller/rack_lint_patch.rb +36 -0
  46. data/lib/action_controller/record_identifier.rb +104 -0
  47. data/lib/action_controller/reloader.rb +54 -0
  48. data/lib/action_controller/request.rb +495 -0
  49. data/lib/action_controller/request_forgery_protection.rb +116 -0
  50. data/lib/action_controller/rescue.rb +183 -0
  51. data/lib/action_controller/resources.rb +682 -0
  52. data/lib/action_controller/response.rb +237 -0
  53. data/lib/action_controller/routing.rb +388 -0
  54. data/lib/action_controller/routing/builder.rb +197 -0
  55. data/lib/action_controller/routing/optimisations.rb +130 -0
  56. data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  57. data/lib/action_controller/routing/route.rb +265 -0
  58. data/lib/action_controller/routing/route_set.rb +503 -0
  59. data/lib/action_controller/routing/routing_ext.rb +49 -0
  60. data/lib/action_controller/routing/segments.rb +343 -0
  61. data/lib/action_controller/session/abstract_store.rb +276 -0
  62. data/lib/action_controller/session/cookie_store.rb +240 -0
  63. data/lib/action_controller/session/mem_cache_store.rb +60 -0
  64. data/lib/action_controller/session_management.rb +54 -0
  65. data/lib/action_controller/status_codes.rb +88 -0
  66. data/lib/action_controller/streaming.rb +181 -0
  67. data/lib/action_controller/string_coercion.rb +29 -0
  68. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  69. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  70. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  71. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  72. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  73. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  74. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  75. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  76. data/lib/action_controller/test_case.rb +209 -0
  77. data/lib/action_controller/test_process.rb +580 -0
  78. data/lib/action_controller/translation.rb +13 -0
  79. data/lib/action_controller/uploaded_file.rb +44 -0
  80. data/lib/action_controller/url_rewriter.rb +229 -0
  81. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  82. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  83. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  84. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  85. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  86. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  87. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  88. data/lib/action_controller/verification.rb +130 -0
  89. data/lib/action_pack.rb +24 -0
  90. data/lib/action_pack/version.rb +9 -0
  91. data/lib/action_view.rb +58 -0
  92. data/lib/action_view/base.rb +362 -0
  93. data/lib/action_view/helpers.rb +61 -0
  94. data/lib/action_view/helpers/active_record_helper.rb +305 -0
  95. data/lib/action_view/helpers/asset_tag_helper.rb +695 -0
  96. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  97. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  98. data/lib/action_view/helpers/cache_helper.rb +39 -0
  99. data/lib/action_view/helpers/capture_helper.rb +136 -0
  100. data/lib/action_view/helpers/csrf_helper.rb +14 -0
  101. data/lib/action_view/helpers/date_helper.rb +989 -0
  102. data/lib/action_view/helpers/debug_helper.rb +38 -0
  103. data/lib/action_view/helpers/form_helper.rb +1118 -0
  104. data/lib/action_view/helpers/form_options_helper.rb +599 -0
  105. data/lib/action_view/helpers/form_tag_helper.rb +490 -0
  106. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  107. data/lib/action_view/helpers/number_helper.rb +308 -0
  108. data/lib/action_view/helpers/prototype_helper.rb +1305 -0
  109. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  110. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  111. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  112. data/lib/action_view/helpers/sanitize_helper.rb +251 -0
  113. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  114. data/lib/action_view/helpers/tag_helper.rb +151 -0
  115. data/lib/action_view/helpers/text_helper.rb +597 -0
  116. data/lib/action_view/helpers/translation_helper.rb +67 -0
  117. data/lib/action_view/helpers/url_helper.rb +637 -0
  118. data/lib/action_view/inline_template.rb +19 -0
  119. data/lib/action_view/locale/en.yml +117 -0
  120. data/lib/action_view/partials.rb +241 -0
  121. data/lib/action_view/paths.rb +77 -0
  122. data/lib/action_view/reloadable_template.rb +117 -0
  123. data/lib/action_view/renderable.rb +109 -0
  124. data/lib/action_view/renderable_partial.rb +53 -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.rb +48 -0
  129. data/lib/action_view/template_handlers/builder.rb +17 -0
  130. data/lib/action_view/template_handlers/erb.rb +25 -0
  131. data/lib/action_view/template_handlers/rjs.rb +13 -0
  132. data/lib/action_view/test_case.rb +162 -0
  133. data/lib/actionpack.rb +2 -0
  134. data/test/abstract_unit.rb +78 -0
  135. data/test/active_record_unit.rb +104 -0
  136. data/test/activerecord/active_record_store_test.rb +221 -0
  137. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  138. data/test/adv_attr_test.rb +20 -0
  139. data/test/controller/action_pack_assertions_test.rb +545 -0
  140. data/test/controller/addresses_render_test.rb +37 -0
  141. data/test/controller/assert_select_test.rb +735 -0
  142. data/test/controller/base_test.rb +217 -0
  143. data/test/controller/benchmark_test.rb +32 -0
  144. data/test/controller/caching_test.rb +743 -0
  145. data/test/controller/capture_test.rb +66 -0
  146. data/test/controller/content_type_test.rb +178 -0
  147. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  148. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  150. data/test/controller/cookie_test.rb +208 -0
  151. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  152. data/test/controller/dispatcher_test.rb +144 -0
  153. data/test/controller/dom_assertions_test.rb +53 -0
  154. data/test/controller/failsafe_test.rb +60 -0
  155. data/test/controller/fake_controllers.rb +33 -0
  156. data/test/controller/fake_models.rb +19 -0
  157. data/test/controller/filter_params_test.rb +52 -0
  158. data/test/controller/filters_test.rb +885 -0
  159. data/test/controller/flash_test.rb +174 -0
  160. data/test/controller/header_test.rb +14 -0
  161. data/test/controller/helper_test.rb +224 -0
  162. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  163. data/test/controller/html-scanner/document_test.rb +148 -0
  164. data/test/controller/html-scanner/node_test.rb +89 -0
  165. data/test/controller/html-scanner/sanitizer_test.rb +281 -0
  166. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  167. data/test/controller/html-scanner/text_node_test.rb +50 -0
  168. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  169. data/test/controller/http_basic_authentication_test.rb +113 -0
  170. data/test/controller/http_digest_authentication_test.rb +254 -0
  171. data/test/controller/integration_test.rb +526 -0
  172. data/test/controller/layout_test.rb +215 -0
  173. data/test/controller/localized_templates_test.rb +24 -0
  174. data/test/controller/logging_test.rb +46 -0
  175. data/test/controller/middleware_stack_test.rb +90 -0
  176. data/test/controller/mime_responds_test.rb +536 -0
  177. data/test/controller/mime_type_test.rb +93 -0
  178. data/test/controller/output_escaping_test.rb +19 -0
  179. data/test/controller/polymorphic_routes_test.rb +297 -0
  180. data/test/controller/rack_test.rb +308 -0
  181. data/test/controller/record_identifier_test.rb +139 -0
  182. data/test/controller/redirect_test.rb +285 -0
  183. data/test/controller/reloader_test.rb +125 -0
  184. data/test/controller/render_test.rb +1783 -0
  185. data/test/controller/request/json_params_parsing_test.rb +65 -0
  186. data/test/controller/request/multipart_params_parsing_test.rb +177 -0
  187. data/test/controller/request/query_string_parsing_test.rb +120 -0
  188. data/test/controller/request/test_request_test.rb +35 -0
  189. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  190. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  191. data/test/controller/request_forgery_protection_test.rb +233 -0
  192. data/test/controller/request_test.rb +398 -0
  193. data/test/controller/rescue_test.rb +541 -0
  194. data/test/controller/resources_test.rb +1393 -0
  195. data/test/controller/routing_test.rb +2592 -0
  196. data/test/controller/selector_test.rb +628 -0
  197. data/test/controller/send_file_test.rb +171 -0
  198. data/test/controller/session/abstract_store_test.rb +64 -0
  199. data/test/controller/session/cookie_store_test.rb +354 -0
  200. data/test/controller/session/mem_cache_store_test.rb +187 -0
  201. data/test/controller/session/test_session_test.rb +58 -0
  202. data/test/controller/test_test.rb +700 -0
  203. data/test/controller/translation_test.rb +26 -0
  204. data/test/controller/url_rewriter_test.rb +395 -0
  205. data/test/controller/verification_test.rb +270 -0
  206. data/test/controller/view_paths_test.rb +141 -0
  207. data/test/controller/webservice_test.rb +273 -0
  208. data/test/fixtures/_top_level_partial.html.erb +1 -0
  209. data/test/fixtures/_top_level_partial_only.erb +1 -0
  210. data/test/fixtures/addresses/list.erb +1 -0
  211. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  212. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  213. data/test/fixtures/companies.yml +24 -0
  214. data/test/fixtures/company.rb +10 -0
  215. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  216. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  217. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  218. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  219. data/test/fixtures/customers/_customer.html.erb +1 -0
  220. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  221. data/test/fixtures/developer.rb +9 -0
  222. data/test/fixtures/developers.yml +21 -0
  223. data/test/fixtures/developers/_developer.erb +1 -0
  224. data/test/fixtures/developers_projects.yml +13 -0
  225. data/test/fixtures/failsafe/500.html +1 -0
  226. data/test/fixtures/fun/games/_game.erb +1 -0
  227. data/test/fixtures/fun/games/hello_world.erb +1 -0
  228. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  229. data/test/fixtures/functional_caching/_partial.erb +3 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  231. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  232. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  233. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  235. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  236. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  237. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  238. data/test/fixtures/helpers/abc_helper.rb +5 -0
  239. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  240. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  241. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  242. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  243. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  244. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  246. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  247. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  248. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  249. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  250. data/test/fixtures/layouts/_column.html.erb +2 -0
  251. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  252. data/test/fixtures/layouts/builder.builder +3 -0
  253. data/test/fixtures/layouts/default_html.html.erb +1 -0
  254. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  255. data/test/fixtures/layouts/standard.erb +1 -0
  256. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  257. data/test/fixtures/layouts/xhr.html.erb +2 -0
  258. data/test/fixtures/layouts/yield.erb +2 -0
  259. data/test/fixtures/localized/hello_world.de.html +1 -0
  260. data/test/fixtures/localized/hello_world.en.html +1 -0
  261. data/test/fixtures/mascot.rb +3 -0
  262. data/test/fixtures/mascots.yml +4 -0
  263. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  264. data/test/fixtures/multipart/binary_file +0 -0
  265. data/test/fixtures/multipart/boundary_problem_file +10 -0
  266. data/test/fixtures/multipart/bracketed_param +5 -0
  267. data/test/fixtures/multipart/empty +10 -0
  268. data/test/fixtures/multipart/hello.txt +1 -0
  269. data/test/fixtures/multipart/large_text_file +10 -0
  270. data/test/fixtures/multipart/mixed_files +0 -0
  271. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  272. data/test/fixtures/multipart/none +9 -0
  273. data/test/fixtures/multipart/single_parameter +5 -0
  274. data/test/fixtures/multipart/text_file +10 -0
  275. data/test/fixtures/override/test/hello_world.erb +1 -0
  276. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  277. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  278. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  279. data/test/fixtures/post_test/post/index.html.erb +1 -0
  280. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  281. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  282. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  283. data/test/fixtures/project.rb +3 -0
  284. data/test/fixtures/projects.yml +7 -0
  285. data/test/fixtures/projects/_project.erb +1 -0
  286. data/test/fixtures/public/404.html +1 -0
  287. data/test/fixtures/public/500.da.html +1 -0
  288. data/test/fixtures/public/500.html +1 -0
  289. data/test/fixtures/public/absolute/test.css +23 -0
  290. data/test/fixtures/public/absolute/test.js +63 -0
  291. data/test/fixtures/public/images/rails.png +0 -0
  292. data/test/fixtures/public/javascripts/application.js +1 -0
  293. data/test/fixtures/public/javascripts/bank.js +1 -0
  294. data/test/fixtures/public/javascripts/controls.js +1 -0
  295. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  296. data/test/fixtures/public/javascripts/effects.js +1 -0
  297. data/test/fixtures/public/javascripts/prototype.js +1 -0
  298. data/test/fixtures/public/javascripts/robber.js +1 -0
  299. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  300. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  301. data/test/fixtures/public/stylesheets/bank.css +1 -0
  302. data/test/fixtures/public/stylesheets/robber.css +1 -0
  303. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  304. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  305. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  306. data/test/fixtures/replies.yml +15 -0
  307. data/test/fixtures/replies/_reply.erb +1 -0
  308. data/test/fixtures/reply.rb +7 -0
  309. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  310. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  311. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  312. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  313. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  314. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  315. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  316. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  318. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  319. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  320. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  321. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  322. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  323. data/test/fixtures/scope/test/modgreet.erb +1 -0
  324. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +10 -0
  325. data/test/fixtures/shared.html.erb +1 -0
  326. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  327. data/test/fixtures/test/_counter.html.erb +1 -0
  328. data/test/fixtures/test/_customer.erb +1 -0
  329. data/test/fixtures/test/_customer_counter.erb +1 -0
  330. data/test/fixtures/test/_customer_counter_with_as.erb +1 -0
  331. data/test/fixtures/test/_customer_greeting.erb +1 -0
  332. data/test/fixtures/test/_customer_with_var.erb +1 -0
  333. data/test/fixtures/test/_form.erb +1 -0
  334. data/test/fixtures/test/_from_helper.erb +1 -0
  335. data/test/fixtures/test/_hash_greeting.erb +1 -0
  336. data/test/fixtures/test/_hash_object.erb +2 -0
  337. data/test/fixtures/test/_hello.builder +1 -0
  338. data/test/fixtures/test/_labelling_form.erb +1 -0
  339. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  340. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  341. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  342. data/test/fixtures/test/_one.html.erb +1 -0
  343. data/test/fixtures/test/_partial.erb +1 -0
  344. data/test/fixtures/test/_partial.html.erb +1 -0
  345. data/test/fixtures/test/_partial.js.erb +1 -0
  346. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  347. data/test/fixtures/test/_partial_only.erb +1 -0
  348. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  349. data/test/fixtures/test/_person.erb +2 -0
  350. data/test/fixtures/test/_raise.html.erb +1 -0
  351. data/test/fixtures/test/_two.html.erb +1 -0
  352. data/test/fixtures/test/_utf8_partial.html.erb +1 -0
  353. data/test/fixtures/test/_utf8_partial_magic.html.erb +2 -0
  354. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  355. data/test/fixtures/test/array_translation.erb +1 -0
  356. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  357. data/test/fixtures/test/capturing.erb +4 -0
  358. data/test/fixtures/test/content_for.erb +2 -0
  359. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  360. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  361. data/test/fixtures/test/delete_with_js.rjs +2 -0
  362. data/test/fixtures/test/dont_pick_me +1 -0
  363. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  364. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  365. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  366. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  367. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  368. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  369. data/test/fixtures/test/greeting.erb +1 -0
  370. data/test/fixtures/test/greeting.js.rjs +1 -0
  371. data/test/fixtures/test/hello.builder +4 -0
  372. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  373. data/test/fixtures/test/hello_world.erb +1 -0
  374. data/test/fixtures/test/hello_world.erb~ +1 -0
  375. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  376. data/test/fixtures/test/hello_world_container.builder +3 -0
  377. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  378. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  379. data/test/fixtures/test/hello_xml_world.builder +11 -0
  380. data/test/fixtures/test/hyphen-ated.erb +1 -0
  381. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  382. data/test/fixtures/test/list.erb +1 -0
  383. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  384. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  385. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  386. data/test/fixtures/test/nested_layout.erb +3 -0
  387. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  388. data/test/fixtures/test/potential_conflicts.erb +4 -0
  389. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  390. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  391. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  392. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  393. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  394. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  395. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  396. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  397. data/test/fixtures/test/render_to_string_test.erb +1 -0
  398. data/test/fixtures/test/scoped_array_translation.erb +1 -0
  399. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  400. data/test/fixtures/test/template.erb +1 -0
  401. data/test/fixtures/test/translation.erb +1 -0
  402. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  403. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  404. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  405. data/test/fixtures/test/utf8.html.erb +4 -0
  406. data/test/fixtures/test/utf8_magic.html.erb +5 -0
  407. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +5 -0
  408. data/test/fixtures/topic.rb +3 -0
  409. data/test/fixtures/topics.yml +22 -0
  410. data/test/fixtures/topics/_topic.html.erb +1 -0
  411. data/test/template/active_record_helper_i18n_test.rb +51 -0
  412. data/test/template/active_record_helper_test.rb +302 -0
  413. data/test/template/asset_tag_helper_test.rb +770 -0
  414. data/test/template/atom_feed_helper_test.rb +315 -0
  415. data/test/template/benchmark_helper_test.rb +86 -0
  416. data/test/template/compiled_templates_test.rb +204 -0
  417. data/test/template/date_helper_i18n_test.rb +121 -0
  418. data/test/template/date_helper_test.rb +2603 -0
  419. data/test/template/erb_util_test.rb +36 -0
  420. data/test/template/form_helper_test.rb +1447 -0
  421. data/test/template/form_options_helper_i18n_test.rb +27 -0
  422. data/test/template/form_options_helper_test.rb +811 -0
  423. data/test/template/form_tag_helper_test.rb +356 -0
  424. data/test/template/javascript_helper_test.rb +106 -0
  425. data/test/template/number_helper_i18n_test.rb +69 -0
  426. data/test/template/number_helper_test.rb +132 -0
  427. data/test/template/prototype_helper_test.rb +639 -0
  428. data/test/template/raw_output_helper_test.rb +21 -0
  429. data/test/template/record_tag_helper_test.rb +58 -0
  430. data/test/template/render_test.rb +329 -0
  431. data/test/template/sanitize_helper_test.rb +57 -0
  432. data/test/template/scriptaculous_helper_test.rb +90 -0
  433. data/test/template/tag_helper_test.rb +98 -0
  434. data/test/template/template_test.rb +32 -0
  435. data/test/template/test_test.rb +54 -0
  436. data/test/template/text_helper_test.rb +597 -0
  437. data/test/template/translation_helper_test.rb +95 -0
  438. data/test/template/url_helper_test.rb +641 -0
  439. data/test/testing_sandbox.rb +15 -0
  440. data/test/view/test_case_test.rb +176 -0
  441. metadata +519 -0
data/Rakefile ADDED
@@ -0,0 +1,158 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rdoc/task'
5
+ require 'rake/packagetask'
6
+ require 'rubygems/package_task'
7
+ require File.join(File.dirname(__FILE__), 'lib', 'action_pack', 'version')
8
+
9
+ PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
10
+ PKG_NAME = 'actionpack-rack-upgrade-2'
11
+ PKG_VERSION = ActionPack::VERSION::STRING + PKG_BUILD
12
+ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
13
+
14
+ RELEASE_NAME = "REL #{PKG_VERSION}"
15
+
16
+ RUBY_FORGE_PROJECT = "actionpack"
17
+ RUBY_FORGE_USER = "webster132"
18
+
19
+ desc "Default Task"
20
+ task :default => [ :test ]
21
+
22
+ # Run the unit tests
23
+
24
+ desc "Run all unit tests"
25
+ task :test => [:test_action_pack, :test_active_record_integration]
26
+
27
+ Rake::TestTask.new(:test_action_pack) do |t|
28
+ t.libs << "test"
29
+
30
+ # make sure we include the tests in alphabetical order as on some systems
31
+ # this will not happen automatically and the tests (as a whole) will error
32
+ t.test_files = Dir.glob( "test/[cftv]*/**/*_test.rb" ).sort
33
+
34
+ t.verbose = true
35
+ #t.warning = true
36
+ end
37
+
38
+ desc 'ActiveRecord Integration Tests'
39
+ Rake::TestTask.new(:test_active_record_integration) do |t|
40
+ t.libs << "test"
41
+ t.test_files = Dir.glob("test/activerecord/*_test.rb")
42
+ t.verbose = true
43
+ end
44
+
45
+
46
+ # Genereate the RDoc documentation
47
+
48
+ RDoc::Task.new { |rdoc|
49
+ rdoc.rdoc_dir = 'doc'
50
+ rdoc.title = "Action Pack -- On rails from request to response"
51
+ rdoc.options << '--line-numbers' << '--inline-source'
52
+ rdoc.options << '--charset' << 'utf-8'
53
+ rdoc.template = ENV['template'] ? "#{ENV['template']}.rb" : '../doc/template/horo'
54
+ if ENV['DOC_FILES']
55
+ rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
56
+ else
57
+ rdoc.rdoc_files.include('README', 'RUNNING_UNIT_TESTS', 'CHANGELOG')
58
+ rdoc.rdoc_files.include(Dir['lib/**/*.rb'] -
59
+ Dir['lib/*/vendor/**/*.rb'])
60
+ rdoc.rdoc_files.exclude('lib/actionpack.rb')
61
+ end
62
+ }
63
+
64
+ # Create compressed packages
65
+ dist_dirs = [ "lib", "test" ]
66
+
67
+ spec = Gem::Specification.new do |s|
68
+ s.platform = Gem::Platform::RUBY
69
+ s.name = PKG_NAME
70
+ s.version = PKG_VERSION
71
+ s.summary = "Web-flow and rendering framework putting the VC in MVC."
72
+ s.description = %q{Eases web-request routing, handling, and response as a half-way front, half-way page controller. Implemented with specific emphasis on enabling easy unit/integration testing that doesn't require a browser.} #'
73
+
74
+ s.author = "David Heinemeier Hansson"
75
+ s.email = "david@loudthinking.com"
76
+ s.rubyforge_project = "actionpack"
77
+ s.homepage = "http://www.rubyonrails.org"
78
+
79
+ s.requirements << 'none'
80
+
81
+ s.add_dependency('activesupport', '= 2.3.15' + PKG_BUILD)
82
+ s.add_dependency('rack', '~> 1.1.3')
83
+
84
+ s.require_path = 'lib'
85
+
86
+ s.files = [ "Rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG", "MIT-LICENSE" ]
87
+ dist_dirs.each do |dir|
88
+ s.files = s.files + Dir.glob( "#{dir}/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
89
+ end
90
+ end
91
+
92
+ Gem::PackageTask.new(spec) do |p|
93
+ p.gem_spec = spec
94
+ p.need_tar = true
95
+ p.need_zip = true
96
+ end
97
+
98
+ task :lines do
99
+ lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
100
+
101
+ for file_name in FileList["lib/**/*.rb"]
102
+ next if file_name =~ /vendor/
103
+ f = File.open(file_name)
104
+
105
+ while line = f.gets
106
+ lines += 1
107
+ next if line =~ /^\s*$/
108
+ next if line =~ /^\s*#/
109
+ codelines += 1
110
+ end
111
+ puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}"
112
+
113
+ total_lines += lines
114
+ total_codelines += codelines
115
+
116
+ lines, codelines = 0, 0
117
+ end
118
+
119
+ puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
120
+ end
121
+
122
+ # Publishing ------------------------------------------------------
123
+
124
+ task :update_scriptaculous do
125
+ for js in %w( controls dragdrop effects )
126
+ system("svn export --force http://dev.rubyonrails.org/svn/rails/spinoffs/scriptaculous/src/#{js}.js #{File.dirname(__FILE__)}/lib/action_view/helpers/javascripts/#{js}.js")
127
+ end
128
+ end
129
+
130
+ desc "Updates actionpack to the latest version of the javascript spinoffs"
131
+ task :update_js => [ :update_scriptaculous ]
132
+
133
+ # Publishing ------------------------------------------------------
134
+
135
+ desc "Publish the API documentation"
136
+ task :pgem => [:package] do
137
+ require 'rake/contrib/sshpublisher'
138
+ Rake::SshFilePublisher.new("gems.rubyonrails.org", "/u/sites/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
139
+ `ssh gems.rubyonrails.org '/u/sites/gems/gemupdate.sh'`
140
+ end
141
+
142
+ desc "Publish the API documentation"
143
+ task :pdoc => [:rdoc] do
144
+ require 'rake/contrib/sshpublisher'
145
+ Rake::SshDirPublisher.new("wrath.rubyonrails.org", "public_html/ap", "doc").upload
146
+ end
147
+
148
+ desc "Publish the release files to RubyForge."
149
+ task :release => [ :package ] do
150
+ require 'rubyforge'
151
+ require 'rake/contrib/rubyforgepublisher'
152
+
153
+ packages = %w( gem tgz zip ).collect{ |ext| "pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}" }
154
+
155
+ rubyforge = RubyForge.new
156
+ rubyforge.login
157
+ rubyforge.add_release(PKG_NAME, PKG_NAME, "REL #{PKG_VERSION}", *packages)
158
+ end
data/install.rb ADDED
@@ -0,0 +1,30 @@
1
+ require 'rbconfig'
2
+ require 'find'
3
+ require 'ftools'
4
+
5
+ include Config
6
+
7
+ # this was adapted from rdoc's install.rb by way of Log4r
8
+
9
+ $sitedir = CONFIG["sitelibdir"]
10
+ unless $sitedir
11
+ version = CONFIG["MAJOR"] + "." + CONFIG["MINOR"]
12
+ $libdir = File.join(CONFIG["libdir"], "ruby", version)
13
+ $sitedir = $:.find {|x| x =~ /site_ruby/ }
14
+ if !$sitedir
15
+ $sitedir = File.join($libdir, "site_ruby")
16
+ elsif $sitedir !~ Regexp.quote(version)
17
+ $sitedir = File.join($sitedir, version)
18
+ end
19
+ end
20
+
21
+ # the actual gruntwork
22
+ Dir.chdir("lib")
23
+
24
+ Find.find("action_controller", "action_controller.rb", "action_view", "action_view.rb") { |f|
25
+ if f[-3..-1] == ".rb"
26
+ File::install(f, File.join($sitedir, *f.split(/\//)), 0644, true)
27
+ else
28
+ File::makedirs(File.join($sitedir, *f.split(/\//)))
29
+ end
30
+ }
@@ -0,0 +1,113 @@
1
+ #--
2
+ # Copyright (c) 2004-2010 David Heinemeier Hansson
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ begin
25
+ require 'active_support'
26
+ rescue LoadError
27
+ activesupport_path = "#{File.dirname(__FILE__)}/../../activesupport/lib"
28
+ if File.directory?(activesupport_path)
29
+ $:.unshift activesupport_path
30
+ require 'active_support'
31
+ end
32
+ end
33
+
34
+ gem 'rack', '> 1.1.3'
35
+ require 'rack'
36
+ require 'action_controller/cgi_ext'
37
+
38
+ module ActionController
39
+ # TODO: Review explicit to see if they will automatically be handled by
40
+ # the initilizer if they are really needed.
41
+ def self.load_all!
42
+ [Base, CGIHandler, CgiRequest, Request, Response, Http::Headers, UrlRewriter, UrlWriter]
43
+ end
44
+
45
+ autoload :Base, 'action_controller/base'
46
+ autoload :Benchmarking, 'action_controller/benchmarking'
47
+ autoload :Caching, 'action_controller/caching'
48
+ autoload :Cookies, 'action_controller/cookies'
49
+ autoload :Dispatcher, 'action_controller/dispatcher'
50
+ autoload :Failsafe, 'action_controller/failsafe'
51
+ autoload :Filters, 'action_controller/filters'
52
+ autoload :Flash, 'action_controller/flash'
53
+ autoload :Helpers, 'action_controller/helpers'
54
+ autoload :HttpAuthentication, 'action_controller/http_authentication'
55
+ autoload :Integration, 'action_controller/integration'
56
+ autoload :IntegrationTest, 'action_controller/integration'
57
+ autoload :Layout, 'action_controller/layout'
58
+ autoload :MiddlewareStack, 'action_controller/middleware_stack'
59
+ autoload :MimeResponds, 'action_controller/mime_responds'
60
+ autoload :ParamsParser, 'action_controller/params_parser'
61
+ autoload :PolymorphicRoutes, 'action_controller/polymorphic_routes'
62
+ autoload :RecordIdentifier, 'action_controller/record_identifier'
63
+ autoload :Reloader, 'action_controller/reloader'
64
+ autoload :Request, 'action_controller/request'
65
+ autoload :RequestForgeryProtection, 'action_controller/request_forgery_protection'
66
+ autoload :Rescue, 'action_controller/rescue'
67
+ autoload :Resources, 'action_controller/resources'
68
+ autoload :Response, 'action_controller/response'
69
+ autoload :RewindableInput, 'action_controller/rewindable_input'
70
+ autoload :Routing, 'action_controller/routing'
71
+ autoload :SessionManagement, 'action_controller/session_management'
72
+ autoload :StatusCodes, 'action_controller/status_codes'
73
+ autoload :Streaming, 'action_controller/streaming'
74
+ autoload :StringCoercion, 'action_controller/string_coercion'
75
+ autoload :TestCase, 'action_controller/test_case'
76
+ autoload :TestProcess, 'action_controller/test_process'
77
+ autoload :Translation, 'action_controller/translation'
78
+ autoload :UploadedFile, 'action_controller/uploaded_file'
79
+ autoload :UploadedStringIO, 'action_controller/uploaded_file'
80
+ autoload :UploadedTempfile, 'action_controller/uploaded_file'
81
+ autoload :UrlRewriter, 'action_controller/url_rewriter'
82
+ autoload :UrlWriter, 'action_controller/url_rewriter'
83
+ autoload :Verification, 'action_controller/verification'
84
+
85
+ module Assertions
86
+ autoload :DomAssertions, 'action_controller/assertions/dom_assertions'
87
+ autoload :ModelAssertions, 'action_controller/assertions/model_assertions'
88
+ autoload :ResponseAssertions, 'action_controller/assertions/response_assertions'
89
+ autoload :RoutingAssertions, 'action_controller/assertions/routing_assertions'
90
+ autoload :SelectorAssertions, 'action_controller/assertions/selector_assertions'
91
+ autoload :TagAssertions, 'action_controller/assertions/tag_assertions'
92
+ end
93
+
94
+ module Http
95
+ autoload :Headers, 'action_controller/headers'
96
+ end
97
+
98
+ module Session
99
+ autoload :AbstractStore, 'action_controller/session/abstract_store'
100
+ autoload :CookieStore, 'action_controller/session/cookie_store'
101
+ autoload :MemCacheStore, 'action_controller/session/mem_cache_store'
102
+ end
103
+
104
+ # DEPRECATE: Remove CGI support
105
+ autoload :CgiRequest, 'action_controller/cgi_process'
106
+ autoload :CGIHandler, 'action_controller/cgi_process'
107
+ end
108
+
109
+ autoload :Mime, 'action_controller/mime_type'
110
+
111
+ autoload :HTML, 'action_controller/vendor/html-scanner'
112
+
113
+ require 'action_view'
@@ -0,0 +1,55 @@
1
+ module ActionController
2
+ module Assertions
3
+ module DomAssertions
4
+ def self.strip_whitespace!(nodes)
5
+ nodes.reject! do |node|
6
+ if node.is_a?(HTML::Text)
7
+ node.content.strip!
8
+ node.content.empty?
9
+ else
10
+ strip_whitespace! node.children
11
+ false
12
+ end
13
+ end
14
+ end
15
+
16
+ # Test two HTML strings for equivalency (e.g., identical up to reordering of attributes)
17
+ #
18
+ # ==== Examples
19
+ #
20
+ # # assert that the referenced method generates the appropriate HTML string
21
+ # assert_dom_equal '<a href="http://www.example.com">Apples</a>', link_to("Apples", "http://www.example.com")
22
+ #
23
+ def assert_dom_equal(expected, actual, message = "")
24
+ clean_backtrace do
25
+ expected_dom = HTML::Document.new(expected).root
26
+ actual_dom = HTML::Document.new(actual).root
27
+ DomAssertions.strip_whitespace!(expected_dom.children)
28
+ DomAssertions.strip_whitespace!(actual_dom.children)
29
+
30
+ full_message = build_message(message, "<?> expected but was\n<?>.", expected_dom.to_s, actual_dom.to_s)
31
+ assert_block(full_message) { expected_dom == actual_dom }
32
+ end
33
+ end
34
+
35
+ # The negated form of +assert_dom_equal+.
36
+ #
37
+ # ==== Examples
38
+ #
39
+ # # assert that the referenced method does not generate the specified HTML string
40
+ # assert_dom_not_equal '<a href="http://www.example.com">Apples</a>', link_to("Oranges", "http://www.example.com")
41
+ #
42
+ def assert_dom_not_equal(expected, actual, message = "")
43
+ clean_backtrace do
44
+ expected_dom = HTML::Document.new(expected).root
45
+ actual_dom = HTML::Document.new(actual).root
46
+ DomAssertions.strip_whitespace!(expected_dom.children)
47
+ DomAssertions.strip_whitespace!(actual_dom.children)
48
+
49
+ full_message = build_message(message, "<?> expected to be != to\n<?>.", expected_dom.to_s, actual_dom.to_s)
50
+ assert_block(full_message) { expected_dom != actual_dom }
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,21 @@
1
+ module ActionController
2
+ module Assertions
3
+ module ModelAssertions
4
+ # Ensures that the passed record is valid by Active Record standards and
5
+ # returns any error messages if it is not.
6
+ #
7
+ # ==== Examples
8
+ #
9
+ # # assert that a newly created record is valid
10
+ # model = Model.new
11
+ # assert_valid(model)
12
+ #
13
+ def assert_valid(record)
14
+ ::ActiveSupport::Deprecation.warn("assert_valid is deprecated. Use assert record.valid? instead", caller)
15
+ clean_backtrace do
16
+ assert record.valid?, record.errors.full_messages.join("\n")
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,169 @@
1
+ module ActionController
2
+ module Assertions
3
+ # A small suite of assertions that test responses from Rails applications.
4
+ module ResponseAssertions
5
+ # Asserts that the response is one of the following types:
6
+ #
7
+ # * <tt>:success</tt> - Status code was 200
8
+ # * <tt>:redirect</tt> - Status code was in the 300-399 range
9
+ # * <tt>:missing</tt> - Status code was 404
10
+ # * <tt>:error</tt> - Status code was in the 500-599 range
11
+ #
12
+ # You can also pass an explicit status number like assert_response(501)
13
+ # or its symbolic equivalent assert_response(:not_implemented).
14
+ # See ActionController::StatusCodes for a full list.
15
+ #
16
+ # ==== Examples
17
+ #
18
+ # # assert that the response was a redirection
19
+ # assert_response :redirect
20
+ #
21
+ # # assert that the response code was status code 401 (unauthorized)
22
+ # assert_response 401
23
+ #
24
+ def assert_response(type, message = nil)
25
+ clean_backtrace do
26
+ if [ :success, :missing, :redirect, :error ].include?(type) && @response.send("#{type}?")
27
+ assert_block("") { true } # to count the assertion
28
+ elsif type.is_a?(Fixnum) && @response.response_code == type
29
+ assert_block("") { true } # to count the assertion
30
+ elsif type.is_a?(Symbol) && @response.response_code == ActionController::StatusCodes::SYMBOL_TO_STATUS_CODE[type]
31
+ assert_block("") { true } # to count the assertion
32
+ else
33
+ if @response.error?
34
+ exception = @response.template.instance_variable_get(:@exception)
35
+ exception_message = exception && exception.message
36
+ assert_block(build_message(message, "Expected response to be a <?>, but was <?>\n<?>", type, @response.response_code, exception_message.to_s)) { false }
37
+ else
38
+ assert_block(build_message(message, "Expected response to be a <?>, but was <?>", type, @response.response_code)) { false }
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ # Assert that the redirection options passed in match those of the redirect called in the latest action.
45
+ # This match can be partial, such that assert_redirected_to(:controller => "weblog") will also
46
+ # match the redirection of redirect_to(:controller => "weblog", :action => "show") and so on.
47
+ #
48
+ # ==== Examples
49
+ #
50
+ # # assert that the redirection was to the "index" action on the WeblogController
51
+ # assert_redirected_to :controller => "weblog", :action => "index"
52
+ #
53
+ # # assert that the redirection was to the named route login_url
54
+ # assert_redirected_to login_url
55
+ #
56
+ # # assert that the redirection was to the url for @customer
57
+ # assert_redirected_to @customer
58
+ #
59
+ def assert_redirected_to(options = {}, message=nil)
60
+ clean_backtrace do
61
+ assert_response(:redirect, message)
62
+ return true if options == @response.redirected_to
63
+
64
+ # Support partial arguments for hash redirections
65
+ if options.is_a?(Hash) && @response.redirected_to.is_a?(Hash)
66
+ if options.all? {|(key, value)| @response.redirected_to[key] == value}
67
+ callstack = caller.dup
68
+ callstack.slice!(0, 2)
69
+ ::ActiveSupport::Deprecation.warn("Using assert_redirected_to with partial hash arguments is deprecated. Specify the full set arguments instead", callstack)
70
+ return true
71
+ end
72
+ end
73
+
74
+ redirected_to_after_normalisation = normalize_argument_to_redirection(@response.redirected_to)
75
+ options_after_normalisation = normalize_argument_to_redirection(options)
76
+
77
+ if redirected_to_after_normalisation != options_after_normalisation
78
+ flunk "Expected response to be a redirect to <#{options_after_normalisation}> but was a redirect to <#{redirected_to_after_normalisation}>"
79
+ end
80
+ end
81
+ end
82
+
83
+ # Asserts that the request was rendered with the appropriate template file or partials
84
+ #
85
+ # ==== Examples
86
+ #
87
+ # # assert that the "new" view template was rendered
88
+ # assert_template "new"
89
+ #
90
+ # # assert that the "new" view template was rendered with Symbol
91
+ # assert_template :new
92
+ #
93
+ # # assert that the "_customer" partial was rendered twice
94
+ # assert_template :partial => '_customer', :count => 2
95
+ #
96
+ # # assert that no partials were rendered
97
+ # assert_template :partial => false
98
+ #
99
+ def assert_template(options = {}, message = nil)
100
+ clean_backtrace do
101
+ case options
102
+ when NilClass, String, Symbol
103
+ rendered = @response.rendered[:template].to_s
104
+ msg = build_message(message,
105
+ "expecting <?> but rendering with <?>",
106
+ options, rendered)
107
+ assert_block(msg) do
108
+ if options.nil?
109
+ @response.rendered[:template].blank?
110
+ else
111
+ rendered.to_s.match(options.to_s)
112
+ end
113
+ end
114
+ when Hash
115
+ if expected_partial = options[:partial]
116
+ partials = @response.rendered[:partials]
117
+ if expected_count = options[:count]
118
+ found = partials.detect { |p, _| p.to_s.match(expected_partial) }
119
+ actual_count = found.nil? ? 0 : found.second
120
+ msg = build_message(message,
121
+ "expecting ? to be rendered ? time(s) but rendered ? time(s)",
122
+ expected_partial, expected_count, actual_count)
123
+ assert(actual_count == expected_count.to_i, msg)
124
+ else
125
+ msg = build_message(message,
126
+ "expecting partial <?> but action rendered <?>",
127
+ options[:partial], partials.keys)
128
+ assert(partials.keys.any? { |p| p.to_s.match(expected_partial) }, msg)
129
+ end
130
+ else
131
+ assert @response.rendered[:partials].empty?,
132
+ "Expected no partials to be rendered"
133
+ end
134
+ else
135
+ raise ArgumentError
136
+ end
137
+ end
138
+ end
139
+
140
+ private
141
+ # Proxy to to_param if the object will respond to it.
142
+ def parameterize(value)
143
+ value.respond_to?(:to_param) ? value.to_param : value
144
+ end
145
+
146
+ def normalize_argument_to_redirection(fragment)
147
+ case fragment
148
+ when %r{^\w[\w\d+.-]*:.*}
149
+ fragment
150
+ when String
151
+ if fragment =~ %r{^\w[\w\d+.-]*:.*}
152
+ fragment
153
+ else
154
+ if fragment !~ /^\//
155
+ ActiveSupport::Deprecation.warn "Omitting the leading slash on a path with assert_redirected_to is deprecated. Use '/#{fragment}' instead.", caller(2)
156
+ fragment = "/#{fragment}"
157
+ end
158
+ @request.protocol + @request.host_with_port + fragment
159
+ end
160
+ when :back
161
+ raise RedirectBackError unless refer = @request.headers["Referer"]
162
+ refer
163
+ else
164
+ @controller.url_for(fragment)
165
+ end.gsub(/[\r\n]/, '')
166
+ end
167
+ end
168
+ end
169
+ end