eactionpack 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. data/CHANGELOG +7 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +469 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +146 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller.rb +79 -0
  8. data/lib/action_controller/assertions.rb +69 -0
  9. data/lib/action_controller/assertions/dom_assertions.rb +39 -0
  10. data/lib/action_controller/assertions/model_assertions.rb +20 -0
  11. data/lib/action_controller/assertions/response_assertions.rb +172 -0
  12. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  13. data/lib/action_controller/assertions/selector_assertions.rb +491 -0
  14. data/lib/action_controller/assertions/tag_assertions.rb +130 -0
  15. data/lib/action_controller/base.rb +1288 -0
  16. data/lib/action_controller/benchmarking.rb +94 -0
  17. data/lib/action_controller/caching.rb +72 -0
  18. data/lib/action_controller/caching/actions.rb +144 -0
  19. data/lib/action_controller/caching/fragments.rb +138 -0
  20. data/lib/action_controller/caching/pages.rb +154 -0
  21. data/lib/action_controller/caching/sql_cache.rb +18 -0
  22. data/lib/action_controller/caching/sweeping.rb +97 -0
  23. data/lib/action_controller/cgi_ext.rb +16 -0
  24. data/lib/action_controller/cgi_ext/cookie.rb +110 -0
  25. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  26. data/lib/action_controller/cgi_ext/session.rb +73 -0
  27. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  28. data/lib/action_controller/cgi_process.rb +223 -0
  29. data/lib/action_controller/components.rb +166 -0
  30. data/lib/action_controller/cookies.rb +96 -0
  31. data/lib/action_controller/dispatcher.rb +162 -0
  32. data/lib/action_controller/filters.rb +642 -0
  33. data/lib/action_controller/flash.rb +172 -0
  34. data/lib/action_controller/headers.rb +31 -0
  35. data/lib/action_controller/helpers.rb +221 -0
  36. data/lib/action_controller/http_authentication.rb +124 -0
  37. data/lib/action_controller/integration.rb +634 -0
  38. data/lib/action_controller/layout.rb +309 -0
  39. data/lib/action_controller/mime_responds.rb +173 -0
  40. data/lib/action_controller/mime_type.rb +186 -0
  41. data/lib/action_controller/mime_types.rb +20 -0
  42. data/lib/action_controller/polymorphic_routes.rb +191 -0
  43. data/lib/action_controller/record_identifier.rb +102 -0
  44. data/lib/action_controller/request.rb +764 -0
  45. data/lib/action_controller/request_forgery_protection.rb +140 -0
  46. data/lib/action_controller/request_profiler.rb +169 -0
  47. data/lib/action_controller/rescue.rb +258 -0
  48. data/lib/action_controller/resources.rb +572 -0
  49. data/lib/action_controller/response.rb +76 -0
  50. data/lib/action_controller/routing.rb +387 -0
  51. data/lib/action_controller/routing/builder.rb +203 -0
  52. data/lib/action_controller/routing/optimisations.rb +120 -0
  53. data/lib/action_controller/routing/recognition_optimisation.rb +162 -0
  54. data/lib/action_controller/routing/route.rb +240 -0
  55. data/lib/action_controller/routing/route_set.rb +436 -0
  56. data/lib/action_controller/routing/routing_ext.rb +46 -0
  57. data/lib/action_controller/routing/segments.rb +283 -0
  58. data/lib/action_controller/session/active_record_store.rb +340 -0
  59. data/lib/action_controller/session/cookie_store.rb +166 -0
  60. data/lib/action_controller/session/drb_server.rb +32 -0
  61. data/lib/action_controller/session/drb_store.rb +35 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +98 -0
  63. data/lib/action_controller/session_management.rb +158 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +155 -0
  66. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  67. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  68. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  69. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  70. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  71. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  72. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  73. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  74. data/lib/action_controller/test_case.rb +83 -0
  75. data/lib/action_controller/test_process.rb +526 -0
  76. data/lib/action_controller/url_rewriter.rb +142 -0
  77. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  78. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  79. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  80. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  81. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  82. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  83. data/lib/action_controller/verification.rb +130 -0
  84. data/lib/action_pack.rb +24 -0
  85. data/lib/action_pack/version.rb +9 -0
  86. data/lib/action_view.rb +44 -0
  87. data/lib/action_view/base.rb +335 -0
  88. data/lib/action_view/helpers/active_record_helper.rb +276 -0
  89. data/lib/action_view/helpers/asset_tag_helper.rb +599 -0
  90. data/lib/action_view/helpers/atom_feed_helper.rb +143 -0
  91. data/lib/action_view/helpers/benchmark_helper.rb +33 -0
  92. data/lib/action_view/helpers/cache_helper.rb +40 -0
  93. data/lib/action_view/helpers/capture_helper.rb +161 -0
  94. data/lib/action_view/helpers/date_helper.rb +711 -0
  95. data/lib/action_view/helpers/debug_helper.rb +31 -0
  96. data/lib/action_view/helpers/form_helper.rb +767 -0
  97. data/lib/action_view/helpers/form_options_helper.rb +458 -0
  98. data/lib/action_view/helpers/form_tag_helper.rb +458 -0
  99. data/lib/action_view/helpers/javascript_helper.rb +148 -0
  100. data/lib/action_view/helpers/number_helper.rb +186 -0
  101. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  102. data/lib/action_view/helpers/record_tag_helper.rb +59 -0
  103. data/lib/action_view/helpers/sanitize_helper.rb +229 -0
  104. data/lib/action_view/helpers/tag_helper.rb +134 -0
  105. data/lib/action_view/helpers/text_helper.rb +507 -0
  106. data/lib/action_view/helpers/url_helper.rb +573 -0
  107. data/lib/action_view/inline_template.rb +20 -0
  108. data/lib/action_view/partial_template.rb +70 -0
  109. data/lib/action_view/partials.rb +158 -0
  110. data/lib/action_view/template.rb +125 -0
  111. data/lib/action_view/template_error.rb +110 -0
  112. data/lib/action_view/template_finder.rb +176 -0
  113. data/lib/action_view/template_handler.rb +34 -0
  114. data/lib/action_view/template_handlers/builder.rb +27 -0
  115. data/lib/action_view/template_handlers/compilable.rb +128 -0
  116. data/lib/action_view/template_handlers/erb.rb +56 -0
  117. data/lib/action_view/test_case.rb +58 -0
  118. data/lib/actionpack.rb +1 -0
  119. data/test/abstract_unit.rb +36 -0
  120. data/test/active_record_unit.rb +105 -0
  121. data/test/activerecord/active_record_store_test.rb +141 -0
  122. data/test/activerecord/render_partial_with_record_identification_test.rb +191 -0
  123. data/test/adv_attr_test.rb +20 -0
  124. data/test/controller/action_pack_assertions_test.rb +543 -0
  125. data/test/controller/addresses_render_test.rb +43 -0
  126. data/test/controller/assert_select_test.rb +331 -0
  127. data/test/controller/base_test.rb +219 -0
  128. data/test/controller/benchmark_test.rb +32 -0
  129. data/test/controller/caching_test.rb +581 -0
  130. data/test/controller/capture_test.rb +89 -0
  131. data/test/controller/cgi_test.rb +116 -0
  132. data/test/controller/components_test.rb +140 -0
  133. data/test/controller/content_type_test.rb +139 -0
  134. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  135. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  136. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  137. data/test/controller/cookie_test.rb +146 -0
  138. data/test/controller/custom_handler_test.rb +45 -0
  139. data/test/controller/deprecation/deprecated_base_methods_test.rb +37 -0
  140. data/test/controller/dispatcher_test.rb +105 -0
  141. data/test/controller/fake_controllers.rb +33 -0
  142. data/test/controller/fake_models.rb +11 -0
  143. data/test/controller/filter_params_test.rb +49 -0
  144. data/test/controller/filters_test.rb +881 -0
  145. data/test/controller/flash_test.rb +146 -0
  146. data/test/controller/header_test.rb +14 -0
  147. data/test/controller/helper_test.rb +210 -0
  148. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  149. data/test/controller/html-scanner/document_test.rb +148 -0
  150. data/test/controller/html-scanner/node_test.rb +89 -0
  151. data/test/controller/html-scanner/sanitizer_test.rb +269 -0
  152. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  153. data/test/controller/html-scanner/text_node_test.rb +50 -0
  154. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  155. data/test/controller/http_authentication_test.rb +54 -0
  156. data/test/controller/integration_test.rb +252 -0
  157. data/test/controller/integration_upload_test.rb +43 -0
  158. data/test/controller/layout_test.rb +255 -0
  159. data/test/controller/mime_responds_test.rb +514 -0
  160. data/test/controller/mime_type_test.rb +84 -0
  161. data/test/controller/new_render_test.rb +843 -0
  162. data/test/controller/polymorphic_routes_test.rb +174 -0
  163. data/test/controller/record_identifier_test.rb +139 -0
  164. data/test/controller/redirect_test.rb +289 -0
  165. data/test/controller/render_test.rb +484 -0
  166. data/test/controller/request_forgery_protection_test.rb +305 -0
  167. data/test/controller/request_test.rb +928 -0
  168. data/test/controller/rescue_test.rb +517 -0
  169. data/test/controller/resources_test.rb +873 -0
  170. data/test/controller/routing_test.rb +2464 -0
  171. data/test/controller/selector_test.rb +628 -0
  172. data/test/controller/send_file_test.rb +138 -0
  173. data/test/controller/session/cookie_store_test.rb +258 -0
  174. data/test/controller/session/mem_cache_store_test.rb +181 -0
  175. data/test/controller/session_fixation_test.rb +89 -0
  176. data/test/controller/session_management_test.rb +178 -0
  177. data/test/controller/test_test.rb +695 -0
  178. data/test/controller/url_rewriter_test.rb +310 -0
  179. data/test/controller/verification_test.rb +270 -0
  180. data/test/controller/view_paths_test.rb +140 -0
  181. data/test/controller/webservice_test.rb +229 -0
  182. data/test/fixtures/addresses/list.erb +1 -0
  183. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  184. data/test/fixtures/companies.yml +24 -0
  185. data/test/fixtures/company.rb +10 -0
  186. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  187. data/test/fixtures/content_type/render_default_for_js.js.erb +1 -0
  188. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  189. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  190. data/test/fixtures/customers/_customer.html.erb +1 -0
  191. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  192. data/test/fixtures/developer.rb +9 -0
  193. data/test/fixtures/developers.yml +21 -0
  194. data/test/fixtures/developers_projects.yml +13 -0
  195. data/test/fixtures/fun/games/hello_world.erb +1 -0
  196. data/test/fixtures/functional_caching/_partial.erb +3 -0
  197. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  198. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  199. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  200. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  201. data/test/fixtures/helpers/abc_helper.rb +5 -0
  202. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  203. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  204. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  205. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  206. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  207. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  208. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  209. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  210. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  211. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  212. data/test/fixtures/layouts/builder.builder +3 -0
  213. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  214. data/test/fixtures/layouts/standard.erb +1 -0
  215. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  216. data/test/fixtures/layouts/yield.erb +2 -0
  217. data/test/fixtures/mascot.rb +3 -0
  218. data/test/fixtures/mascots.yml +4 -0
  219. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  220. data/test/fixtures/multipart/binary_file +0 -0
  221. data/test/fixtures/multipart/boundary_problem_file +10 -0
  222. data/test/fixtures/multipart/bracketed_param +5 -0
  223. data/test/fixtures/multipart/large_text_file +10 -0
  224. data/test/fixtures/multipart/mixed_files +0 -0
  225. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  226. data/test/fixtures/multipart/single_parameter +5 -0
  227. data/test/fixtures/multipart/text_file +10 -0
  228. data/test/fixtures/override/test/hello_world.erb +1 -0
  229. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  230. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  231. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  232. data/test/fixtures/post_test/post/index.html.erb +1 -0
  233. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  234. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  235. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  236. data/test/fixtures/project.rb +3 -0
  237. data/test/fixtures/projects.yml +7 -0
  238. data/test/fixtures/public/404.html +1 -0
  239. data/test/fixtures/public/500.html +1 -0
  240. data/test/fixtures/public/images/rails.png +0 -0
  241. data/test/fixtures/public/javascripts/application.js +1 -0
  242. data/test/fixtures/public/javascripts/bank.js +1 -0
  243. data/test/fixtures/public/javascripts/robber.js +1 -0
  244. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  245. data/test/fixtures/public/stylesheets/bank.css +1 -0
  246. data/test/fixtures/public/stylesheets/robber.css +1 -0
  247. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  248. data/test/fixtures/replies.yml +15 -0
  249. data/test/fixtures/reply.rb +7 -0
  250. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  251. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  252. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  253. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  254. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  255. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  256. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  257. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  258. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  259. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  260. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  261. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  262. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  263. data/test/fixtures/scope/test/modgreet.erb +1 -0
  264. data/test/fixtures/shared.html.erb +1 -0
  265. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  266. data/test/fixtures/test/_customer.erb +1 -0
  267. data/test/fixtures/test/_customer_counter.erb +1 -0
  268. data/test/fixtures/test/_customer_greeting.erb +1 -0
  269. data/test/fixtures/test/_form.erb +1 -0
  270. data/test/fixtures/test/_hash_greeting.erb +1 -0
  271. data/test/fixtures/test/_hash_object.erb +2 -0
  272. data/test/fixtures/test/_hello.builder +1 -0
  273. data/test/fixtures/test/_labelling_form.erb +1 -0
  274. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  275. data/test/fixtures/test/_partial.erb +1 -0
  276. data/test/fixtures/test/_partial.html.erb +1 -0
  277. data/test/fixtures/test/_partial.js.erb +1 -0
  278. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  279. data/test/fixtures/test/_partial_only.erb +1 -0
  280. data/test/fixtures/test/_person.erb +2 -0
  281. data/test/fixtures/test/_raise.html.erb +1 -0
  282. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  283. data/test/fixtures/test/block_content_for.erb +2 -0
  284. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  285. data/test/fixtures/test/capturing.erb +4 -0
  286. data/test/fixtures/test/content_for.erb +2 -0
  287. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  288. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  289. data/test/fixtures/test/delete_with_js.rjs +2 -0
  290. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  291. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  292. data/test/fixtures/test/erb_content_for.erb +2 -0
  293. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  294. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  295. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  296. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  297. data/test/fixtures/test/greeting.erb +1 -0
  298. data/test/fixtures/test/greeting.js.rjs +1 -0
  299. data/test/fixtures/test/hello.builder +4 -0
  300. data/test/fixtures/test/hello_world.erb +1 -0
  301. data/test/fixtures/test/hello_world_container.builder +3 -0
  302. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  303. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  304. data/test/fixtures/test/hello_xml_world.builder +11 -0
  305. data/test/fixtures/test/list.erb +1 -0
  306. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  307. data/test/fixtures/test/potential_conflicts.erb +4 -0
  308. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  309. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  310. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  311. data/test/fixtures/test/render_to_string_test.erb +1 -0
  312. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  313. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  314. data/test/fixtures/topic.rb +3 -0
  315. data/test/fixtures/topics.yml +22 -0
  316. data/test/fixtures/topics/_topic.html.erb +1 -0
  317. data/test/template/active_record_helper_test.rb +268 -0
  318. data/test/template/asset_tag_helper_test.rb +514 -0
  319. data/test/template/atom_feed_helper_test.rb +179 -0
  320. data/test/template/benchmark_helper_test.rb +60 -0
  321. data/test/template/date_helper_test.rb +1791 -0
  322. data/test/template/deprecated_erb_variable_test.rb +9 -0
  323. data/test/template/erb_util_test.rb +24 -0
  324. data/test/template/form_helper_test.rb +885 -0
  325. data/test/template/form_options_helper_test.rb +1333 -0
  326. data/test/template/form_tag_helper_test.rb +272 -0
  327. data/test/template/javascript_helper_test.rb +73 -0
  328. data/test/template/number_helper_test.rb +97 -0
  329. data/test/template/record_tag_helper_test.rb +54 -0
  330. data/test/template/sanitize_helper_test.rb +48 -0
  331. data/test/template/tag_helper_test.rb +77 -0
  332. data/test/template/template_finder_test.rb +73 -0
  333. data/test/template/template_object_test.rb +95 -0
  334. data/test/template/test_test.rb +56 -0
  335. data/test/template/text_helper_test.rb +367 -0
  336. data/test/template/url_helper_test.rb +544 -0
  337. data/test/testing_sandbox.rb +15 -0
  338. metadata +469 -0
