actionpack_csi 2.3.5.p6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. data/CHANGELOG +5184 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +160 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller/assertions/dom_assertions.rb +55 -0
  8. data/lib/action_controller/assertions/model_assertions.rb +21 -0
  9. data/lib/action_controller/assertions/response_assertions.rb +160 -0
  10. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  11. data/lib/action_controller/assertions/selector_assertions.rb +638 -0
  12. data/lib/action_controller/assertions/tag_assertions.rb +127 -0
  13. data/lib/action_controller/base.rb +1423 -0
  14. data/lib/action_controller/benchmarking.rb +107 -0
  15. data/lib/action_controller/caching/actions.rb +177 -0
  16. data/lib/action_controller/caching/fragments.rb +120 -0
  17. data/lib/action_controller/caching/pages.rb +152 -0
  18. data/lib/action_controller/caching/sweeper.rb +45 -0
  19. data/lib/action_controller/caching/sweeping.rb +55 -0
  20. data/lib/action_controller/caching.rb +71 -0
  21. data/lib/action_controller/cgi_ext/cookie.rb +112 -0
  22. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  23. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  24. data/lib/action_controller/cgi_ext.rb +15 -0
  25. data/lib/action_controller/cgi_process.rb +77 -0
  26. data/lib/action_controller/cookies.rb +95 -0
  27. data/lib/action_controller/dispatcher.rb +133 -0
  28. data/lib/action_controller/failsafe.rb +86 -0
  29. data/lib/action_controller/filters.rb +680 -0
  30. data/lib/action_controller/flash.rb +171 -0
  31. data/lib/action_controller/headers.rb +33 -0
  32. data/lib/action_controller/helpers.rb +225 -0
  33. data/lib/action_controller/http_authentication.rb +309 -0
  34. data/lib/action_controller/integration.rb +692 -0
  35. data/lib/action_controller/layout.rb +286 -0
  36. data/lib/action_controller/middleware_stack.rb +119 -0
  37. data/lib/action_controller/middlewares.rb +14 -0
  38. data/lib/action_controller/mime_responds.rb +193 -0
  39. data/lib/action_controller/mime_type.rb +212 -0
  40. data/lib/action_controller/mime_types.rb +21 -0
  41. data/lib/action_controller/params_parser.rb +77 -0
  42. data/lib/action_controller/performance_test.rb +15 -0
  43. data/lib/action_controller/polymorphic_routes.rb +189 -0
  44. data/lib/action_controller/rack_lint_patch.rb +36 -0
  45. data/lib/action_controller/record_identifier.rb +104 -0
  46. data/lib/action_controller/reloader.rb +54 -0
  47. data/lib/action_controller/request.rb +493 -0
  48. data/lib/action_controller/request_forgery_protection.rb +113 -0
  49. data/lib/action_controller/rescue.rb +183 -0
  50. data/lib/action_controller/resources.rb +682 -0
  51. data/lib/action_controller/response.rb +239 -0
  52. data/lib/action_controller/routing/builder.rb +197 -0
  53. data/lib/action_controller/routing/optimisations.rb +130 -0
  54. data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  55. data/lib/action_controller/routing/route.rb +265 -0
  56. data/lib/action_controller/routing/route_set.rb +502 -0
  57. data/lib/action_controller/routing/routing_ext.rb +49 -0
  58. data/lib/action_controller/routing/segments.rb +343 -0
  59. data/lib/action_controller/routing.rb +388 -0
  60. data/lib/action_controller/session/abstract_store.rb +181 -0
  61. data/lib/action_controller/session/cookie_store.rb +221 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +51 -0
  63. data/lib/action_controller/session_management.rb +54 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +181 -0
  66. data/lib/action_controller/string_coercion.rb +29 -0
  67. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  68. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  69. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  70. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  71. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  72. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  73. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  74. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  75. data/lib/action_controller/test_case.rb +209 -0
  76. data/lib/action_controller/test_process.rb +580 -0
  77. data/lib/action_controller/translation.rb +13 -0
  78. data/lib/action_controller/uploaded_file.rb +44 -0
  79. data/lib/action_controller/url_rewriter.rb +216 -0
  80. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  81. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  82. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  83. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  84. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  85. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  86. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  87. data/lib/action_controller/verification.rb +130 -0
  88. data/lib/action_controller.rb +113 -0
  89. data/lib/action_pack/version.rb +9 -0
  90. data/lib/action_pack.rb +24 -0
  91. data/lib/action_view/base.rb +362 -0
  92. data/lib/action_view/erb/util.rb +44 -0
  93. data/lib/action_view/helpers/active_record_helper.rb +305 -0
  94. data/lib/action_view/helpers/asset_tag_helper.rb +694 -0
  95. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  96. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  97. data/lib/action_view/helpers/cache_helper.rb +39 -0
  98. data/lib/action_view/helpers/capture_helper.rb +136 -0
  99. data/lib/action_view/helpers/date_helper.rb +988 -0
  100. data/lib/action_view/helpers/debug_helper.rb +38 -0
  101. data/lib/action_view/helpers/form_helper.rb +1074 -0
  102. data/lib/action_view/helpers/form_options_helper.rb +600 -0
  103. data/lib/action_view/helpers/form_tag_helper.rb +487 -0
  104. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  105. data/lib/action_view/helpers/number_helper.rb +308 -0
  106. data/lib/action_view/helpers/prototype_helper.rb +1305 -0
  107. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  108. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  109. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  110. data/lib/action_view/helpers/sanitize_helper.rb +259 -0
  111. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  112. data/lib/action_view/helpers/tag_helper.rb +150 -0
  113. data/lib/action_view/helpers/text_helper.rb +587 -0
  114. data/lib/action_view/helpers/translation_helper.rb +39 -0
  115. data/lib/action_view/helpers/url_helper.rb +639 -0
  116. data/lib/action_view/helpers.rb +59 -0
  117. data/lib/action_view/inline_template.rb +19 -0
  118. data/lib/action_view/locale/en.yml +117 -0
  119. data/lib/action_view/partials.rb +240 -0
  120. data/lib/action_view/paths.rb +69 -0
  121. data/lib/action_view/reloadable_template.rb +117 -0
  122. data/lib/action_view/renderable.rb +95 -0
  123. data/lib/action_view/renderable_partial.rb +47 -0
  124. data/lib/action_view/safe_buffer.rb +28 -0
  125. data/lib/action_view/template.rb +252 -0
  126. data/lib/action_view/template_error.rb +99 -0
  127. data/lib/action_view/template_handler.rb +34 -0
  128. data/lib/action_view/template_handlers/builder.rb +17 -0
  129. data/lib/action_view/template_handlers/erb.rb +22 -0
  130. data/lib/action_view/template_handlers/rjs.rb +13 -0
  131. data/lib/action_view/template_handlers.rb +48 -0
  132. data/lib/action_view/test_case.rb +162 -0
  133. data/lib/action_view.rb +58 -0
  134. data/lib/actionpack.rb +2 -0
  135. data/test/abstract_unit.rb +61 -0
  136. data/test/active_record_unit.rb +104 -0
  137. data/test/activerecord/active_record_store_test.rb +174 -0
  138. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  139. data/test/adv_attr_test.rb +20 -0
  140. data/test/controller/action_pack_assertions_test.rb +543 -0
  141. data/test/controller/addresses_render_test.rb +37 -0
  142. data/test/controller/assert_select_test.rb +734 -0
  143. data/test/controller/base_test.rb +217 -0
  144. data/test/controller/benchmark_test.rb +32 -0
  145. data/test/controller/caching_test.rb +729 -0
  146. data/test/controller/capture_test.rb +66 -0
  147. data/test/controller/content_type_test.rb +168 -0
  148. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  150. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  151. data/test/controller/cookie_test.rb +134 -0
  152. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  153. data/test/controller/dispatcher_test.rb +144 -0
  154. data/test/controller/dom_assertions_test.rb +53 -0
  155. data/test/controller/failsafe_test.rb +60 -0
  156. data/test/controller/fake_controllers.rb +33 -0
  157. data/test/controller/fake_models.rb +19 -0
  158. data/test/controller/filter_params_test.rb +52 -0
  159. data/test/controller/filters_test.rb +885 -0
  160. data/test/controller/flash_test.rb +147 -0
  161. data/test/controller/header_test.rb +14 -0
  162. data/test/controller/helper_test.rb +224 -0
  163. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  164. data/test/controller/html-scanner/document_test.rb +148 -0
  165. data/test/controller/html-scanner/node_test.rb +89 -0
  166. data/test/controller/html-scanner/sanitizer_test.rb +274 -0
  167. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  168. data/test/controller/html-scanner/text_node_test.rb +50 -0
  169. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  170. data/test/controller/http_basic_authentication_test.rb +113 -0
  171. data/test/controller/http_digest_authentication_test.rb +254 -0
  172. data/test/controller/integration_test.rb +483 -0
  173. data/test/controller/layout_test.rb +215 -0
  174. data/test/controller/logging_test.rb +46 -0
  175. data/test/controller/middleware_stack_test.rb +90 -0
  176. data/test/controller/mime_responds_test.rb +536 -0
  177. data/test/controller/mime_type_test.rb +93 -0
  178. data/test/controller/polymorphic_routes_test.rb +297 -0
  179. data/test/controller/rack_test.rb +311 -0
  180. data/test/controller/record_identifier_test.rb +139 -0
  181. data/test/controller/redirect_test.rb +285 -0
  182. data/test/controller/reloader_test.rb +124 -0
  183. data/test/controller/render_test.rb +1762 -0
  184. data/test/controller/request/json_params_parsing_test.rb +65 -0
  185. data/test/controller/request/multipart_params_parsing_test.rb +162 -0
  186. data/test/controller/request/query_string_parsing_test.rb +120 -0
  187. data/test/controller/request/test_request_test.rb +35 -0
  188. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  189. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  190. data/test/controller/request_forgery_protection_test.rb +265 -0
  191. data/test/controller/request_test.rb +395 -0
  192. data/test/controller/rescue_test.rb +536 -0
  193. data/test/controller/resources_test.rb +1393 -0
  194. data/test/controller/routing_test.rb +2591 -0
  195. data/test/controller/selector_test.rb +628 -0
  196. data/test/controller/send_file_test.rb +171 -0
  197. data/test/controller/session/cookie_store_test.rb +216 -0
  198. data/test/controller/session/mem_cache_store_test.rb +127 -0
  199. data/test/controller/session/test_session_test.rb +58 -0
  200. data/test/controller/test_test.rb +700 -0
  201. data/test/controller/translation_test.rb +26 -0
  202. data/test/controller/url_rewriter_test.rb +385 -0
  203. data/test/controller/verification_test.rb +270 -0
  204. data/test/controller/view_paths_test.rb +141 -0
  205. data/test/controller/webservice_test.rb +273 -0
  206. data/test/fixtures/_top_level_partial.html.erb +1 -0
  207. data/test/fixtures/_top_level_partial_only.erb +1 -0
  208. data/test/fixtures/addresses/list.erb +1 -0
  209. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  210. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  211. data/test/fixtures/companies.yml +24 -0
  212. data/test/fixtures/company.rb +10 -0
  213. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  214. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  215. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  216. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  217. data/test/fixtures/customers/_customer.html.erb +1 -0
  218. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  219. data/test/fixtures/developer.rb +9 -0
  220. data/test/fixtures/developers/_developer.erb +1 -0
  221. data/test/fixtures/developers.yml +21 -0
  222. data/test/fixtures/developers_projects.yml +13 -0
  223. data/test/fixtures/failsafe/500.html +1 -0
  224. data/test/fixtures/fun/games/_game.erb +1 -0
  225. data/test/fixtures/fun/games/hello_world.erb +1 -0
  226. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  227. data/test/fixtures/functional_caching/_partial.erb +3 -0
  228. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  229. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  231. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  232. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  233. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  235. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  236. data/test/fixtures/helpers/abc_helper.rb +5 -0
  237. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  238. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  239. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  240. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  241. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  242. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  243. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  244. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  246. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  247. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  248. data/test/fixtures/layouts/_column.html.erb +2 -0
  249. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  250. data/test/fixtures/layouts/builder.builder +3 -0
  251. data/test/fixtures/layouts/default_html.html.erb +1 -0
  252. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  253. data/test/fixtures/layouts/standard.erb +1 -0
  254. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  255. data/test/fixtures/layouts/xhr.html.erb +2 -0
  256. data/test/fixtures/layouts/yield.erb +2 -0
  257. data/test/fixtures/mascot.rb +3 -0
  258. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  259. data/test/fixtures/mascots.yml +4 -0
  260. data/test/fixtures/multipart/binary_file +0 -0
  261. data/test/fixtures/multipart/boundary_problem_file +10 -0
  262. data/test/fixtures/multipart/bracketed_param +5 -0
  263. data/test/fixtures/multipart/empty +10 -0
  264. data/test/fixtures/multipart/hello.txt +1 -0
  265. data/test/fixtures/multipart/large_text_file +10 -0
  266. data/test/fixtures/multipart/mixed_files +0 -0
  267. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  268. data/test/fixtures/multipart/none +9 -0
  269. data/test/fixtures/multipart/single_parameter +5 -0
  270. data/test/fixtures/multipart/text_file +10 -0
  271. data/test/fixtures/override/test/hello_world.erb +1 -0
  272. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  273. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  274. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  275. data/test/fixtures/post_test/post/index.html.erb +1 -0
  276. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  277. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  278. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  279. data/test/fixtures/project.rb +3 -0
  280. data/test/fixtures/projects/_project.erb +1 -0
  281. data/test/fixtures/projects.yml +7 -0
  282. data/test/fixtures/public/404.html +1 -0
  283. data/test/fixtures/public/500.da.html +1 -0
  284. data/test/fixtures/public/500.html +1 -0
  285. data/test/fixtures/public/absolute/test.css +23 -0
  286. data/test/fixtures/public/absolute/test.js +63 -0
  287. data/test/fixtures/public/images/rails.png +0 -0
  288. data/test/fixtures/public/javascripts/application.js +1 -0
  289. data/test/fixtures/public/javascripts/bank.js +1 -0
  290. data/test/fixtures/public/javascripts/controls.js +1 -0
  291. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  292. data/test/fixtures/public/javascripts/effects.js +1 -0
  293. data/test/fixtures/public/javascripts/prototype.js +1 -0
  294. data/test/fixtures/public/javascripts/robber.js +1 -0
  295. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  296. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  297. data/test/fixtures/public/stylesheets/bank.css +1 -0
  298. data/test/fixtures/public/stylesheets/robber.css +1 -0
  299. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  300. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  301. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  302. data/test/fixtures/replies/_reply.erb +1 -0
  303. data/test/fixtures/replies.yml +15 -0
  304. data/test/fixtures/reply.rb +7 -0
  305. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  306. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  307. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  308. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  309. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  310. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  311. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  312. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  313. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  314. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  315. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  316. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  318. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  319. data/test/fixtures/scope/test/modgreet.erb +1 -0
  320. data/test/fixtures/shared.html.erb +1 -0
  321. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  322. data/test/fixtures/test/_counter.html.erb +1 -0
  323. data/test/fixtures/test/_customer.erb +1 -0
  324. data/test/fixtures/test/_customer_counter.erb +1 -0
  325. data/test/fixtures/test/_customer_greeting.erb +1 -0
  326. data/test/fixtures/test/_customer_with_var.erb +1 -0
  327. data/test/fixtures/test/_form.erb +1 -0
  328. data/test/fixtures/test/_from_helper.erb +1 -0
  329. data/test/fixtures/test/_hash_greeting.erb +1 -0
  330. data/test/fixtures/test/_hash_object.erb +2 -0
  331. data/test/fixtures/test/_hello.builder +1 -0
  332. data/test/fixtures/test/_labelling_form.erb +1 -0
  333. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  334. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  335. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  336. data/test/fixtures/test/_one.html.erb +1 -0
  337. data/test/fixtures/test/_partial.erb +1 -0
  338. data/test/fixtures/test/_partial.html.erb +1 -0
  339. data/test/fixtures/test/_partial.js.erb +1 -0
  340. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  341. data/test/fixtures/test/_partial_only.erb +1 -0
  342. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  343. data/test/fixtures/test/_person.erb +2 -0
  344. data/test/fixtures/test/_raise.html.erb +1 -0
  345. data/test/fixtures/test/_two.html.erb +1 -0
  346. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  347. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  348. data/test/fixtures/test/capturing.erb +4 -0
  349. data/test/fixtures/test/content_for.erb +2 -0
  350. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  351. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  352. data/test/fixtures/test/delete_with_js.rjs +2 -0
  353. data/test/fixtures/test/dont_pick_me +1 -0
  354. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  355. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  356. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  357. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  358. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  359. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  360. data/test/fixtures/test/greeting.erb +1 -0
  361. data/test/fixtures/test/greeting.js.rjs +1 -0
  362. data/test/fixtures/test/hello.builder +4 -0
  363. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  364. data/test/fixtures/test/hello_world.erb +1 -0
  365. data/test/fixtures/test/hello_world.erb~ +1 -0
  366. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  367. data/test/fixtures/test/hello_world_container.builder +3 -0
  368. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  369. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  370. data/test/fixtures/test/hello_xml_world.builder +11 -0
  371. data/test/fixtures/test/hyphen-ated.erb +1 -0
  372. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  373. data/test/fixtures/test/list.erb +1 -0
  374. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  375. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  376. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  377. data/test/fixtures/test/nested_layout.erb +3 -0
  378. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  379. data/test/fixtures/test/potential_conflicts.erb +4 -0
  380. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  381. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  382. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  383. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  384. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  385. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  386. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  387. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  388. data/test/fixtures/test/render_to_string_test.erb +1 -0
  389. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  390. data/test/fixtures/test/template.erb +1 -0
  391. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  392. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  393. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  394. data/test/fixtures/test/utf8.html.erb +2 -0
  395. data/test/fixtures/topic.rb +3 -0
  396. data/test/fixtures/topics/_topic.html.erb +1 -0
  397. data/test/fixtures/topics.yml +22 -0
  398. data/test/template/active_record_helper_i18n_test.rb +44 -0
  399. data/test/template/active_record_helper_test.rb +302 -0
  400. data/test/template/asset_tag_helper_test.rb +771 -0
  401. data/test/template/atom_feed_helper_test.rb +315 -0
  402. data/test/template/benchmark_helper_test.rb +86 -0
  403. data/test/template/compiled_templates_test.rb +204 -0
  404. data/test/template/date_helper_i18n_test.rb +121 -0
  405. data/test/template/date_helper_test.rb +2485 -0
  406. data/test/template/erb_util_test.rb +24 -0
  407. data/test/template/form_helper_test.rb +1393 -0
  408. data/test/template/form_options_helper_i18n_test.rb +27 -0
  409. data/test/template/form_options_helper_test.rb +807 -0
  410. data/test/template/form_tag_helper_test.rb +344 -0
  411. data/test/template/javascript_helper_test.rb +106 -0
  412. data/test/template/number_helper_i18n_test.rb +69 -0
  413. data/test/template/number_helper_test.rb +132 -0
  414. data/test/template/prototype_helper_test.rb +639 -0
  415. data/test/template/raw_output_helper_test.rb +21 -0
  416. data/test/template/record_tag_helper_test.rb +58 -0
  417. data/test/template/render_test.rb +290 -0
  418. data/test/template/sanitize_helper_test.rb +57 -0
  419. data/test/template/scriptaculous_helper_test.rb +90 -0
  420. data/test/template/tag_helper_test.rb +98 -0
  421. data/test/template/template_test.rb +32 -0
  422. data/test/template/test_test.rb +54 -0
  423. data/test/template/text_helper_test.rb +543 -0
  424. data/test/template/translation_helper_test.rb +32 -0
  425. data/test/template/url_helper_test.rb +622 -0
  426. data/test/testing_sandbox.rb +15 -0
  427. data/test/view/safe_buffer_test.rb +36 -0
  428. data/test/view/test_case_test.rb +176 -0
  429. metadata +531 -0
