actionpack 1.13.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (317) hide show
  1. data/CHANGELOG +1400 -20
  2. data/MIT-LICENSE +1 -1
  3. data/README +5 -5
  4. data/RUNNING_UNIT_TESTS +4 -5
  5. data/Rakefile +5 -6
  6. data/install.rb +2 -2
  7. data/lib/action_controller.rb +11 -15
  8. data/lib/action_controller/assertions.rb +12 -25
  9. data/lib/action_controller/assertions/dom_assertions.rb +18 -4
  10. data/lib/action_controller/assertions/model_assertions.rb +8 -1
  11. data/lib/action_controller/assertions/response_assertions.rb +35 -12
  12. data/lib/action_controller/assertions/routing_assertions.rb +56 -12
  13. data/lib/action_controller/assertions/selector_assertions.rb +105 -38
  14. data/lib/action_controller/assertions/tag_assertions.rb +28 -15
  15. data/lib/action_controller/base.rb +318 -250
  16. data/lib/action_controller/benchmarking.rb +33 -29
  17. data/lib/action_controller/caching.rb +130 -64
  18. data/lib/action_controller/cgi_ext.rb +16 -0
  19. data/lib/action_controller/cgi_ext/{cookie_performance_fix.rb → cookie.rb} +25 -40
  20. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  21. data/lib/action_controller/cgi_ext/session.rb +73 -0
  22. data/lib/action_controller/cgi_ext/stdinput.rb +23 -0
  23. data/lib/action_controller/cgi_process.rb +34 -57
  24. data/lib/action_controller/components.rb +19 -36
  25. data/lib/action_controller/cookies.rb +10 -9
  26. data/lib/action_controller/dispatcher.rb +195 -0
  27. data/lib/action_controller/filters.rb +35 -34
  28. data/lib/action_controller/flash.rb +30 -35
  29. data/lib/action_controller/helpers.rb +121 -47
  30. data/lib/action_controller/http_authentication.rb +126 -0
  31. data/lib/action_controller/integration.rb +105 -101
  32. data/lib/action_controller/layout.rb +59 -47
  33. data/lib/action_controller/mime_responds.rb +57 -68
  34. data/lib/action_controller/mime_type.rb +43 -80
  35. data/lib/action_controller/mime_types.rb +20 -0
  36. data/lib/action_controller/polymorphic_routes.rb +88 -0
  37. data/lib/action_controller/record_identifier.rb +91 -0
  38. data/lib/action_controller/request.rb +553 -88
  39. data/lib/action_controller/request_forgery_protection.rb +126 -0
  40. data/lib/action_controller/request_profiler.rb +138 -0
  41. data/lib/action_controller/rescue.rb +185 -69
  42. data/lib/action_controller/resources.rb +211 -172
  43. data/lib/action_controller/response.rb +49 -8
  44. data/lib/action_controller/routing.rb +359 -236
  45. data/lib/action_controller/routing_optimisation.rb +119 -0
  46. data/lib/action_controller/session/active_record_store.rb +3 -2
  47. data/lib/action_controller/session/cookie_store.rb +161 -0
  48. data/lib/action_controller/session/mem_cache_store.rb +9 -16
  49. data/lib/action_controller/session_management.rb +17 -8
  50. data/lib/action_controller/streaming.rb +6 -3
  51. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  52. data/lib/action_controller/templates/rescues/{_trace.rhtml → _trace.erb} +0 -0
  53. data/lib/action_controller/templates/rescues/{diagnostics.rhtml → diagnostics.erb} +2 -2
  54. data/lib/action_controller/templates/rescues/{layout.rhtml → layout.erb} +0 -0
  55. data/lib/action_controller/templates/rescues/{missing_template.rhtml → missing_template.erb} +0 -0
  56. data/lib/action_controller/templates/rescues/{routing_error.rhtml → routing_error.erb} +0 -0
  57. data/lib/action_controller/templates/rescues/{template_error.rhtml → template_error.erb} +2 -2
  58. data/lib/action_controller/templates/rescues/{unknown_action.rhtml → unknown_action.erb} +0 -0
  59. data/lib/action_controller/test_case.rb +53 -0
  60. data/lib/action_controller/test_process.rb +59 -46
  61. data/lib/action_controller/url_rewriter.rb +48 -24
  62. data/lib/action_controller/vendor/html-scanner/html/document.rb +7 -4
  63. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  64. data/lib/action_controller/vendor/html-scanner/html/selector.rb +11 -6
  65. data/lib/action_controller/verification.rb +27 -21
  66. data/lib/action_pack.rb +1 -1
  67. data/lib/action_pack/version.rb +4 -4
  68. data/lib/action_view.rb +2 -3
  69. data/lib/action_view/base.rb +218 -63
  70. data/lib/action_view/compiled_templates.rb +1 -2
  71. data/lib/action_view/helpers/active_record_helper.rb +35 -17
  72. data/lib/action_view/helpers/asset_tag_helper.rb +395 -87
  73. data/lib/action_view/helpers/atom_feed_helper.rb +111 -0
  74. data/lib/action_view/helpers/benchmark_helper.rb +12 -5
  75. data/lib/action_view/helpers/cache_helper.rb +29 -0
  76. data/lib/action_view/helpers/capture_helper.rb +97 -63
  77. data/lib/action_view/helpers/date_helper.rb +295 -35
  78. data/lib/action_view/helpers/debug_helper.rb +6 -2
  79. data/lib/action_view/helpers/form_helper.rb +354 -111
  80. data/lib/action_view/helpers/form_options_helper.rb +171 -109
  81. data/lib/action_view/helpers/form_tag_helper.rb +332 -76
  82. data/lib/action_view/helpers/javascript_helper.rb +35 -11
  83. data/lib/action_view/helpers/javascripts/controls.js +484 -354
  84. data/lib/action_view/helpers/javascripts/dragdrop.js +88 -58
  85. data/lib/action_view/helpers/javascripts/effects.js +396 -364
  86. data/lib/action_view/helpers/javascripts/prototype.js +2817 -1107
  87. data/lib/action_view/helpers/number_helper.rb +84 -60
  88. data/lib/action_view/helpers/prototype_helper.rb +419 -43
  89. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  90. data/lib/action_view/helpers/record_tag_helper.rb +59 -0
  91. data/lib/action_view/helpers/sanitize_helper.rb +223 -0
  92. data/lib/action_view/helpers/scriptaculous_helper.rb +63 -4
  93. data/lib/action_view/helpers/tag_helper.rb +69 -39
  94. data/lib/action_view/helpers/text_helper.rb +221 -148
  95. data/lib/action_view/helpers/url_helper.rb +283 -165
  96. data/lib/action_view/partials.rb +134 -62
  97. data/lib/action_view/template_error.rb +4 -12
  98. data/lib/actionpack.rb +1 -0
  99. data/test/abstract_unit.rb +21 -1
  100. data/test/action_view_test.rb +26 -0
  101. data/test/active_record_unit.rb +12 -20
  102. data/test/activerecord/active_record_store_test.rb +2 -2
  103. data/test/activerecord/render_partial_with_record_identification_test.rb +74 -0
  104. data/test/controller/action_pack_assertions_test.rb +21 -152
  105. data/test/controller/addresses_render_test.rb +2 -7
  106. data/test/controller/assert_select_test.rb +120 -14
  107. data/test/controller/base_test.rb +11 -13
  108. data/test/controller/caching_test.rb +125 -5
  109. data/test/controller/capture_test.rb +23 -16
  110. data/test/controller/cgi_test.rb +66 -391
  111. data/test/controller/components_test.rb +31 -42
  112. data/test/controller/content_type_test.rb +1 -1
  113. data/test/controller/cookie_test.rb +42 -14
  114. data/test/controller/deprecation/deprecated_base_methods_test.rb +1 -42
  115. data/test/controller/dispatcher_test.rb +123 -0
  116. data/test/controller/fake_models.rb +5 -0
  117. data/test/controller/filters_test.rb +44 -7
  118. data/test/controller/flash_test.rb +46 -2
  119. data/test/controller/fragment_store_setting_test.rb +10 -8
  120. data/test/controller/helper_test.rb +19 -2
  121. data/test/controller/html-scanner/document_test.rb +124 -0
  122. data/test/controller/html-scanner/node_test.rb +69 -0
  123. data/test/controller/html-scanner/sanitizer_test.rb +250 -0
  124. data/test/controller/html-scanner/tag_node_test.rb +239 -0
  125. data/test/controller/html-scanner/text_node_test.rb +51 -0
  126. data/test/controller/html-scanner/tokenizer_test.rb +125 -0
  127. data/test/controller/http_authentication_test.rb +54 -0
  128. data/test/controller/integration_test.rb +12 -26
  129. data/test/controller/layout_test.rb +64 -12
  130. data/test/controller/mime_responds_test.rb +193 -38
  131. data/test/controller/mime_type_test.rb +30 -8
  132. data/test/controller/new_render_test.rb +104 -22
  133. data/test/controller/polymorphic_routes_test.rb +98 -0
  134. data/test/controller/record_identifier_test.rb +103 -0
  135. data/test/controller/redirect_test.rb +120 -18
  136. data/test/controller/render_test.rb +195 -45
  137. data/test/controller/request_forgery_protection_test.rb +217 -0
  138. data/test/controller/request_test.rb +545 -27
  139. data/test/controller/rescue_test.rb +501 -0
  140. data/test/controller/resources_test.rb +258 -132
  141. data/test/controller/routing_test.rb +502 -106
  142. data/test/controller/selector_test.rb +5 -5
  143. data/test/controller/send_file_test.rb +17 -7
  144. data/test/controller/session/cookie_store_test.rb +246 -0
  145. data/test/controller/session/mem_cache_store_test.rb +182 -0
  146. data/test/controller/session_fixation_test.rb +8 -11
  147. data/test/controller/session_management_test.rb +7 -7
  148. data/test/controller/test_test.rb +150 -38
  149. data/test/controller/url_rewriter_test.rb +87 -12
  150. data/test/controller/verification_test.rb +11 -0
  151. data/test/controller/view_paths_test.rb +137 -0
  152. data/test/controller/webservice_test.rb +11 -75
  153. data/test/fixtures/addresses/{list.rhtml → list.erb} +0 -0
  154. data/test/fixtures/db_definitions/sqlite.sql +2 -1
  155. data/test/fixtures/developer.rb +2 -0
  156. data/test/fixtures/fun/games/{hello_world.rhtml → hello_world.erb} +0 -0
  157. data/test/fixtures/helpers/fun/pdf_helper.rb +1 -1
  158. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  159. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  160. data/test/fixtures/layouts/{builder.rxml → builder.builder} +0 -0
  161. data/test/fixtures/layouts/{standard.rhtml → standard.erb} +0 -0
  162. data/test/fixtures/layouts/{talk_from_action.rhtml → talk_from_action.erb} +0 -0
  163. data/test/fixtures/layouts/{yield.rhtml → yield.erb} +0 -0
  164. data/test/fixtures/multipart/binary_file +0 -0
  165. data/test/fixtures/multipart/bracketed_param +5 -0
  166. data/test/fixtures/override/test/hello_world.erb +1 -0
  167. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  168. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  169. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  170. data/test/fixtures/post_test/post/index.html.erb +1 -0
  171. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  172. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  173. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  174. data/test/fixtures/public/404.html +1 -0
  175. data/test/fixtures/public/500.html +1 -0
  176. data/test/fixtures/public/javascripts/application.js +0 -1
  177. data/test/fixtures/public/javascripts/bank.js +1 -0
  178. data/test/fixtures/public/javascripts/robber.js +1 -0
  179. data/test/fixtures/public/stylesheets/bank.css +1 -0
  180. data/test/fixtures/public/stylesheets/robber.css +1 -0
  181. data/test/fixtures/replies.yml +2 -0
  182. data/test/fixtures/reply.rb +2 -1
  183. data/test/fixtures/respond_to/{all_types_with_layout.rhtml → all_types_with_layout.html.erb} +0 -0
  184. data/test/fixtures/respond_to/{all_types_with_layout.rjs → all_types_with_layout.js.rjs} +0 -0
  185. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  186. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  187. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  188. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  189. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  190. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  191. data/test/fixtures/respond_to/{using_defaults.rhtml → using_defaults.html.erb} +0 -0
  192. data/test/fixtures/respond_to/{using_defaults.rjs → using_defaults.js.rjs} +0 -0
  193. data/test/fixtures/respond_to/{using_defaults.rxml → using_defaults.xml.builder} +0 -0
  194. data/test/fixtures/respond_to/{using_defaults_with_type_list.rhtml → using_defaults_with_type_list.html.erb} +0 -0
  195. data/test/fixtures/respond_to/{using_defaults_with_type_list.rjs → using_defaults_with_type_list.js.rjs} +0 -0
  196. data/test/fixtures/respond_to/{using_defaults_with_type_list.rxml → using_defaults_with_type_list.xml.builder} +0 -0
  197. data/test/fixtures/scope/test/{modgreet.rhtml → modgreet.erb} +0 -0
  198. data/test/fixtures/test/{_customer.rhtml → _customer.erb} +0 -0
  199. data/test/fixtures/test/{_customer_greeting.rhtml → _customer_greeting.erb} +0 -0
  200. data/test/fixtures/test/_hash_greeting.erb +1 -0
  201. data/test/fixtures/test/_hash_object.erb +2 -0
  202. data/test/fixtures/test/{_hello.rxml → _hello.builder} +0 -0
  203. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  204. data/test/fixtures/test/_partial.erb +1 -0
  205. data/test/fixtures/test/_partial.html.erb +1 -0
  206. data/test/fixtures/test/_partial.js.erb +1 -0
  207. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  208. data/test/fixtures/test/{_partial_only.rhtml → _partial_only.erb} +0 -0
  209. data/test/fixtures/test/{_person.rhtml → _person.erb} +0 -0
  210. data/test/fixtures/test/{action_talk_to_layout.rhtml → action_talk_to_layout.erb} +0 -0
  211. data/test/fixtures/test/{block_content_for.rhtml → block_content_for.erb} +0 -0
  212. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  213. data/test/fixtures/test/{capturing.rhtml → capturing.erb} +0 -0
  214. data/test/fixtures/test/{content_for.rhtml → content_for.erb} +0 -0
  215. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  216. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  217. data/test/fixtures/test/dot.directory/{render_file_with_ivar.rhtml → render_file_with_ivar.erb} +0 -0
  218. data/test/fixtures/test/{erb_content_for.rhtml → erb_content_for.erb} +0 -0
  219. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  220. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  221. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  222. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  223. data/test/fixtures/test/{greeting.rhtml → greeting.erb} +0 -0
  224. data/test/fixtures/test/{hello.rxml → hello.builder} +0 -0
  225. data/test/fixtures/test/{hello_world.rxml → hello_world.builder} +0 -0
  226. data/test/fixtures/test/{hello_world.rhtml → hello_world.erb} +0 -0
  227. data/test/fixtures/test/{hello_world_container.rxml → hello_world_container.builder} +0 -0
  228. data/test/fixtures/test/{hello_world_with_layout_false.rhtml → hello_world_with_layout_false.erb} +0 -0
  229. data/test/fixtures/test/{hello_xml_world.rxml → hello_xml_world.builder} +0 -0
  230. data/test/fixtures/test/list.erb +1 -0
  231. data/test/fixtures/test/{non_erb_block_content_for.rxml → non_erb_block_content_for.builder} +0 -0
  232. data/test/fixtures/test/{potential_conflicts.rhtml → potential_conflicts.erb} +0 -0
  233. data/test/fixtures/test/{render_file_with_ivar.rhtml → render_file_with_ivar.erb} +0 -0
  234. data/test/fixtures/test/{render_file_with_locals.rhtml → render_file_with_locals.erb} +0 -0
  235. data/test/fixtures/test/{render_to_string_test.rhtml → render_to_string_test.erb} +0 -0
  236. data/test/fixtures/test/{update_element_with_capture.rhtml → update_element_with_capture.erb} +0 -0
  237. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  238. data/test/fixtures/topic.rb +1 -1
  239. data/test/template/active_record_helper_test.rb +67 -20
  240. data/test/template/asset_tag_helper_test.rb +222 -54
  241. data/test/template/atom_feed_helper_test.rb +101 -0
  242. data/test/template/benchmark_helper_test.rb +2 -2
  243. data/test/template/compiled_templates_test.rb +76 -32
  244. data/test/template/date_helper_test.rb +125 -9
  245. data/test/template/form_helper_test.rb +326 -33
  246. data/test/template/form_options_helper_test.rb +822 -15
  247. data/test/template/form_tag_helper_test.rb +96 -30
  248. data/test/template/javascript_helper_test.rb +61 -13
  249. data/test/template/number_helper_test.rb +12 -11
  250. data/test/template/prototype_helper_test.rb +185 -24
  251. data/test/template/sanitize_helper_test.rb +49 -0
  252. data/test/template/scriptaculous_helper_test.rb +9 -3
  253. data/test/template/tag_helper_test.rb +13 -2
  254. data/test/template/text_helper_test.rb +38 -52
  255. data/test/template/url_helper_test.rb +216 -46
  256. metadata +144 -116
  257. data/examples/.htaccess +0 -24
  258. data/examples/address_book/index.rhtml +0 -33
  259. data/examples/address_book/layout.rhtml +0 -8
  260. data/examples/address_book_controller.cgi +0 -9
  261. data/examples/address_book_controller.fcgi +0 -6
  262. data/examples/address_book_controller.rb +0 -52
  263. data/examples/address_book_controller.rbx +0 -4
  264. data/examples/benchmark.rb +0 -52
  265. data/examples/benchmark_with_ar.fcgi +0 -89
  266. data/examples/blog_controller.cgi +0 -53
  267. data/examples/debate/index.rhtml +0 -14
  268. data/examples/debate/new_topic.rhtml +0 -22
  269. data/examples/debate/topic.rhtml +0 -32
  270. data/examples/debate_controller.cgi +0 -57
  271. data/lib/action_controller/assertions/deprecated_assertions.rb +0 -228
  272. data/lib/action_controller/cgi_ext/cgi_ext.rb +0 -36
  273. data/lib/action_controller/cgi_ext/cgi_methods.rb +0 -211
  274. data/lib/action_controller/cgi_ext/pstore_performance_fix.rb +0 -30
  275. data/lib/action_controller/cgi_ext/raw_post_data_fix.rb +0 -95
  276. data/lib/action_controller/cgi_ext/session_performance_fix.rb +0 -30
  277. data/lib/action_controller/deprecated_dependencies.rb +0 -65
  278. data/lib/action_controller/deprecated_redirects.rb +0 -17
  279. data/lib/action_controller/deprecated_request_methods.rb +0 -34
  280. data/lib/action_controller/macros/auto_complete.rb +0 -53
  281. data/lib/action_controller/macros/in_place_editing.rb +0 -33
  282. data/lib/action_controller/pagination.rb +0 -408
  283. data/lib/action_controller/scaffolding.rb +0 -189
  284. data/lib/action_controller/templates/rescues/_request_and_response.rhtml +0 -44
  285. data/lib/action_controller/templates/scaffolds/edit.rhtml +0 -7
  286. data/lib/action_controller/templates/scaffolds/layout.rhtml +0 -69
  287. data/lib/action_controller/templates/scaffolds/list.rhtml +0 -27
  288. data/lib/action_controller/templates/scaffolds/new.rhtml +0 -6
  289. data/lib/action_controller/templates/scaffolds/show.rhtml +0 -9
  290. data/lib/action_controller/vendor/xml_node.rb +0 -97
  291. data/lib/action_view/helpers/deprecated_helper.rb +0 -37
  292. data/lib/action_view/helpers/java_script_macros_helper.rb +0 -233
  293. data/lib/action_view/helpers/pagination_helper.rb +0 -86
  294. data/test/activerecord/active_record_assertions_test.rb +0 -92
  295. data/test/activerecord/pagination_test.rb +0 -165
  296. data/test/controller/deprecated_instance_variables_test.rb +0 -48
  297. data/test/controller/raw_post_test.rb +0 -68
  298. data/test/fixtures/deprecated_instance_variables/_cookies_ivar.rhtml +0 -1
  299. data/test/fixtures/deprecated_instance_variables/_cookies_method.rhtml +0 -1
  300. data/test/fixtures/deprecated_instance_variables/_flash_ivar.rhtml +0 -1
  301. data/test/fixtures/deprecated_instance_variables/_flash_method.rhtml +0 -1
  302. data/test/fixtures/deprecated_instance_variables/_headers_ivar.rhtml +0 -1
  303. data/test/fixtures/deprecated_instance_variables/_headers_method.rhtml +0 -1
  304. data/test/fixtures/deprecated_instance_variables/_params_ivar.rhtml +0 -1
  305. data/test/fixtures/deprecated_instance_variables/_params_method.rhtml +0 -1
  306. data/test/fixtures/deprecated_instance_variables/_request_ivar.rhtml +0 -1
  307. data/test/fixtures/deprecated_instance_variables/_request_method.rhtml +0 -1
  308. data/test/fixtures/deprecated_instance_variables/_response_ivar.rhtml +0 -1
  309. data/test/fixtures/deprecated_instance_variables/_response_method.rhtml +0 -1
  310. data/test/fixtures/deprecated_instance_variables/_session_ivar.rhtml +0 -1
  311. data/test/fixtures/deprecated_instance_variables/_session_method.rhtml +0 -1
  312. data/test/fixtures/respond_to/layouts/standard.rhtml +0 -1
  313. data/test/fixtures/test/_hash_object.rhtml +0 -1
  314. data/test/fixtures/test/list.rhtml +0 -1
  315. data/test/template/deprecated_helper_test.rb +0 -36
  316. data/test/template/deprecated_instance_variables_test.rb +0 -43
  317. data/test/template/java_script_macros_helper_test.rb +0 -109
