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
@@ -11,7 +11,7 @@ class RespondToController < ActionController::Base
11
11
  type.all { render :text => "Nothing" }
12
12
  end
13
13
  end
14
-
14
+
15
15
  def js_or_html
16
16
  respond_to do |type|
17
17
  type.html { render :text => "HTML" }
@@ -34,13 +34,22 @@ class RespondToController < ActionController::Base
34
34
  type.all { render :text => "Nothing" }
35
35
  end
36
36
  end
37
-
37
+
38
+ def forced_xml
39
+ request.format = :xml
40
+
41
+ respond_to do |type|
42
+ type.html { render :text => "HTML" }
43
+ type.xml { render :text => "XML" }
44
+ end
45
+ end
46
+
38
47
  def just_xml
39
48
  respond_to do |type|
40
49
  type.xml { render :text => "XML" }
41
50
  end
42
51
  end
43
-
52
+
44
53
  def using_defaults
45
54
  respond_to do |type|
46
55
  type.html
@@ -48,11 +57,11 @@ class RespondToController < ActionController::Base
48
57
  type.xml
49
58
  end
50
59
  end
51
-
60
+
52
61
  def using_defaults_with_type_list
53
62
  respond_to(:html, :js, :xml)
54
63
  end
55
-
64
+
56
65
  def made_for_content_type
57
66
  respond_to do |type|
58
67
  type.rss { render :text => "RSS" }
@@ -68,7 +77,7 @@ class RespondToController < ActionController::Base
68
77
  type.all { render :text => "Nothing" }
69
78
  end
70
79
  end
71
-
80
+
72
81
  def custom_constant_handling
73
82
  Mime::Type.register("text/x-mobile", :mobile)
74
83
 
@@ -76,10 +85,10 @@ class RespondToController < ActionController::Base
76
85
  type.html { render :text => "HTML" }
77
86
  type.mobile { render :text => "Mobile" }
78
87
  end
79
-
80
- Mime.send :remove_const, :MOBILE
88
+ ensure
89
+ Mime.module_eval { remove_const :MOBILE if const_defined?(:MOBILE) }
81
90
  end
82
-
91
+
83
92
  def custom_constant_handling_without_block
84
93
  Mime::Type.register("text/x-mobile", :mobile)
85
94
 
@@ -87,10 +96,10 @@ class RespondToController < ActionController::Base
87
96
  type.html { render :text => "HTML" }
88
97
  type.mobile
89
98
  end
90
-
91
- Mime.send :remove_const, :MOBILE
99
+
100
+ ensure
101
+ Mime.module_eval { remove_const :MOBILE if const_defined?(:MOBILE) }
92
102
  end
93
-
94
103
 
95
104
  def handle_any
96
105
  respond_to do |type|
@@ -104,21 +113,49 @@ class RespondToController < ActionController::Base
104
113
  type.html
105
114
  type.js
106
115
  end
116
+ end
117
+
118
+ def iphone_with_html_response_type
119
+ Mime::Type.register_alias("text/html", :iphone)
120
+ request.format = :iphone if request.env["HTTP_ACCEPT"] == "text/iphone"
121
+
122
+ respond_to do |type|
123
+ type.html { @type = "Firefox" }
124
+ type.iphone { @type = "iPhone" }
125
+ end
126
+
127
+ ensure
128
+ Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
129
+ end
130
+
131
+ def iphone_with_html_response_type_without_layout
132
+ Mime::Type.register_alias("text/html", :iphone)
133
+ request.format = "iphone" if request.env["HTTP_ACCEPT"] == "text/iphone"
134
+
135
+ respond_to do |type|
136
+ type.html { @type = "Firefox"; render :action => "iphone_with_html_response_type" }
137
+ type.iphone { @type = "iPhone" ; render :action => "iphone_with_html_response_type" }
138
+ end
139
+
140
+ ensure
141
+ Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
107
142
  end
108
143
 
