actionpack-2.3.17-rack-upgrade 2.3.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (441) hide show
  1. data/CHANGELOG +5250 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +158 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller.rb +113 -0
  8. data/lib/action_controller/assertions/dom_assertions.rb +55 -0
  9. data/lib/action_controller/assertions/model_assertions.rb +21 -0
  10. data/lib/action_controller/assertions/response_assertions.rb +169 -0
  11. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  12. data/lib/action_controller/assertions/selector_assertions.rb +638 -0
  13. data/lib/action_controller/assertions/tag_assertions.rb +127 -0
  14. data/lib/action_controller/base.rb +1425 -0
  15. data/lib/action_controller/benchmarking.rb +107 -0
  16. data/lib/action_controller/caching.rb +71 -0
  17. data/lib/action_controller/caching/actions.rb +177 -0
  18. data/lib/action_controller/caching/fragments.rb +120 -0
  19. data/lib/action_controller/caching/pages.rb +152 -0
  20. data/lib/action_controller/caching/sweeper.rb +45 -0
  21. data/lib/action_controller/caching/sweeping.rb +55 -0
  22. data/lib/action_controller/cgi_ext.rb +15 -0
  23. data/lib/action_controller/cgi_ext/cookie.rb +112 -0
  24. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  25. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  26. data/lib/action_controller/cgi_process.rb +77 -0
  27. data/lib/action_controller/cookies.rb +197 -0
  28. data/lib/action_controller/dispatcher.rb +133 -0
  29. data/lib/action_controller/failsafe.rb +87 -0
  30. data/lib/action_controller/filters.rb +680 -0
  31. data/lib/action_controller/flash.rb +213 -0
  32. data/lib/action_controller/headers.rb +33 -0
  33. data/lib/action_controller/helpers.rb +225 -0
  34. data/lib/action_controller/http_authentication.rb +309 -0
  35. data/lib/action_controller/integration.rb +708 -0
  36. data/lib/action_controller/layout.rb +286 -0
  37. data/lib/action_controller/middleware_stack.rb +119 -0
  38. data/lib/action_controller/middlewares.rb +14 -0
  39. data/lib/action_controller/mime_responds.rb +193 -0
  40. data/lib/action_controller/mime_type.rb +212 -0
  41. data/lib/action_controller/mime_types.rb +21 -0
  42. data/lib/action_controller/params_parser.rb +77 -0
  43. data/lib/action_controller/performance_test.rb +15 -0
  44. data/lib/action_controller/polymorphic_routes.rb +189 -0
  45. data/lib/action_controller/rack_lint_patch.rb +36 -0
  46. data/lib/action_controller/record_identifier.rb +104 -0
  47. data/lib/action_controller/reloader.rb +54 -0
  48. data/lib/action_controller/request.rb +518 -0
  49. data/lib/action_controller/request_forgery_protection.rb +116 -0
  50. data/lib/action_controller/rescue.rb +183 -0
  51. data/lib/action_controller/resources.rb +682 -0
  52. data/lib/action_controller/response.rb +237 -0
  53. data/lib/action_controller/routing.rb +388 -0
  54. data/lib/action_controller/routing/builder.rb +197 -0
  55. data/lib/action_controller/routing/optimisations.rb +130 -0
  56. data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  57. data/lib/action_controller/routing/route.rb +265 -0
  58. data/lib/action_controller/routing/route_set.rb +503 -0
  59. data/lib/action_controller/routing/routing_ext.rb +49 -0
  60. data/lib/action_controller/routing/segments.rb +343 -0
  61. data/lib/action_controller/session/abstract_store.rb +276 -0
  62. data/lib/action_controller/session/cookie_store.rb +240 -0
  63. data/lib/action_controller/session/mem_cache_store.rb +60 -0
  64. data/lib/action_controller/session_management.rb +54 -0
  65. data/lib/action_controller/status_codes.rb +88 -0
  66. data/lib/action_controller/streaming.rb +181 -0
  67. data/lib/action_controller/string_coercion.rb +29 -0
  68. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  69. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  70. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  71. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  72. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  73. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  74. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  75. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  76. data/lib/action_controller/test_case.rb +209 -0
  77. data/lib/action_controller/test_process.rb +580 -0
  78. data/lib/action_controller/translation.rb +13 -0
  79. data/lib/action_controller/uploaded_file.rb +44 -0
  80. data/lib/action_controller/url_rewriter.rb +229 -0
  81. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  82. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  83. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  84. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  85. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  86. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  87. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  88. data/lib/action_controller/verification.rb +130 -0
  89. data/lib/action_pack.rb +24 -0
  90. data/lib/action_pack/version.rb +9 -0
  91. data/lib/action_view.rb +58 -0
  92. data/lib/action_view/base.rb +362 -0
  93. data/lib/action_view/helpers.rb +61 -0
  94. data/lib/action_view/helpers/active_record_helper.rb +305 -0
  95. data/lib/action_view/helpers/asset_tag_helper.rb +695 -0
  96. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  97. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  98. data/lib/action_view/helpers/cache_helper.rb +39 -0
  99. data/lib/action_view/helpers/capture_helper.rb +136 -0
  100. data/lib/action_view/helpers/csrf_helper.rb +14 -0
  101. data/lib/action_view/helpers/date_helper.rb +989 -0
  102. data/lib/action_view/helpers/debug_helper.rb +38 -0
  103. data/lib/action_view/helpers/form_helper.rb +1118 -0
  104. data/lib/action_view/helpers/form_options_helper.rb +599 -0
  105. data/lib/action_view/helpers/form_tag_helper.rb +490 -0
  106. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  107. data/lib/action_view/helpers/number_helper.rb +308 -0
  108. data/lib/action_view/helpers/prototype_helper.rb +1305 -0
  109. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  110. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  111. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  112. data/lib/action_view/helpers/sanitize_helper.rb +251 -0
  113. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  114. data/lib/action_view/helpers/tag_helper.rb +151 -0
  115. data/lib/action_view/helpers/text_helper.rb +597 -0
  116. data/lib/action_view/helpers/translation_helper.rb +67 -0
  117. data/lib/action_view/helpers/url_helper.rb +637 -0
  118. data/lib/action_view/inline_template.rb +19 -0
  119. data/lib/action_view/locale/en.yml +117 -0
  120. data/lib/action_view/partials.rb +241 -0
  121. data/lib/action_view/paths.rb +77 -0
  122. data/lib/action_view/reloadable_template.rb +117 -0
  123. data/lib/action_view/renderable.rb +109 -0
  124. data/lib/action_view/renderable_partial.rb +53 -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.rb +48 -0
  129. data/lib/action_view/template_handlers/builder.rb +17 -0
  130. data/lib/action_view/template_handlers/erb.rb +25 -0
  131. data/lib/action_view/template_handlers/rjs.rb +13 -0
  132. data/lib/action_view/test_case.rb +162 -0
  133. data/lib/actionpack.rb +2 -0
  134. data/test/abstract_unit.rb +78 -0
  135. data/test/active_record_unit.rb +104 -0
  136. data/test/activerecord/active_record_store_test.rb +221 -0
  137. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  138. data/test/adv_attr_test.rb +20 -0
  139. data/test/controller/action_pack_assertions_test.rb +545 -0
  140. data/test/controller/addresses_render_test.rb +37 -0
  141. data/test/controller/assert_select_test.rb +735 -0
  142. data/test/controller/base_test.rb +217 -0
  143. data/test/controller/benchmark_test.rb +32 -0
  144. data/test/controller/caching_test.rb +743 -0
  145. data/test/controller/capture_test.rb +66 -0
  146. data/test/controller/content_type_test.rb +178 -0
  147. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  148. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  150. data/test/controller/cookie_test.rb +208 -0
  151. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  152. data/test/controller/dispatcher_test.rb +144 -0
  153. data/test/controller/dom_assertions_test.rb +53 -0
  154. data/test/controller/failsafe_test.rb +60 -0
  155. data/test/controller/fake_controllers.rb +33 -0
  156. data/test/controller/fake_models.rb +19 -0
  157. data/test/controller/filter_params_test.rb +52 -0
  158. data/test/controller/filters_test.rb +885 -0
  159. data/test/controller/flash_test.rb +174 -0
  160. data/test/controller/header_test.rb +14 -0
  161. data/test/controller/helper_test.rb +224 -0
  162. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  163. data/test/controller/html-scanner/document_test.rb +148 -0
  164. data/test/controller/html-scanner/node_test.rb +89 -0
  165. data/test/controller/html-scanner/sanitizer_test.rb +281 -0
  166. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  167. data/test/controller/html-scanner/text_node_test.rb +50 -0
  168. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  169. data/test/controller/http_basic_authentication_test.rb +113 -0
  170. data/test/controller/http_digest_authentication_test.rb +254 -0
  171. data/test/controller/integration_test.rb +526 -0
  172. data/test/controller/layout_test.rb +215 -0
  173. data/test/controller/localized_templates_test.rb +24 -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/output_escaping_test.rb +19 -0
  179. data/test/controller/polymorphic_routes_test.rb +297 -0
  180. data/test/controller/rack_test.rb +308 -0
  181. data/test/controller/record_identifier_test.rb +139 -0
  182. data/test/controller/redirect_test.rb +285 -0
  183. data/test/controller/reloader_test.rb +125 -0
  184. data/test/controller/render_test.rb +1783 -0
  185. data/test/controller/request/json_params_parsing_test.rb +65 -0
  186. data/test/controller/request/multipart_params_parsing_test.rb +177 -0
  187. data/test/controller/request/query_string_parsing_test.rb +129 -0
  188. data/test/controller/request/test_request_test.rb +35 -0
  189. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  190. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  191. data/test/controller/request_forgery_protection_test.rb +233 -0
  192. data/test/controller/request_test.rb +398 -0
  193. data/test/controller/rescue_test.rb +541 -0
  194. data/test/controller/resources_test.rb +1393 -0
  195. data/test/controller/routing_test.rb +2592 -0
  196. data/test/controller/selector_test.rb +628 -0
  197. data/test/controller/send_file_test.rb +171 -0
  198. data/test/controller/session/abstract_store_test.rb +64 -0
  199. data/test/controller/session/cookie_store_test.rb +354 -0
  200. data/test/controller/session/mem_cache_store_test.rb +187 -0
  201. data/test/controller/session/test_session_test.rb +58 -0
  202. data/test/controller/test_test.rb +700 -0
  203. data/test/controller/translation_test.rb +26 -0
  204. data/test/controller/url_rewriter_test.rb +395 -0
  205. data/test/controller/verification_test.rb +270 -0
  206. data/test/controller/view_paths_test.rb +141 -0
  207. data/test/controller/webservice_test.rb +273 -0
  208. data/test/fixtures/_top_level_partial.html.erb +1 -0
  209. data/test/fixtures/_top_level_partial_only.erb +1 -0
  210. data/test/fixtures/addresses/list.erb +1 -0
  211. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  212. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  213. data/test/fixtures/companies.yml +24 -0
  214. data/test/fixtures/company.rb +10 -0
  215. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  216. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  217. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  218. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  219. data/test/fixtures/customers/_customer.html.erb +1 -0
  220. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  221. data/test/fixtures/developer.rb +9 -0
  222. data/test/fixtures/developers.yml +21 -0
  223. data/test/fixtures/developers/_developer.erb +1 -0
  224. data/test/fixtures/developers_projects.yml +13 -0
  225. data/test/fixtures/failsafe/500.html +1 -0
  226. data/test/fixtures/fun/games/_game.erb +1 -0
  227. data/test/fixtures/fun/games/hello_world.erb +1 -0
  228. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  229. data/test/fixtures/functional_caching/_partial.erb +3 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  231. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  232. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  233. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  235. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  236. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  237. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  238. data/test/fixtures/helpers/abc_helper.rb +5 -0
  239. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  240. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  241. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  242. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  243. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  244. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  246. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  247. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  248. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  249. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  250. data/test/fixtures/layouts/_column.html.erb +2 -0
  251. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  252. data/test/fixtures/layouts/builder.builder +3 -0
  253. data/test/fixtures/layouts/default_html.html.erb +1 -0
  254. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  255. data/test/fixtures/layouts/standard.erb +1 -0
  256. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  257. data/test/fixtures/layouts/xhr.html.erb +2 -0
  258. data/test/fixtures/layouts/yield.erb +2 -0
  259. data/test/fixtures/localized/hello_world.de.html +1 -0
  260. data/test/fixtures/localized/hello_world.en.html +1 -0
  261. data/test/fixtures/mascot.rb +3 -0
  262. data/test/fixtures/mascots.yml +4 -0
  263. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  264. data/test/fixtures/multipart/binary_file +0 -0
  265. data/test/fixtures/multipart/boundary_problem_file +10 -0
  266. data/test/fixtures/multipart/bracketed_param +5 -0
  267. data/test/fixtures/multipart/empty +10 -0
  268. data/test/fixtures/multipart/hello.txt +1 -0
  269. data/test/fixtures/multipart/large_text_file +10 -0
  270. data/test/fixtures/multipart/mixed_files +0 -0
  271. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  272. data/test/fixtures/multipart/none +9 -0
  273. data/test/fixtures/multipart/single_parameter +5 -0
  274. data/test/fixtures/multipart/text_file +10 -0
  275. data/test/fixtures/override/test/hello_world.erb +1 -0
  276. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  277. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  278. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  279. data/test/fixtures/post_test/post/index.html.erb +1 -0
  280. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  281. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  282. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  283. data/test/fixtures/project.rb +3 -0
  284. data/test/fixtures/projects.yml +7 -0
  285. data/test/fixtures/projects/_project.erb +1 -0
  286. data/test/fixtures/public/404.html +1 -0
  287. data/test/fixtures/public/500.da.html +1 -0
  288. data/test/fixtures/public/500.html +1 -0
  289. data/test/fixtures/public/absolute/test.css +23 -0
  290. data/test/fixtures/public/absolute/test.js +63 -0
  291. data/test/fixtures/public/images/rails.png +0 -0
  292. data/test/fixtures/public/javascripts/application.js +1 -0
  293. data/test/fixtures/public/javascripts/bank.js +1 -0
  294. data/test/fixtures/public/javascripts/controls.js +1 -0
  295. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  296. data/test/fixtures/public/javascripts/effects.js +1 -0
  297. data/test/fixtures/public/javascripts/prototype.js +1 -0
  298. data/test/fixtures/public/javascripts/robber.js +1 -0
  299. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  300. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  301. data/test/fixtures/public/stylesheets/bank.css +1 -0
  302. data/test/fixtures/public/stylesheets/robber.css +1 -0
  303. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  304. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  305. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  306. data/test/fixtures/replies.yml +15 -0
  307. data/test/fixtures/replies/_reply.erb +1 -0
  308. data/test/fixtures/reply.rb +7 -0
  309. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  310. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  311. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  312. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  313. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  314. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  315. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  316. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  318. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  319. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  320. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  321. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  322. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  323. data/test/fixtures/scope/test/modgreet.erb +1 -0
  324. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +10 -0
  325. data/test/fixtures/shared.html.erb +1 -0
  326. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  327. data/test/fixtures/test/_counter.html.erb +1 -0
  328. data/test/fixtures/test/_customer.erb +1 -0
  329. data/test/fixtures/test/_customer_counter.erb +1 -0
  330. data/test/fixtures/test/_customer_counter_with_as.erb +1 -0
  331. data/test/fixtures/test/_customer_greeting.erb +1 -0
  332. data/test/fixtures/test/_customer_with_var.erb +1 -0
  333. data/test/fixtures/test/_form.erb +1 -0
  334. data/test/fixtures/test/_from_helper.erb +1 -0
  335. data/test/fixtures/test/_hash_greeting.erb +1 -0
  336. data/test/fixtures/test/_hash_object.erb +2 -0
  337. data/test/fixtures/test/_hello.builder +1 -0
  338. data/test/fixtures/test/_labelling_form.erb +1 -0
  339. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  340. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  341. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  342. data/test/fixtures/test/_one.html.erb +1 -0
  343. data/test/fixtures/test/_partial.erb +1 -0
  344. data/test/fixtures/test/_partial.html.erb +1 -0
  345. data/test/fixtures/test/_partial.js.erb +1 -0
  346. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  347. data/test/fixtures/test/_partial_only.erb +1 -0
  348. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  349. data/test/fixtures/test/_person.erb +2 -0
  350. data/test/fixtures/test/_raise.html.erb +1 -0
  351. data/test/fixtures/test/_two.html.erb +1 -0
  352. data/test/fixtures/test/_utf8_partial.html.erb +1 -0
  353. data/test/fixtures/test/_utf8_partial_magic.html.erb +2 -0
  354. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  355. data/test/fixtures/test/array_translation.erb +1 -0
  356. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  357. data/test/fixtures/test/capturing.erb +4 -0
  358. data/test/fixtures/test/content_for.erb +2 -0
  359. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  360. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  361. data/test/fixtures/test/delete_with_js.rjs +2 -0
  362. data/test/fixtures/test/dont_pick_me +1 -0
  363. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  364. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  365. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  366. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  367. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  368. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  369. data/test/fixtures/test/greeting.erb +1 -0
  370. data/test/fixtures/test/greeting.js.rjs +1 -0
  371. data/test/fixtures/test/hello.builder +4 -0
  372. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  373. data/test/fixtures/test/hello_world.erb +1 -0
  374. data/test/fixtures/test/hello_world.erb~ +1 -0
  375. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  376. data/test/fixtures/test/hello_world_container.builder +3 -0
  377. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  378. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  379. data/test/fixtures/test/hello_xml_world.builder +11 -0
  380. data/test/fixtures/test/hyphen-ated.erb +1 -0
  381. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  382. data/test/fixtures/test/list.erb +1 -0
  383. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  384. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  385. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  386. data/test/fixtures/test/nested_layout.erb +3 -0
  387. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  388. data/test/fixtures/test/potential_conflicts.erb +4 -0
  389. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  390. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  391. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  392. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  393. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  394. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  395. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  396. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  397. data/test/fixtures/test/render_to_string_test.erb +1 -0
  398. data/test/fixtures/test/scoped_array_translation.erb +1 -0
  399. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  400. data/test/fixtures/test/template.erb +1 -0
  401. data/test/fixtures/test/translation.erb +1 -0
  402. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  403. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  404. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  405. data/test/fixtures/test/utf8.html.erb +4 -0
  406. data/test/fixtures/test/utf8_magic.html.erb +5 -0
  407. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +5 -0
  408. data/test/fixtures/topic.rb +3 -0
  409. data/test/fixtures/topics.yml +22 -0
  410. data/test/fixtures/topics/_topic.html.erb +1 -0
  411. data/test/template/active_record_helper_i18n_test.rb +51 -0
  412. data/test/template/active_record_helper_test.rb +302 -0
  413. data/test/template/asset_tag_helper_test.rb +770 -0
  414. data/test/template/atom_feed_helper_test.rb +315 -0
  415. data/test/template/benchmark_helper_test.rb +86 -0
  416. data/test/template/compiled_templates_test.rb +204 -0
  417. data/test/template/date_helper_i18n_test.rb +121 -0
  418. data/test/template/date_helper_test.rb +2603 -0
  419. data/test/template/erb_util_test.rb +36 -0
  420. data/test/template/form_helper_test.rb +1447 -0
  421. data/test/template/form_options_helper_i18n_test.rb +27 -0
  422. data/test/template/form_options_helper_test.rb +811 -0
  423. data/test/template/form_tag_helper_test.rb +356 -0
  424. data/test/template/javascript_helper_test.rb +106 -0
  425. data/test/template/number_helper_i18n_test.rb +69 -0
  426. data/test/template/number_helper_test.rb +132 -0
  427. data/test/template/prototype_helper_test.rb +639 -0
  428. data/test/template/raw_output_helper_test.rb +21 -0
  429. data/test/template/record_tag_helper_test.rb +58 -0
  430. data/test/template/render_test.rb +329 -0
  431. data/test/template/sanitize_helper_test.rb +57 -0
  432. data/test/template/scriptaculous_helper_test.rb +90 -0
  433. data/test/template/tag_helper_test.rb +98 -0
  434. data/test/template/template_test.rb +32 -0
  435. data/test/template/test_test.rb +54 -0
  436. data/test/template/text_helper_test.rb +601 -0
  437. data/test/template/translation_helper_test.rb +95 -0
  438. data/test/template/url_helper_test.rb +641 -0
  439. data/test/testing_sandbox.rb +15 -0
  440. data/test/view/test_case_test.rb +176 -0
  441. metadata +519 -0