@@ -0,0 +1,5 @@
1
+ class Customer < Struct.new(:name, :id)
2
+ def to_param
3
+ id.to_s
4
+ end
5
+ end
@@ -44,7 +44,9 @@ class FilterTest < Test::Unit::TestCase
44
44
  (1..3).each do |i|
45
45
  define_method "try_#{i}" do
46
46
  instance_variable_set :@try, i
47
- action_name != "fail_#{i}"
47
+ if action_name == "fail_#{i}"
48
+ head(404)
49
+ end
48
50
  end
49
51
  end
50
52
  end
@@ -234,7 +236,7 @@ class FilterTest < Test::Unit::TestCase
234
236
  before_filter(AuditFilter)
235
237
 
236
238
  def show
237
- render_text "hello"
239
+ render :text => "hello"
238
240
  end
239
241
  end
240
242
 
@@ -271,11 +273,11 @@ class FilterTest < Test::Unit::TestCase
271
273
  before_filter :second, :only => :foo
272
274
 
273
275
  def foo
274
- render_text 'foo'
276
+ render :text => 'foo'
275
277
  end
276
278
 
277
279
  def bar
278
- render_text 'bar'
280
+ render :text => 'bar'
279
281
  end
280
282
 
281
283
  protected
@@ -325,6 +327,31 @@ class FilterTest < Test::Unit::TestCase
325
327
  end