109
144
  def rescue_action(e)
110
145
  raise
111
146
  end
112
-
147
+
113
148
  protected
114
149
  def set_layout
115
- if action_name == "all_types_with_layout"
116
- "standard"
150
+ if ["all_types_with_layout", "iphone_with_html_response_type"].include?(action_name)
151
+ "respond_to/layouts/standard"
152
+ elsif action_name == "iphone_with_html_response_type_without_layout"
153
+ "respond_to/layouts/missing"
117
154
  end
118
155
  end
119
156
  end
120
157
 
121
- RespondToController.template_root = File.dirname(__FILE__) + "/../fixtures/"
158
+ RespondToController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
122
159
 
123
160
  class MimeControllerTest < Test::Unit::TestCase
124
161
  def setup
@@ -128,12 +165,12 @@ class MimeControllerTest < Test::Unit::TestCase
128
165
  @controller = RespondToController.new
129
166
  @request.host = "www.example.com"
130
167
  end
131
-
168
+
132
169
  def test_html
133
170
  @request.env["HTTP_ACCEPT"] = "text/html"
134
171
  get :js_or_html
135
172
  assert_equal 'HTML', @response.body
136
-
173
+
137
174
  get :html_or_xml
138
175
  assert_equal 'HTML', @response.body
139
176
 
@@ -207,41 +244,49 @@ class MimeControllerTest < Test::Unit::TestCase
207
244
  def test_using_defaults
208
245
  @request.env["HTTP_ACCEPT"] = "*/*"
209
246
  get :using_defaults
247
+ assert_equal "text/html", @response.content_type
210
248
  assert_equal 'Hello world!', @response.body
211
249
 
212
250
  @request.env["HTTP_ACCEPT"] = "text/javascript"
213
251
  get :using_defaults
252
+ assert_equal "text/javascript", @response.content_type
214
253
  assert_equal '$("body").visualEffect("highlight");', @response.body
215
254
 
216
255
  @request.env["HTTP_ACCEPT"] = "application/xml"
217
256
  get :using_defaults
257
+ assert_equal "application/xml", @response.content_type
218
258
  assert_equal "<p>Hello world!</p>\n", @response.body
219
259
  end
220
-
260
+
221
261
  def test_using_defaults_with_type_list
222
262
  @request.env["HTTP_ACCEPT"] = "*/*"
223
263
  get :using_defaults_with_type_list
264
+ assert_equal "text/html", @response.content_type
224
265
  assert_equal 'Hello world!', @response.body
225
266
 
226
267
  @request.env["HTTP_ACCEPT"] = "text/javascript"
227
268
  get :using_defaults_with_type_list
269
+ assert_equal "text/javascript", @response.content_type
228
270
  assert_equal '$("body").visualEffect("highlight");', @response.body
229
271
 
230
272
  @request.env["HTTP_ACCEPT"] = "application/xml"
231
273
  get :using_defaults_with_type_list
274
+ assert_equal "application/xml", @response.content_type
232
275
  assert_equal "<p>Hello world!</p>\n", @response.body
233
276
  end
234
-
235
- def test_with_content_type
277
+
278
+ def test_with_atom_content_type
236
279
  @request.env["CONTENT_TYPE"] = "application/atom+xml"
237
280
  get :made_for_content_type
238
281
  assert_equal "ATOM", @response.body
282
+ end
239
283
 
284
+ def test_with_rss_content_type
240
285
  @request.env["CONTENT_TYPE"] = "application/rss+xml"
241
286
  get :made_for_content_type
242
287
  assert_equal "RSS", @response.body
243
288
  end
244
-
289
+
245
290
  def test_synonyms
246
291
  @request.env["HTTP_ACCEPT"] = "application/javascript"
247
292
  get :js_or_html
@@ -251,14 +296,16 @@ class MimeControllerTest < Test::Unit::TestCase
251
296
  get :html_xml_or_rss
