actionpack-rack-upgrade 2.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. data/CHANGELOG +5250 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +158 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller/assertions/dom_assertions.rb +55 -0
  8. data/lib/action_controller/assertions/model_assertions.rb +21 -0
  9. data/lib/action_controller/assertions/response_assertions.rb +169 -0
  10. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  11. data/lib/action_controller/assertions/selector_assertions.rb +638 -0
  12. data/lib/action_controller/assertions/tag_assertions.rb +127 -0
  13. data/lib/action_controller/base.rb +1425 -0
  14. data/lib/action_controller/benchmarking.rb +107 -0
  15. data/lib/action_controller/caching/actions.rb +177 -0
  16. data/lib/action_controller/caching/fragments.rb +120 -0
  17. data/lib/action_controller/caching/pages.rb +152 -0
  18. data/lib/action_controller/caching/sweeper.rb +45 -0
  19. data/lib/action_controller/caching/sweeping.rb +55 -0
  20. data/lib/action_controller/caching.rb +71 -0
  21. data/lib/action_controller/cgi_ext/cookie.rb +112 -0
  22. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  23. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  24. data/lib/action_controller/cgi_ext.rb +15 -0
  25. data/lib/action_controller/cgi_process.rb +77 -0
  26. data/lib/action_controller/cookies.rb +197 -0
  27. data/lib/action_controller/dispatcher.rb +133 -0
  28. data/lib/action_controller/failsafe.rb +87 -0
  29. data/lib/action_controller/filters.rb +680 -0
  30. data/lib/action_controller/flash.rb +213 -0
  31. data/lib/action_controller/headers.rb +33 -0
  32. data/lib/action_controller/helpers.rb +225 -0
  33. data/lib/action_controller/http_authentication.rb +309 -0
  34. data/lib/action_controller/integration.rb +708 -0
  35. data/lib/action_controller/layout.rb +286 -0
  36. data/lib/action_controller/middleware_stack.rb +119 -0
  37. data/lib/action_controller/middlewares.rb +14 -0
  38. data/lib/action_controller/mime_responds.rb +193 -0
  39. data/lib/action_controller/mime_type.rb +212 -0
  40. data/lib/action_controller/mime_types.rb +21 -0
  41. data/lib/action_controller/params_parser.rb +77 -0
  42. data/lib/action_controller/performance_test.rb +15 -0
  43. data/lib/action_controller/polymorphic_routes.rb +189 -0
  44. data/lib/action_controller/rack_lint_patch.rb +36 -0
  45. data/lib/action_controller/record_identifier.rb +104 -0
  46. data/lib/action_controller/reloader.rb +54 -0
  47. data/lib/action_controller/request.rb +495 -0
  48. data/lib/action_controller/request_forgery_protection.rb +116 -0
  49. data/lib/action_controller/rescue.rb +183 -0
  50. data/lib/action_controller/resources.rb +682 -0
  51. data/lib/action_controller/response.rb +237 -0
  52. data/lib/action_controller/routing/builder.rb +197 -0
  53. data/lib/action_controller/routing/optimisations.rb +130 -0
  54. data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  55. data/lib/action_controller/routing/route.rb +265 -0
  56. data/lib/action_controller/routing/route_set.rb +503 -0
  57. data/lib/action_controller/routing/routing_ext.rb +49 -0
  58. data/lib/action_controller/routing/segments.rb +343 -0
  59. data/lib/action_controller/routing.rb +388 -0
  60. data/lib/action_controller/session/abstract_store.rb +276 -0
  61. data/lib/action_controller/session/cookie_store.rb +240 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +60 -0
  63. data/lib/action_controller/session_management.rb +54 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +181 -0
  66. data/lib/action_controller/string_coercion.rb +29 -0
  67. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  68. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  69. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  70. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  71. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  72. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  73. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  74. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  75. data/lib/action_controller/test_case.rb +209 -0
  76. data/lib/action_controller/test_process.rb +580 -0
  77. data/lib/action_controller/translation.rb +13 -0
  78. data/lib/action_controller/uploaded_file.rb +44 -0
  79. data/lib/action_controller/url_rewriter.rb +229 -0
  80. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  81. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  82. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  83. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  84. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  85. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  86. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  87. data/lib/action_controller/verification.rb +130 -0
  88. data/lib/action_controller.rb +113 -0
  89. data/lib/action_pack/version.rb +9 -0
  90. data/lib/action_pack.rb +24 -0
  91. data/lib/action_view/base.rb +362 -0
  92. data/lib/action_view/helpers/active_record_helper.rb +305 -0
  93. data/lib/action_view/helpers/asset_tag_helper.rb +695 -0
  94. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  95. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  96. data/lib/action_view/helpers/cache_helper.rb +39 -0
  97. data/lib/action_view/helpers/capture_helper.rb +136 -0
  98. data/lib/action_view/helpers/csrf_helper.rb +14 -0
  99. data/lib/action_view/helpers/date_helper.rb +989 -0
  100. data/lib/action_view/helpers/debug_helper.rb +38 -0
  101. data/lib/action_view/helpers/form_helper.rb +1118 -0
  102. data/lib/action_view/helpers/form_options_helper.rb +599 -0
  103. data/lib/action_view/helpers/form_tag_helper.rb +490 -0
  104. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  105. data/lib/action_view/helpers/number_helper.rb +308 -0
  106. data/lib/action_view/helpers/prototype_helper.rb +1305 -0
  107. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  108. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  109. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  110. data/lib/action_view/helpers/sanitize_helper.rb +251 -0
  111. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  112. data/lib/action_view/helpers/tag_helper.rb +151 -0
  113. data/lib/action_view/helpers/text_helper.rb +597 -0
  114. data/lib/action_view/helpers/translation_helper.rb +67 -0
  115. data/lib/action_view/helpers/url_helper.rb +637 -0
  116. data/lib/action_view/helpers.rb +61 -0
  117. data/lib/action_view/inline_template.rb +19 -0
  118. data/lib/action_view/locale/en.yml +117 -0
  119. data/lib/action_view/partials.rb +241 -0
  120. data/lib/action_view/paths.rb +77 -0
  121. data/lib/action_view/reloadable_template.rb +117 -0
  122. data/lib/action_view/renderable.rb +109 -0
  123. data/lib/action_view/renderable_partial.rb +53 -0
  124. data/lib/action_view/template.rb +252 -0
  125. data/lib/action_view/template_error.rb +99 -0
  126. data/lib/action_view/template_handler.rb +34 -0
  127. data/lib/action_view/template_handlers/builder.rb +17 -0
  128. data/lib/action_view/template_handlers/erb.rb +25 -0
  129. data/lib/action_view/template_handlers/rjs.rb +13 -0
  130. data/lib/action_view/template_handlers.rb +48 -0
  131. data/lib/action_view/test_case.rb +162 -0
  132. data/lib/action_view.rb +58 -0
  133. data/lib/actionpack.rb +2 -0
  134. data/test/abstract_unit.rb +78 -0
  135. data/test/active_record_unit.rb +104 -0
  136. data/test/activerecord/active_record_store_test.rb +221 -0
  137. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  138. data/test/adv_attr_test.rb +20 -0
  139. data/test/controller/action_pack_assertions_test.rb +545 -0
  140. data/test/controller/addresses_render_test.rb +37 -0
  141. data/test/controller/assert_select_test.rb +735 -0
  142. data/test/controller/base_test.rb +217 -0
  143. data/test/controller/benchmark_test.rb +32 -0
  144. data/test/controller/caching_test.rb +743 -0
  145. data/test/controller/capture_test.rb +66 -0
  146. data/test/controller/content_type_test.rb +178 -0
  147. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  148. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  150. data/test/controller/cookie_test.rb +208 -0
  151. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  152. data/test/controller/dispatcher_test.rb +144 -0
  153. data/test/controller/dom_assertions_test.rb +53 -0
  154. data/test/controller/failsafe_test.rb +60 -0
  155. data/test/controller/fake_controllers.rb +33 -0
  156. data/test/controller/fake_models.rb +19 -0
  157. data/test/controller/filter_params_test.rb +52 -0
  158. data/test/controller/filters_test.rb +885 -0
  159. data/test/controller/flash_test.rb +174 -0
  160. data/test/controller/header_test.rb +14 -0
  161. data/test/controller/helper_test.rb +224 -0
  162. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  163. data/test/controller/html-scanner/document_test.rb +148 -0
  164. data/test/controller/html-scanner/node_test.rb +89 -0
  165. data/test/controller/html-scanner/sanitizer_test.rb +281 -0
  166. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  167. data/test/controller/html-scanner/text_node_test.rb +50 -0
  168. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  169. data/test/controller/http_basic_authentication_test.rb +113 -0
  170. data/test/controller/http_digest_authentication_test.rb +254 -0
  171. data/test/controller/integration_test.rb +526 -0
  172. data/test/controller/layout_test.rb +215 -0
  173. data/test/controller/localized_templates_test.rb +24 -0
  174. data/test/controller/logging_test.rb +46 -0
  175. data/test/controller/middleware_stack_test.rb +90 -0
  176. data/test/controller/mime_responds_test.rb +536 -0
  177. data/test/controller/mime_type_test.rb +93 -0
  178. data/test/controller/output_escaping_test.rb +19 -0
  179. data/test/controller/polymorphic_routes_test.rb +297 -0
  180. data/test/controller/rack_test.rb +308 -0
  181. data/test/controller/record_identifier_test.rb +139 -0
  182. data/test/controller/redirect_test.rb +285 -0
  183. data/test/controller/reloader_test.rb +125 -0
  184. data/test/controller/render_test.rb +1783 -0
  185. data/test/controller/request/json_params_parsing_test.rb +65 -0
  186. data/test/controller/request/multipart_params_parsing_test.rb +177 -0
  187. data/test/controller/request/query_string_parsing_test.rb +120 -0
  188. data/test/controller/request/test_request_test.rb +35 -0
  189. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  190. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  191. data/test/controller/request_forgery_protection_test.rb +233 -0
  192. data/test/controller/request_test.rb +395 -0
  193. data/test/controller/rescue_test.rb +541 -0
  194. data/test/controller/resources_test.rb +1393 -0
  195. data/test/controller/routing_test.rb +2592 -0
  196. data/test/controller/selector_test.rb +628 -0
  197. data/test/controller/send_file_test.rb +171 -0
  198. data/test/controller/session/abstract_store_test.rb +64 -0
  199. data/test/controller/session/cookie_store_test.rb +354 -0
  200. data/test/controller/session/mem_cache_store_test.rb +187 -0
  201. data/test/controller/session/test_session_test.rb +58 -0
  202. data/test/controller/test_test.rb +700 -0
  203. data/test/controller/translation_test.rb +26 -0
  204. data/test/controller/url_rewriter_test.rb +395 -0
  205. data/test/controller/verification_test.rb +270 -0
  206. data/test/controller/view_paths_test.rb +141 -0
  207. data/test/controller/webservice_test.rb +260 -0
  208. data/test/fixtures/_top_level_partial.html.erb +1 -0
  209. data/test/fixtures/_top_level_partial_only.erb +1 -0
  210. data/test/fixtures/addresses/list.erb +1 -0
  211. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  212. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  213. data/test/fixtures/companies.yml +24 -0
  214. data/test/fixtures/company.rb +10 -0
  215. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  216. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  217. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  218. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  219. data/test/fixtures/customers/_customer.html.erb +1 -0
  220. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  221. data/test/fixtures/developer.rb +9 -0
  222. data/test/fixtures/developers/_developer.erb +1 -0
  223. data/test/fixtures/developers.yml +21 -0
  224. data/test/fixtures/developers_projects.yml +13 -0
  225. data/test/fixtures/failsafe/500.html +1 -0
  226. data/test/fixtures/fun/games/_game.erb +1 -0
  227. data/test/fixtures/fun/games/hello_world.erb +1 -0
  228. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  229. data/test/fixtures/functional_caching/_partial.erb +3 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  231. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  232. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  233. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  235. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  236. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  237. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  238. data/test/fixtures/helpers/abc_helper.rb +5 -0
  239. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  240. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  241. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  242. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  243. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  244. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  246. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  247. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  248. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  249. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  250. data/test/fixtures/layouts/_column.html.erb +2 -0
  251. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  252. data/test/fixtures/layouts/builder.builder +3 -0
  253. data/test/fixtures/layouts/default_html.html.erb +1 -0
  254. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  255. data/test/fixtures/layouts/standard.erb +1 -0
  256. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  257. data/test/fixtures/layouts/xhr.html.erb +2 -0
  258. data/test/fixtures/layouts/yield.erb +2 -0
  259. data/test/fixtures/localized/hello_world.de.html +1 -0
  260. data/test/fixtures/localized/hello_world.en.html +1 -0
  261. data/test/fixtures/mascot.rb +3 -0
  262. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  263. data/test/fixtures/mascots.yml +4 -0
  264. data/test/fixtures/multipart/binary_file +0 -0
  265. data/test/fixtures/multipart/boundary_problem_file +10 -0
  266. data/test/fixtures/multipart/bracketed_param +5 -0
  267. data/test/fixtures/multipart/empty +10 -0
  268. data/test/fixtures/multipart/hello.txt +1 -0
  269. data/test/fixtures/multipart/large_text_file +10 -0
  270. data/test/fixtures/multipart/mixed_files +0 -0
  271. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  272. data/test/fixtures/multipart/none +9 -0
  273. data/test/fixtures/multipart/single_parameter +5 -0
  274. data/test/fixtures/multipart/text_file +10 -0
  275. data/test/fixtures/override/test/hello_world.erb +1 -0
  276. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  277. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  278. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  279. data/test/fixtures/post_test/post/index.html.erb +1 -0
  280. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  281. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  282. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  283. data/test/fixtures/project.rb +3 -0
  284. data/test/fixtures/projects/_project.erb +1 -0
  285. data/test/fixtures/projects.yml +7 -0
  286. data/test/fixtures/public/404.html +1 -0
  287. data/test/fixtures/public/500.da.html +1 -0
  288. data/test/fixtures/public/500.html +1 -0
  289. data/test/fixtures/public/absolute/test.css +23 -0
  290. data/test/fixtures/public/absolute/test.js +63 -0
  291. data/test/fixtures/public/images/rails.png +0 -0
  292. data/test/fixtures/public/javascripts/application.js +1 -0
  293. data/test/fixtures/public/javascripts/bank.js +1 -0
  294. data/test/fixtures/public/javascripts/controls.js +1 -0
  295. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  296. data/test/fixtures/public/javascripts/effects.js +1 -0
  297. data/test/fixtures/public/javascripts/prototype.js +1 -0
  298. data/test/fixtures/public/javascripts/robber.js +1 -0
  299. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  300. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  301. data/test/fixtures/public/stylesheets/bank.css +1 -0
  302. data/test/fixtures/public/stylesheets/robber.css +1 -0
  303. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  304. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  305. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  306. data/test/fixtures/replies/_reply.erb +1 -0
  307. data/test/fixtures/replies.yml +15 -0
  308. data/test/fixtures/reply.rb +7 -0
  309. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  310. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  311. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  312. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  313. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  314. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  315. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  316. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  318. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  319. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  320. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  321. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  322. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  323. data/test/fixtures/scope/test/modgreet.erb +1 -0
  324. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +10 -0
  325. data/test/fixtures/shared.html.erb +1 -0
  326. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  327. data/test/fixtures/test/_counter.html.erb +1 -0
  328. data/test/fixtures/test/_customer.erb +1 -0
  329. data/test/fixtures/test/_customer_counter.erb +1 -0
  330. data/test/fixtures/test/_customer_counter_with_as.erb +1 -0
  331. data/test/fixtures/test/_customer_greeting.erb +1 -0
  332. data/test/fixtures/test/_customer_with_var.erb +1 -0
  333. data/test/fixtures/test/_form.erb +1 -0
  334. data/test/fixtures/test/_from_helper.erb +1 -0
  335. data/test/fixtures/test/_hash_greeting.erb +1 -0
  336. data/test/fixtures/test/_hash_object.erb +2 -0
  337. data/test/fixtures/test/_hello.builder +1 -0
  338. data/test/fixtures/test/_labelling_form.erb +1 -0
  339. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  340. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  341. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  342. data/test/fixtures/test/_one.html.erb +1 -0
  343. data/test/fixtures/test/_partial.erb +1 -0
  344. data/test/fixtures/test/_partial.html.erb +1 -0
  345. data/test/fixtures/test/_partial.js.erb +1 -0
  346. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  347. data/test/fixtures/test/_partial_only.erb +1 -0
  348. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  349. data/test/fixtures/test/_person.erb +2 -0
  350. data/test/fixtures/test/_raise.html.erb +1 -0
  351. data/test/fixtures/test/_two.html.erb +1 -0
  352. data/test/fixtures/test/_utf8_partial.html.erb +1 -0
  353. data/test/fixtures/test/_utf8_partial_magic.html.erb +2 -0
  354. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  355. data/test/fixtures/test/array_translation.erb +1 -0
  356. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  357. data/test/fixtures/test/capturing.erb +4 -0
  358. data/test/fixtures/test/content_for.erb +2 -0
  359. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  360. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  361. data/test/fixtures/test/delete_with_js.rjs +2 -0
  362. data/test/fixtures/test/dont_pick_me +1 -0
  363. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  364. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  365. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  366. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  367. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  368. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  369. data/test/fixtures/test/greeting.erb +1 -0
  370. data/test/fixtures/test/greeting.js.rjs +1 -0
  371. data/test/fixtures/test/hello.builder +4 -0
  372. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  373. data/test/fixtures/test/hello_world.erb +1 -0
  374. data/test/fixtures/test/hello_world.erb~ +1 -0
  375. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  376. data/test/fixtures/test/hello_world_container.builder +3 -0
  377. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  378. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  379. data/test/fixtures/test/hello_xml_world.builder +11 -0
  380. data/test/fixtures/test/hyphen-ated.erb +1 -0
  381. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  382. data/test/fixtures/test/list.erb +1 -0
  383. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  384. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  385. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  386. data/test/fixtures/test/nested_layout.erb +3 -0
  387. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  388. data/test/fixtures/test/potential_conflicts.erb +4 -0
  389. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  390. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  391. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  392. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  393. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  394. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  395. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  396. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  397. data/test/fixtures/test/render_to_string_test.erb +1 -0
  398. data/test/fixtures/test/scoped_array_translation.erb +1 -0
  399. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  400. data/test/fixtures/test/template.erb +1 -0
  401. data/test/fixtures/test/translation.erb +1 -0
  402. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  403. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  404. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  405. data/test/fixtures/test/utf8.html.erb +4 -0
  406. data/test/fixtures/test/utf8_magic.html.erb +5 -0
  407. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +5 -0
  408. data/test/fixtures/topic.rb +3 -0
  409. data/test/fixtures/topics/_topic.html.erb +1 -0
  410. data/test/fixtures/topics.yml +22 -0
  411. data/test/template/active_record_helper_i18n_test.rb +51 -0
  412. data/test/template/active_record_helper_test.rb +302 -0
  413. data/test/template/asset_tag_helper_test.rb +770 -0
  414. data/test/template/atom_feed_helper_test.rb +315 -0
  415. data/test/template/benchmark_helper_test.rb +86 -0
  416. data/test/template/compiled_templates_test.rb +204 -0
  417. data/test/template/date_helper_i18n_test.rb +121 -0
  418. data/test/template/date_helper_test.rb +2603 -0
  419. data/test/template/erb_util_test.rb +36 -0
  420. data/test/template/form_helper_test.rb +1447 -0
  421. data/test/template/form_options_helper_i18n_test.rb +27 -0
  422. data/test/template/form_options_helper_test.rb +811 -0
  423. data/test/template/form_tag_helper_test.rb +356 -0
  424. data/test/template/javascript_helper_test.rb +106 -0
  425. data/test/template/number_helper_i18n_test.rb +69 -0
  426. data/test/template/number_helper_test.rb +132 -0
  427. data/test/template/prototype_helper_test.rb +639 -0
  428. data/test/template/raw_output_helper_test.rb +21 -0
  429. data/test/template/record_tag_helper_test.rb +58 -0
  430. data/test/template/render_test.rb +329 -0
  431. data/test/template/sanitize_helper_test.rb +57 -0
  432. data/test/template/scriptaculous_helper_test.rb +90 -0
  433. data/test/template/tag_helper_test.rb +98 -0
  434. data/test/template/template_test.rb +32 -0
  435. data/test/template/test_test.rb +54 -0
  436. data/test/template/text_helper_test.rb +597 -0
  437. data/test/template/translation_helper_test.rb +95 -0
  438. data/test/template/url_helper_test.rb +641 -0
  439. data/test/testing_sandbox.rb +15 -0
  440. data/test/view/test_case_test.rb +176 -0
  441. metadata +519 -0