326
328
  end
327
329
 
330
+ class ErrorToRescue < Exception; end
331
+
332
+ class RescuingAroundFilterWithBlock
333
+ def filter(controller)
334
+ begin
335
+ yield
336
+ rescue ErrorToRescue => ex
337
+ controller.send! :render, :text => "I rescued this: #{ex.inspect}"
338
+ end
339
+ end
340
+ end
341
+
342
+ class RescuedController < ActionController::Base
343
+ around_filter RescuingAroundFilterWithBlock.new
344
+
345
+ def show
346
+ raise ErrorToRescue.new("Something made the bad noise.")
347
+ end
348
+
349
+ private
350
+ def rescue_action(exception)
351
+ raise exception
352
+ end
353
+ end
354
+
328
355
  class NonYieldingAroundFilterController < ActionController::Base
329
356
 
330
357
  before_filter :filter_one
@@ -558,6 +585,16 @@ class FilterTest < Test::Unit::TestCase
558
585
  assert_equal nil, test_process(ChangingTheRequirementsController, "go_wild").template.assigns['ran_filter']
559
586
  end
560
587
 
588
+ def test_a_rescuing_around_filter
589
+ response = nil
590
+ assert_nothing_raised do
591
+ response = test_process(RescuedController)
592
+ end
593
+
594
+ assert response.success?
595
+ assert_equal("I rescued this: #<FilterTest::ErrorToRescue: Something made the bad noise.>", response.body)
596
+ end
597
+
561
598
  private