252
297
  assert_equal "XML", @response.body
253
298
  end
254
-
299
+
255
300
  def test_custom_types
256
301
  @request.env["HTTP_ACCEPT"] = "application/crazy-xml"
257
302
  get :custom_type_handling
303
+ assert_equal "application/crazy-xml", @response.content_type
258
304
  assert_equal 'Crazy XML', @response.body
259
305
 
260
306
  @request.env["HTTP_ACCEPT"] = "text/html"
261
307
  get :custom_type_handling
308
+ assert_equal "text/html", @response.content_type
262
309
  assert_equal 'HTML', @response.body
263
310
  end
264
311
 
@@ -267,7 +314,7 @@ class MimeControllerTest < Test::Unit::TestCase
267
314
  get :html_or_xml
268
315
  assert_equal 'HTML', @response.body
269
316
  end
270
-
317
+
271
318
  def test_firefox_simulation
272
319
  @request.env["HTTP_ACCEPT"] = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"
273
320
  get :html_or_xml
@@ -287,15 +334,17 @@ class MimeControllerTest < Test::Unit::TestCase
287
334
  get :handle_any
288
335
  assert_equal 'Either JS or XML', @response.body
289
336
  end
290
-
291
- def test_all_types_with_layout
337
+
338
+ def test_rjs_type_skips_layout
292
339
  @request.env["HTTP_ACCEPT"] = "text/javascript"
293
340
  get :all_types_with_layout
294
341
  assert_equal 'RJS for all_types_with_layout', @response.body
342
+ end
295
343
 
344
+ def test_html_type_with_layout
296
345
  @request.env["HTTP_ACCEPT"] = "text/html"
297
346
  get :all_types_with_layout
298
- assert_equal '<html>HTML for all_types_with_layout</html>', @response.body
347
+ assert_equal '<html><div id="html">HTML for all_types_with_layout</div></html>', @response.body
299
348
  end
300
349
 
301
350
  def test_xhr
@@ -305,19 +354,19 @@ class MimeControllerTest < Test::Unit::TestCase
305
354
  xhr :get, :using_defaults
306
355
  assert_equal '$("body").visualEffect("highlight");', @response.body
307
356
  end
308
-
357
+
309
358
  def test_custom_constant
310
359
  get :custom_constant_handling, :format => "mobile"
360
+ assert_equal "text/x-mobile", @response.content_type
311
361
  assert_equal "Mobile", @response.body
312
362
  end
313
-
314
- def custom_constant_handling_without_block
315
-
316
- assert_raised(ActionController::RenderError) do
317
- get :custom_constant_handling, :format => "mobile"
318
- end
363
+
364
+ def test_custom_constant_handling_without_block
365
+ get :custom_constant_handling_without_block, :format => "mobile"
366
+ assert_equal "text/x-mobile", @response.content_type
367
+ assert_equal "Mobile", @response.body
319
368
  end
320
-
369
+
321
370
  def test_forced_format
322
371
  get :html_xml_or_rss
323
372
  assert_equal "HTML", @response.body
@@ -332,20 +381,126 @@ class MimeControllerTest < Test::Unit::TestCase
332
381
  assert_equal "RSS", @response.body
333
382
  end
334
383
 
384
+ def test_internally_forced_format
385
+ get :forced_xml
386
+ assert_equal "XML", @response.body
387
+
388
+ get :forced_xml, :format => "html"
389
+ assert_equal "XML", @response.body
390
+ end
391
+
392
+ def test_extension_synonyms
393
+ get :html_xml_or_rss, :format => "xhtml"
394
+ assert_equal "HTML", @response.body
395
+ end
396
+
335
397
  def test_render_action_for_html
336
398
  @controller.instance_eval do
337
399
  def render(*args)
338
400
  unless args.empty?
339
401
  @action = args.first[:action]
340
402
  end
341
- response.body = @action
403
+ response.body = "#{@action} - #{@template.template_format}"
342
404
  end