@@ -0,0 +1,27 @@
1
+ require 'abstract_unit'
2
+
3
+ class FormOptionsHelperI18nTests < ActionView::TestCase
4
+ tests ActionView::Helpers::FormOptionsHelper
5
+
6
+ def setup
7
+ @prompt_message = 'Select!'
8
+ I18n.backend.send(:init_translations)
9
+ I18n.backend.store_translations :en, :support => { :select => { :prompt => @prompt_message } }
10
+ end
11
+
12
+ def teardown
13
+ I18n.backend = I18n::Backend::Simple.new
14
+ end
15
+
16
+ def test_select_with_prompt_true_translates_prompt_message
17
+ I18n.expects(:translate).with('support.select.prompt', { :default => 'Please select' })
18
+ select('post', 'category', [], :prompt => true)
19
+ end
20
+
21
+ def test_select_with_translated_prompt
22
+ assert_dom_equal(
23
+ %Q(<select id="post_category" name="post[category]"><option value="">#{@prompt_message}</option>\n</select>),
24
+ select('post', 'category', [], :prompt => true)
25
+ )
26
+ end
27
+ end
@@ -0,0 +1,811 @@
1
+ require 'abstract_unit'
2
+ require 'tzinfo'
3
+
4
+ TZInfo::Timezone.cattr_reader :loaded_zones
5
+
6
+ class FormOptionsHelperTest < ActionView::TestCase
7
+ tests ActionView::Helpers::FormOptionsHelper
8
+
9
+ silence_warnings do
10
+ Post = Struct.new('Post', :title, :author_name, :body, :secret, :written_on, :category, :origin)
11
+ Continent = Struct.new('Continent', :continent_name, :countries)
12
+ Country = Struct.new('Country', :country_id, :country_name)
13
+ Firm = Struct.new('Firm', :time_zone)
14
+ Album = Struct.new('Album', :id, :title, :genre)
15
+ end
16
+
17
+ def setup
18
+ @fake_timezones = %w(A B C D E).inject([]) do |zones, id|
19
+ tz = TZInfo::Timezone.loaded_zones[id] = stub(:name => id, :to_s => id)
20
+ ActiveSupport::TimeZone.stubs(:[]).with(id).returns(tz)
21
+ zones << tz
22
+ end
23
+ ActiveSupport::TimeZone.stubs(:all).returns(@fake_timezones)
24
+ end
25
+
26
+ def test_collection_options
27
+ assert_dom_equal(
28
+ "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>",
29
+ options_from_collection_for_select(dummy_posts, "author_name", "title")
30
+ )
31
+ end
32
+
33
+
34
+ def test_collection_options_with_preselected_value
35
+ assert_dom_equal(
36
+ "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" selected=\"selected\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>",
37
+ options_from_collection_for_select(dummy_posts, "author_name", "title", "Babe")
38
+ )
39
+ end
40
+
41
+ def test_collection_options_with_preselected_value_array
42
+ assert_dom_equal(
43
+ "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" selected=\"selected\">Babe went home</option>\n<option value=\"Cabe\" selected=\"selected\">Cabe went home</option>",
44
+ options_from_collection_for_select(dummy_posts, "author_name", "title", [ "Babe", "Cabe" ])
45
+ )
46
+ end
47
+
48
+ def test_collection_options_with_proc_for_selected
49
+ assert_dom_equal(
50
+ "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" selected=\"selected\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>",
51
+ options_from_collection_for_select(dummy_posts, "author_name", "title", lambda{|p| p.author_name == 'Babe' })
52
+ )
53
+ end
54
+
55
+ def test_collection_options_with_disabled_value
56
+ assert_dom_equal(
57
+ "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" disabled=\"disabled\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>",
58
+ options_from_collection_for_select(dummy_posts, "author_name", "title", :disabled => "Babe")
59
+ )
60
+ end
61
+
62
+ def test_collection_options_with_disabled_array
63
+ assert_dom_equal(
64
+ "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" disabled=\"disabled\">Babe went home</option>\n<option value=\"Cabe\" disabled=\"disabled\">Cabe went home</option>",
65
+ options_from_collection_for_select(dummy_posts, "author_name", "title", :disabled => [ "Babe", "Cabe" ])
66
+ )
67
+ end
68
+
69
+ def test_collection_options_with_preselected_and_disabled_value
70
+ assert_dom_equal(
71
+ "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" disabled=\"disabled\">Babe went home</option>\n<option value=\"Cabe\" selected=\"selected\">Cabe went home</option>",
72
+ options_from_collection_for_select(dummy_posts, "author_name", "title", :selected => "Cabe", :disabled => "Babe")
73
+ )
74
+ end
75
+
76
+ def test_collection_options_with_proc_for_disabled
77
+ assert_dom_equal(
78
+ "<option value=\"&lt;Abe&gt;\">&lt;Abe&gt; went home</option>\n<option value=\"Babe\" disabled=\"disabled\">Babe went home</option>\n<option value=\"Cabe\" disabled=\"disabled\">Cabe went home</option>",
79
+ options_from_collection_for_select(dummy_posts, "author_name", "title", :disabled => lambda{|p| %w(Babe Cabe).include? p.author_name })
80
+ )
81
+ end
82
+
83
+ def test_string_options_for_select
84
+ options = "<option value=\"Denmark\">Denmark</option><option value=\"USA\">USA</option><option value=\"Sweden\">Sweden</option>"
85
+ assert_dom_equal(
86
+ options,
87
+ options_for_select(options)
88
+ )
89
+ end
90
+
91
+ def test_array_options_for_select
92
+ assert_dom_equal(
93
+ "<option value=\"&lt;Denmark&gt;\">&lt;Denmark&gt;</option>\n<option value=\"USA\">USA</option>\n<option value=\"Sweden\">Sweden</option>",
94
+ options_for_select([ "<Denmark>", "USA", "Sweden" ])
95
+ )
96
+ end
97
+
98
+ def test_array_options_for_select_with_selection
99
+ assert_dom_equal(
100
+ "<option value=\"Denmark\">Denmark</option>\n<option value=\"&lt;USA&gt;\" selected=\"selected\">&lt;USA&gt;</option>\n<option value=\"Sweden\">Sweden</option>",
101
+ options_for_select([ "Denmark", "<USA>", "Sweden" ], "<USA>")
102
+ )
103
+ end
104
+
105
+ def test_array_options_for_select_with_selection_array
106
+ assert_dom_equal(
107
+ "<option value=\"Denmark\">Denmark</option>\n<option value=\"&lt;USA&gt;\" selected=\"selected\">&lt;USA&gt;</option>\n<option value=\"Sweden\" selected=\"selected\">Sweden</option>",
108
+ options_for_select([ "Denmark", "<USA>", "Sweden" ], [ "<USA>", "Sweden" ])
109
+ )
110
+ end
111
+
112
+ def test_array_options_for_select_with_disabled_value
113
+ assert_dom_equal(
114
+ "<option value=\"Denmark\">Denmark</option>\n<option value=\"&lt;USA&gt;\" disabled=\"disabled\">&lt;USA&gt;</option>\n<option value=\"Sweden\">Sweden</option>",
115
+ options_for_select([ "Denmark", "<USA>", "Sweden" ], :disabled => "<USA>")
116
+ )
117
+ end
118
+
119
+ def test_array_options_for_select_with_disabled_array
120
+ assert_dom_equal(
121
+ "<option value=\"Denmark\">Denmark</option>\n<option value=\"&lt;USA&gt;\" disabled=\"disabled\">&lt;USA&gt;</option>\n<option value=\"Sweden\" disabled=\"disabled\">Sweden</option>",
122
+ options_for_select([ "Denmark", "<USA>", "Sweden" ], :disabled => ["<USA>", "Sweden"])
123
+ )
124
+ end
125
+
126
+ def test_array_options_for_select_with_selection_and_disabled_value
127
+ assert_dom_equal(
128
+ "<option value=\"Denmark\" selected=\"selected\">Denmark</option>\n<option value=\"&lt;USA&gt;\" disabled=\"disabled\">&lt;USA&gt;</option>\n<option value=\"Sweden\">Sweden</option>",
129
+ options_for_select([ "Denmark", "<USA>", "Sweden" ], :selected => "Denmark", :disabled => "<USA>")
130
+ )
131
+ end
132
+
133
+ def test_array_options_for_string_include_in_other_string_bug_fix
134
+ assert_dom_equal(
135
+ "<option value=\"ruby\">ruby</option>\n<option value=\"rubyonrails\" selected=\"selected\">rubyonrails</option>",
136
+ options_for_select([ "ruby", "rubyonrails" ], "rubyonrails")
137
+ )
138
+ assert_dom_equal(
139
+ "<option value=\"ruby\" selected=\"selected\">ruby</option>\n<option value=\"rubyonrails\">rubyonrails</option>",
140
+ options_for_select([ "ruby", "rubyonrails" ], "ruby")
141
+ )
142
+ assert_dom_equal(
143
+ %(<option value="ruby" selected="selected">ruby</option>\n<option value="rubyonrails">rubyonrails</option>\n<option value=""></option>),
144
+ options_for_select([ "ruby", "rubyonrails", nil ], "ruby")
145
+ )
146
+ end
147
+
148
+ def test_hash_options_for_select
149
+ assert_dom_equal(
150
+ "<option value=\"&lt;Kroner&gt;\">&lt;DKR&gt;</option>\n<option value=\"Dollar\">$</option>",
151
+ options_for_select("$" => "Dollar", "<DKR>" => "<Kroner>").split("\n").sort.join("\n")
152
+ )
153
+ assert_dom_equal(
154
+ "<option value=\"&lt;Kroner&gt;\">&lt;DKR&gt;</option>\n<option value=\"Dollar\" selected=\"selected\">$</option>",
155
+ options_for_select({ "$" => "Dollar", "<DKR>" => "<Kroner>" }, "Dollar").split("\n").sort.join("\n")
156
+ )
157
+ assert_dom_equal(
158
+ "<option value=\"&lt;Kroner&gt;\" selected=\"selected\">&lt;DKR&gt;</option>\n<option value=\"Dollar\" selected=\"selected\">$</option>",
159
+ options_for_select({ "$" => "Dollar", "<DKR>" => "<Kroner>" }, [ "Dollar", "<Kroner>" ]).split("\n").sort.join("\n")
160
+ )
161
+ end
162
+
163
+ def test_ducktyped_options_for_select
164
+ quack = Struct.new(:first, :last)
165
+ assert_dom_equal(
166
+ "<option value=\"&lt;Kroner&gt;\">&lt;DKR&gt;</option>\n<option value=\"Dollar\">$</option>",
167
+ options_for_select([quack.new("<DKR>", "<Kroner>"), quack.new("$", "Dollar")])
168
+ )
169
+ assert_dom_equal(
170
+ "<option value=\"&lt;Kroner&gt;\">&lt;DKR&gt;</option>\n<option value=\"Dollar\" selected=\"selected\">$</option>",
171
+ options_for_select([quack.new("<DKR>", "<Kroner>"), quack.new("$", "Dollar")], "Dollar")
172
+ )
173
+ assert_dom_equal(
174
+ "<option value=\"&lt;Kroner&gt;\" selected=\"selected\">&lt;DKR&gt;</option>\n<option value=\"Dollar\" selected=\"selected\">$</option>",
175
+ options_for_select([quack.new("<DKR>", "<Kroner>"), quack.new("$", "Dollar")], ["Dollar", "<Kroner>"])
176
+ )
177
+ end
178
+
179
+ def test_option_groups_from_collection_for_select
180
+ @continents = [
181
+ Continent.new("<Africa>", [Country.new("<sa>", "<South Africa>"), Country.new("so", "Somalia")] ),
182
+ Continent.new("Europe", [Country.new("dk", "Denmark"), Country.new("ie", "Ireland")] )
183
+ ]
184
+
185
+ assert_dom_equal(
186
+ "<optgroup label=\"&lt;Africa&gt;\"><option value=\"&lt;sa&gt;\">&lt;South Africa&gt;</option>\n<option value=\"so\">Somalia</option></optgroup><optgroup label=\"Europe\"><option value=\"dk\" selected=\"selected\">Denmark</option>\n<option value=\"ie\">Ireland</option></optgroup>",
187
+ option_groups_from_collection_for_select(@continents, "countries", "continent_name", "country_id", "country_name", "dk")
188
+ )
189
+ end
190
+
191
+ def test_grouped_options_for_select_with_array
192
+ assert_dom_equal(
193
+ "<optgroup label=\"North America\"><option value=\"US\">United States</option>\n<option value=\"Canada\">Canada</option></optgroup><optgroup label=\"Europe\"><option value=\"GB\">Great Britain</option>\n<option value=\"Germany\">Germany</option></optgroup>",
194
+ grouped_options_for_select([
195
+ ["North America",
196
+ [['United States','US'],"Canada"]],
197
+ ["Europe",
198
+ [["Great Britain","GB"], "Germany"]]
199
+ ])
200
+ )
201
+ end
202
+
203
+ def test_grouped_options_for_select_with_selected_and_prompt
204
+ assert_dom_equal(
205
+ "<option value=\"\">Choose a product...</option><optgroup label=\"Hats\"><option value=\"Baseball Cap\">Baseball Cap</option>\n<option selected=\"selected\" value=\"Cowboy Hat\">Cowboy Hat</option></optgroup>",
206
+ grouped_options_for_select([["Hats", ["Baseball Cap","Cowboy Hat"]]], "Cowboy Hat", "Choose a product...")
207
+ )
208
+ end
209
+
210
+ def test_optgroups_with_with_options_with_hash
211
+ assert_dom_equal(
212
+ "<optgroup label=\"Europe\"><option value=\"Denmark\">Denmark</option>\n<option value=\"Germany\">Germany</option></optgroup><optgroup label=\"North America\"><option value=\"United States\">United States</option>\n<option value=\"Canada\">Canada</option></optgroup>",
213
+ grouped_options_for_select({'North America' => ['United States','Canada'], 'Europe' => ['Denmark','Germany']})
214
+ )
215
+ end
216
+
217
+ def test_time_zone_options_no_parms
218
+ opts = time_zone_options_for_select
219
+ assert_dom_equal "<option value=\"A\">A</option>\n" +
220
+ "<option value=\"B\">B</option>\n" +
221
+ "<option value=\"C\">C</option>\n" +
222
+ "<option value=\"D\">D</option>\n" +
223
+ "<option value=\"E\">E</option>",
224
+ opts
225
+ end
226
+
227
+ def test_time_zone_options_with_selected
228
+ opts = time_zone_options_for_select( "D" )
229
+ assert_dom_equal "<option value=\"A\">A</option>\n" +
230
+ "<option value=\"B\">B</option>\n" +
231
+ "<option value=\"C\">C</option>\n" +
232
+ "<option value=\"D\" selected=\"selected\">D</option>\n" +
233
+ "<option value=\"E\">E</option>",
234
+ opts
235
+ end
236
+
237
+ def test_time_zone_options_with_unknown_selected
238
+ opts = time_zone_options_for_select( "K" )
239
+ assert_dom_equal "<option value=\"A\">A</option>\n" +
240
+ "<option value=\"B\">B</option>\n" +
241
+ "<option value=\"C\">C</option>\n" +
242
+ "<option value=\"D\">D</option>\n" +
243
+ "<option value=\"E\">E</option>",
244
+ opts
245
+ end
246
+
247
+ def test_time_zone_options_with_priority_zones
248
+ zones = [ ActiveSupport::TimeZone.new( "B" ), ActiveSupport::TimeZone.new( "E" ) ]
249
+ opts = time_zone_options_for_select( nil, zones )
250
+ assert_dom_equal "<option value=\"B\">B</option>\n" +
251
+ "<option value=\"E\">E</option>" +
252
+ "<option value=\"\" disabled=\"disabled\">-------------</option>\n" +
253
+ "<option value=\"A\">A</option>\n" +
254
+ "<option value=\"C\">C</option>\n" +
255
+ "<option value=\"D\">D</option>",
256
+ opts
257
+ end
258
+
259
+ def test_time_zone_options_with_selected_priority_zones
260
+ zones = [ ActiveSupport::TimeZone.new( "B" ), ActiveSupport::TimeZone.new( "E" ) ]
261
+ opts = time_zone_options_for_select( "E", zones )
262
+ assert_dom_equal "<option value=\"B\">B</option>\n" +
263
+ "<option value=\"E\" selected=\"selected\">E</option>" +
264
+ "<option value=\"\" disabled=\"disabled\">-------------</option>\n" +
265
+ "<option value=\"A\">A</option>\n" +
266
+ "<option value=\"C\">C</option>\n" +
267
+ "<option value=\"D\">D</option>",
268
+ opts
269
+ end
270
+
271
+ def test_time_zone_options_with_unselected_priority_zones
272
+ zones = [ ActiveSupport::TimeZone.new( "B" ), ActiveSupport::TimeZone.new( "E" ) ]
273
+ opts = time_zone_options_for_select( "C", zones )
274
+ assert_dom_equal "<option value=\"B\">B</option>\n" +
275
+ "<option value=\"E\">E</option>" +
276
+ "<option value=\"\" disabled=\"disabled\">-------------</option>\n" +
277
+ "<option value=\"A\">A</option>\n" +
278
+ "<option value=\"C\" selected=\"selected\">C</option>\n" +
279
+ "<option value=\"D\">D</option>",
280
+ opts
281
+ end
282
+
283
+ def test_time_zone_options_returns_html_safe_string
284
+ assert time_zone_options_for_select.html_safe?
285
+ end
286
+
287
+ def test_select
288
+ @post = Post.new
289
+ @post.category = "<mus>"
290
+ assert_dom_equal(
291
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
292
+ select("post", "category", %w( abe <mus> hest))
293
+ )
294
+ end
295
+
296
+ def test_select_under_fields_for
297
+ @post = Post.new
298
+ @post.category = "<mus>"
299
+
300
+ fields_for :post, @post do |f|
301
+ concat f.select(:category, %w( abe <mus> hest))
302
+ end
303
+
304
+ assert_dom_equal(
305
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
306
+ output_buffer
307
+ )
308
+ end
309
+
310
+ def test_select_under_fields_for_with_index
311
+ @post = Post.new
312
+ @post.category = "<mus>"
313
+
314
+ fields_for :post, @post, :index => 108 do |f|
315
+ concat f.select(:category, %w( abe <mus> hest))
316
+ end
317
+
318
+ assert_dom_equal(
319
+ "<select id=\"post_108_category\" name=\"post[108][category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
320
+ output_buffer
321
+ )
322
+ end
323
+
324
+ def test_select_under_fields_for_with_auto_index
325
+ @post = Post.new
326
+ @post.category = "<mus>"
327
+ def @post.to_param; 108; end
328
+
329
+ fields_for "post[]", @post do |f|
330
+ concat f.select(:category, %w( abe <mus> hest))
331
+ end
332
+
333
+ assert_dom_equal(
334
+ "<select id=\"post_108_category\" name=\"post[108][category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
335
+ output_buffer
336
+ )
337
+ end
338
+
339
+ def test_select_under_fields_for_with_string_and_given_prompt
340
+ @post = Post.new
341
+ options = "<option value=\"abe\">abe</option><option value=\"mus\">mus</option><option value=\"hest\">hest</option>"
342
+
343
+ fields_for :post, @post do |f|
344
+ concat f.select(:category, options, :prompt => 'The prompt')
345
+ end
346
+
347
+ assert_dom_equal(
348
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">The prompt</option>\n#{options}</select>",
349
+ output_buffer
350
+ )
351
+ end
352
+
353
+ def test_select_with_blank
354
+ @post = Post.new
355
+ @post.category = "<mus>"
356
+ assert_dom_equal(
357
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"\"></option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
358
+ select("post", "category", %w( abe <mus> hest), :include_blank => true)
359
+ )
360
+ end
361
+
362
+ def test_select_with_blank_as_string
363
+ @post = Post.new
364
+ @post.category = "<mus>"
365
+ assert_dom_equal(
366
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">None</option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
367
+ select("post", "category", %w( abe <mus> hest), :include_blank => 'None')
368
+ )
369
+ end
370
+
371
+ def test_select_with_default_prompt
372
+ @post = Post.new
373
+ @post.category = ""
374
+ assert_dom_equal(
375
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">Please select</option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
376
+ select("post", "category", %w( abe <mus> hest), :prompt => true)
377
+ )
378
+ end
379
+
380
+ def test_select_no_prompt_when_select_has_value
381
+ @post = Post.new
382
+ @post.category = "<mus>"
383
+ assert_dom_equal(
384
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
385
+ select("post", "category", %w( abe <mus> hest), :prompt => true)
386
+ )
387
+ end
388
+
389
+ def test_select_with_given_prompt
390
+ @post = Post.new
391
+ @post.category = ""
392
+ assert_dom_equal(
393
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">The prompt</option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
394
+ select("post", "category", %w( abe <mus> hest), :prompt => 'The prompt')
395
+ )
396
+ end
397
+
398
+ def test_select_with_prompt_and_blank
399
+ @post = Post.new
400
+ @post.category = ""
401
+ assert_dom_equal(
402
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"\">Please select</option>\n<option value=\"\"></option>\n<option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
403
+ select("post", "category", %w( abe <mus> hest), :prompt => true, :include_blank => true)
404
+ )
405
+ end
406
+
407
+ def test_select_with_selected_value
408
+ @post = Post.new
409
+ @post.category = "<mus>"
410
+ assert_dom_equal(
411
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\" selected=\"selected\">abe</option>\n<option value=\"&lt;mus&gt;\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
412
+ select("post", "category", %w( abe <mus> hest ), :selected => 'abe')
413
+ )
414
+ end
415
+
416
+ def test_select_with_index_option
417
+ @album = Album.new
418
+ @album.id = 1
419
+
420
+ expected = "<select id=\"album__genre\" name=\"album[][genre]\"><option value=\"rap\">rap</option>\n<option value=\"rock\">rock</option>\n<option value=\"country\">country</option></select>"
421
+
422
+ assert_dom_equal(
423
+ expected,
424
+ select("album[]", "genre", %w[rap rock country], {}, { :index => nil })
425
+ )
426
+ end
427
+
428
+ def test_select_with_selected_nil
429
+ @post = Post.new
430
+ @post.category = "<mus>"
431
+ assert_dom_equal(
432
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\">&lt;mus&gt;</option>\n<option value=\"hest\">hest</option></select>",
433
+ select("post", "category", %w( abe <mus> hest ), :selected => nil)
434
+ )
435
+ end
436
+
437
+ def test_select_with_disabled_value
438
+ @post = Post.new
439
+ @post.category = "<mus>"
440
+ assert_dom_equal(
441
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\" disabled=\"disabled\">hest</option></select>",
442
+ select("post", "category", %w( abe <mus> hest ), :disabled => 'hest')
443
+ )
444
+ end
445
+
446
+ def test_select_with_disabled_array
447
+ @post = Post.new
448
+ @post.category = "<mus>"
449
+ assert_dom_equal(
450
+ "<select id=\"post_category\" name=\"post[category]\"><option value=\"abe\" disabled=\"disabled\">abe</option>\n<option value=\"&lt;mus&gt;\" selected=\"selected\">&lt;mus&gt;</option>\n<option value=\"hest\" disabled=\"disabled\">hest</option></select>",
451
+ select("post", "category", %w( abe <mus> hest ), :disabled => ['hest', 'abe'])
452
+ )
453
+ end
454
+
455
+ def test_collection_select
456
+ @post = Post.new
457
+ @post.author_name = "Babe"
458
+
459
+ assert_dom_equal(
460
+ "<select id=\"post_author_name\" name=\"post[author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
461
+ collection_select("post", "author_name", dummy_posts, "author_name", "author_name")
462
+ )
463
+ end
464
+
465
+ def test_collection_select_under_fields_for
466
+ @post = Post.new
467
+ @post.author_name = "Babe"
468
+
469
+ fields_for :post, @post do |f|
470
+ concat f.collection_select(:author_name, dummy_posts, :author_name, :author_name)
471
+ end
472
+
473
+ assert_dom_equal(
474
+ "<select id=\"post_author_name\" name=\"post[author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
475
+ output_buffer
476
+ )
477
+ end
478
+
479
+ def test_collection_select_under_fields_for_with_index
480
+ @post = Post.new
481
+ @post.author_name = "Babe"
482
+
483
+ fields_for :post, @post, :index => 815 do |f|
484
+ concat f.collection_select(:author_name, dummy_posts, :author_name, :author_name)
485
+ end
486
+
487
+ assert_dom_equal(
488
+ "<select id=\"post_815_author_name\" name=\"post[815][author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
489
+ output_buffer
490
+ )
491
+ end
492
+
493
+ def test_collection_select_under_fields_for_with_auto_index
494
+ @post = Post.new
495
+ @post.author_name = "Babe"
496
+ def @post.to_param; 815; end
497
+
498
+ fields_for "post[]", @post do |f|
499
+ concat f.collection_select(:author_name, dummy_posts, :author_name, :author_name)
500
+ end
501
+
502
+ assert_dom_equal(
503
+ "<select id=\"post_815_author_name\" name=\"post[815][author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
504
+ output_buffer
505
+ )
506
+ end
507
+
508
+ def test_collection_select_with_blank_and_style
509
+ @post = Post.new
510
+ @post.author_name = "Babe"
511
+
512
+ assert_dom_equal(
513
+ "<select id=\"post_author_name\" name=\"post[author_name]\" style=\"width: 200px\"><option value=\"\"></option>\n<option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
514
+ collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { :include_blank => true }, "style" => "width: 200px")
515
+ )
516
+ end
517
+
518
+ def test_collection_select_with_blank_as_string_and_style
519
+ @post = Post.new
520
+ @post.author_name = "Babe"
521
+
522
+ assert_dom_equal(
523
+ "<select id=\"post_author_name\" name=\"post[author_name]\" style=\"width: 200px\"><option value=\"\">No Selection</option>\n<option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>",
524
+ collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { :include_blank => 'No Selection' }, "style" => "width: 200px")
525
+ )
526
+ end
527
+
528
+ def test_collection_select_with_multiple_option_appends_array_brackets
529
+ @post = Post.new
530
+ @post.author_name = "Babe"
531
+
532
+ expected = "<select id=\"post_author_name\" name=\"post[author_name][]\" multiple=\"multiple\"><option value=\"\"></option>\n<option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\">Cabe</option></select>"
533
+
534
+ # Should suffix default name with [].
535
+ assert_dom_equal expected, collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { :include_blank => true }, :multiple => true)
536
+
537
+ # Shouldn't suffix custom name with [].
538
+ assert_dom_equal expected, collection_select("post", "author_name", dummy_posts, "author_name", "author_name", { :include_blank => true, :name => 'post[author_name][]' }, :multiple => true)
539
+ end
540
+
541
+ def test_collection_select_with_blank_and_selected
542
+ @post = Post.new
543
+ @post.author_name = "Babe"
544
+
545
+ assert_dom_equal(
546
+ %{<select id="post_author_name" name="post[author_name]"><option value=""></option>\n<option value="&lt;Abe&gt;" selected="selected">&lt;Abe&gt;</option>\n<option value="Babe">Babe</option>\n<option value="Cabe">Cabe</option></select>},
547
+ collection_select("post", "author_name", dummy_posts, "author_name", "author_name", {:include_blank => true, :selected => "<Abe>"})
548
+ )
549
+ end
550
+
551
+ def test_collection_select_with_disabled
552
+ @post = Post.new
553
+ @post.author_name = "Babe"
554
+
555
+ assert_dom_equal(
556
+ "<select id=\"post_author_name\" name=\"post[author_name]\"><option value=\"&lt;Abe&gt;\">&lt;Abe&gt;</option>\n<option value=\"Babe\" selected=\"selected\">Babe</option>\n<option value=\"Cabe\" disabled=\"disabled\">Cabe</option></select>",
557
+ collection_select("post", "author_name", dummy_posts, "author_name", "author_name", :disabled => 'Cabe')
558
+ )
559
+ end
560
+
561
+ def test_time_zone_select
562
+ @firm = Firm.new("D")
563
+ html = time_zone_select( "firm", "time_zone" )
564
+ assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" +
565
+ "<option value=\"A\">A</option>\n" +
566
+ "<option value=\"B\">B</option>\n" +
567
+ "<option value=\"C\">C</option>\n" +
568
+ "<option value=\"D\" selected=\"selected\">D</option>\n" +
569
+ "<option value=\"E\">E</option>" +
570
+ "</select>",
571
+ html
572
+ end
573
+
574
+ def test_time_zone_select_under_fields_for
575
+ @firm = Firm.new("D")
576
+
577
+ fields_for :firm, @firm do |f|
578
+ concat f.time_zone_select(:time_zone)
579
+ end
580
+
581
+ assert_dom_equal(
582
+ "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" +
583
+ "<option value=\"A\">A</option>\n" +
584
+ "<option value=\"B\">B</option>\n" +
585
+ "<option value=\"C\">C</option>\n" +
586
+ "<option value=\"D\" selected=\"selected\">D</option>\n" +
587
+ "<option value=\"E\">E</option>" +
588
+ "</select>",
589
+ output_buffer
590
+ )
591
+ end
592
+
593
+ def test_time_zone_select_under_fields_for_with_index
594
+ @firm = Firm.new("D")
595
+
596
+ fields_for :firm, @firm, :index => 305 do |f|
597
+ concat f.time_zone_select(:time_zone)
598
+ end
599
+
600
+ assert_dom_equal(
601
+ "<select id=\"firm_305_time_zone\" name=\"firm[305][time_zone]\">" +
602
+ "<option value=\"A\">A</option>\n" +
603
+ "<option value=\"B\">B</option>\n" +
604
+ "<option value=\"C\">C</option>\n" +
605
+ "<option value=\"D\" selected=\"selected\">D</option>\n" +
606
+ "<option value=\"E\">E</option>" +
607
+ "</select>",
608
+ output_buffer
609
+ )
610
+ end
611
+
612
+ def test_time_zone_select_under_fields_for_with_auto_index
613
+ @firm = Firm.new("D")
614
+ def @firm.to_param; 305; end
615
+
616
+ fields_for "firm[]", @firm do |f|
617
+ concat f.time_zone_select(:time_zone)
618
+ end
619
+
620
+ assert_dom_equal(
621
+ "<select id=\"firm_305_time_zone\" name=\"firm[305][time_zone]\">" +
622
+ "<option value=\"A\">A</option>\n" +
623
+ "<option value=\"B\">B</option>\n" +
624
+ "<option value=\"C\">C</option>\n" +
625
+ "<option value=\"D\" selected=\"selected\">D</option>\n" +
626
+ "<option value=\"E\">E</option>" +
627
+ "</select>",
628
+ output_buffer
629
+ )
630
+ end
631
+
632
+ def test_time_zone_select_with_blank
633
+ @firm = Firm.new("D")
634
+ html = time_zone_select("firm", "time_zone", nil, :include_blank => true)
635
+ assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" +
636
+ "<option value=\"\"></option>\n" +
637
+ "<option value=\"A\">A</option>\n" +
638
+ "<option value=\"B\">B</option>\n" +
639
+ "<option value=\"C\">C</option>\n" +
640
+ "<option value=\"D\" selected=\"selected\">D</option>\n" +
641
+ "<option value=\"E\">E</option>" +
642
+ "</select>",
643
+ html
644
+ end
645
+
646
+ def test_time_zone_select_with_blank_as_string
647
+ @firm = Firm.new("D")
648
+ html = time_zone_select("firm", "time_zone", nil, :include_blank => 'No Zone')
649
+ assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" +
650
+ "<option value=\"\">No Zone</option>\n" +
651
+ "<option value=\"A\">A</option>\n" +
652
+ "<option value=\"B\">B</option>\n" +
653
+ "<option value=\"C\">C</option>\n" +
654
+ "<option value=\"D\" selected=\"selected\">D</option>\n" +
655
+ "<option value=\"E\">E</option>" +
656
+ "</select>",
657
+ html
658
+ end
659
+
660
+ def test_time_zone_select_with_style
661
+ @firm = Firm.new("D")
662
+ html = time_zone_select("firm", "time_zone", nil, {},
663
+ "style" => "color: red")
664
+ assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\" style=\"color: red\">" +
665
+ "<option value=\"A\">A</option>\n" +
666
+ "<option value=\"B\">B</option>\n" +
667
+ "<option value=\"C\">C</option>\n" +
668
+ "<option value=\"D\" selected=\"selected\">D</option>\n" +
669
+ "<option value=\"E\">E</option>" +
670
+ "</select>",
671
+ html
672
+ assert_dom_equal html, time_zone_select("firm", "time_zone", nil, {},
673
+ :style => "color: red")
674
+ end
675
+
676
+ def test_time_zone_select_with_blank_and_style
677
+ @firm = Firm.new("D")
678
+ html = time_zone_select("firm", "time_zone", nil,
679
+ { :include_blank => true }, "style" => "color: red")
680
+ assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\" style=\"color: red\">" +
681
+ "<option value=\"\"></option>\n" +
682
+ "<option value=\"A\">A</option>\n" +
683
+ "<option value=\"B\">B</option>\n" +
684
+ "<option value=\"C\">C</option>\n" +
685
+ "<option value=\"D\" selected=\"selected\">D</option>\n" +
686
+ "<option value=\"E\">E</option>" +
687
+ "</select>",
688
+ html
689
+ assert_dom_equal html, time_zone_select("firm", "time_zone", nil,
690
+ { :include_blank => true }, :style => "color: red")
691
+ end
692
+
693
+ def test_time_zone_select_with_blank_as_string_and_style
694
+ @firm = Firm.new("D")
695
+ html = time_zone_select("firm", "time_zone", nil,
696
+ { :include_blank => 'No Zone' }, "style" => "color: red")
697
+ assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\" style=\"color: red\">" +
698
+ "<option value=\"\">No Zone</option>\n" +
699
+ "<option value=\"A\">A</option>\n" +
700
+ "<option value=\"B\">B</option>\n" +
701
+ "<option value=\"C\">C</option>\n" +
702
+ "<option value=\"D\" selected=\"selected\">D</option>\n" +
703
+ "<option value=\"E\">E</option>" +
704
+ "</select>",
705
+ html
706
+ assert_dom_equal html, time_zone_select("firm", "time_zone", nil,
707
+ { :include_blank => 'No Zone' }, :style => "color: red")
708
+ end
709
+
710
+ def test_time_zone_select_with_priority_zones
711
+ @firm = Firm.new("D")
712
+ zones = [ ActiveSupport::TimeZone.new("A"), ActiveSupport::TimeZone.new("D") ]
713
+ html = time_zone_select("firm", "time_zone", zones )
714
+ assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" +
715
+ "<option value=\"A\">A</option>\n" +
716
+ "<option value=\"D\" selected=\"selected\">D</option>" +
717
+ "<option value=\"\" disabled=\"disabled\">-------------</option>\n" +
718
+ "<option value=\"B\">B</option>\n" +
719
+ "<option value=\"C\">C</option>\n" +
720
+ "<option value=\"E\">E</option>" +
721
+ "</select>",
722
+ html
723
+ end
724
+
725
+ def test_time_zone_select_with_priority_zones_as_regexp
726
+ @firm = Firm.new("D")
727
+ @fake_timezones.each_with_index do |tz, i|
728
+ tz.stubs(:=~).returns(i.zero? || i == 3)
729
+ end
730
+
731
+ html = time_zone_select("firm", "time_zone", /A|D/)
732
+ assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" +
733
+ "<option value=\"A\">A</option>\n" +
734
+ "<option value=\"D\" selected=\"selected\">D</option>" +
735
+ "<option value=\"\" disabled=\"disabled\">-------------</option>\n" +
736
+ "<option value=\"B\">B</option>\n" +
737
+ "<option value=\"C\">C</option>\n" +
738
+ "<option value=\"E\">E</option>" +
739
+ "</select>",
740
+ html
741
+ end
742
+
743
+ def test_time_zone_select_with_default_time_zone_and_nil_value
744
+ @firm = Firm.new()
745
+ @firm.time_zone = nil
746
+ html = time_zone_select( "firm", "time_zone", nil, :default => 'B' )
747
+ assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" +
748
+ "<option value=\"A\">A</option>\n" +
749
+ "<option value=\"B\" selected=\"selected\">B</option>\n" +
750
+ "<option value=\"C\">C</option>\n" +
751
+ "<option value=\"D\">D</option>\n" +
752
+ "<option value=\"E\">E</option>" +
753
+ "</select>",
754
+ html
755
+ end
756
+
757
+ def test_time_zone_select_with_default_time_zone_and_value
758
+ @firm = Firm.new('D')
759
+ html = time_zone_select( "firm", "time_zone", nil, :default => 'B' )
760
+ assert_dom_equal "<select id=\"firm_time_zone\" name=\"firm[time_zone]\">" +
761
+ "<option value=\"A\">A</option>\n" +
762
+ "<option value=\"B\">B</option>\n" +
763
+ "<option value=\"C\">C</option>\n" +
764
+ "<option value=\"D\" selected=\"selected\">D</option>\n" +
765
+ "<option value=\"E\">E</option>" +
766
+ "</select>",
767
+ html
768
+ end
769
+
770
+ def test_grouped_collection_select
771
+ @continents = [
772
+ Continent.new("<Africa>", [Country.new("<sa>", "<South Africa>"), Country.new("so", "Somalia")] ),
773
+ Continent.new("Europe", [Country.new("dk", "Denmark"), Country.new("ie", "Ireland")] )
774
+ ]
775
+
776
+ @post = Post.new
777
+ @post.origin = 'dk'
778
+
779
+ assert_dom_equal(
780
+ %Q{<select id="post_origin" name="post[origin]"><optgroup label="&lt;Africa&gt;"><option value="&lt;sa&gt;">&lt;South Africa&gt;</option>\n<option value="so">Somalia</option></optgroup><optgroup label="Europe"><option value="dk" selected="selected">Denmark</option>\n<option value="ie">Ireland</option></optgroup></select>},
781
+ grouped_collection_select("post", "origin", @continents, :countries, :continent_name, :country_id, :country_name)
782
+ )
783
+ end
784
+
785
+ def test_grouped_collection_select_under_fields_for
786
+ @continents = [
787
+ Continent.new("<Africa>", [Country.new("<sa>", "<South Africa>"), Country.new("so", "Somalia")] ),
788
+ Continent.new("Europe", [Country.new("dk", "Denmark"), Country.new("ie", "Ireland")] )
789
+ ]
790
+
791
+ @post = Post.new
792
+ @post.origin = 'dk'
793
+
794
+ fields_for :post, @post do |f|
795
+ concat f.grouped_collection_select("origin", @continents, :countries, :continent_name, :country_id, :country_name)
796
+ end
797
+
798
+ assert_dom_equal(
799
+ %Q{<select id="post_origin" name="post[origin]"><optgroup label="&lt;Africa&gt;"><option value="&lt;sa&gt;">&lt;South Africa&gt;</option>\n<option value="so">Somalia</option></optgroup><optgroup label="Europe"><option value="dk" selected="selected">Denmark</option>\n<option value="ie">Ireland</option></optgroup></select>},
800
+ output_buffer
801
+ )
802
+ end
803
+
804
+ private
805
+
806
+ def dummy_posts
807
+ [ Post.new("<Abe> went home", "<Abe>", "To a little house", "shh!"),
808
+ Post.new("Babe went home", "Babe", "To a little house", "shh!"),
809
+ Post.new("Cabe went home", "Cabe", "To a little house", "shh!") ]
810
+ end
811
+ end