562
599
  def test_process(controller, action = "show")
563
600
  request = ActionController::TestRequest.new
@@ -788,7 +825,7 @@ class YieldingAroundFiltersTest < Test::Unit::TestCase
788
825
  def test_first_filter_in_multiple_before_filter_chain_halts
789
826
  controller = ::FilterTest::TestMultipleFiltersController.new
790
827
  response = test_process(controller, 'fail_1')
791
- assert_equal '', response.body
828
+ assert_equal ' ', response.body
792
829
  assert_equal 1, controller.instance_variable_get(:@try)
793
830
  assert controller.instance_variable_get(:@before_filter_chain_aborted)
794
831
  end
@@ -796,7 +833,7 @@ class YieldingAroundFiltersTest < Test::Unit::TestCase
796
833
  def test_second_filter_in_multiple_before_filter_chain_halts
797
834
  controller = ::FilterTest::TestMultipleFiltersController.new
798
835
  response = test_process(controller, 'fail_2')
799
- assert_equal '', response.body
836
+ assert_equal ' ', response.body
800
837
  assert_equal 2, controller.instance_variable_get(:@try)
801
838
  assert controller.instance_variable_get(:@before_filter_chain_aborted)
802
839
  end
@@ -804,7 +841,7 @@ class YieldingAroundFiltersTest < Test::Unit::TestCase
804
841
  def test_last_filter_in_multiple_before_filter_chain_halts