343
405
  end
344
406
 
345
407
  get :using_defaults
346
- assert_equal "using_defaults", @response.body
408
+ assert_equal "using_defaults - html", @response.body
347
409
 
348
410
  get :using_defaults, :format => "xml"
349
- assert_equal "using_defaults.rxml", @response.body
411
+ assert_equal "using_defaults - xml", @response.body
412
+ end
413
+
414
+ def test_format_with_custom_response_type
415
+ get :iphone_with_html_response_type
416
+ assert_equal '<html><div id="html">Hello future from Firefox!</div></html>', @response.body
417
+
418
+ get :iphone_with_html_response_type, :format => "iphone"
419
+ assert_equal "text/html", @response.content_type
420
+ assert_equal '<html><div id="iphone">Hello iPhone future from iPhone!</div></html>', @response.body
421
+ end
422
+
423
+ def test_format_with_custom_response_type_and_request_headers
424
+ @request.env["HTTP_ACCEPT"] = "text/iphone"
425
+ get :iphone_with_html_response_type
426
+ assert_equal '<html><div id="iphone">Hello iPhone future from iPhone!</div></html>', @response.body
427
+ assert_equal "text/html", @response.content_type
428
+ end
429
+
430
+ def test_format_with_custom_response_type_and_request_headers_with_only_one_layout_present
431
+ get :iphone_with_html_response_type_without_layout
432
+ assert_equal '<html><div id="html_missing">Hello future from Firefox!</div></html>', @response.body
433
+
434
+ @request.env["HTTP_ACCEPT"] = "text/iphone"
435
+ assert_raises(ActionController::MissingTemplate) { get :iphone_with_html_response_type_without_layout }
436
+ end
437
+ end
438
+
439
+ class AbstractPostController < ActionController::Base
440
+ class << self
441
+ def view_paths
442
+ [ File.dirname(__FILE__) + "/../fixtures/post_test/" ]
443
+ end
444
+ end
445
+ end
446
+
447
+ # For testing layouts which are set automatically
448
+ class PostController < AbstractPostController
449
+ around_filter :with_iphone
450
+
451
+ def index
452
+ respond_to do |type|
453
+ type.html
454
+ type.iphone
455
+ end
456
+ end
457
+
458
+ protected
459
+ def with_iphone
460
+ Mime::Type.register_alias("text/html", :iphone)
461
+ request.format = "iphone" if request.env["HTTP_ACCEPT"] == "text/iphone"
462
+ yield
463
+ ensure
464
+ Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
465
+ end
466
+ end
467
+
468
+ class SuperPostController < PostController
469
+ def index
470
+ respond_to do |type|
471
+ type.html
472
+ type.iphone
473
+ end
474
+ end
475
+ end
476
+
477
+ class MimeControllerLayoutsTest < Test::Unit::TestCase
478
+ def setup
479
+ @request = ActionController::TestRequest.new
480
+ @response = ActionController::TestResponse.new
481
+
482
+ @controller = PostController.new
483
+ @request.host = "www.example.com"
484
+ end
485
+
486
+ def test_missing_layout_renders_properly
487
+ get :index
488
+ assert_equal '<html><div id="html">Hello Firefox</div></html>', @response.body
489
+
490
+ @request.env["HTTP_ACCEPT"] = "text/iphone"
491
+ get :index
492
+ assert_equal 'Hello iPhone', @response.body
493
+ end
494
+
495
+ def test_format_with_inherited_layouts
496
+ @controller = SuperPostController.new
497
+
498
+ get :index
499
+ assert_equal 'Super Firefox', @response.body
500
+
501
+ @request.env["HTTP_ACCEPT"] = "text/iphone"
502
+ get :index
503
+ assert_equal '<html><div id="super_iphone">Super iPhone</div></html>', @response.body
350
504
  end
351
505
  end