@@ -0,0 +1,46 @@
1
+ require 'abstract_unit'
2
+
3
+ class LoggingController < ActionController::Base
4
+ def show
5
+ render :nothing => true
6
+ end
7
+ end
8
+
9
+ class LoggingTest < ActionController::TestCase
10
+ tests LoggingController
11
+
12
+ class MockLogger
13
+ attr_reader :logged
14
+
15
+ def method_missing(method, *args)
16
+ @logged ||= []
17
+ @logged << args.first
18
+ end
19
+ end
20
+
21
+ setup :set_logger
22
+
23
+ def test_logging_without_parameters
24
+ get :show
25
+ assert_equal 2, logs.size
26
+ assert_nil logs.detect {|l| l =~ /Parameters/ }
27
+ end
28
+
29
+ def test_logging_with_parameters
30
+ get :show, :id => 10
31
+ assert_equal 3, logs.size
32
+
33
+ params = logs.detect {|l| l =~ /Parameters/ }
34
+ assert_equal 'Parameters: {"id"=>"10"}', params
35
+ end
36
+
37
+ private
38
+
39
+ def set_logger
40
+ @controller.logger = MockLogger.new
41
+ end
42
+
43
+ def logs
44
+ @logs ||= @controller.logger.logged.compact.map {|l| l.strip}
45
+ end
46
+ end
@@ -0,0 +1,90 @@
1
+ require 'abstract_unit'
2
+
3
+ class MiddlewareStackTest < ActiveSupport::TestCase
4
+ class FooMiddleware; end
5
+ class BarMiddleware; end
6
+ class BazMiddleware; end
7
+
8
+ def setup
9
+ @stack = ActionController::MiddlewareStack.new
10
+ @stack.use FooMiddleware
11
+ @stack.use BarMiddleware
12
+ end
13
+
14
+ test "use should push middleware as class onto the stack" do
15
+ assert_difference "@stack.size" do
16
+ @stack.use BazMiddleware
17
+ end
18
+ assert_equal BazMiddleware, @stack.last.klass
19
+ end
20
+
21
+ test "use should push middleware as a string onto the stack" do
22
+ assert_difference "@stack.size" do
23
+ @stack.use "MiddlewareStackTest::BazMiddleware"
24
+ end
25
+ assert_equal BazMiddleware, @stack.last.klass
26
+ end
27
+
28
+ test "use should push middleware as a symbol onto the stack" do
29
+ assert_difference "@stack.size" do
30
+ @stack.use :"MiddlewareStackTest::BazMiddleware"
31
+ end
32
+ assert_equal BazMiddleware, @stack.last.klass
33
+ end
34
+
35
+ test "use should push middleware class with arguments onto the stack" do
36
+ assert_difference "@stack.size" do
37
+ @stack.use BazMiddleware, true, :foo => "bar"
38
+ end
39
+ assert_equal BazMiddleware, @stack.last.klass
40
+ assert_equal([true, {:foo => "bar"}], @stack.last.args)
41
+ end
42
+
43
+ test "insert inserts middleware at the integer index" do
44
+ @stack.insert(1, BazMiddleware)
45
+ assert_equal BazMiddleware, @stack[1].klass
46
+ end
47
+
48
+ test "insert_after inserts middleware after the integer index" do
49
+ @stack.insert_after(1, BazMiddleware)
50
+ assert_equal BazMiddleware, @stack[2].klass
51
+ end
52
+
53
+ test "insert_before inserts middleware before another middleware class" do
54
+ @stack.insert_before(BarMiddleware, BazMiddleware)
55
+ assert_equal BazMiddleware, @stack[1].klass
56
+ end
57
+
58
+ test "insert_after inserts middleware after another middleware class" do
59
+ @stack.insert_after(BarMiddleware, BazMiddleware)
60
+ assert_equal BazMiddleware, @stack[2].klass
61
+ end
62
+
63
+ test "swaps one middleware out for another" do
64
+ assert_equal FooMiddleware, @stack[0].klass
65
+ @stack.swap(FooMiddleware, BazMiddleware)
66
+ assert_equal BazMiddleware, @stack[0].klass
67
+ end
68
+
69
+ test "active returns all only enabled middleware" do
70
+ assert_no_difference "@stack.active.size" do
71
+ assert_difference "@stack.size" do
72
+ @stack.use BazMiddleware, :if => lambda { false }
73
+ end
74
+ end
75
+ end
76
+
77
+ test "lazy evaluates middleware class" do
78
+ assert_difference "@stack.size" do
79
+ @stack.use lambda { BazMiddleware }
80
+ end
81
+ assert_equal BazMiddleware, @stack.last.klass
82
+ end
83
+
84
+ test "lazy evaluates middleware arguments" do
85
+ assert_difference "@stack.size" do
86
+ @stack.use BazMiddleware, lambda { :foo }
87
+ end
88
+ assert_equal [:foo], @stack.last.send(:build_args)
89
+ end
90
+ end
@@ -0,0 +1,536 @@
1
+ require 'abstract_unit'
2
+
3
+ class RespondToController < ActionController::Base
4
+ layout :set_layout
5
+
6
+ def html_xml_or_rss
7
+ respond_to do |type|
8
+ type.html { render :text => "HTML" }
9
+ type.xml { render :text => "XML" }
10
+ type.rss { render :text => "RSS" }
11
+ type.all { render :text => "Nothing" }
12
+ end
13
+ end
14
+
15
+ def js_or_html
16
+ respond_to do |type|
17
+ type.html { render :text => "HTML" }
18
+ type.js { render :text => "JS" }
19
+ type.all { render :text => "Nothing" }
20
+ end
21
+ end
22
+
23
+ def json_or_yaml
24
+ respond_to do |type|
25
+ type.json { render :text => "JSON" }
26
+ type.yaml { render :text => "YAML" }
27
+ end
28
+ end
29
+
30
+ def html_or_xml
31
+ respond_to do |type|
32
+ type.html { render :text => "HTML" }
33
+ type.xml { render :text => "XML" }
34
+ type.all { render :text => "Nothing" }
35
+ end
36
+ end
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
+
47
+ def just_xml
48
+ respond_to do |type|
49
+ type.xml { render :text => "XML" }
50
+ end
51
+ end
52
+
53
+ def using_defaults
54
+ respond_to do |type|
55
+ type.html
56
+ type.js
57
+ type.xml
58
+ end
59
+ end
60
+
61
+ def using_defaults_with_type_list
62
+ respond_to(:html, :js, :xml)
63
+ end
64
+
65
+ def made_for_content_type
66
+ respond_to do |type|
67
+ type.rss { render :text => "RSS" }
68
+ type.atom { render :text => "ATOM" }
69
+ type.all { render :text => "Nothing" }
70
+ end
71
+ end
72
+
73
+ def custom_type_handling
74
+ respond_to do |type|
75
+ type.html { render :text => "HTML" }
76
+ type.custom("application/crazy-xml") { render :text => "Crazy XML" }
77
+ type.all { render :text => "Nothing" }
78
+ end
79
+ end
80
+
81
+ def custom_constant_handling
82
+ Mime::Type.register("text/x-mobile", :mobile)
83
+
84
+ respond_to do |type|
85
+ type.html { render :text => "HTML" }
86
+ type.mobile { render :text => "Mobile" }
87
+ end
88
+ ensure
89
+ Mime.module_eval { remove_const :MOBILE if const_defined?(:MOBILE) }
90
+ end
91
+
92
+ def custom_constant_handling_without_block
93
+ Mime::Type.register("text/x-mobile", :mobile)
94
+
95
+ respond_to do |type|
96
+ type.html { render :text => "HTML" }
97
+ type.mobile
98
+ end
99
+
100
+ ensure
101
+ Mime.module_eval { remove_const :MOBILE if const_defined?(:MOBILE) }
102
+ end
103
+
104
+ def handle_any
105
+ respond_to do |type|
106
+ type.html { render :text => "HTML" }
107
+ type.any(:js, :xml) { render :text => "Either JS or XML" }
108
+ end
109
+ end
110
+
111
+ def handle_any_any
112
+ respond_to do |type|
113
+ type.html { render :text => 'HTML' }
114
+ type.any { render :text => 'Whatever you ask for, I got it' }
115
+ end
116
+ end
117
+
118
+ def all_types_with_layout
119
+ respond_to do |type|
120
+ type.html
121
+ type.js
122
+ end
123
+ end
124
+
125
+ def iphone_with_html_response_type
126
+ Mime::Type.register_alias("text/html", :iphone)
127
+ request.format = :iphone if request.env["HTTP_ACCEPT"] == "text/iphone"
128
+
129
+ respond_to do |type|
130
+ type.html { @type = "Firefox" }
131
+ type.iphone { @type = "iPhone" }
132
+ end
133
+
134
+ ensure
135
+ Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
136
+ end
137
+
138
+ def iphone_with_html_response_type_without_layout
139
+ Mime::Type.register_alias("text/html", :iphone)
140
+ request.format = "iphone" if request.env["HTTP_ACCEPT"] == "text/iphone"
141
+
142
+ respond_to do |type|
143
+ type.html { @type = "Firefox"; render :action => "iphone_with_html_response_type" }
144
+ type.iphone { @type = "iPhone" ; render :action => "iphone_with_html_response_type" }
145
+ end
146
+
147
+ ensure
148
+ Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
149
+ end
150
+
151
+ def rescue_action(e)
152
+ raise
153
+ end
154
+
155
+ protected
156
+ def set_layout
157
+ if ["all_types_with_layout", "iphone_with_html_response_type"].include?(action_name)
158
+ "respond_to/layouts/standard"
159
+ elsif action_name == "iphone_with_html_response_type_without_layout"
160
+ "respond_to/layouts/missing"
161
+ end
162
+ end
163
+ end
164
+
165
+ class MimeControllerTest < ActionController::TestCase
166
+ tests RespondToController
167
+
168
+ def setup
169
+ ActionController::Base.use_accept_header = true
170
+ @request.host = "www.example.com"
171
+ end
172
+
173
+ def teardown
174
+ ActionController::Base.use_accept_header = false
175
+ end
176
+
177
+ def test_html
178
+ @request.accept = "text/html"
179
+ get :js_or_html
180
+ assert_equal 'HTML', @response.body
181
+
182
+ get :html_or_xml
183
+ assert_equal 'HTML', @response.body
184
+
185
+ get :just_xml
186
+ assert_response 406
187
+ end
188
+
189
+ def test_all
190
+ @request.accept = "*/*"
191
+ get :js_or_html
192
+ assert_equal 'HTML', @response.body # js is not part of all
193
+
194
+ get :html_or_xml
195
+ assert_equal 'HTML', @response.body
196
+
197
+ get :just_xml
198
+ assert_equal 'XML', @response.body
199
+ end
200
+
201
+ def test_xml
202
+ @request.accept = "application/xml"
203
+ get :html_xml_or_rss
204
+ assert_equal 'XML', @response.body
205
+ end
206
+
207
+ def test_js_or_html
208
+ @request.accept = "text/javascript, text/html"
209
+ get :js_or_html
210
+ assert_equal 'JS', @response.body
211
+
212
+ get :html_or_xml
213
+ assert_equal 'HTML', @response.body
214
+
215
+ get :just_xml
216
+ assert_response 406
217
+ end
218
+
219
+ def test_json_or_yaml
220
+ get :json_or_yaml
221
+ assert_equal 'JSON', @response.body
222
+
223
+ get :json_or_yaml, :format => 'json'
224
+ assert_equal 'JSON', @response.body
225
+
226
+ get :json_or_yaml, :format => 'yaml'
227
+ assert_equal 'YAML', @response.body
228
+
229
+ { 'YAML' => %w(text/yaml),
230
+ 'JSON' => %w(application/json text/x-json)
231
+ }.each do |body, content_types|
232
+ content_types.each do |content_type|
233
+ @request.accept = content_type
234
+ get :json_or_yaml
235
+ assert_equal body, @response.body
236
+ end
237
+ end
238
+ end
239
+
240
+ def test_js_or_anything
241
+ @request.accept = "text/javascript, */*"
242
+ get :js_or_html
243
+ assert_equal 'JS', @response.body
244
+
245
+ get :html_or_xml
246
+ assert_equal 'HTML', @response.body
247
+
248
+ get :just_xml
249
+ assert_equal 'XML', @response.body
250
+ end
251
+
252
+ def test_using_defaults
253
+ @request.accept = "*/*"
254
+ get :using_defaults
255
+ assert_equal "text/html", @response.content_type
256
+ assert_equal 'Hello world!', @response.body
257
+
258
+ @request.accept = "text/javascript"
259
+ get :using_defaults
260
+ assert_equal "text/javascript", @response.content_type
261
+ assert_equal '$("body").visualEffect("highlight");', @response.body
262
+
263
+ @request.accept = "application/xml"
264
+ get :using_defaults
265
+ assert_equal "application/xml", @response.content_type
266
+ assert_equal "<p>Hello world!</p>\n", @response.body
267
+ end
268
+
269
+ def test_using_defaults_with_type_list
270
+ @request.accept = "*/*"
271
+ get :using_defaults_with_type_list
272
+ assert_equal "text/html", @response.content_type
273
+ assert_equal 'Hello world!', @response.body
274
+
275
+ @request.accept = "text/javascript"
276
+ get :using_defaults_with_type_list
277
+ assert_equal "text/javascript", @response.content_type
278
+ assert_equal '$("body").visualEffect("highlight");', @response.body
279
+
280
+ @request.accept = "application/xml"
281
+ get :using_defaults_with_type_list
282
+ assert_equal "application/xml", @response.content_type
283
+ assert_equal "<p>Hello world!</p>\n", @response.body
284
+ end
285
+
286
+ def test_with_atom_content_type
287
+ @request.env["CONTENT_TYPE"] = "application/atom+xml"
288
+ get :made_for_content_type
289
+ assert_equal "ATOM", @response.body
290
+ end
291
+
292
+ def test_with_rss_content_type
293
+ @request.env["CONTENT_TYPE"] = "application/rss+xml"
294
+ get :made_for_content_type
295
+ assert_equal "RSS", @response.body
296
+ end
297
+
298
+ def test_synonyms
299
+ @request.accept = "application/javascript"
300
+ get :js_or_html
301
+ assert_equal 'JS', @response.body
302
+
303
+ @request.accept = "application/x-xml"
304
+ get :html_xml_or_rss
305
+ assert_equal "XML", @response.body
306
+ end
307
+
308
+ def test_custom_types
309
+ @request.accept = "application/crazy-xml"
310
+ get :custom_type_handling
311
+ assert_equal "application/crazy-xml", @response.content_type
312
+ assert_equal 'Crazy XML', @response.body
313
+
314
+ @request.accept = "text/html"
315
+ get :custom_type_handling
316
+ assert_equal "text/html", @response.content_type
317
+ assert_equal 'HTML', @response.body
318
+ end
319
+
320
+ def test_xhtml_alias
321
+ @request.accept = "application/xhtml+xml,application/xml"
322
+ get :html_or_xml
323
+ assert_equal 'HTML', @response.body
324
+ end
325
+
326
+ def test_firefox_simulation
327
+ @request.accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"
328
+ get :html_or_xml
329
+ assert_equal 'HTML', @response.body
330
+ end
331
+
332
+ def test_handle_any
333
+ @request.accept = "*/*"
334
+ get :handle_any
335
+ assert_equal 'HTML', @response.body
336
+
337
+ @request.accept = "text/javascript"
338
+ get :handle_any
339
+ assert_equal 'Either JS or XML', @response.body
340
+
341
+ @request.accept = "text/xml"
342
+ get :handle_any
343
+ assert_equal 'Either JS or XML', @response.body
344
+ end
345
+
346
+ def test_handle_any_any
347
+ @request.accept = "*/*"
348
+ get :handle_any_any
349
+ assert_equal 'HTML', @response.body
350
+ end
351
+
352
+ def test_handle_any_any_parameter_format
353
+ get :handle_any_any, {:format=>'html'}
354
+ assert_equal 'HTML', @response.body
355
+ end
356
+
357
+ def test_handle_any_any_explicit_html
358
+ @request.accept = "text/html"
359
+ get :handle_any_any
360
+ assert_equal 'HTML', @response.body
361
+ end
362
+
363
+ def test_handle_any_any_javascript
364
+ @request.accept = "text/javascript"
365
+ get :handle_any_any
366
+ assert_equal 'Whatever you ask for, I got it', @response.body
367
+ end
368
+
369
+ def test_handle_any_any_xml
370
+ @request.accept = "text/xml"
371
+ get :handle_any_any
372
+ assert_equal 'Whatever you ask for, I got it', @response.body
373
+ end
374
+
375
+ def test_rjs_type_skips_layout
376
+ @request.accept = "text/javascript"
377
+ get :all_types_with_layout
378
+ assert_equal 'RJS for all_types_with_layout', @response.body
379
+ end
380
+
381
+ def test_html_type_with_layout
382
+ @request.accept = "text/html"
383
+ get :all_types_with_layout
384
+ assert_equal '<html><div id="html">HTML for all_types_with_layout</div></html>', @response.body
385
+ end
386
+
387
+ def test_xhr
388
+ xhr :get, :js_or_html
389
+ assert_equal 'JS', @response.body
390
+
391
+ xhr :get, :using_defaults
392
+ assert_equal '$("body").visualEffect("highlight");', @response.body
393
+ end
394
+
395
+ def test_custom_constant
396
+ get :custom_constant_handling, :format => "mobile"
397
+ assert_equal "text/x-mobile", @response.content_type
398
+ assert_equal "Mobile", @response.body
399
+ end
400
+
401
+ def test_custom_constant_handling_without_block
402
+ get :custom_constant_handling_without_block, :format => "mobile"
403
+ assert_equal "text/x-mobile", @response.content_type
404
+ assert_equal "Mobile", @response.body
405
+ end
406
+
407
+ def test_forced_format
408
+ get :html_xml_or_rss
409
+ assert_equal "HTML", @response.body
410
+
411
+ get :html_xml_or_rss, :format => "html"
412
+ assert_equal "HTML", @response.body
413
+
414
+ get :html_xml_or_rss, :format => "xml"
415
+ assert_equal "XML", @response.body
416
+
417
+ get :html_xml_or_rss, :format => "rss"
418
+ assert_equal "RSS", @response.body
419
+ end
420
+
421
+ def test_internally_forced_format
422
+ get :forced_xml
423
+ assert_equal "XML", @response.body
424
+
425
+ get :forced_xml, :format => "html"
426
+ assert_equal "XML", @response.body
427
+ end
428
+
429
+ def test_extension_synonyms
430
+ get :html_xml_or_rss, :format => "xhtml"
431
+ assert_equal "HTML", @response.body
432
+ end
433
+
434
+ def test_render_action_for_html
435
+ @controller.instance_eval do
436
+ def render(*args)
437
+ unless args.empty?
438
+ @action = args.first[:action]
439
+ end
440
+ response.body = "#{@action} - #{@template.template_format}"
441
+ end
442
+ end
443
+
444
+ get :using_defaults
445
+ assert_equal "using_defaults - html", @response.body
446
+
447
+ get :using_defaults, :format => "xml"
448
+ assert_equal "using_defaults - xml", @response.body
449
+ end
450
+
451
+ def test_format_with_custom_response_type
452
+ get :iphone_with_html_response_type
453
+ assert_equal '<html><div id="html">Hello future from Firefox!</div></html>', @response.body
454
+
455
+ get :iphone_with_html_response_type, :format => "iphone"
456
+ assert_equal "text/html", @response.content_type
457
+ assert_equal '<html><div id="iphone">Hello iPhone future from iPhone!</div></html>', @response.body
458
+ end
459
+
460
+ def test_format_with_custom_response_type_and_request_headers
461
+ @request.accept = "text/iphone"
462
+ get :iphone_with_html_response_type
463
+ assert_equal '<html><div id="iphone">Hello iPhone future from iPhone!</div></html>', @response.body
464
+ assert_equal "text/html", @response.content_type
465
+ end
466
+
467
+ def test_format_with_custom_response_type_and_request_headers_with_only_one_layout_present
468
+ get :iphone_with_html_response_type_without_layout
469
+ assert_equal '<html><div id="html_missing">Hello future from Firefox!</div></html>', @response.body
470
+
471
+ @request.accept = "text/iphone"
472
+ assert_raise(ActionView::MissingTemplate) { get :iphone_with_html_response_type_without_layout }
473
+ end
474
+ end
475
+
476
+ class AbstractPostController < ActionController::Base
477
+ self.view_paths = File.dirname(__FILE__) + "/../fixtures/post_test/"
478
+ end
479
+
480
+ # For testing layouts which are set automatically
481
+ class PostController < AbstractPostController
482
+ around_filter :with_iphone
483
+
484
+ def index
485
+ respond_to do |type|
486
+ type.html
487
+ type.iphone
488
+ end
489
+ end
490
+
491
+ protected
492
+ def with_iphone
493
+ Mime::Type.register_alias("text/html", :iphone)
494
+ request.format = "iphone" if request.env["HTTP_ACCEPT"] == "text/iphone"
495
+ yield
496
+ ensure
497
+ Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
498
+ end
499
+ end
500
+
501
+ class SuperPostController < PostController
502
+ def index
503
+ respond_to do |type|
504
+ type.html
505
+ type.iphone
506
+ end
507
+ end
508
+ end
509
+
510
+ class MimeControllerLayoutsTest < ActionController::TestCase
511
+ tests PostController
512
+
513
+ def setup
514
+ @request.host = "www.example.com"
515
+ end
516
+
517
+ def test_missing_layout_renders_properly
518
+ get :index
519
+ assert_equal '<html><div id="html">Hello Firefox</div></html>', @response.body
520
+
521
+ @request.accept = "text/iphone"
522
+ get :index
523
+ assert_equal 'Hello iPhone', @response.body
524
+ end
525
+
526
+ def test_format_with_inherited_layouts
527
+ @controller = SuperPostController.new
528
+
529
+ get :index
530
+ assert_equal 'Super Firefox', @response.body
531
+
532
+ @request.accept = "text/iphone"
533
+ get :index
534
+ assert_equal '<html><div id="super_iphone">Super iPhone</div></html>', @response.body
535
+ end
536
+ end