805
842
  controller = ::FilterTest::TestMultipleFiltersController.new
806
843
  response = test_process(controller, 'fail_3')
807
- assert_equal '', response.body
844
+ assert_equal ' ', response.body
808
845
  assert_equal 3, controller.instance_variable_get(:@try)
809
846
  assert controller.instance_variable_get(:@before_filter_chain_aborted)
810
847
  end
@@ -31,7 +31,13 @@ class FlashTest < Test::Unit::TestCase
31
31
  def use_flash_and_keep_it
32
32
  @flash_copy = {}.update flash
33
33
  @flashy = flash["that"]
34
- silence_warnings { keep_flash }
34
+ flash.keep
35
+ render :inline => "hello"
36
+ end
37
+
38
+ def use_flash_and_update_it
39
+ flash.update("this" => "hello again")
40
+ @flash_copy = {}.update flash
35
41
  render :inline => "hello"
36
42
  end
37
43
 
@@ -48,6 +54,23 @@ class FlashTest < Test::Unit::TestCase
48
54
  def rescue_action(e)
49
55
  raise unless ActionController::MissingTemplate === e
50
56
  end
57
+
58
+ # methods for test_sweep_after_halted_filter_chain
59
+ before_filter :halt_and_redir, :only => "filter_halting_action"
60
+
61
+ def std_action
62
+ @flash_copy = {}.update(flash)
63
+ end
64
+
65
+ def filter_halting_action
66
+ @flash_copy = {}.update(flash)
67
+ end
68
+
69
+ def halt_and_redir
70
+ flash["foo"] = "bar"
71
+ redirect_to :action => "std_action"
72
+ @flash_copy = {}.update(flash)
73
+ end
51
74
  end