506
+
@@ -1,8 +1,8 @@
1
1
  require File.dirname(__FILE__) + '/../abstract_unit'
2
2
 
3
3
  class MimeTypeTest < Test::Unit::TestCase
4
- Mime::PNG = Mime::Type.new("image/png")
5
- Mime::PLAIN = Mime::Type.new("text/plain")
4
+ Mime::Type.register "image/png", :png
5
+ Mime::Type.register "application/pdf", :pdf
6
6
 
7
7
  def test_parse_single
8
8
  Mime::LOOKUP.keys.each do |mime_type|
@@ -11,23 +11,45 @@ class MimeTypeTest < Test::Unit::TestCase
11
11
  end
12
12
 
13
13
  def test_parse_without_q
14
- accept = "text/xml,application/xhtml+xml,text/yaml,application/xml,text/html,image/png,text/plain,*/*"
15
- expect = [Mime::HTML, Mime::XML, Mime::YAML, Mime::PNG, Mime::PLAIN, Mime::ALL]
14
+ accept = "text/xml,application/xhtml+xml,text/yaml,application/xml,text/html,image/png,text/plain,application/pdf,*/*"
15
+ expect = [Mime::HTML, Mime::XML, Mime::YAML, Mime::PNG, Mime::TEXT, Mime::PDF, Mime::ALL]
16
16
  assert_equal expect, Mime::Type.parse(accept)
17
17
  end
18
18
 
19
19
  def test_parse_with_q
20
- accept = "text/xml,application/xhtml+xml,text/yaml; q=0.3,application/xml,text/html; q=0.8,image/png,text/plain; q=0.5,*/*; q=0.2"
21
- expect = [Mime::HTML, Mime::XML, Mime::PNG, Mime::PLAIN, Mime::YAML, Mime::ALL]
20
+ accept = "text/xml,application/xhtml+xml,text/yaml; q=0.3,application/xml,text/html; q=0.8,image/png,text/plain; q=0.5,application/pdf,*/*; q=0.2"
21
+ expect = [Mime::HTML, Mime::XML, Mime::PNG, Mime::PDF, Mime::TEXT, Mime::YAML, Mime::ALL]
22
22
  assert_equal expect, Mime::Type.parse(accept)
23
23
  end
24
24
 
25
+ # Accept header send with user HTTP_USER_AGENT: Sunrise/0.42j (Windows XP)
26
+ def test_parse_crappy_broken_acceptlines
27
+ accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/*,,*/*;q=0.5"
28
+ expect = [Mime::HTML, Mime::XML, "image/*", Mime::TEXT, Mime::ALL]
29
+ assert_equal expect, Mime::Type.parse(accept).collect { |c| c.to_s }
30
+ end
31
+
25
32
  def test_custom_type
26
33
  Mime::Type.register("image/gif", :gif)
27
34
  assert_nothing_raised do
28
35
  Mime::GIF
29
36
  assert_equal Mime::GIF, Mime::SET.last
30
37
  end
31
- Mime.send :remove_const, :GIF
38
+ ensure
39
+ Mime.module_eval { remove_const :GIF if const_defined?(:GIF) }
40
+ end
41
+
42
+ def test_type_convenience_methods
43
+ types = [:html, :xml, :png, :pdf, :yaml, :url_encoded_form]
44
+ types.each do |type|
45
+ mime = Mime.const_get(type.to_s.upcase)
46
+ assert mime.send("#{type}?"), "Mime::#{type.to_s.upcase} is not #{type}?"
47
+ (types - [type]).each { |t| assert !mime.send("#{t}?"), "Mime::#{t.to_s.upcase} is #{t}?" }
48
+ end
49
+ end
50
+
51
+ def test_mime_all_is_html
52
+ assert Mime::ALL.all?, "Mime::ALL is not all?"
53
+ assert Mime::ALL.html?, "Mime::ALL is not html?"
32
54
  end
33
- end
55
+ end