@@ -0,0 +1,32 @@
1
+ require 'abstract_unit'
2
+
3
+ # Provide some static controllers.
4
+ class BenchmarkedController < ActionController::Base
5
+ def public_action
6
+ render :nothing => true
7
+ end
8
+
9
+ def rescue_action(e)
10
+ raise e
11
+ end
12
+ end
13
+
14
+ class BenchmarkTest < Test::Unit::TestCase
15
+ class MockLogger
16
+ def method_missing(*args)
17
+ end
18
+ end
19
+
20
+ def setup
21
+ @controller = BenchmarkedController.new
22
+ # benchmark doesn't do anything unless a logger is set
23
+ @controller.logger = MockLogger.new
24
+ @request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new
25
+ @request.host = "test.actioncontroller.i"
26
+ end
27
+
28
+ def test_with_http_1_0_request
29
+ @request.host = nil
30
+ assert_nothing_raised { get :public_action }
31
+ end
32
+ end
@@ -0,0 +1,581 @@
1
+ require 'fileutils'
2
+ require 'abstract_unit'
3
+
4
+ CACHE_DIR = 'test_cache'
5
+ # Don't change '/../temp/' cavalierly or you might hose something you don't want hosed
6
+ FILE_STORE_PATH = File.join(File.dirname(__FILE__), '/../temp/', CACHE_DIR)
7
+ ActionController::Base.page_cache_directory = FILE_STORE_PATH
8
+ ActionController::Base.cache_store = :file_store, FILE_STORE_PATH
9
+ ActionController::Base.view_paths = [ File.dirname(__FILE__) + '/../fixtures/' ]
10
+
11
+ class PageCachingTestController < ActionController::Base
12
+ caches_page :ok, :no_content, :if => Proc.new { |c| !c.request.format.json? }
13
+ caches_page :found, :not_found
14
+
15
+ def ok
16
+ head :ok
17
+ end
18
+
19
+ def no_content
20
+ head :no_content
21
+ end
22
+
23
+ def found
24
+ redirect_to :action => 'ok'
25
+ end
26
+
27
+ def not_found
28
+ head :not_found
29
+ end
30
+
31
+ def custom_path
32
+ render :text => "Super soaker"
33
+ cache_page("Super soaker", "/index.html")
34
+ end
35
+
36
+ def expire_custom_path
37
+ expire_page("/index.html")
38
+ head :ok
39
+ end
40
+
41
+ def trailing_slash
42
+ render :text => "Sneak attack"
43
+ end
44
+ end
45
+
46
+ class PageCachingTest < Test::Unit::TestCase
47
+ def setup
48
+ ActionController::Base.perform_caching = true
49
+
50
+ ActionController::Routing::Routes.draw do |map|
51
+ map.main '', :controller => 'posts'
52
+ map.resources :posts
53
+ map.connect ':controller/:action/:id'
54
+ end
55
+
56
+ @request = ActionController::TestRequest.new
57
+ @request.host = 'hostname.com'
58
+
59
+ @response = ActionController::TestResponse.new
60
+ @controller = PageCachingTestController.new
61
+
62
+ @params = {:controller => 'posts', :action => 'index', :only_path => true, :skip_relative_url_root => true}
63
+ @rewriter = ActionController::UrlRewriter.new(@request, @params)
64
+
65
+ FileUtils.rm_rf(File.dirname(FILE_STORE_PATH))
66
+ FileUtils.mkdir_p(FILE_STORE_PATH)
67
+ end
68
+
69
+ def teardown
70
+ FileUtils.rm_rf(File.dirname(FILE_STORE_PATH))
71
+
72
+ ActionController::Base.perform_caching = false
73
+ end
74
+
75
+ def test_page_caching_resources_saves_to_correct_path_with_extension_even_if_default_route
76
+ @params[:format] = 'rss'
77
+ assert_equal '/posts.rss', @rewriter.rewrite(@params)
78
+ @params[:format] = nil
79
+ assert_equal '/', @rewriter.rewrite(@params)
80
+ end
81
+
82
+ def test_should_cache_get_with_ok_status
83
+ get :ok
84
+ assert_response :ok
85
+ assert_page_cached :ok, "get with ok status should have been cached"
86
+ end
87
+
88
+ def test_should_cache_with_custom_path
89
+ get :custom_path
90
+ assert File.exist?("#{FILE_STORE_PATH}/index.html")
91
+ end
92
+
93
+ def test_should_expire_cache_with_custom_path
94
+ get :custom_path
95
+ assert File.exist?("#{FILE_STORE_PATH}/index.html")
96
+
97
+ get :expire_custom_path
98
+ assert !File.exist?("#{FILE_STORE_PATH}/index.html")
99
+ end
100
+
101
+ def test_should_cache_without_trailing_slash_on_url
102
+ @controller.class.cache_page 'cached content', '/page_caching_test/trailing_slash'
103
+ assert File.exist?("#{FILE_STORE_PATH}/page_caching_test/trailing_slash.html")
104
+ end
105
+
106
+ def test_should_cache_with_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
+ uses_mocha("should_cache_ok_at_custom_path") do
112
+ def test_should_cache_ok_at_custom_path
113
+ @request.expects(:path).returns("/index.html")
114
+ get :ok
115
+ assert_response :ok
116
+ assert File.exist?("#{FILE_STORE_PATH}/index.html")
117
+ end
118
+ end
119
+
120
+ [:ok, :no_content, :found, :not_found].each do |status|
121
+ [:get, :post, :put, :delete].each do |method|
122
+ unless method == :get and status == :ok
123
+ define_method "test_shouldnt_cache_#{method}_with_#{status}_status" do
124
+ @request.env['REQUEST_METHOD'] = method.to_s.upcase
125
+ process status
126
+ assert_response status
127
+ assert_page_not_cached status, "#{method} with #{status} status shouldn't have been cached"
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ def test_page_caching_conditional_options
134
+ @request.env['HTTP_ACCEPT'] = 'application/json'
135
+ get :ok
136
+ assert_page_not_cached :ok
137
+ end
138
+
139
+ private
140
+ def assert_page_cached(action, message = "#{action} should have been cached")
141
+ assert page_cached?(action), message
142
+ end
143
+
144
+ def assert_page_not_cached(action, message = "#{action} shouldn't have been cached")
145
+ assert !page_cached?(action), message
146
+ end
147
+
148
+ def page_cached?(action)
149
+ File.exist? "#{FILE_STORE_PATH}/page_caching_test/#{action}.html"
150
+ end
151
+ end
152
+
153
+
154
+ class ActionCachingTestController < ActionController::Base
155
+ caches_action :index, :redirected, :forbidden, :if => Proc.new { |c| !c.request.format.json? }
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
+
160
+ layout 'talk_from_action.erb'
161
+
162
+ def index
163
+ @cache_this = MockTime.now.to_f.to_s
164
+ render :text => @cache_this
165
+ end
166
+
167
+ def redirected
168
+ redirect_to :action => 'index'
169
+ end
170
+
171
+ def forbidden
172
+ render :text => "Forbidden"
173
+ headers["Status"] = "403 Forbidden"
174
+ end
175
+
176
+ def with_layout
177
+ @cache_this = MockTime.now.to_f.to_s
178
+ render :text => @cache_this, :layout => true
179
+ end
180
+
181
+ alias_method :show, :index
182
+ alias_method :edit, :index
183
+ alias_method :destroy, :index
184
+
185
+ def expire
186
+ expire_action :controller => 'action_caching_test', :action => 'index'
187
+ render :nothing => true
188
+ end
189
+ end
190
+
191
+ class MockTime < Time
192
+ # Let Time spicy to assure that Time.now != Time.now
193
+ def to_f
194
+ super+rand
195
+ end
196
+ end
197
+
198
+ class ActionCachingMockController
199
+ attr_accessor :mock_url_for
200
+ attr_accessor :mock_path
201
+
202
+ def initialize
203
+ yield self if block_given?
204
+ end
205
+
206
+ def url_for(*args)
207
+ @mock_url_for
208
+ end
209
+
210
+ def request
211
+ mocked_path = @mock_path
212
+ Object.new.instance_eval(<<-EVAL)
213
+ def path; '#{@mock_path}' end
214
+ self
215
+ EVAL
216
+ end
217
+ end
218
+
219
+ class ActionCacheTest < Test::Unit::TestCase
220
+ def setup
221
+ reset!
222
+ FileUtils.mkdir_p(FILE_STORE_PATH)
223
+ @path_class = ActionController::Caching::Actions::ActionCachePath
224
+ @mock_controller = ActionCachingMockController.new
225
+ end
226
+
227
+ def teardown
228
+ FileUtils.rm_rf(File.dirname(FILE_STORE_PATH))
229
+ end
230
+
231
+ def test_simple_action_cache
232
+ get :index
233
+ cached_time = content_to_cache
234
+ assert_equal cached_time, @response.body
235
+ assert fragment_exist?('hostname.com/action_caching_test')
236
+ reset!
237
+
238
+ get :index
239
+ assert_equal cached_time, @response.body
240
+ end
241
+
242
+ def test_simple_action_not_cached
243
+ get :destroy
244
+ cached_time = content_to_cache
245
+ assert_equal cached_time, @response.body
246
+ assert !fragment_exist?('hostname.com/action_caching_test/destroy')
247
+ reset!
248
+
249
+ get :destroy
250
+ assert_not_equal cached_time, @response.body
251
+ end
252
+
253
+ def test_action_cache_with_layout
254
+ get :with_layout
255
+ cached_time = content_to_cache
256
+ assert_not_equal cached_time, @response.body
257
+ assert fragment_exist?('hostname.com/action_caching_test/with_layout')
258
+ reset!
259
+
260
+ get :with_layout
261
+ assert_not_equal cached_time, @response.body
262
+
263
+ assert_equal @response.body, read_fragment('hostname.com/action_caching_test/with_layout')
264
+ end
265
+
266
+ def test_action_cache_conditional_options
267
+ @request.env['HTTP_ACCEPT'] = 'application/json'
268
+ get :index
269
+ assert !fragment_exist?('hostname.com/action_caching_test')
270
+ end
271
+
272
+ def test_action_cache_with_custom_cache_path
273
+ get :show
274
+ cached_time = content_to_cache
275
+ assert_equal cached_time, @response.body
276
+ assert fragment_exist?('test.host/custom/show')
277
+ reset!
278
+
279
+ get :show
280
+ assert_equal cached_time, @response.body
281
+ end
282
+
283
+ def test_action_cache_with_custom_cache_path_in_block
284
+ get :edit
285
+ assert fragment_exist?('test.host/edit')
286
+ reset!
287
+
288
+ get :edit, :id => 1
289
+ assert fragment_exist?('test.host/1;edit')
290
+ end
291
+
292
+ def test_cache_expiration
293
+ get :index
294
+ cached_time = content_to_cache
295
+ reset!
296
+
297
+ get :index
298
+ assert_equal cached_time, @response.body
299
+ reset!
300
+
301
+ get :expire
302
+ reset!
303
+
304
+ get :index
305
+ new_cached_time = content_to_cache
306
+ assert_not_equal cached_time, @response.body
307
+ reset!
308
+
309
+ get :index
310
+ assert_response :success
311
+ assert_equal new_cached_time, @response.body
312
+ end
313
+
314
+ def test_cache_is_scoped_by_subdomain
315
+ @request.host = 'jamis.hostname.com'
316
+ get :index
317
+ jamis_cache = content_to_cache
318
+
319
+ reset!
320
+
321
+ @request.host = 'david.hostname.com'
322
+ get :index
323
+ david_cache = content_to_cache
324
+ assert_not_equal jamis_cache, @response.body
325
+
326
+ reset!
327
+
328
+ @request.host = 'jamis.hostname.com'
329
+ get :index
330
+ assert_equal jamis_cache, @response.body
331
+
332
+ reset!
333
+
334
+ @request.host = 'david.hostname.com'
335
+ get :index
336
+ assert_equal david_cache, @response.body
337
+ end
338
+
339
+ def test_redirect_is_not_cached
340
+ get :redirected
341
+ assert_response :redirect
342
+ reset!
343
+
344
+ get :redirected
345
+ assert_response :redirect
346
+ end
347
+
348
+ def test_forbidden_is_not_cached
349
+ get :forbidden
350
+ assert_response :forbidden
351
+ reset!
352
+
353
+ get :forbidden
354
+ assert_response :forbidden
355
+ end
356
+
357
+ def test_xml_version_of_resource_is_treated_as_different_cache
358
+ @mock_controller.mock_url_for = 'http://example.org/posts/'
359
+ @mock_controller.mock_path = '/posts/index.xml'
360
+ path_object = @path_class.new(@mock_controller, {})
361
+ assert_equal 'xml', path_object.extension
362
+ assert_equal 'example.org/posts/index.xml', path_object.path
363
+ end
364
+
365
+ def test_correct_content_type_is_returned_for_cache_hit
366
+ # run it twice to cache it the first time
367
+ get :index, :id => 'content-type.xml'
368
+ get :index, :id => 'content-type.xml'
369
+ assert_equal 'application/xml', @response.content_type
370
+ end
371
+
372
+ def test_empty_path_is_normalized
373
+ @mock_controller.mock_url_for = 'http://example.org/'
374
+ @mock_controller.mock_path = '/'
375
+
376
+ assert_equal 'example.org/index', @path_class.path_for(@mock_controller, {})
377
+ end
378
+
379
+ def test_file_extensions
380
+ get :index, :id => 'kitten.jpg'
381
+ get :index, :id => 'kitten.jpg'
382
+
383
+ assert_response :success
384
+ end
385
+
386
+ private
387
+ def content_to_cache
388
+ assigns(:cache_this)
389
+ end
390
+
391
+ def reset!
392
+ @request = ActionController::TestRequest.new
393
+ @response = ActionController::TestResponse.new
394
+ @controller = ActionCachingTestController.new
395
+ @request.host = 'hostname.com'
396
+ end
397
+
398
+ def fragment_exist?(path)
399
+ @controller.fragment_exist?(path)
400
+ end
401
+
402
+ def read_fragment(path)
403
+ @controller.read_fragment(path)
404
+ end
405
+ end
406
+
407
+ class FragmentCachingTestController < ActionController::Base
408
+ def some_action; end;
409
+ end
410
+
411
+ class FragmentCachingTest < Test::Unit::TestCase
412
+ def setup
413
+ ActionController::Base.perform_caching = true
414
+ @store = ActiveSupport::Cache::MemoryStore.new
415
+ ActionController::Base.cache_store = @store
416
+ @controller = FragmentCachingTestController.new
417
+ @params = {:controller => 'posts', :action => 'index'}
418
+ @request = ActionController::TestRequest.new
419
+ @response = ActionController::TestResponse.new
420
+ @controller.params = @params
421
+ @controller.request = @request
422
+ @controller.response = @response
423
+ @controller.send(:initialize_current_url)
424
+ end
425
+
426
+ def test_fragment_cache_key
427
+ assert_equal 'views/what a key', @controller.fragment_cache_key('what a key')
428
+ assert_equal( "views/test.host/fragment_caching_test/some_action",
429
+ @controller.fragment_cache_key(:controller => 'fragment_caching_test',:action => 'some_action'))
430
+ end
431
+
432
+ def test_read_fragment__with_caching_enabled
433
+ @store.write('views/name', 'value')
434
+ assert_equal 'value', @controller.read_fragment('name')
435
+ end
436
+
437
+ def test_read_fragment__with_caching_disabled
438
+ ActionController::Base.perform_caching = false
439
+ @store.write('views/name', 'value')
440
+ assert_nil @controller.read_fragment('name')
441
+ end
442
+
443
+ def test_fragment_exist__with_caching_enabled
444
+ @store.write('views/name', 'value')
445
+ assert @controller.fragment_exist?('name')
446
+ assert !@controller.fragment_exist?('other_name')
447
+ end
448
+
449
+ def test_fragment_exist__with_caching_disabled
450
+ ActionController::Base.perform_caching = false
451
+ @store.write('views/name', 'value')
452
+ assert !@controller.fragment_exist?('name')
453
+ assert !@controller.fragment_exist?('other_name')
454
+ end
455
+
456
+ def test_write_fragment__with_caching_enabled
457
+ assert_nil @store.read('views/name')
458
+ assert_equal 'value', @controller.write_fragment('name', 'value')
459
+ assert_equal 'value', @store.read('views/name')
460
+ end
461
+
462
+ def test_write_fragment__with_caching_disabled
463
+ assert_nil @store.read('views/name')
464
+ ActionController::Base.perform_caching = false
465
+ assert_equal nil, @controller.write_fragment('name', 'value')
466
+ assert_nil @store.read('views/name')
467
+ end
468
+
469
+ def test_expire_fragment__with_simple_key
470
+ @store.write('views/name', 'value')
471
+ @controller.expire_fragment 'name'
472
+ assert_nil @store.read('views/name')
473
+ end
474
+
475
+ def test_expire_fragment__with__regexp
476
+ @store.write('views/name', 'value')
477
+ @store.write('views/another_name', 'another_value')
478
+ @store.write('views/primalgrasp', 'will not expire ;-)')
479
+
480
+ @controller.expire_fragment /name/
481
+
482
+ assert_nil @store.read('views/name')
483
+ assert_nil @store.read('views/another_name')
484
+ assert_equal 'will not expire ;-)', @store.read('views/primalgrasp')
485
+ end
486
+
487
+ def test_fragment_for__with_disabled_caching
488
+ ActionController::Base.perform_caching = false
489
+
490
+ @store.write('views/expensive', 'fragment content')
491
+ fragment_computed = false
492
+
493
+ buffer = 'generated till now -> '
494
+ @controller.fragment_for(Proc.new { fragment_computed = true }, 'expensive') { buffer }
495
+
496
+ assert fragment_computed
497
+ assert_equal 'generated till now -> ', buffer
498
+ end
499
+
500
+ def test_fragment_for
501
+ @store.write('views/expensive', 'fragment content')
502
+ fragment_computed = false
503
+
504
+ buffer = 'generated till now -> '
505
+ @controller.fragment_for(Proc.new { fragment_computed = true }, 'expensive') { buffer}
506
+
507
+ assert !fragment_computed
508
+ assert_equal 'generated till now -> fragment content', buffer
509
+ end
510
+
511
+ def test_cache_erb_fragment
512
+ @store.write('views/expensive', 'fragment content')
513
+ _erbout = 'generated till now -> '
514
+
515
+ assert_equal( 'generated till now -> fragment content',
516
+ ActionView::TemplateHandlers::ERB.new(@controller).cache_fragment(Proc.new{ }, 'expensive'))
517
+ end
518
+
519
+ def test_cache_rxml_fragment
520
+ @store.write('views/expensive', 'fragment content')
521
+ xml = 'generated till now -> '
522
+ class << xml; def target!; to_s; end; end
523
+
524
+ assert_equal( 'generated till now -> fragment content',
525
+ ActionView::TemplateHandlers::Builder.new(@controller).cache_fragment(Proc.new{ }, 'expensive'))
526
+ end
527
+ end
528
+
529
+
530
+ class FunctionalCachingController < ActionController::Base
531
+ def fragment_cached
532
+ end
533
+
534
+ def html_fragment_cached_with_partial
535
+ respond_to do |format|
536
+ format.html
537
+ end
538
+ end
539
+
540
+ def js_fragment_cached_with_partial
541
+ respond_to do |format|
542
+ format.js
543
+ end
544
+ end
545
+
546
+
547
+ def rescue_action(e)
548
+ raise e
549
+ end
550
+ end
551
+
552
+ FunctionalCachingController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
553
+
554
+ class FunctionalFragmentCachingTest < Test::Unit::TestCase
555
+ def setup
556
+ ActionController::Base.perform_caching = true
557
+ @store = ActiveSupport::Cache::MemoryStore.new
558
+ ActionController::Base.cache_store = @store
559
+ @controller = FunctionalCachingController.new
560
+ @request = ActionController::TestRequest.new
561
+ @response = ActionController::TestResponse.new
562
+ end
563
+ def test_fragment_caching
564
+ get :fragment_cached
565
+ assert_response :success
566
+ expected_body = <<-CACHED
567
+ Hello
568
+ This bit's fragment cached
569
+ CACHED
570
+ assert_equal expected_body, @response.body
571
+
572
+ assert_equal "This bit's fragment cached", @store.read('views/test.host/functional_caching/fragment_cached')
573
+ end
574
+
575
+ def test_fragment_caching_in_partials
576
+ get :html_fragment_cached_with_partial
577
+ assert_response :success
578
+ assert_match /Fragment caching in a partial/, @response.body
579
+ assert_match "Fragment caching in a partial", @store.read('views/test.host/functional_caching/html_fragment_cached_with_partial')
580
+ end
581
+ end