52
75
 
53
76
  def setup
@@ -70,7 +93,7 @@ class FlashTest < Test::Unit::TestCase
70
93
  def test_keep_flash
71
94
  get :set_flash
72
95
 
73
- assert_deprecated(/keep_flash/) { get :use_flash_and_keep_it }
96
+ get :use_flash_and_keep_it
74
97
  assert_equal "hello", @response.template.assigns["flash_copy"]["that"]
75
98
  assert_equal "hello", @response.template.assigns["flashy"]
76
99
 
@@ -93,10 +116,31 @@ class FlashTest < Test::Unit::TestCase
93
116
  assert_nil @response.template.assigns["flashy"]
94
117
  end
95
118
 
119
+ def test_update_flash
120
+ get :set_flash
121
+ get :use_flash_and_update_it
122
+ assert_equal "hello", @response.template.assigns["flash_copy"]["that"]
123
+ assert_equal "hello again", @response.template.assigns["flash_copy"]["this"]
124
+ get :use_flash
125
+ assert_nil @response.template.assigns["flash_copy"]["that"], "On second flash"
126
+ assert_equal "hello again", @response.template.assigns["flash_copy"]["this"], "On second flash"
127
+ end
128
+
96
129
  def test_flash_after_reset_session
97
130
  get :use_flash_after_reset_session
98
131
  assert_equal "hello", @response.template.assigns["flashy_that"]
99
132
  assert_equal "good-bye", @response.template.assigns["flashy_this"]
100
133
  assert_nil @response.template.assigns["flashy_that_reset"]
101
134
  end
135
+
136
+ def test_sweep_after_halted_filter_chain
137
+ get :std_action
138
+ assert_nil @response.template.assigns["flash_copy"]["foo"]
139
+ get :filter_halting_action
140
+ assert_equal "bar", @response.template.assigns["flash_copy"]["foo"]
141
+ get :std_action # follow redirection
142
+ assert_equal "bar", @response.template.assigns["flash_copy"]["foo"]
143
+ get :std_action
144
+ assert_nil @response.template.assigns["flash_copy"]["foo"]
145
+ end
102
146
  end
@@ -24,14 +24,16 @@ class FragmentCacheStoreSettingTest < Test::Unit::TestCase
24
24
  )
25
25
  assert_equal "druby://localhost:9192", ActionController::Base.fragment_cache_store.address