@@ -0,0 +1,66 @@
1
+ require 'abstract_unit'
2
+
3
+ class CaptureController < ActionController::Base
4
+ def self.controller_name; "test"; end
5
+ def self.controller_path; "test"; end
6
+
7
+ def content_for
8
+ render :layout => "talk_from_action"
9
+ end
10
+
11
+ def content_for_with_parameter
12
+ render :layout => "talk_from_action"
13
+ end
14
+
15
+ def content_for_concatenated
16
+ render :layout => "talk_from_action"
17
+ end
18
+
19
+ def non_erb_block_content_for
20
+ render :layout => "talk_from_action"
21
+ end
22
+
23
+ def rescue_action(e) raise end
24
+ end
25
+
26
+ class CaptureTest < ActionController::TestCase
27
+ tests CaptureController
28
+
29
+ def setup
30
+ # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
31
+ # a more accurate simulation of what happens in "real life".
32
+ @controller.logger = Logger.new(nil)
33
+
34
+ @request.host = "www.nextangle.com"
35
+ end
36
+
37
+ def test_simple_capture
38
+ get :capturing
39
+ assert_equal "<p>Dreamy days</p>", @response.body.strip
40
+ end
41
+
42
+ def test_content_for
43
+ get :content_for
44
+ assert_equal expected_content_for_output, @response.body
45
+ end
46
+
47
+ def test_should_concatentate_content_for
48
+ get :content_for_concatenated
49
+ assert_equal expected_content_for_output, @response.body
50
+ end
51
+
52
+ def test_should_set_content_for_with_parameter
53
+ get :content_for_with_parameter
54
+ assert_equal expected_content_for_output, @response.body
55
+ end
56
+
57
+ def test_non_erb_block_content_for
58
+ get :non_erb_block_content_for
59
+ assert_equal expected_content_for_output, @response.body
60
+ end
61
+
62
+ private
63
+ def expected_content_for_output
64
+ "<title>Putting stuff in the title!</title>\n\nGreat stuff!"
65
+ end
66
+ end
@@ -0,0 +1,178 @@
1
+ require 'abstract_unit'
2
+
3
+ class ContentTypeController < ActionController::Base
4
+ def render_content_type_from_body
5
+ response.content_type = Mime::RSS
6
+ render :text => "hello world!"
7
+ end
8
+
9
+ def render_defaults
10
+ render :text => "hello world!"
11
+ end
12
+
13
+ def render_content_type_from_render
14
+ render :text => "hello world!", :content_type => Mime::RSS
15
+ end
16
+
17
+ def render_charset_from_body
18
+ response.charset = "utf-16"
19
+ render :text => "hello world!"
20
+ end
21
+
22
+ def render_nil_charset_from_body
23
+ response.charset = nil
24
+ render :text => "hello world!"
25
+ end
26
+
27
+ def render_default_for_rhtml
28
+ end
29
+
30
+ def render_default_for_rxml
31
+ end
32
+
33
+ def render_default_for_rjs
34
+ end
35
+
36
+ def render_change_for_rxml
37
+ response.content_type = Mime::HTML
38
+ render :action => "render_default_for_rxml"
39
+ end
40
+
41
+ def render_default_content_types_for_respond_to
42
+ respond_to do |format|
43
+ format.html { render :text => "hello world!" }
44
+ format.xml { render :action => "render_default_content_types_for_respond_to.rhtml" }
45
+ format.js { render :text => "hello world!" }
46
+ format.rss { render :text => "hello world!", :content_type => Mime::XML }
47
+ end
48
+ end
49
+
50
+ def render_content_type_from_user_input
51
+ response.content_type= params[:hello]
52
+ render :text=>"hello"
53
+ end
54
+
55
+ def rescue_action(e) raise end
56
+ end
57
+
58
+ class ContentTypeTest < ActionController::TestCase
59
+ tests ContentTypeController
60
+
61
+ def setup
62
+ # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
63
+ # a more accurate simulation of what happens in "real life".
64
+ @controller.logger = Logger.new(nil)
65
+ end
66
+
67
+ def test_render_defaults
68
+ get :render_defaults
69
+ assert_equal "utf-8", @response.charset
70
+ assert_equal Mime::HTML, @response.content_type
71
+ end
72
+
73
+ def test_render_changed_charset_default
74
+ ContentTypeController.default_charset = "utf-16"
75
+ get :render_defaults
76
+ assert_equal "utf-16", @response.charset
77
+ assert_equal Mime::HTML, @response.content_type
78
+ ContentTypeController.default_charset = "utf-8"
79
+ end
80
+
81
+ def test_content_type_from_body
82
+ get :render_content_type_from_body
83
+ assert_equal "application/rss+xml", @response.content_type
84
+ assert_equal "utf-8", @response.charset
85
+ end
86
+
87
+ def test_content_type_from_render
88
+ get :render_content_type_from_render
89
+ assert_equal "application/rss+xml", @response.content_type
90
+ assert_equal "utf-8", @response.charset
91
+ end
92
+
93
+ def test_charset_from_body
94
+ get :render_charset_from_body
95
+ assert_equal Mime::HTML, @response.content_type
96
+ assert_equal "utf-16", @response.charset
97
+ end
98
+
99
+ def test_nil_charset_from_body
100
+ get :render_nil_charset_from_body
101
+ assert_equal Mime::HTML, @response.content_type
102
+ assert_equal "utf-8", @response.charset, @response.headers.inspect
103
+ end
104
+
105
+ def test_nil_default_for_rhtml
106
+ ContentTypeController.default_charset = nil
107
+ get :render_default_for_rhtml
108
+ assert_equal Mime::HTML, @response.content_type
109
+ assert_nil @response.charset, @response.headers.inspect
110
+ ensure
111
+ ContentTypeController.default_charset = "utf-8"
112
+ end
113
+
114
+ def test_default_for_rhtml
115
+ get :render_default_for_rhtml
116
+ assert_equal Mime::HTML, @response.content_type
117
+ assert_equal "utf-8", @response.charset
118
+ end
119
+
120
+ def test_default_for_rxml
121
+ get :render_default_for_rxml
122
+ assert_equal Mime::XML, @response.content_type
123
+ assert_equal "utf-8", @response.charset
124
+ end
125
+
126
+ def test_default_for_rjs
127
+ xhr :post, :render_default_for_rjs
128
+ assert_equal Mime::JS, @response.content_type
129
+ assert_equal "utf-8", @response.charset
130
+ end
131
+
132
+ def test_change_for_rxml
133
+ get :render_change_for_rxml
134
+ assert_equal Mime::HTML, @response.content_type
135
+ assert_equal "utf-8", @response.charset
136
+ end
137
+
138
+ def test_user_supplied_value
139
+ get :render_content_type_from_user_input, :hello=>"hello/world\r\nAttack: true"
140
+ assert_equal "hello/world%0D%0AAttack: true", @response.content_type
141
+ end
142
+ end
143
+
144
+ class AcceptBasedContentTypeTest < ActionController::TestCase
145
+
146
+ tests ContentTypeController
147
+
148
+ def setup
149
+ ActionController::Base.use_accept_header = true
150
+ end
151
+
152
+ def teardown
153
+ ActionController::Base.use_accept_header = false
154
+ end
155
+
156
+
157
+ def test_render_default_content_types_for_respond_to
158
+ @request.accept = Mime::HTML.to_s
159
+ get :render_default_content_types_for_respond_to
160
+ assert_equal Mime::HTML, @response.content_type
161
+
162
+ @request.accept = Mime::JS.to_s
163
+ get :render_default_content_types_for_respond_to
164
+ assert_equal Mime::JS, @response.content_type
165
+ end
166
+
167
+ def test_render_default_content_types_for_respond_to_with_template
168
+ @request.accept = Mime::XML.to_s
169
+ get :render_default_content_types_for_respond_to
170
+ assert_equal Mime::XML, @response.content_type
171
+ end
172
+
173
+ def test_render_default_content_types_for_respond_to_with_overwrite
174
+ @request.accept = Mime::RSS.to_s
175
+ get :render_default_content_types_for_respond_to
176
+ assert_equal Mime::XML, @response.content_type
177
+ end
178
+ end
@@ -0,0 +1,208 @@
1
+ require 'abstract_unit'
2
+
3
+ class CookieTest < ActionController::TestCase
4
+ class TestController < ActionController::Base
5
+ self.cookie_verifier_secret = "thisISverySECRET123"
6
+
7
+ def authenticate
8
+ cookies["user_name"] = "david"
9
+ end
10
+
11
+ def set_with_with_escapable_characters
12
+ cookies["that & guy"] = "foo & bar => baz"
13
+ end
14
+
15
+ def authenticate_for_fourteen_days
16
+ cookies["user_name"] = { "value" => "david", "expires" => Time.utc(2005, 10, 10,5) }
17
+ end
18
+
19
+ def authenticate_for_fourteen_days_with_symbols
20
+ cookies[:user_name] = { :value => "david", :expires => Time.utc(2005, 10, 10,5) }
21
+ end
22
+
23
+ def set_multiple_cookies
24
+ cookies["user_name"] = { "value" => "david", "expires" => Time.utc(2005, 10, 10,5) }
25
+ cookies["login"] = "XJ-122"
26
+ end
27
+
28
+ def access_frozen_cookies
29
+ cookies["will"] = "work"
30
+ end
31
+
32
+ def logout
33
+ cookies.delete("user_name")
34
+ end
35
+
36
+ def delete_cookie_with_path
37
+ cookies.delete("user_name", :path => '/beaten')
38
+ render :text => "hello world"
39
+ end
40
+
41
+ def authenticate_with_http_only
42
+ cookies["user_name"] = { :value => "david", :httponly => true }
43
+ end
44
+
45
+ def authenticate_with_secure
46
+ cookies["user_name"] = { :value => "david", :secure => true }
47
+ end
48
+
49
+ def set_permanent_cookie
50
+ cookies.permanent[:user_name] = "Jamie"
51
+ end
52
+
53
+ def set_signed_cookie
54
+ cookies.signed[:user_id] = 45
55
+ end
56
+
57
+ def set_permanent_signed_cookie
58
+ cookies.permanent.signed[:remember_me] = 100
59
+ end
60
+
61
+ def rescue_action(e)
62
+ raise unless ActionView::MissingTemplate # No templates here, and we don't care about the output
63
+ end
64
+ end
65
+
66
+ tests TestController
67
+
68
+ def setup
69
+ @request.host = "www.nextangle.com"
70
+ end
71
+
72
+ def test_setting_cookie
73
+ get :authenticate
74
+ assert_equal ["user_name=david; path=/"], @response.headers["Set-Cookie"]
75
+ assert_equal({"user_name" => "david"}, @response.cookies)
76
+ end
77
+
78
+ def test_setting_with_escapable_characters
79
+ get :set_with_with_escapable_characters
80
+ assert_equal ["that+%26+guy=foo+%26+bar+%3D%3E+baz; path=/"], @response.headers["Set-Cookie"]
81
+ assert_equal({"that & guy" => "foo & bar => baz"}, @response.cookies)
82
+ end
83
+
84
+ def test_setting_cookie_for_fourteen_days
85
+ get :authenticate_for_fourteen_days
86
+ assert_equal ["user_name=david; path=/; expires=Mon, 10-Oct-2005 05:00:00 GMT"], @response.headers["Set-Cookie"]
87
+ assert_equal({"user_name" => "david"}, @response.cookies)
88
+ end
89
+
90
+ def test_setting_cookie_for_fourteen_days_with_symbols
91
+ get :authenticate_for_fourteen_days_with_symbols
92
+ assert_equal ["user_name=david; path=/; expires=Mon, 10-Oct-2005 05:00:00 GMT"], @response.headers["Set-Cookie"]
93
+ assert_equal({"user_name" => "david"}, @response.cookies)
94
+ end
95
+
96
+ def test_setting_cookie_with_http_only
97
+ get :authenticate_with_http_only
98
+ assert_equal ["user_name=david; path=/; HttpOnly"], @response.headers["Set-Cookie"]
99
+ assert_equal({"user_name" => "david"}, @response.cookies)
100
+ end
101
+
102
+ def test_setting_cookie_with_secure
103
+ @request.env["HTTPS"] = "on"
104
+ get :authenticate_with_secure
105
+ assert_equal ["user_name=david; path=/; secure"], @response.headers["Set-Cookie"]
106
+ assert_equal({"user_name" => "david"}, @response.cookies)
107
+ end
108
+
109
+ def test_setting_cookie_with_secure_in_development
110
+ with_environment(:development) do
111
+ get :authenticate_with_secure
112
+ assert_equal ["user_name=david; path=/; secure"], @response.headers["Set-Cookie"]
113
+ assert_equal({"user_name" => "david"}, @response.cookies)
114
+ end
115
+ end
116
+
117
+ def test_not_setting_cookie_with_secure
118
+ get :authenticate_with_secure
119
+ assert_not_equal ["user_name=david; path=/; secure"], @response.headers["Set-Cookie"]
120
+ assert_not_equal({"user_name" => "david"}, @response.cookies)
121
+ end
122
+
123
+ def test_multiple_cookies
124
+ get :set_multiple_cookies
125
+ assert_equal 2, @response.cookies.size
126
+ assert_equal "user_name=david; path=/; expires=Mon, 10-Oct-2005 05:00:00 GMT", @response.headers["Set-Cookie"][0]
127
+ assert_equal "login=XJ-122; path=/", @response.headers["Set-Cookie"][1]
128
+ assert_equal({"login" => "XJ-122", "user_name" => "david"}, @response.cookies)
129
+ end
130
+
131
+ def test_setting_test_cookie
132
+ assert_nothing_raised { get :access_frozen_cookies }
133
+ end
134
+
135
+ def test_expiring_cookie
136
+ get :logout
137
+ assert_equal ["user_name=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT"], @response.headers["Set-Cookie"]
138
+ assert_equal({"user_name" => nil}, @response.cookies)
139
+ end
140
+
141
+ def test_cookiejar_accessor
142
+ @request.cookies["user_name"] = "david"
143
+ @controller.request = @request
144
+ jar = ActionController::CookieJar.new(@controller)
145
+ assert_equal "david", jar["user_name"]
146
+ assert_equal nil, jar["something_else"]
147
+ end
148
+
149
+ def test_cookiejar_accessor_with_array_value
150
+ @request.cookies["pages"] = %w{1 2 3}
151
+ @controller.request = @request
152
+ jar = ActionController::CookieJar.new(@controller)
153
+ assert_equal %w{1 2 3}, jar["pages"]
154
+ end
155
+
156
+ def test_cookiejar_delete_removes_item_and_returns_its_value
157
+ @request.cookies["user_name"] = "david"
158
+ @controller.response = @response
159
+ jar = ActionController::CookieJar.new(@controller)
160
+ assert_equal "david", jar.delete("user_name")
161
+ end
162
+
163
+ def test_delete_cookie_with_path
164
+ get :delete_cookie_with_path
165
+ assert_equal ["user_name=; path=/beaten; expires=Thu, 01-Jan-1970 00:00:00 GMT"], @response.headers["Set-Cookie"]
166
+ end
167
+
168
+ def test_cookies_persist_throughout_request
169
+ get :authenticate
170
+ cookies = @controller.send(:cookies)
171
+ assert_equal 'david', cookies['user_name']
172
+ end
173
+
174
+ def test_permanent_cookie
175
+ get :set_permanent_cookie
176
+ assert_match /Jamie/, @response.headers["Set-Cookie"].first
177
+ assert_match %r(#{20.years.from_now.year}), @response.headers["Set-Cookie"].first
178
+ end
179
+
180
+ def test_signed_cookie
181
+ get :set_signed_cookie
182
+ assert_equal 45, @controller.send(:cookies).signed[:user_id]
183
+ end
184
+
185
+ def test_accessing_nonexistant_signed_cookie_should_not_raise_an_invalid_signature
186
+ get :set_signed_cookie
187
+ assert_nil @controller.send(:cookies).signed[:non_existant_attribute]
188
+ end
189
+
190
+ def test_permanent_signed_cookie
191
+ get :set_permanent_signed_cookie
192
+ assert_match %r(#{20.years.from_now.year}), @response.headers["Set-Cookie"].first
193
+ assert_equal 100, @controller.send(:cookies).signed[:remember_me]
194
+ end
195
+
196
+ private
197
+ def with_environment(enviroment)
198
+ old_rails = Object.const_get(:Rails) rescue nil
199
+ mod = Object.const_set(:Rails, Module.new)
200
+ (class << mod; self; end).instance_eval do
201
+ define_method(:env) { @_env ||= ActiveSupport::StringInquirer.new(enviroment.to_s) }
202
+ end
203
+ yield
204
+ ensure
205
+ Object.module_eval { remove_const(:Rails) } if defined?(Rails)
206
+ Object.const_set(:Rails, old_rails) if old_rails
207
+ end
208
+ end
@@ -0,0 +1,32 @@
1
+ require 'abstract_unit'
2
+
3
+ class DeprecatedBaseMethodsTest < ActionController::TestCase
4
+ class Target < ActionController::Base
5
+ def home_url(greeting)
6
+ "http://example.com/#{greeting}"
7
+ end
8
+
9
+ def raises_name_error
10
+ this_method_doesnt_exist
11
+ end
12
+
13
+ def rescue_action(e) raise e end
14
+ end
15
+
16
+ tests Target
17
+
18
+ def test_log_error_silences_deprecation_warnings
19
+ get :raises_name_error
20
+ rescue => e
21
+ assert_not_deprecated { @controller.send :log_error, e }
22
+ end
23
+
24
+ if defined? Test::Unit::Error
25
+ def test_assertion_failed_error_silences_deprecation_warnings
26
+ get :raises_name_error
27
+ rescue => e
28
+ error = Test::Unit::Error.new('testing ur doodz', e)
29
+ assert_not_deprecated { error.message }
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,144 @@
1
+ require 'abstract_unit'
2
+
3
+ class DispatcherTest < Test::Unit::TestCase
4
+ Dispatcher = ActionController::Dispatcher
5
+ Reloader = ActionController::Reloader
6
+
7
+ def setup
8
+ ENV['REQUEST_METHOD'] = 'GET'
9
+ reset_dispatcher
10
+ Dispatcher.stubs(:require_dependency)
11
+ end
12
+
13
+ def teardown
14
+ ENV.delete 'REQUEST_METHOD'
15
+ reset_dispatcher
16
+ end
17
+
18
+ def test_clears_dependencies_after_dispatch_if_in_loading_mode
19
+ ActiveSupport::Dependencies.expects(:clear).once
20
+ # Close the response so dependencies kicks in
21
+ dispatch(false).last.close
22
+ end
23
+
24
+ def test_reloads_routes_before_dispatch_if_in_loading_mode
25
+ ActionController::Routing::Routes.expects(:reload).once
26
+ dispatch(false)
27
+ end
28
+
29
+ def test_leaves_dependencies_after_dispatch_if_not_in_loading_mode
30
+ ActionController::Routing::Routes.expects(:reload).never
31
+ ActiveSupport::Dependencies.expects(:clear).never
32
+
33
+ dispatch
34
+ end
35
+
36
+ def test_builds_middleware_stack_only_during_initialization_if_not_in_loading_mode
37
+ dispatcher = create_dispatcher
38
+ assert_not_nil dispatcher.instance_variable_get(:"@app")
39
+ dispatcher.instance_variable_set(:"@app", lambda { |env| })
40
+ dispatcher.expects(:build_middleware_stack).never
41
+ dispatcher.call(nil)
42
+ dispatcher.call(nil)
43
+ end
44
+
45
+ def test_rebuilds_middleware_stack_on_every_request_if_in_loading_mode
46
+ dispatcher = create_dispatcher(false)
47
+ dispatcher.instance_variable_set(:"@app", lambda { |env| })
48
+ dispatcher.expects(:build_middleware_stack).twice
49
+ dispatcher.call(nil)
50
+ Reloader.default_lock.unlock
51
+ dispatcher.call(nil)
52
+ end
53
+
54
+ def test_doesnt_wrap_call_in_reloader_if_not_in_loading_mode
55
+ Reloader.expects(:run).never
56
+ dispatch
57
+ end
58
+
59
+ def test_wraps_call_in_reloader_if_in_loading_mode
60
+ Reloader.expects(:run).once
61
+ dispatch(false)
62
+ end
63
+
64
+ # Stub out dispatch error logger
65
+ class << Dispatcher
66
+ def log_failsafe_exception(status, exception); end
67
+ end
68
+
69
+ def test_failsafe_response
70
+ Dispatcher.any_instance.expects(:dispatch).raises('b00m')
71
+ ActionController::Failsafe.any_instance.expects(:log_failsafe_exception)
72
+
73
+ response = nil
74
+ assert_nothing_raised do
75
+ response = dispatch
76
+ end
77
+ assert_equal 3, response.size
78
+ assert_equal 500, response[0]
79
+ assert_equal({"Content-Type" => "text/html"}, response[1])
80
+ assert_match /500 Internal Server Error/, response[2].join
81
+ end
82
+
83
+ def test_prepare_callbacks
84
+ a = b = c = nil
85
+ Dispatcher.to_prepare { |*args| a = b = c = 1 }
86
+ Dispatcher.to_prepare { |*args| b = c = 2 }
87
+ Dispatcher.to_prepare { |*args| c = 3 }
88
+
89
+ # Ensure to_prepare callbacks are not run when defined
90
+ assert_nil a || b || c
91
+
92
+ # Run callbacks
93
+ Dispatcher.run_prepare_callbacks
94
+
95
+ assert_equal 1, a
96
+ assert_equal 2, b
97
+ assert_equal 3, c
98
+
99
+ # Make sure they are only run once
100
+ a = b = c = nil
101
+ dispatch
102
+ assert_nil a || b || c
103
+ end
104
+
105
+ def test_to_prepare_with_identifier_replaces
106
+ a = b = nil
107
+ Dispatcher.to_prepare(:unique_id) { |*args| a = b = 1 }
108
+ Dispatcher.to_prepare(:unique_id) { |*args| a = 2 }
109
+
110
+ Dispatcher.run_prepare_callbacks
111
+ assert_equal 2, a
112
+ assert_equal nil, b
113
+ end
114
+
115
+ private
116
+ def dispatch(cache_classes = true)
117
+ ActionController::Routing::RouteSet.any_instance.stubs(:call).returns([200, {}, 'response'])
118
+ Dispatcher.define_dispatcher_callbacks(cache_classes)
119
+ Dispatcher.new.call({'rack.input' => StringIO.new('')})
120
+ end
121
+
122
+ def create_dispatcher(cache_classes = true)
123
+ Dispatcher.define_dispatcher_callbacks(cache_classes)
124
+ Dispatcher.new
125
+ end
126
+
127
+ def reset_dispatcher
128
+ Dispatcher.middleware = ActionController::MiddlewareStack.new do |middleware|
129
+ middlewares = File.expand_path(File.join(File.dirname(__FILE__), "../../lib/action_controller/middlewares.rb"))
130
+ middleware.instance_eval(File.read(middlewares))
131
+ end
132
+
133
+ # Clear callbacks as they are redefined by Dispatcher#define_dispatcher_callbacks
134
+ Dispatcher.instance_variable_set("@prepare_dispatch_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
135
+ Dispatcher.instance_variable_set("@before_dispatch_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
136
+ Dispatcher.instance_variable_set("@after_dispatch_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
137
+
138
+ Dispatcher.define_dispatcher_callbacks(true)
139
+ end
140
+
141
+ def assert_subclasses(howmany, klass, message = klass.subclasses.inspect)
142
+ assert_equal howmany, klass.subclasses.size, message
143
+ end
144
+ end
@@ -0,0 +1,53 @@
1
+ require 'abstract_unit'
2
+
3
+ class DomAssertionsTest < ActionView::TestCase
4
+ def setup
5
+ super
6
+ @html_only = '<ul><li>foo</li><li>bar</li></ul>'
7
+ @html_with_meaningless_whitespace = %{
8
+ <ul>
9
+ <li>\tfoo </li>
10
+ <li>
11
+ bar
12
+ </li>
13
+ </ul>
14
+ }
15
+ @more_html_with_meaningless_whitespace = %{<ul>
16
+
17
+ <li>foo</li>
18
+
19
+ <li>bar</li></ul>}
20
+ end
21
+
22
+ test "assert_dom_equal strips meaningless whitespace from expected string" do
23
+ assert_dom_equal @html_with_meaningless_whitespace, @html_only
24
+ end
25
+
26
+ test "assert_dom_equal strips meaningless whitespace from actual string" do
27
+ assert_dom_equal @html_only, @html_with_meaningless_whitespace
28
+ end
29
+
30
+ test "assert_dom_equal strips meaningless whitespace from both expected and actual strings" do
31
+ assert_dom_equal @more_html_with_meaningless_whitespace, @html_with_meaningless_whitespace
32
+ end
33
+
34
+ test "assert_dom_not_equal strips meaningless whitespace from expected string" do
35
+ assert_assertion_fails { assert_dom_not_equal @html_with_meaningless_whitespace, @html_only }
36
+ end
37
+
38
+ test "assert_dom_not_equal strips meaningless whitespace from actual string" do
39
+ assert_assertion_fails { assert_dom_not_equal @html_only, @html_with_meaningless_whitespace }
40
+ end
41
+
42
+ test "assert_dom_not_equal strips meaningless whitespace from both expected and actual strings" do
43
+ assert_assertion_fails do
44
+ assert_dom_not_equal @more_html_with_meaningless_whitespace, @html_with_meaningless_whitespace
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def assert_assertion_fails
51
+ assert_raise(ActiveSupport::TestCase::Assertion) { yield }
52
+ end
53
+ end