actionpack_csi 2.3.5.p6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. data/CHANGELOG +5184 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +160 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller/assertions/dom_assertions.rb +55 -0
  8. data/lib/action_controller/assertions/model_assertions.rb +21 -0
  9. data/lib/action_controller/assertions/response_assertions.rb +160 -0
  10. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  11. data/lib/action_controller/assertions/selector_assertions.rb +638 -0
  12. data/lib/action_controller/assertions/tag_assertions.rb +127 -0
  13. data/lib/action_controller/base.rb +1423 -0
  14. data/lib/action_controller/benchmarking.rb +107 -0
  15. data/lib/action_controller/caching/actions.rb +177 -0
  16. data/lib/action_controller/caching/fragments.rb +120 -0
  17. data/lib/action_controller/caching/pages.rb +152 -0
  18. data/lib/action_controller/caching/sweeper.rb +45 -0
  19. data/lib/action_controller/caching/sweeping.rb +55 -0
  20. data/lib/action_controller/caching.rb +71 -0
  21. data/lib/action_controller/cgi_ext/cookie.rb +112 -0
  22. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  23. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  24. data/lib/action_controller/cgi_ext.rb +15 -0
  25. data/lib/action_controller/cgi_process.rb +77 -0
  26. data/lib/action_controller/cookies.rb +95 -0
  27. data/lib/action_controller/dispatcher.rb +133 -0
  28. data/lib/action_controller/failsafe.rb +86 -0
  29. data/lib/action_controller/filters.rb +680 -0
  30. data/lib/action_controller/flash.rb +171 -0
  31. data/lib/action_controller/headers.rb +33 -0
  32. data/lib/action_controller/helpers.rb +225 -0
  33. data/lib/action_controller/http_authentication.rb +309 -0
  34. data/lib/action_controller/integration.rb +692 -0
  35. data/lib/action_controller/layout.rb +286 -0
  36. data/lib/action_controller/middleware_stack.rb +119 -0
  37. data/lib/action_controller/middlewares.rb +14 -0
  38. data/lib/action_controller/mime_responds.rb +193 -0
  39. data/lib/action_controller/mime_type.rb +212 -0
  40. data/lib/action_controller/mime_types.rb +21 -0
  41. data/lib/action_controller/params_parser.rb +77 -0
  42. data/lib/action_controller/performance_test.rb +15 -0
  43. data/lib/action_controller/polymorphic_routes.rb +189 -0
  44. data/lib/action_controller/rack_lint_patch.rb +36 -0
  45. data/lib/action_controller/record_identifier.rb +104 -0
  46. data/lib/action_controller/reloader.rb +54 -0
  47. data/lib/action_controller/request.rb +493 -0
  48. data/lib/action_controller/request_forgery_protection.rb +113 -0
  49. data/lib/action_controller/rescue.rb +183 -0
  50. data/lib/action_controller/resources.rb +682 -0
  51. data/lib/action_controller/response.rb +239 -0
  52. data/lib/action_controller/routing/builder.rb +197 -0
  53. data/lib/action_controller/routing/optimisations.rb +130 -0
  54. data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  55. data/lib/action_controller/routing/route.rb +265 -0
  56. data/lib/action_controller/routing/route_set.rb +502 -0
  57. data/lib/action_controller/routing/routing_ext.rb +49 -0
  58. data/lib/action_controller/routing/segments.rb +343 -0
  59. data/lib/action_controller/routing.rb +388 -0
  60. data/lib/action_controller/session/abstract_store.rb +181 -0
  61. data/lib/action_controller/session/cookie_store.rb +221 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +51 -0
  63. data/lib/action_controller/session_management.rb +54 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +181 -0
  66. data/lib/action_controller/string_coercion.rb +29 -0
  67. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  68. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  69. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  70. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  71. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  72. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  73. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  74. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  75. data/lib/action_controller/test_case.rb +209 -0
  76. data/lib/action_controller/test_process.rb +580 -0
  77. data/lib/action_controller/translation.rb +13 -0
  78. data/lib/action_controller/uploaded_file.rb +44 -0
  79. data/lib/action_controller/url_rewriter.rb +216 -0
  80. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  81. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  82. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  83. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  84. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  85. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  86. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  87. data/lib/action_controller/verification.rb +130 -0
  88. data/lib/action_controller.rb +113 -0
  89. data/lib/action_pack/version.rb +9 -0
  90. data/lib/action_pack.rb +24 -0
  91. data/lib/action_view/base.rb +362 -0
  92. data/lib/action_view/erb/util.rb +44 -0
  93. data/lib/action_view/helpers/active_record_helper.rb +305 -0
  94. data/lib/action_view/helpers/asset_tag_helper.rb +694 -0
  95. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  96. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  97. data/lib/action_view/helpers/cache_helper.rb +39 -0
  98. data/lib/action_view/helpers/capture_helper.rb +136 -0
  99. data/lib/action_view/helpers/date_helper.rb +988 -0
  100. data/lib/action_view/helpers/debug_helper.rb +38 -0
  101. data/lib/action_view/helpers/form_helper.rb +1074 -0
  102. data/lib/action_view/helpers/form_options_helper.rb +600 -0
  103. data/lib/action_view/helpers/form_tag_helper.rb +487 -0
  104. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  105. data/lib/action_view/helpers/number_helper.rb +308 -0
  106. data/lib/action_view/helpers/prototype_helper.rb +1305 -0
  107. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  108. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  109. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  110. data/lib/action_view/helpers/sanitize_helper.rb +259 -0
  111. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  112. data/lib/action_view/helpers/tag_helper.rb +150 -0
  113. data/lib/action_view/helpers/text_helper.rb +587 -0
  114. data/lib/action_view/helpers/translation_helper.rb +39 -0
  115. data/lib/action_view/helpers/url_helper.rb +639 -0
  116. data/lib/action_view/helpers.rb +59 -0
  117. data/lib/action_view/inline_template.rb +19 -0
  118. data/lib/action_view/locale/en.yml +117 -0
  119. data/lib/action_view/partials.rb +240 -0
  120. data/lib/action_view/paths.rb +69 -0
  121. data/lib/action_view/reloadable_template.rb +117 -0
  122. data/lib/action_view/renderable.rb +95 -0
  123. data/lib/action_view/renderable_partial.rb +47 -0
  124. data/lib/action_view/safe_buffer.rb +28 -0
  125. data/lib/action_view/template.rb +252 -0
  126. data/lib/action_view/template_error.rb +99 -0
  127. data/lib/action_view/template_handler.rb +34 -0
  128. data/lib/action_view/template_handlers/builder.rb +17 -0
  129. data/lib/action_view/template_handlers/erb.rb +22 -0
  130. data/lib/action_view/template_handlers/rjs.rb +13 -0
  131. data/lib/action_view/template_handlers.rb +48 -0
  132. data/lib/action_view/test_case.rb +162 -0
  133. data/lib/action_view.rb +58 -0
  134. data/lib/actionpack.rb +2 -0
  135. data/test/abstract_unit.rb +61 -0
  136. data/test/active_record_unit.rb +104 -0
  137. data/test/activerecord/active_record_store_test.rb +174 -0
  138. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  139. data/test/adv_attr_test.rb +20 -0
  140. data/test/controller/action_pack_assertions_test.rb +543 -0
  141. data/test/controller/addresses_render_test.rb +37 -0
  142. data/test/controller/assert_select_test.rb +734 -0
  143. data/test/controller/base_test.rb +217 -0
  144. data/test/controller/benchmark_test.rb +32 -0
  145. data/test/controller/caching_test.rb +729 -0
  146. data/test/controller/capture_test.rb +66 -0
  147. data/test/controller/content_type_test.rb +168 -0
  148. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  150. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  151. data/test/controller/cookie_test.rb +134 -0
  152. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  153. data/test/controller/dispatcher_test.rb +144 -0
  154. data/test/controller/dom_assertions_test.rb +53 -0
  155. data/test/controller/failsafe_test.rb +60 -0
  156. data/test/controller/fake_controllers.rb +33 -0
  157. data/test/controller/fake_models.rb +19 -0
  158. data/test/controller/filter_params_test.rb +52 -0
  159. data/test/controller/filters_test.rb +885 -0
  160. data/test/controller/flash_test.rb +147 -0
  161. data/test/controller/header_test.rb +14 -0
  162. data/test/controller/helper_test.rb +224 -0
  163. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  164. data/test/controller/html-scanner/document_test.rb +148 -0
  165. data/test/controller/html-scanner/node_test.rb +89 -0
  166. data/test/controller/html-scanner/sanitizer_test.rb +274 -0
  167. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  168. data/test/controller/html-scanner/text_node_test.rb +50 -0
  169. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  170. data/test/controller/http_basic_authentication_test.rb +113 -0
  171. data/test/controller/http_digest_authentication_test.rb +254 -0
  172. data/test/controller/integration_test.rb +483 -0
  173. data/test/controller/layout_test.rb +215 -0
  174. data/test/controller/logging_test.rb +46 -0
  175. data/test/controller/middleware_stack_test.rb +90 -0
  176. data/test/controller/mime_responds_test.rb +536 -0
  177. data/test/controller/mime_type_test.rb +93 -0
  178. data/test/controller/polymorphic_routes_test.rb +297 -0
  179. data/test/controller/rack_test.rb +311 -0
  180. data/test/controller/record_identifier_test.rb +139 -0
  181. data/test/controller/redirect_test.rb +285 -0
  182. data/test/controller/reloader_test.rb +124 -0
  183. data/test/controller/render_test.rb +1762 -0
  184. data/test/controller/request/json_params_parsing_test.rb +65 -0
  185. data/test/controller/request/multipart_params_parsing_test.rb +162 -0
  186. data/test/controller/request/query_string_parsing_test.rb +120 -0
  187. data/test/controller/request/test_request_test.rb +35 -0
  188. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  189. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  190. data/test/controller/request_forgery_protection_test.rb +265 -0
  191. data/test/controller/request_test.rb +395 -0
  192. data/test/controller/rescue_test.rb +536 -0
  193. data/test/controller/resources_test.rb +1393 -0
  194. data/test/controller/routing_test.rb +2591 -0
  195. data/test/controller/selector_test.rb +628 -0
  196. data/test/controller/send_file_test.rb +171 -0
  197. data/test/controller/session/cookie_store_test.rb +216 -0
  198. data/test/controller/session/mem_cache_store_test.rb +127 -0
  199. data/test/controller/session/test_session_test.rb +58 -0
  200. data/test/controller/test_test.rb +700 -0
  201. data/test/controller/translation_test.rb +26 -0
  202. data/test/controller/url_rewriter_test.rb +385 -0
  203. data/test/controller/verification_test.rb +270 -0
  204. data/test/controller/view_paths_test.rb +141 -0
  205. data/test/controller/webservice_test.rb +273 -0
  206. data/test/fixtures/_top_level_partial.html.erb +1 -0
  207. data/test/fixtures/_top_level_partial_only.erb +1 -0
  208. data/test/fixtures/addresses/list.erb +1 -0
  209. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  210. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  211. data/test/fixtures/companies.yml +24 -0
  212. data/test/fixtures/company.rb +10 -0
  213. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  214. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  215. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  216. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  217. data/test/fixtures/customers/_customer.html.erb +1 -0
  218. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  219. data/test/fixtures/developer.rb +9 -0
  220. data/test/fixtures/developers/_developer.erb +1 -0
  221. data/test/fixtures/developers.yml +21 -0
  222. data/test/fixtures/developers_projects.yml +13 -0
  223. data/test/fixtures/failsafe/500.html +1 -0
  224. data/test/fixtures/fun/games/_game.erb +1 -0
  225. data/test/fixtures/fun/games/hello_world.erb +1 -0
  226. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  227. data/test/fixtures/functional_caching/_partial.erb +3 -0
  228. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  229. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  231. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  232. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  233. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  235. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  236. data/test/fixtures/helpers/abc_helper.rb +5 -0
  237. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  238. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  239. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  240. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  241. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  242. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  243. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  244. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  246. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  247. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  248. data/test/fixtures/layouts/_column.html.erb +2 -0
  249. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  250. data/test/fixtures/layouts/builder.builder +3 -0
  251. data/test/fixtures/layouts/default_html.html.erb +1 -0
  252. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  253. data/test/fixtures/layouts/standard.erb +1 -0
  254. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  255. data/test/fixtures/layouts/xhr.html.erb +2 -0
  256. data/test/fixtures/layouts/yield.erb +2 -0
  257. data/test/fixtures/mascot.rb +3 -0
  258. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  259. data/test/fixtures/mascots.yml +4 -0
  260. data/test/fixtures/multipart/binary_file +0 -0
  261. data/test/fixtures/multipart/boundary_problem_file +10 -0
  262. data/test/fixtures/multipart/bracketed_param +5 -0
  263. data/test/fixtures/multipart/empty +10 -0
  264. data/test/fixtures/multipart/hello.txt +1 -0
  265. data/test/fixtures/multipart/large_text_file +10 -0
  266. data/test/fixtures/multipart/mixed_files +0 -0
  267. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  268. data/test/fixtures/multipart/none +9 -0
  269. data/test/fixtures/multipart/single_parameter +5 -0
  270. data/test/fixtures/multipart/text_file +10 -0
  271. data/test/fixtures/override/test/hello_world.erb +1 -0
  272. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  273. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  274. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  275. data/test/fixtures/post_test/post/index.html.erb +1 -0
  276. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  277. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  278. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  279. data/test/fixtures/project.rb +3 -0
  280. data/test/fixtures/projects/_project.erb +1 -0
  281. data/test/fixtures/projects.yml +7 -0
  282. data/test/fixtures/public/404.html +1 -0
  283. data/test/fixtures/public/500.da.html +1 -0
  284. data/test/fixtures/public/500.html +1 -0
  285. data/test/fixtures/public/absolute/test.css +23 -0
  286. data/test/fixtures/public/absolute/test.js +63 -0
  287. data/test/fixtures/public/images/rails.png +0 -0
  288. data/test/fixtures/public/javascripts/application.js +1 -0
  289. data/test/fixtures/public/javascripts/bank.js +1 -0
  290. data/test/fixtures/public/javascripts/controls.js +1 -0
  291. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  292. data/test/fixtures/public/javascripts/effects.js +1 -0
  293. data/test/fixtures/public/javascripts/prototype.js +1 -0
  294. data/test/fixtures/public/javascripts/robber.js +1 -0
  295. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  296. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  297. data/test/fixtures/public/stylesheets/bank.css +1 -0
  298. data/test/fixtures/public/stylesheets/robber.css +1 -0
  299. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  300. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  301. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  302. data/test/fixtures/replies/_reply.erb +1 -0
  303. data/test/fixtures/replies.yml +15 -0
  304. data/test/fixtures/reply.rb +7 -0
  305. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  306. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  307. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  308. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  309. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  310. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  311. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  312. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  313. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  314. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  315. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  316. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  318. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  319. data/test/fixtures/scope/test/modgreet.erb +1 -0
  320. data/test/fixtures/shared.html.erb +1 -0
  321. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  322. data/test/fixtures/test/_counter.html.erb +1 -0
  323. data/test/fixtures/test/_customer.erb +1 -0
  324. data/test/fixtures/test/_customer_counter.erb +1 -0
  325. data/test/fixtures/test/_customer_greeting.erb +1 -0
  326. data/test/fixtures/test/_customer_with_var.erb +1 -0
  327. data/test/fixtures/test/_form.erb +1 -0
  328. data/test/fixtures/test/_from_helper.erb +1 -0
  329. data/test/fixtures/test/_hash_greeting.erb +1 -0
  330. data/test/fixtures/test/_hash_object.erb +2 -0
  331. data/test/fixtures/test/_hello.builder +1 -0
  332. data/test/fixtures/test/_labelling_form.erb +1 -0
  333. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  334. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  335. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  336. data/test/fixtures/test/_one.html.erb +1 -0
  337. data/test/fixtures/test/_partial.erb +1 -0
  338. data/test/fixtures/test/_partial.html.erb +1 -0
  339. data/test/fixtures/test/_partial.js.erb +1 -0
  340. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  341. data/test/fixtures/test/_partial_only.erb +1 -0
  342. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  343. data/test/fixtures/test/_person.erb +2 -0
  344. data/test/fixtures/test/_raise.html.erb +1 -0
  345. data/test/fixtures/test/_two.html.erb +1 -0
  346. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  347. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  348. data/test/fixtures/test/capturing.erb +4 -0
  349. data/test/fixtures/test/content_for.erb +2 -0
  350. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  351. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  352. data/test/fixtures/test/delete_with_js.rjs +2 -0
  353. data/test/fixtures/test/dont_pick_me +1 -0
  354. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  355. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  356. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  357. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  358. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  359. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  360. data/test/fixtures/test/greeting.erb +1 -0
  361. data/test/fixtures/test/greeting.js.rjs +1 -0
  362. data/test/fixtures/test/hello.builder +4 -0
  363. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  364. data/test/fixtures/test/hello_world.erb +1 -0
  365. data/test/fixtures/test/hello_world.erb~ +1 -0
  366. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  367. data/test/fixtures/test/hello_world_container.builder +3 -0
  368. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  369. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  370. data/test/fixtures/test/hello_xml_world.builder +11 -0
  371. data/test/fixtures/test/hyphen-ated.erb +1 -0
  372. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  373. data/test/fixtures/test/list.erb +1 -0
  374. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  375. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  376. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  377. data/test/fixtures/test/nested_layout.erb +3 -0
  378. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  379. data/test/fixtures/test/potential_conflicts.erb +4 -0
  380. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  381. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  382. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  383. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  384. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  385. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  386. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  387. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  388. data/test/fixtures/test/render_to_string_test.erb +1 -0
  389. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  390. data/test/fixtures/test/template.erb +1 -0
  391. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  392. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  393. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  394. data/test/fixtures/test/utf8.html.erb +2 -0
  395. data/test/fixtures/topic.rb +3 -0
  396. data/test/fixtures/topics/_topic.html.erb +1 -0
  397. data/test/fixtures/topics.yml +22 -0
  398. data/test/template/active_record_helper_i18n_test.rb +44 -0
  399. data/test/template/active_record_helper_test.rb +302 -0
  400. data/test/template/asset_tag_helper_test.rb +771 -0
  401. data/test/template/atom_feed_helper_test.rb +315 -0
  402. data/test/template/benchmark_helper_test.rb +86 -0
  403. data/test/template/compiled_templates_test.rb +204 -0
  404. data/test/template/date_helper_i18n_test.rb +121 -0
  405. data/test/template/date_helper_test.rb +2485 -0
  406. data/test/template/erb_util_test.rb +24 -0
  407. data/test/template/form_helper_test.rb +1393 -0
  408. data/test/template/form_options_helper_i18n_test.rb +27 -0
  409. data/test/template/form_options_helper_test.rb +807 -0
  410. data/test/template/form_tag_helper_test.rb +344 -0
  411. data/test/template/javascript_helper_test.rb +106 -0
  412. data/test/template/number_helper_i18n_test.rb +69 -0
  413. data/test/template/number_helper_test.rb +132 -0
  414. data/test/template/prototype_helper_test.rb +639 -0
  415. data/test/template/raw_output_helper_test.rb +21 -0
  416. data/test/template/record_tag_helper_test.rb +58 -0
  417. data/test/template/render_test.rb +290 -0
  418. data/test/template/sanitize_helper_test.rb +57 -0
  419. data/test/template/scriptaculous_helper_test.rb +90 -0
  420. data/test/template/tag_helper_test.rb +98 -0
  421. data/test/template/template_test.rb +32 -0
  422. data/test/template/test_test.rb +54 -0
  423. data/test/template/text_helper_test.rb +543 -0
  424. data/test/template/translation_helper_test.rb +32 -0
  425. data/test/template/url_helper_test.rb +622 -0
  426. data/test/testing_sandbox.rb +15 -0
  427. data/test/view/safe_buffer_test.rb +36 -0
  428. data/test/view/test_case_test.rb +176 -0
  429. metadata +531 -0