26
26
  end
27
-
28
- def test_mem_cache_fragment_cache_store
29
- ActionController::Base.fragment_cache_store = :mem_cache_store, "localhost"
30
- assert_kind_of(
31
- ActionController::Caching::Fragments::MemCacheStore,
32
- ActionController::Base.fragment_cache_store
33
- )
34
- assert_equal %w(localhost), ActionController::Base.fragment_cache_store.addresses
27
+
28
+ if defined? CGI::Session::MemCacheStore
29
+ def test_mem_cache_fragment_cache_store
30
+ ActionController::Base.fragment_cache_store = :mem_cache_store, "localhost"
31
+ assert_kind_of(
32
+ ActionController::Caching::Fragments::MemCacheStore,
33
+ ActionController::Base.fragment_cache_store
34
+ )
35
+ assert_equal %w(localhost), ActionController::Base.fragment_cache_store.addresses
36
+ end
35
37
  end
36
38
 
37
39
  def test_object_assigned_fragment_cache_store
@@ -1,5 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/../abstract_unit'
2
2
 
3
+ silence_warnings { ActionController::Helpers::HELPERS_DIR = File.dirname(__FILE__) + '/../fixtures/helpers' }
4
+
3
5
  class TestController < ActionController::Base
4
6
  attr_accessor :delegate_attr
5
7
  def delegate_method() end
@@ -15,7 +17,7 @@ module Fun
15
17
  def rescue_action(e) raise end
16
18
  end
17
19
 
18
- class PDFController < ActionController::Base
20
+ class PdfController < ActionController::Base
19
21
  def test
20
22
  render :inline => "test: <%= foobar %>"
21
23
  end
@@ -24,6 +26,10 @@ module Fun
24
26
  end
25
27
  end
26
28
 
29
+ class ApplicationController < ActionController::Base
30
+ helper :all
31
+ end
32
+
27
33
  module LocalAbcHelper
28
34
  def a() end
29
35
  def b() end
@@ -120,7 +126,18 @@ class HelperTest < Test::Unit::TestCase
120
126
  response = ActionController::TestResponse.new
121
127
  request.action = 'test'
122
128
 
123
- assert_equal 'test: baz', Fun::PDFController.process(request, response).body
129
+ assert_equal 'test: baz', Fun::PdfController.process(request, response).body
130
+ end
131
+
132
+ def test_all_helpers
133
+ # abc_helper.rb
134
+ assert ApplicationController.master_helper_module.instance_methods.include?("bare_a")
135
+
136
+ # fun/games_helper.rb
137
+ assert ApplicationController.master_helper_module.instance_methods.include?("stratego")
138
+
139
+ # fun/pdf_helper.rb
140
+ assert ApplicationController.master_helper_module.instance_methods.include?("foobar")
124
141
  end
125
142
 
126
143
  private