@@ -0,0 +1,729 @@
1
+ require 'fileutils'
2
+ require 'abstract_unit'
3
+ require 'active_record_unit'
4
+
5
+ CACHE_DIR = 'test_cache'
6
+ # Don't change '/../temp/' cavalierly or you might hose something you don't want hosed
7
+ FILE_STORE_PATH = File.join(File.dirname(__FILE__), '/../temp/', CACHE_DIR)
8
+ ActionController::Base.page_cache_directory = FILE_STORE_PATH
9
+ ActionController::Base.cache_store = :file_store, FILE_STORE_PATH
10
+
11
+ # Force sweeper classes to load
12
+ ActionController::Caching::Sweeper
13
+ ActionController::Caching::Sweeping
14
+
15
+ class PageCachingTestController < ActionController::Base
16
+ caches_page :ok, :no_content, :if => Proc.new { |c| !c.request.format.json? }
17
+ caches_page :found, :not_found
18
+
19
+ def ok
20
+ head :ok
21
+ end
22
+
23
+ def no_content
24
+ head :no_content
25
+ end
26
+
27
+ def found
28
+ redirect_to :action => 'ok'
29
+ end
30
+
31
+ def not_found
32
+ head :not_found
33
+ end
34
+
35
+ def custom_path
36
+ render :text => "Super soaker"
37
+ cache_page("Super soaker", "/index.html")
38
+ end
39
+
40
+ def expire_custom_path
41
+ expire_page("/index.html")
42
+ head :ok
43
+ end
44
+
45
+ def trailing_slash
46
+ render :text => "Sneak attack"
47
+ end
48
+ end
49
+
50
+ class PageCachingTest < ActionController::TestCase
51
+ def setup
52
+ ActionController::Base.perform_caching = true
53
+
54
+ ActionController::Routing::Routes.draw do |map|
55
+ map.main '', :controller => 'posts', :format => nil
56
+ map.formatted_posts 'posts.:format', :controller => 'posts'
57
+ map.resources :posts
58
+ map.connect ':controller/:action/:id'
59
+ end
60
+
61
+ @request = ActionController::TestRequest.new
62
+ @request.host = 'hostname.com'
63
+
64
+ @response = ActionController::TestResponse.new
65
+ @controller = PageCachingTestController.new
66
+
67
+ @params = {:controller => 'posts', :action => 'index', :only_path => true, :skip_relative_url_root => true}
68
+ @rewriter = ActionController::UrlRewriter.new(@request, @params)
69
+
70
+ FileUtils.rm_rf(File.dirname(FILE_STORE_PATH))
71
+ FileUtils.mkdir_p(FILE_STORE_PATH)
72
+ end
73
+
74
+ def teardown
75
+ FileUtils.rm_rf(File.dirname(FILE_STORE_PATH))
76
+ ActionController::Routing::Routes.clear!
77
+ ActionController::Base.perform_caching = false
78
+ end
79
+
80
+ def test_page_caching_resources_saves_to_correct_path_with_extension_even_if_default_route
81
+ @params[:format] = 'rss'
82
+ assert_equal '/posts.rss', @rewriter.rewrite(@params)
83
+ @params[:format] = nil
84
+ assert_equal '/', @rewriter.rewrite(@params)
85
+ end
86
+
87
+ def test_should_cache_get_with_ok_status
88
+ get :ok
89
+ assert_response :ok
90
+ assert_page_cached :ok, "get with ok status should have been cached"
91
+ end
92
+
93
+ def test_should_cache_with_custom_path
94
+ get :custom_path
95
+ assert File.exist?("#{FILE_STORE_PATH}/index.html")
96
+ end
97
+
98
+ def test_should_expire_cache_with_custom_path
99
+ get :custom_path
100
+ assert File.exist?("#{FILE_STORE_PATH}/index.html")
101
+
102
+ get :expire_custom_path
103
+ assert !File.exist?("#{FILE_STORE_PATH}/index.html")
104
+ end
105
+
106
+ def test_should_cache_without_trailing_slash_on_url
107
+ @controller.class.cache_page 'cached content', '/page_caching_test/trailing_slash'
108
+ assert File.exist?("#{FILE_STORE_PATH}/page_caching_test/trailing_slash.html")
109
+ end
110
+
111
+ def test_should_cache_with_trailing_slash_on_url
112
+ @controller.class.cache_page 'cached content', '/page_caching_test/trailing_slash/'
113
+ assert File.exist?("#{FILE_STORE_PATH}/page_caching_test/trailing_slash.html")
114
+ end
115
+
116
+ def test_should_cache_ok_at_custom_path
117
+ @request.stubs(:path).returns("/index.html")
118
+ get :ok
119
+ assert_response :ok
120
+ assert File.exist?("#{FILE_STORE_PATH}/index.html")
121
+ end
122
+
123
+ [:ok, :no_content, :found, :not_found].each do |status|
124
+ [:get, :post, :put, :delete].each do |method|
125
+ unless method == :get and status == :ok
126
+ define_method "test_shouldnt_cache_#{method}_with_#{status}_status" do
127
+ send(method, status)
128
+ assert_response status
129
+ assert_page_not_cached status, "#{method} with #{status} status shouldn't have been cached"
130
+ end
131
+ end
132
+ end
133
+ end
134
+
135
+ def test_page_caching_conditional_options
136
+ get :ok, :format=>'json'
137
+ assert_page_not_cached :ok
138
+ end
139
+
140
+ private
141
+ def assert_page_cached(action, message = "#{action} should have been cached")
142
+ assert page_cached?(action), message
143
+ end
144
+
145
+ def assert_page_not_cached(action, message = "#{action} shouldn't have been cached")
146
+ assert !page_cached?(action), message
147
+ end
148
+
149
+ def page_cached?(action)
150
+ File.exist? "#{FILE_STORE_PATH}/page_caching_test/#{action}.html"
151
+ end
152
+ end
153
+
154
+ class ActionCachingTestController < ActionController::Base
155
+ caches_action :index, :redirected, :forbidden, :if => Proc.new { |c| !c.request.format.json? }, :expires_in => 1.hour
156
+ caches_action :show, :cache_path => 'http://test.host/custom/show'
157
+ caches_action :edit, :cache_path => Proc.new { |c| c.params[:id] ? "http://test.host/#{c.params[:id]};edit" : "http://test.host/edit" }
158
+ caches_action :with_layout
159
+ caches_action :layout_false, :layout => false
160
+ caches_action :record_not_found, :four_oh_four, :simple_runtime_error
161
+
162
+ layout 'talk_from_action.erb'
163
+
164
+ def index
165
+ @cache_this = MockTime.now.to_f.to_s
166
+ render :text => @cache_this
167
+ end
168
+
169
+ def redirected
170
+ redirect_to :action => 'index'
171
+ end
172
+
173
+ def forbidden
174
+ render :text => "Forbidden"
175
+ response.status = "403 Forbidden"
176
+ end
177
+
178
+ def with_layout
179
+ @cache_this = MockTime.now.to_f.to_s
180
+ render :text => @cache_this, :layout => true
181
+ end
182
+
183
+ def record_not_found
184
+ raise ActiveRecord::RecordNotFound, "oops!"
185
+ end
186
+
187
+ def four_oh_four
188
+ render :text => "404'd!", :status => 404
189
+ end
190
+
191
+ def simple_runtime_error
192
+ raise "oops!"
193
+ end
194
+
195
+ alias_method :show, :index
196
+ alias_method :edit, :index
197
+ alias_method :destroy, :index
198
+ alias_method :layout_false, :with_layout
199
+
200
+ def expire
201
+ expire_action :controller => 'action_caching_test', :action => 'index'
202
+ render :nothing => true
203
+ end
204
+
205
+ def expire_xml
206
+ expire_action :controller => 'action_caching_test', :action => 'index', :format => 'xml'
207
+ render :nothing => true
208
+ end
209
+ end
210
+
211
+ class MockTime < Time
212
+ # Let Time spicy to assure that Time.now != Time.now
213
+ def to_f
214
+ super+rand
215
+ end
216
+ end
217
+
218
+ class ActionCachingMockController
219
+ attr_accessor :mock_url_for
220
+ attr_accessor :mock_path
221
+
222
+ def initialize
223
+ yield self if block_given?
224
+ end
225
+
226
+ def url_for(*args)
227
+ @mock_url_for
228
+ end
229
+
230
+ def request
231
+ mocked_path = @mock_path
232
+ Object.new.instance_eval(<<-EVAL)
233
+ def path; '#{@mock_path}' end
234
+ def format; 'all' end
235
+ def cache_format; nil end
236
+ self
237
+ EVAL
238
+ end
239
+ end
240
+
241
+ class ActionCacheTest < ActionController::TestCase
242
+ def setup
243
+ reset!
244
+ FileUtils.mkdir_p(FILE_STORE_PATH)
245
+ @path_class = ActionController::Caching::Actions::ActionCachePath
246
+ @mock_controller = ActionCachingMockController.new
247
+ end
248
+
249
+ def teardown
250
+ FileUtils.rm_rf(File.dirname(FILE_STORE_PATH))
251
+ end
252
+
253
+ def test_simple_action_cache
254
+ get :index
255
+ cached_time = content_to_cache
256
+ assert_equal cached_time, @response.body
257
+ assert fragment_exist?('hostname.com/action_caching_test')
258
+ reset!
259
+
260
+ get :index
261
+ assert_equal cached_time, @response.body
262
+ end
263
+
264
+ def test_simple_action_not_cached
265
+ get :destroy
266
+ cached_time = content_to_cache
267
+ assert_equal cached_time, @response.body
268
+ assert !fragment_exist?('hostname.com/action_caching_test/destroy')
269
+ reset!
270
+
271
+ get :destroy
272
+ assert_not_equal cached_time, @response.body
273
+ end
274
+
275
+ def test_action_cache_with_layout
276
+ get :with_layout
277
+ cached_time = content_to_cache
278
+ assert_not_equal cached_time, @response.body
279
+ assert fragment_exist?('hostname.com/action_caching_test/with_layout')
280
+ reset!
281
+
282
+ get :with_layout
283
+ assert_not_equal cached_time, @response.body
284
+
285
+ assert_equal @response.body, read_fragment('hostname.com/action_caching_test/with_layout')
286
+ end
287
+
288
+ def test_action_cache_with_layout_and_layout_cache_false
289
+ get :layout_false
290
+ cached_time = content_to_cache
291
+ assert_not_equal cached_time, @response.body
292
+ assert fragment_exist?('hostname.com/action_caching_test/layout_false')
293
+ reset!
294
+
295
+ get :layout_false
296
+ assert_not_equal cached_time, @response.body
297
+
298
+ assert_equal cached_time, read_fragment('hostname.com/action_caching_test/layout_false')
299
+ end
300
+
301
+ def test_action_cache_conditional_options
302
+ old_use_accept_header = ActionController::Base.use_accept_header
303
+ ActionController::Base.use_accept_header = true
304
+ @request.env['HTTP_ACCEPT'] = 'application/json'
305
+ get :index
306
+ assert !fragment_exist?('hostname.com/action_caching_test')
307
+ ActionController::Base.use_accept_header = old_use_accept_header
308
+ end
309
+
310
+ def test_action_cache_with_store_options
311
+ MockTime.expects(:now).returns(12345).once
312
+ @controller.expects(:read_fragment).with('hostname.com/action_caching_test', :expires_in => 1.hour).once
313
+ @controller.expects(:write_fragment).with('hostname.com/action_caching_test', '12345.0', :expires_in => 1.hour).once
314
+ get :index
315
+ end
316
+
317
+ def test_action_cache_with_custom_cache_path
318
+ get :show
319
+ cached_time = content_to_cache
320
+ assert_equal cached_time, @response.body
321
+ assert fragment_exist?('test.host/custom/show')
322
+ reset!
323
+
324
+ get :show
325
+ assert_equal cached_time, @response.body
326
+ end
327
+
328
+ def test_action_cache_with_custom_cache_path_in_block
329
+ get :edit
330
+ assert fragment_exist?('test.host/edit')
331
+ reset!
332
+
333
+ get :edit, :id => 1
334
+ assert fragment_exist?('test.host/1;edit')
335
+ end
336
+
337
+ def test_cache_expiration
338
+ get :index
339
+ cached_time = content_to_cache
340
+ reset!
341
+
342
+ get :index
343
+ assert_equal cached_time, @response.body
344
+ reset!
345
+
346
+ get :expire
347
+ reset!
348
+
349
+ get :index
350
+ new_cached_time = content_to_cache
351
+ assert_not_equal cached_time, @response.body
352
+ reset!
353
+
354
+ get :index
355
+ assert_response :success
356
+ assert_equal new_cached_time, @response.body
357
+ end
358
+
359
+ def test_cache_expiration_isnt_affected_by_request_format
360
+ get :index
361
+ cached_time = content_to_cache
362
+ reset!
363
+
364
+ @request.set_REQUEST_URI "/action_caching_test/expire.xml"
365
+ get :expire, :format => :xml
366
+ reset!
367
+
368
+ get :index
369
+ new_cached_time = content_to_cache
370
+ assert_not_equal cached_time, @response.body
371
+ end
372
+
373
+ def test_cache_is_scoped_by_subdomain
374
+ @request.host = 'jamis.hostname.com'
375
+ get :index
376
+ jamis_cache = content_to_cache
377
+
378
+ reset!
379
+
380
+ @request.host = 'david.hostname.com'
381
+ get :index
382
+ david_cache = content_to_cache
383
+ assert_not_equal jamis_cache, @response.body
384
+
385
+ reset!
386
+
387
+ @request.host = 'jamis.hostname.com'
388
+ get :index
389
+ assert_equal jamis_cache, @response.body
390
+
391
+ reset!
392
+
393
+ @request.host = 'david.hostname.com'
394
+ get :index
395
+ assert_equal david_cache, @response.body
396
+ end
397
+
398
+ def test_redirect_is_not_cached
399
+ get :redirected
400
+ assert_response :redirect
401
+ reset!
402
+
403
+ get :redirected
404
+ assert_response :redirect
405
+ end
406
+
407
+ def test_forbidden_is_not_cached
408
+ get :forbidden
409
+ assert_response :forbidden
410
+ reset!
411
+
412
+ get :forbidden
413
+ assert_response :forbidden
414
+ end
415
+
416
+ def test_xml_version_of_resource_is_treated_as_different_cache
417
+ with_routing do |set|
418
+ set.draw do |map|
419
+ map.connect ':controller/:action.:format'
420
+ map.connect ':controller/:action'
421
+ end
422
+
423
+ get :index, :format => 'xml'
424
+ cached_time = content_to_cache
425
+ assert_equal cached_time, @response.body
426
+ assert fragment_exist?('hostname.com/action_caching_test/index.xml')
427
+ reset!
428
+
429
+ get :index, :format => 'xml'
430
+ assert_equal cached_time, @response.body
431
+ assert_equal 'application/xml', @response.content_type
432
+ reset!
433
+
434
+ get :expire_xml
435
+ reset!
436
+
437
+ get :index, :format => 'xml'
438
+ assert_not_equal cached_time, @response.body
439
+ end
440
+ end
441
+
442
+ def test_correct_content_type_is_returned_for_cache_hit
443
+ # run it twice to cache it the first time
444
+ get :index, :id => 'content-type.xml'
445
+ get :index, :id => 'content-type.xml'
446
+ assert_equal 'application/xml', @response.content_type
447
+ end
448
+
449
+ def test_correct_content_type_is_returned_for_cache_hit_on_action_with_string_key
450
+ # run it twice to cache it the first time
451
+ get :show, :format => 'xml'
452
+ get :show, :format => 'xml'
453
+ assert_equal 'application/xml', @response.content_type
454
+ end
455
+
456
+ def test_correct_content_type_is_returned_for_cache_hit_on_action_with_string_key_from_proc
457
+ # run it twice to cache it the first time
458
+ get :edit, :id => 1, :format => 'xml'
459
+ get :edit, :id => 1, :format => 'xml'
460
+ assert_equal 'application/xml', @response.content_type
461
+ end
462
+
463
+ def test_empty_path_is_normalized
464
+ @mock_controller.mock_url_for = 'http://example.org/'
465
+ @mock_controller.mock_path = '/'
466
+
467
+ assert_equal 'example.org/index', @path_class.path_for(@mock_controller, {})
468
+ end
469
+
470
+ def test_file_extensions
471
+ get :index, :id => 'kitten.jpg'
472
+ get :index, :id => 'kitten.jpg'
473
+
474
+ assert_response :success
475
+ end
476
+
477
+ def test_record_not_found_returns_404_for_multiple_requests
478
+ get :record_not_found
479
+ assert_response 404
480
+ get :record_not_found
481
+ assert_response 404
482
+ end
483
+
484
+ def test_four_oh_four_returns_404_for_multiple_requests
485
+ get :four_oh_four
486
+ assert_response 404
487
+ get :four_oh_four
488
+ assert_response 404
489
+ end
490
+
491
+ def test_simple_runtime_error_returns_500_for_multiple_requests
492
+ get :simple_runtime_error
493
+ assert_response 500
494
+ get :simple_runtime_error
495
+ assert_response 500
496
+ end
497
+
498
+ private
499
+ def content_to_cache
500
+ assigns(:cache_this)
501
+ end
502
+
503
+ def reset!
504
+ @request = ActionController::TestRequest.new
505
+ @response = ActionController::TestResponse.new
506
+ @controller = ActionCachingTestController.new
507
+ @request.host = 'hostname.com'
508
+ end
509
+
510
+ def fragment_exist?(path)
511
+ @controller.fragment_exist?(path)
512
+ end
513
+
514
+ def read_fragment(path)
515
+ @controller.read_fragment(path)
516
+ end
517
+ end
518
+
519
+ class FragmentCachingTestController < ActionController::Base
520
+ def some_action; end;
521
+ end
522
+
523
+ class FragmentCachingTest < ActionController::TestCase
524
+ def setup
525
+ ActionController::Base.perform_caching = true
526
+ @store = ActiveSupport::Cache::MemoryStore.new
527
+ ActionController::Base.cache_store = @store
528
+ @controller = FragmentCachingTestController.new
529
+ @params = {:controller => 'posts', :action => 'index'}
530
+ @request = ActionController::TestRequest.new
531
+ @response = ActionController::TestResponse.new
532
+ @controller.params = @params
533
+ @controller.request = @request
534
+ @controller.response = @response
535
+ @controller.send(:initialize_current_url)
536
+ @controller.send(:initialize_template_class, @response)
537
+ @controller.send(:assign_shortcuts, @request, @response)
538
+ end
539
+
540
+ def test_fragment_cache_key
541
+ assert_equal 'views/what a key', @controller.fragment_cache_key('what a key')
542
+ assert_equal "views/test.host/fragment_caching_test/some_action",
543
+ @controller.fragment_cache_key(:controller => 'fragment_caching_test',:action => 'some_action')
544
+ end
545
+
546
+ def test_read_fragment_with_caching_enabled
547
+ @store.write('views/name', 'value')
548
+ assert_equal 'value', @controller.read_fragment('name')
549
+ end
550
+
551
+ def test_read_fragment_with_caching_disabled
552
+ ActionController::Base.perform_caching = false
553
+ @store.write('views/name', 'value')
554
+ assert_nil @controller.read_fragment('name')
555
+ end
556
+
557
+ def test_fragment_exist_with_caching_enabled
558
+ @store.write('views/name', 'value')
559
+ assert @controller.fragment_exist?('name')
560
+ assert !@controller.fragment_exist?('other_name')
561
+ end
562
+
563
+ def test_fragment_exist_with_caching_disabled
564
+ ActionController::Base.perform_caching = false
565
+ @store.write('views/name', 'value')
566
+ assert !@controller.fragment_exist?('name')
567
+ assert !@controller.fragment_exist?('other_name')
568
+ end
569
+
570
+ def test_write_fragment_with_caching_enabled
571
+ assert_nil @store.read('views/name')
572
+ assert_equal 'value', @controller.write_fragment('name', 'value')
573
+ assert_equal 'value', @store.read('views/name')
574
+ end
575
+
576
+ def test_write_fragment_with_caching_disabled
577
+ assert_nil @store.read('views/name')
578
+ ActionController::Base.perform_caching = false
579
+ assert_equal 'value', @controller.write_fragment('name', 'value')
580
+ assert_nil @store.read('views/name')
581
+ end
582
+
583
+ def test_expire_fragment_with_simple_key
584
+ @store.write('views/name', 'value')
585
+ @controller.expire_fragment 'name'
586
+ assert_nil @store.read('views/name')
587
+ end
588
+
589
+ def test_expire_fragment_with_regexp
590
+ @store.write('views/name', 'value')
591
+ @store.write('views/another_name', 'another_value')
592
+ @store.write('views/primalgrasp', 'will not expire ;-)')
593
+
594
+ @controller.expire_fragment /name/
595
+
596
+ assert_nil @store.read('views/name')
597
+ assert_nil @store.read('views/another_name')
598
+ assert_equal 'will not expire ;-)', @store.read('views/primalgrasp')
599
+ end
600
+
601
+ def test_fragment_for_with_disabled_caching
602
+ ActionController::Base.perform_caching = false
603
+
604
+ @store.write('views/expensive', 'fragment content')
605
+ fragment_computed = false
606
+
607
+ buffer = 'generated till now -> '
608
+ @controller.fragment_for(buffer, 'expensive') { fragment_computed = true }
609
+
610
+ assert fragment_computed
611
+ assert_equal 'generated till now -> ', buffer
612
+ end
613
+
614
+ def test_fragment_for
615
+ @store.write('views/expensive', 'fragment content')
616
+ fragment_computed = false
617
+
618
+ buffer = 'generated till now -> '
619
+ @controller.fragment_for(buffer, 'expensive') { fragment_computed = true }
620
+
621
+ assert !fragment_computed
622
+ assert_equal 'generated till now -> fragment content', buffer
623
+ end
624
+ end
625
+
626
+ class FunctionalCachingController < ActionController::Base
627
+ def fragment_cached
628
+ end
629
+
630
+ def html_fragment_cached_with_partial
631
+ respond_to do |format|
632
+ format.html
633
+ end
634
+ end
635
+
636
+ def js_fragment_cached_with_partial
637
+ respond_to do |format|
638
+ format.js
639
+ end
640
+ end
641
+
642
+ def formatted_fragment_cached
643
+ respond_to do |format|
644
+ format.html
645
+ format.xml
646
+ format.js
647
+ end
648
+ end
649
+
650
+ def rescue_action(e)
651
+ raise e
652
+ end
653
+ end
654
+
655
+ class FunctionalFragmentCachingTest < ActionController::TestCase
656
+ def setup
657
+ ActionController::Base.perform_caching = true
658
+ @store = ActiveSupport::Cache::MemoryStore.new
659
+ ActionController::Base.cache_store = @store
660
+ @controller = FunctionalCachingController.new
661
+ @request = ActionController::TestRequest.new
662
+ @response = ActionController::TestResponse.new
663
+ end
664
+
665
+ def test_fragment_caching
666
+ get :fragment_cached
667
+ assert_response :success
668
+ expected_body = <<-CACHED
669
+ Hello
670
+ This bit's fragment cached
671
+ CACHED
672
+ assert_equal expected_body, @response.body
673
+
674
+ assert_equal "This bit's fragment cached", @store.read('views/test.host/functional_caching/fragment_cached')
675
+ end
676
+
677
+ def test_fragment_caching_in_partials
678
+ get :html_fragment_cached_with_partial
679
+ assert_response :success
680
+ assert_match /Fragment caching in a partial/, @response.body
681
+ assert_match "Fragment caching in a partial", @store.read('views/test.host/functional_caching/html_fragment_cached_with_partial')
682
+ end
683
+
684
+ def test_render_inline_before_fragment_caching
685
+ get :inline_fragment_cached
686
+ assert_response :success
687
+ assert_match /Some inline content/, @response.body
688
+ assert_match /Some cached content/, @response.body
689
+ assert_match "Some cached content", @store.read('views/test.host/functional_caching/inline_fragment_cached')
690
+ end
691
+
692
+ def test_fragment_caching_in_rjs_partials
693
+ xhr :get, :js_fragment_cached_with_partial
694
+ assert_response :success
695
+ assert_match /Fragment caching in a partial/, @response.body
696
+ assert_match "Fragment caching in a partial", @store.read('views/test.host/functional_caching/js_fragment_cached_with_partial')
697
+ end
698
+
699
+ def test_html_formatted_fragment_caching
700
+ get :formatted_fragment_cached, :format => "html"
701
+ assert_response :success
702
+ expected_body = "<body>\n<p>ERB</p>\n</body>"
703
+
704
+ assert_equal expected_body, @response.body
705
+
706
+ assert_equal "<p>ERB</p>", @store.read('views/test.host/functional_caching/formatted_fragment_cached')
707
+ end
708
+
709
+ def test_xml_formatted_fragment_caching
710
+ get :formatted_fragment_cached, :format => "xml"
711
+ assert_response :success
712
+ expected_body = "<body>\n <p>Builder</p>\n</body>\n"
713
+
714
+ assert_equal expected_body, @response.body
715
+
716
+ assert_equal " <p>Builder</p>\n", @store.read('views/test.host/functional_caching/formatted_fragment_cached')
717
+ end
718
+
719
+ def test_js_formatted_fragment_caching
720
+ get :formatted_fragment_cached, :format => "js"
721
+ assert_response :success
722
+ expected_body = %(title = "Hey";\n$("element_1").visualEffect("highlight");\n) +
723
+ %($("element_2").visualEffect("highlight");\nfooter = "Bye";)
724
+ assert_equal expected_body, @response.body
725
+
726
+ assert_equal ['$("element_1").visualEffect("highlight");', '$("element_2").visualEffect("highlight");'],
727
+ @store.read('views/test.host/functional_caching/formatted_fragment_cached')
728
+ end
729
+ end