@@ -0,0 +1,124 @@
1
+ require File.dirname(__FILE__) + '/../../abstract_unit'
2
+ require 'test/unit'
3
+
4
+ class DocumentTest < Test::Unit::TestCase
5
+ def test_handle_doctype
6
+ doc = nil
7
+ assert_nothing_raised do
8
+ doc = HTML::Document.new <<-HTML.strip
9
+ <!DOCTYPE "blah" "blah" "blah">
10
+ <html>
11
+ </html>
12
+ HTML
13
+ end
14
+ assert_equal 3, doc.root.children.length
15
+ assert_equal %{<!DOCTYPE "blah" "blah" "blah">}, doc.root.children[0].content
16
+ assert_match %r{\s+}m, doc.root.children[1].content
17
+ assert_equal "html", doc.root.children[2].name
18
+ end
19
+
20
+ def test_find_img
21
+ doc = HTML::Document.new <<-HTML.strip
22
+ <html>
23
+ <body>
24
+ <p><img src="hello.gif"></p>
25
+ </body>
26
+ </html>
27
+ HTML
28
+ assert doc.find(:tag=>"img", :attributes=>{"src"=>"hello.gif"})
29
+ end
30
+
31
+ def test_find_all
32
+ doc = HTML::Document.new <<-HTML.strip
33
+ <html>
34
+ <body>
35
+ <p class="test"><img src="hello.gif"></p>
36
+ <div class="foo">
37
+ <p class="test">something</p>
38
+ <p>here is <em class="test">more</em></p>
39
+ </div>
40
+ </body>
41
+ </html>
42
+ HTML
43
+ all = doc.find_all :attributes => { :class => "test" }
44
+ assert_equal 3, all.length
45
+ assert_equal [ "p", "p", "em" ], all.map { |n| n.name }
46
+ end
47
+
48
+ def test_find_with_text
49
+ doc = HTML::Document.new <<-HTML.strip
50
+ <html>
51
+ <body>
52
+ <p>Some text</p>
53
+ </body>
54
+ </html>
55
+ HTML
56
+ assert doc.find(:content => "Some text")
57
+ assert doc.find(:tag => "p", :child => { :content => "Some text" })
58
+ assert doc.find(:tag => "p", :child => "Some text")
59
+ assert doc.find(:tag => "p", :content => "Some text")
60
+ end
61
+
62
+ def test_parse_xml
63
+ assert_nothing_raised { HTML::Document.new("<tags><tag/></tags>", true, true) }
64
+ assert_nothing_raised { HTML::Document.new("<outer><link>something</link></outer>", true, true) }
65
+ end
66
+
67
+ def test_parse_document
68
+ doc = HTML::Document.new(<<-HTML)
69
+ <div>
70
+ <h2>blah</h2>
71
+ <table>
72
+ </table>
73
+ </div>
74
+ HTML
75
+ assert_not_nil doc.find(:tag => "div", :children => { :count => 1, :only => { :tag => "table" } })
76
+ end
77
+
78
+ def test_tag_nesting_nothing_to_s
79
+ doc = HTML::Document.new("<tag></tag>")
80
+ assert_equal "<tag></tag>", doc.root.to_s
81
+ end
82
+
83
+ def test_tag_nesting_space_to_s
84
+ doc = HTML::Document.new("<tag> </tag>")
85
+ assert_equal "<tag> </tag>", doc.root.to_s
86
+ end
87
+
88
+ def test_tag_nesting_text_to_s
89
+ doc = HTML::Document.new("<tag>text</tag>")
90
+ assert_equal "<tag>text</tag>", doc.root.to_s
91
+ end
92
+
93
+ def test_tag_nesting_tag_to_s
94
+ doc = HTML::Document.new("<tag><nested /></tag>")
95
+ assert_equal "<tag><nested /></tag>", doc.root.to_s
96
+ end
97
+
98
+ def test_parse_cdata
99
+ doc = HTML::Document.new(<<-HTML)
100
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
101
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
102
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
103
+ <head>
104
+ <title><![CDATA[<br>]]></title>
105
+ </head>
106
+ <body>
107
+ <p>this document has &lt;br&gt; for a title</p>
108
+ </body>
109
+ </html>
110
+ HTML
111
+
112
+ assert_nil doc.find(:tag => "title", :descendant => { :tag => "br" })
113
+ assert doc.find(:tag => "title", :child => "<br>")
114
+ end
115
+
116
+ def test_find_empty_tag
117
+ doc = HTML::Document.new("<div id='map'></div>")
118
+ assert_nil doc.find(:tag => "div", :attributes => { :id => "map" }, :content => /./)
119
+ assert doc.find(:tag => "div", :attributes => { :id => "map" }, :content => /\A\Z/)
120
+ assert doc.find(:tag => "div", :attributes => { :id => "map" }, :content => /^$/)
121
+ assert doc.find(:tag => "div", :attributes => { :id => "map" }, :content => "")
122
+ assert doc.find(:tag => "div", :attributes => { :id => "map" }, :content => nil)
123
+ end
124
+ end
@@ -0,0 +1,69 @@
1
+ require File.dirname(__FILE__) + '/../../abstract_unit'
2
+ require 'test/unit'
3
+
4
+ class NodeTest < Test::Unit::TestCase
5
+
6
+ class MockNode
7
+ def initialize(matched, value)
8
+ @matched = matched
9
+ @value = value
10
+ end
11
+
12
+ def find(conditions)
13
+ @matched && self
14
+ end
15
+
16
+ def to_s
17
+ @value.to_s
18
+ end
19
+ end
20
+
21
+ def setup
22
+ @node = HTML::Node.new("parent")
23
+ @node.children.concat [MockNode.new(false,1), MockNode.new(true,"two"), MockNode.new(false,:three)]
24
+ end
25
+
26
+ def test_match
27
+ assert !@node.match("foo")
28
+ end
29
+
30
+ def test_tag
31
+ assert !@node.tag?
32
+ end
33
+
34
+ def test_to_s
35
+ assert_equal "1twothree", @node.to_s
36
+ end
37
+
38
+ def test_find
39
+ assert_equal "two", @node.find('blah').to_s
40
+ end
41
+
42
+ def test_parse_strict
43
+ s = "<b foo='hello'' bar='baz'>"
44
+ assert_raise(RuntimeError) { HTML::Node.parse(nil,0,0,s) }
45
+ end
46
+
47
+ def test_parse_relaxed
48
+ s = "<b foo='hello'' bar='baz'>"
49
+ node = nil
50
+ assert_nothing_raised { node = HTML::Node.parse(nil,0,0,s,false) }
51
+ assert node.attributes.has_key?("foo")
52
+ assert !node.attributes.has_key?("bar")
53
+ end
54
+
55
+ def test_to_s_with_boolean_attrs
56
+ s = "<b foo bar>"
57
+ node = HTML::Node.parse(nil,0,0,s)
58
+ assert node.attributes.has_key?("foo")
59
+ assert node.attributes.has_key?("bar")
60
+ assert "<b foo bar>", node.to_s
61
+ end
62
+
63
+ def test_parse_with_unclosed_tag
64
+ s = "<span onmouseover='bang'"
65
+ node = nil
66
+ assert_nothing_raised { node = HTML::Node.parse(nil,0,0,s,false) }
67
+ assert node.attributes.has_key?("onmouseover")
68
+ end
69
+ end