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,1393 @@
1
+ require 'abstract_unit'
2
+
3
+ silence_warnings do
4
+ Post = Struct.new(:title, :author_name, :body, :secret, :written_on, :cost)
5
+ Post.class_eval do
6
+ alias_method :title_before_type_cast, :title unless respond_to?(:title_before_type_cast)
7
+ alias_method :body_before_type_cast, :body unless respond_to?(:body_before_type_cast)
8
+ alias_method :author_name_before_type_cast, :author_name unless respond_to?(:author_name_before_type_cast)
9
+ alias_method :secret?, :secret
10
+
11
+ def new_record=(boolean)
12
+ @new_record = boolean
13
+ end
14
+
15
+ def new_record?
16
+ @new_record
17
+ end
18
+
19
+ attr_accessor :author
20
+ def author_attributes=(attributes); end
21
+
22
+ attr_accessor :comments
23
+ def comments_attributes=(attributes); end
24
+
25
+ attr_accessor :tags
26
+ def tags_attributes=(attributes); end
27
+ end
28
+
29
+ class Comment
30
+ attr_reader :id
31
+ attr_reader :post_id
32
+ def initialize(id = nil, post_id = nil); @id, @post_id = id, post_id end
33
+ def save; @id = 1; @post_id = 1 end
34
+ def new_record?; @id.nil? end
35
+ def to_param; @id; end
36
+ def name
37
+ @id.nil? ? "new #{self.class.name.downcase}" : "#{self.class.name.downcase} ##{@id}"
38
+ end
39
+
40
+ attr_accessor :relevances
41
+ def relevances_attributes=(attributes); end
42
+
43
+ end
44
+
45
+ class Tag
46
+ attr_reader :id
47
+ attr_reader :post_id
48
+ def initialize(id = nil, post_id = nil); @id, @post_id = id, post_id end
49
+ def save; @id = 1; @post_id = 1 end
50
+ def new_record?; @id.nil? end
51
+ def to_param; @id; end
52
+ def value
53
+ @id.nil? ? "new #{self.class.name.downcase}" : "#{self.class.name.downcase} ##{@id}"
54
+ end
55
+
56
+ attr_accessor :relevances
57
+ def relevances_attributes=(attributes); end
58
+
59
+ end
60
+
61
+ class CommentRelevance
62
+ attr_reader :id
63
+ attr_reader :comment_id
64
+ def initialize(id = nil, comment_id = nil); @id, @comment_id = id, comment_id end
65
+ def save; @id = 1; @comment_id = 1 end
66
+ def new_record?; @id.nil? end
67
+ def to_param; @id; end
68
+ def value
69
+ @id.nil? ? "new #{self.class.name.downcase}" : "#{self.class.name.downcase} ##{@id}"
70
+ end
71
+ end
72
+
73
+ class TagRelevance
74
+ attr_reader :id
75
+ attr_reader :tag_id
76
+ def initialize(id = nil, tag_id = nil); @id, @tag_id = id, tag_id end
77
+ def save; @id = 1; @tag_id = 1 end
78
+ def new_record?; @id.nil? end
79
+ def to_param; @id; end
80
+ def value
81
+ @id.nil? ? "new #{self.class.name.downcase}" : "#{self.class.name.downcase} ##{@id}"
82
+ end
83
+ end
84
+
85
+ class Author < Comment
86
+ attr_accessor :post
87
+ def post_attributes=(attributes); end
88
+ end
89
+ end
90
+
91
+ class FormHelperTest < ActionView::TestCase
92
+ tests ActionView::Helpers::FormHelper
93
+
94
+ def setup
95
+ @post = Post.new
96
+ @comment = Comment.new
97
+ def @post.errors()
98
+ Class.new{
99
+ def on(field); "can't be empty" if field == "author_name"; end
100
+ def empty?() false end
101
+ def count() 1 end
102
+ def full_messages() [ "Author name can't be empty" ] end
103
+ }.new
104
+ end
105
+ def @post.id; 123; end
106
+ def @post.id_before_type_cast; 123; end
107
+ def @post.to_param; '123'; end
108
+
109
+ @post.title = "Hello World"
110
+ @post.author_name = ""
111
+ @post.body = "Back to the hill and over it again!"
112
+ @post.secret = 1
113
+ @post.written_on = Date.new(2004, 6, 15)
114
+
115
+ @controller = Class.new do
116
+ attr_reader :url_for_options
117
+ def url_for(options)
118
+ @url_for_options = options
119
+ "http://www.example.com"
120
+ end
121
+ end
122
+ @controller = @controller.new
123
+ end
124
+
125
+ def test_label
126
+ assert_dom_equal('<label for="post_title">Title</label>', label("post", "title"))
127
+ assert_dom_equal('<label for="post_title">The title goes here</label>', label("post", "title", "The title goes here"))
128
+ assert_dom_equal(
129
+ '<label class="title_label" for="post_title">Title</label>',
130
+ label("post", "title", nil, :class => 'title_label')
131
+ )
132
+ assert_dom_equal('<label for="post_secret">Secret?</label>', label("post", "secret?"))
133
+ end
134
+
135
+ def test_label_with_symbols
136
+ assert_dom_equal('<label for="post_title">Title</label>', label(:post, :title))
137
+ assert_dom_equal('<label for="post_secret">Secret?</label>', label(:post, :secret?))
138
+ end
139
+
140
+ def test_label_with_for_attribute_as_symbol
141
+ assert_dom_equal('<label for="my_for">Title</label>', label(:post, :title, nil, :for => "my_for"))
142
+ end
143
+
144
+ def test_label_with_for_attribute_as_string
145
+ assert_dom_equal('<label for="my_for">Title</label>', label(:post, :title, nil, "for" => "my_for"))
146
+ end
147
+
148
+ def test_label_with_id_attribute_as_symbol
149
+ assert_dom_equal('<label for="post_title" id="my_id">Title</label>', label(:post, :title, nil, :id => "my_id"))
150
+ end
151
+
152
+ def test_label_with_id_attribute_as_string
153
+ assert_dom_equal('<label for="post_title" id="my_id">Title</label>', label(:post, :title, nil, "id" => "my_id"))
154
+ end
155
+
156
+ def test_label_with_for_and_id_attributes_as_symbol
157
+ assert_dom_equal('<label for="my_for" id="my_id">Title</label>', label(:post, :title, nil, :for => "my_for", :id => "my_id"))
158
+ end
159
+
160
+ def test_label_with_for_and_id_attributes_as_string
161
+ assert_dom_equal('<label for="my_for" id="my_id">Title</label>', label(:post, :title, nil, "for" => "my_for", "id" => "my_id"))
162
+ end
163
+
164
+ def test_label_for_radio_buttons_with_value
165
+ assert_dom_equal('<label for="post_title_great_title">The title goes here</label>', label("post", "title", "The title goes here", :value => "great_title"))
166
+ assert_dom_equal('<label for="post_title_great_title">The title goes here</label>', label("post", "title", "The title goes here", :value => "great title"))
167
+ end
168
+
169
+ def test_text_field
170
+ assert_dom_equal(
171
+ '<input id="post_title" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title")
172
+ )
173
+ assert_dom_equal(
174
+ '<input id="post_title" name="post[title]" size="30" type="password" value="Hello World" />', password_field("post", "title")
175
+ )
176
+ assert_dom_equal(
177
+ '<input id="person_name" name="person[name]" size="30" type="password" />', password_field("person", "name")
178
+ )
179
+ end
180
+
181
+ def test_text_field_with_escapes
182
+ @post.title = "<b>Hello World</b>"
183
+ assert_dom_equal(
184
+ '<input id="post_title" name="post[title]" size="30" type="text" value="&lt;b&gt;Hello World&lt;/b&gt;" />', text_field("post", "title")
185
+ )
186
+ end
187
+
188
+ def test_text_field_with_html_entities
189
+ @post.title = "The HTML Entity for & is &amp;"
190
+ assert_dom_equal(
191
+ '<input id="post_title" name="post[title]" size="30" type="text" value="The HTML Entity for &amp; is &amp;amp;" />',
192
+ text_field("post", "title")
193
+ )
194
+ end
195
+
196
+ def test_text_field_with_options
197
+ expected = '<input id="post_title" name="post[title]" size="35" type="text" value="Hello World" />'
198
+ assert_dom_equal expected, text_field("post", "title", "size" => 35)
199
+ assert_dom_equal expected, text_field("post", "title", :size => 35)
200
+ end
201
+
202
+ def test_text_field_assuming_size
203
+ expected = '<input id="post_title" maxlength="35" name="post[title]" size="35" type="text" value="Hello World" />'
204
+ assert_dom_equal expected, text_field("post", "title", "maxlength" => 35)
205
+ assert_dom_equal expected, text_field("post", "title", :maxlength => 35)
206
+ end
207
+
208
+ def test_text_field_removing_size
209
+ expected = '<input id="post_title" maxlength="35" name="post[title]" type="text" value="Hello World" />'
210
+ assert_dom_equal expected, text_field("post", "title", "maxlength" => 35, "size" => nil)
211
+ assert_dom_equal expected, text_field("post", "title", :maxlength => 35, :size => nil)
212
+ end
213
+
214
+ def test_text_field_doesnt_change_param_values
215
+ object_name = 'post[]'
216
+ expected = '<input id="post_123_title" name="post[123][title]" size="30" type="text" value="Hello World" />'
217
+ assert_equal expected, text_field(object_name, "title")
218
+ assert_equal object_name, "post[]"
219
+ end
220
+
221
+ def test_hidden_field
222
+ assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="Hello World" />',
223
+ hidden_field("post", "title")
224
+ assert_dom_equal '<input id="post_secret" name="post[secret]" type="hidden" value="1" />',
225
+ hidden_field("post", "secret?")
226
+ end
227
+
228
+ def test_hidden_field_with_escapes
229
+ @post.title = "<b>Hello World</b>"
230
+ assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="&lt;b&gt;Hello World&lt;/b&gt;" />',
231
+ hidden_field("post", "title")
232
+ end
233
+
234
+ def test_text_field_with_options
235
+ assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="Something Else" />',
236
+ hidden_field("post", "title", :value => "Something Else")
237
+ end
238
+
239
+ def test_check_box
240
+ assert_dom_equal(
241
+ '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
242
+ check_box("post", "secret")
243
+ )
244
+ @post.secret = 0
245
+ assert_dom_equal(
246
+ '<input name="post[secret]" type="hidden" value="0" /><input id="post_secret" name="post[secret]" type="checkbox" value="1" />',
247
+ check_box("post", "secret")
248
+ )
249
+ assert_dom_equal(
250
+ '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
251
+ check_box("post", "secret" ,{"checked"=>"checked"})
252
+ )
253
+ @post.secret = true
254
+ assert_dom_equal(
255
+ '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
256
+ check_box("post", "secret")
257
+ )
258
+ assert_dom_equal(
259
+ '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
260
+ check_box("post", "secret?")
261
+ )
262
+
263
+ @post.secret = ['0']
264
+ assert_dom_equal(
265
+ '<input name="post[secret]" type="hidden" value="0" /><input id="post_secret" name="post[secret]" type="checkbox" value="1" />',
266
+ check_box("post", "secret")
267
+ )
268
+ @post.secret = ['1']
269
+ assert_dom_equal(
270
+ '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
271
+ check_box("post", "secret")
272
+ )
273
+ end
274
+
275
+ def test_check_box_with_explicit_checked_and_unchecked_values
276
+ @post.secret = "on"
277
+ assert_dom_equal(
278
+ '<input name="post[secret]" type="hidden" value="off" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="on" />',
279
+ check_box("post", "secret", {}, "on", "off")
280
+ )
281
+ end
282
+
283
+ def test_checkbox_disabled_still_submits_checked_value
284
+ assert_dom_equal(
285
+ '<input name="post[secret]" type="hidden" value="1" /><input checked="checked" disabled="disabled" id="post_secret" name="post[secret]" type="checkbox" value="1" />',
286
+ check_box("post", "secret", { :disabled => :true })
287
+ )
288
+ end
289
+
290
+ def test_radio_button
291
+ assert_dom_equal('<input checked="checked" id="post_title_hello_world" name="post[title]" type="radio" value="Hello World" />',
292
+ radio_button("post", "title", "Hello World")
293
+ )
294
+ assert_dom_equal('<input id="post_title_goodbye_world" name="post[title]" type="radio" value="Goodbye World" />',
295
+ radio_button("post", "title", "Goodbye World")
296
+ )
297
+ assert_dom_equal('<input id="item_subobject_title_inside_world" name="item[subobject][title]" type="radio" value="inside world"/>',
298
+ radio_button("item[subobject]", "title", "inside world")
299
+ )
300
+ end
301
+
302
+ def test_radio_button_is_checked_with_integers
303
+ assert_dom_equal('<input checked="checked" id="post_secret_1" name="post[secret]" type="radio" value="1" />',
304
+ radio_button("post", "secret", "1")
305
+ )
306
+ end
307
+
308
+ def test_radio_button_respects_passed_in_id
309
+ assert_dom_equal('<input checked="checked" id="foo" name="post[secret]" type="radio" value="1" />',
310
+ radio_button("post", "secret", "1", :id=>"foo")
311
+ )
312
+ end
313
+
314
+ def test_radio_button_with_booleans
315
+ assert_dom_equal('<input id="post_secret_true" name="post[secret]" type="radio" value="true" />',
316
+ radio_button("post", "secret", true)
317
+ )
318
+
319
+ assert_dom_equal('<input id="post_secret_false" name="post[secret]" type="radio" value="false" />',
320
+ radio_button("post", "secret", false)
321
+ )
322
+ end
323
+
324
+ def test_text_area
325
+ assert_dom_equal(
326
+ '<textarea cols="40" id="post_body" name="post[body]" rows="20">Back to the hill and over it again!</textarea>',
327
+ text_area("post", "body")
328
+ )
329
+ end
330
+
331
+ def test_text_area_with_escapes
332
+ @post.body = "Back to <i>the</i> hill and over it again!"
333
+ assert_dom_equal(
334
+ '<textarea cols="40" id="post_body" name="post[body]" rows="20">Back to &lt;i&gt;the&lt;/i&gt; hill and over it again!</textarea>',
335
+ text_area("post", "body")
336
+ )
337
+ end
338
+
339
+ def test_text_area_with_alternate_value
340
+ assert_dom_equal(
341
+ '<textarea cols="40" id="post_body" name="post[body]" rows="20">Testing alternate values.</textarea>',
342
+ text_area("post", "body", :value => 'Testing alternate values.')
343
+ )
344
+ end
345
+
346
+ def test_text_area_with_html_entities
347
+ @post.body = "The HTML Entity for & is &amp;"
348
+ assert_dom_equal(
349
+ '<textarea cols="40" id="post_body" name="post[body]" rows="20">The HTML Entity for &amp; is &amp;amp;</textarea>',
350
+ text_area("post", "body")
351
+ )
352
+ end
353
+
354
+ def test_text_area_with_size_option
355
+ assert_dom_equal(
356
+ '<textarea cols="183" id="post_body" name="post[body]" rows="820">Back to the hill and over it again!</textarea>',
357
+ text_area("post", "body", :size => "183x820")
358
+ )
359
+ end
360
+
361
+ def test_explicit_name
362
+ assert_dom_equal(
363
+ '<input id="post_title" name="dont guess" size="30" type="text" value="Hello World" />', text_field("post", "title", "name" => "dont guess")
364
+ )
365
+ assert_dom_equal(
366
+ '<textarea cols="40" id="post_body" name="really!" rows="20">Back to the hill and over it again!</textarea>',
367
+ text_area("post", "body", "name" => "really!")
368
+ )
369
+ assert_dom_equal(
370
+ '<input name="i mean it" type="hidden" value="0" /><input checked="checked" id="post_secret" name="i mean it" type="checkbox" value="1" />',
371
+ check_box("post", "secret", "name" => "i mean it")
372
+ )
373
+ assert_dom_equal text_field("post", "title", "name" => "dont guess"),
374
+ text_field("post", "title", :name => "dont guess")
375
+ assert_dom_equal text_area("post", "body", "name" => "really!"),
376
+ text_area("post", "body", :name => "really!")
377
+ assert_dom_equal check_box("post", "secret", "name" => "i mean it"),
378
+ check_box("post", "secret", :name => "i mean it")
379
+ end
380
+
381
+ def test_explicit_id
382
+ assert_dom_equal(
383
+ '<input id="dont guess" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title", "id" => "dont guess")
384
+ )
385
+ assert_dom_equal(
386
+ '<textarea cols="40" id="really!" name="post[body]" rows="20">Back to the hill and over it again!</textarea>',
387
+ text_area("post", "body", "id" => "really!")
388
+ )
389
+ assert_dom_equal(
390
+ '<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="i mean it" name="post[secret]" type="checkbox" value="1" />',
391
+ check_box("post", "secret", "id" => "i mean it")
392
+ )
393
+ assert_dom_equal text_field("post", "title", "id" => "dont guess"),
394
+ text_field("post", "title", :id => "dont guess")
395
+ assert_dom_equal text_area("post", "body", "id" => "really!"),
396
+ text_area("post", "body", :id => "really!")
397
+ assert_dom_equal check_box("post", "secret", "id" => "i mean it"),
398
+ check_box("post", "secret", :id => "i mean it")
399
+ end
400
+
401
+ def test_auto_index
402
+ pid = @post.id
403
+ assert_dom_equal(
404
+ "<label for=\"post_#{pid}_title\">Title</label>",
405
+ label("post[]", "title")
406
+ )
407
+ assert_dom_equal(
408
+ "<input id=\"post_#{pid}_title\" name=\"post[#{pid}][title]\" size=\"30\" type=\"text\" value=\"Hello World\" />", text_field("post[]","title")
409
+ )
410
+ assert_dom_equal(
411
+ "<textarea cols=\"40\" id=\"post_#{pid}_body\" name=\"post[#{pid}][body]\" rows=\"20\">Back to the hill and over it again!</textarea>",
412
+ text_area("post[]", "body")
413
+ )
414
+ assert_dom_equal(
415
+ "<input name=\"post[#{pid}][secret]\" type=\"hidden\" value=\"0\" /><input checked=\"checked\" id=\"post_#{pid}_secret\" name=\"post[#{pid}][secret]\" type=\"checkbox\" value=\"1\" />",
416
+ check_box("post[]", "secret")
417
+ )
418
+ assert_dom_equal(
419
+ "<input checked=\"checked\" id=\"post_#{pid}_title_hello_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Hello World\" />",
420
+ radio_button("post[]", "title", "Hello World")
421
+ )
422
+ assert_dom_equal("<input id=\"post_#{pid}_title_goodbye_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Goodbye World\" />",
423
+ radio_button("post[]", "title", "Goodbye World")
424
+ )
425
+ end
426
+
427
+ def test_form_for
428
+ form_for(:post, @post, :html => { :id => 'create-post' }) do |f|
429
+ concat f.label(:title)
430
+ concat f.text_field(:title)
431
+ concat f.text_area(:body)
432
+ concat f.check_box(:secret)
433
+ concat f.submit('Create post')
434
+ end
435
+
436
+ expected =
437
+ "<form action='http://www.example.com' id='create-post' method='post'>" +
438
+ "<label for='post_title'>Title</label>" +
439
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
440
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
441
+ "<input name='post[secret]' type='hidden' value='0' />" +
442
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
443
+ "<input name='commit' id='post_submit' type='submit' value='Create post' />" +
444
+ "</form>"
445
+
446
+ assert_dom_equal expected, output_buffer
447
+ end
448
+
449
+ def test_form_for_with_method
450
+ form_for(:post, @post, :html => { :id => 'create-post', :method => :put }) do |f|
451
+ concat f.text_field(:title)
452
+ concat f.text_area(:body)
453
+ concat f.check_box(:secret)
454
+ end
455
+
456
+ expected =
457
+ "<form action='http://www.example.com' id='create-post' method='post'>" +
458
+ "<div style='margin:0;padding:0;display:inline'><input name='_method' type='hidden' value='put' /></div>" +
459
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
460
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
461
+ "<input name='post[secret]' type='hidden' value='0' />" +
462
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
463
+ "</form>"
464
+
465
+ assert_dom_equal expected, output_buffer
466
+ end
467
+
468
+ def test_form_for_without_object
469
+ form_for(:post, :html => { :id => 'create-post' }) do |f|
470
+ concat f.text_field(:title)
471
+ concat f.text_area(:body)
472
+ concat f.check_box(:secret)
473
+ end
474
+
475
+ expected =
476
+ "<form action='http://www.example.com' id='create-post' method='post'>" +
477
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
478
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
479
+ "<input name='post[secret]' type='hidden' value='0' />" +
480
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
481
+ "</form>"
482
+
483
+ assert_dom_equal expected, output_buffer
484
+ end
485
+
486
+ def test_form_for_with_index
487
+ form_for("post[]", @post) do |f|
488
+ concat f.label(:title)
489
+ concat f.text_field(:title)
490
+ concat f.text_area(:body)
491
+ concat f.check_box(:secret)
492
+ end
493
+
494
+ expected =
495
+ "<form action='http://www.example.com' method='post'>" +
496
+ "<label for=\"post_123_title\">Title</label>" +
497
+ "<input name='post[123][title]' size='30' type='text' id='post_123_title' value='Hello World' />" +
498
+ "<textarea name='post[123][body]' id='post_123_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
499
+ "<input name='post[123][secret]' type='hidden' value='0' />" +
500
+ "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />" +
501
+ "</form>"
502
+
503
+ assert_dom_equal expected, output_buffer
504
+ end
505
+
506
+ def test_form_for_with_nil_index_option_override
507
+ form_for("post[]", @post, :index => nil) do |f|
508
+ concat f.text_field(:title)
509
+ concat f.text_area(:body)
510
+ concat f.check_box(:secret)
511
+ end
512
+
513
+ expected =
514
+ "<form action='http://www.example.com' method='post'>" +
515
+ "<input name='post[][title]' size='30' type='text' id='post__title' value='Hello World' />" +
516
+ "<textarea name='post[][body]' id='post__body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
517
+ "<input name='post[][secret]' type='hidden' value='0' />" +
518
+ "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />" +
519
+ "</form>"
520
+
521
+ assert_dom_equal expected, output_buffer
522
+ end
523
+
524
+ def test_nested_fields_for
525
+ form_for(:post, @post) do |f|
526
+ f.fields_for(:comment, @post) do |c|
527
+ concat c.text_field(:title)
528
+ end
529
+ end
530
+
531
+ expected = "<form action='http://www.example.com' method='post'>" +
532
+ "<input name='post[comment][title]' size='30' type='text' id='post_comment_title' value='Hello World' />" +
533
+ "</form>"
534
+
535
+ assert_dom_equal expected, output_buffer
536
+ end
537
+
538
+ def test_nested_fields_for_with_nested_collections
539
+ form_for('post[]', @post) do |f|
540
+ concat f.text_field(:title)
541
+ f.fields_for('comment[]', @comment) do |c|
542
+ concat c.text_field(:name)
543
+ end
544
+ end
545
+
546
+ expected = "<form action='http://www.example.com' method='post'>" +
547
+ "<input name='post[123][title]' size='30' type='text' id='post_123_title' value='Hello World' />" +
548
+ "<input name='post[123][comment][][name]' size='30' type='text' id='post_123_comment__name' value='new comment' />" +
549
+ "</form>"
550
+
551
+ assert_dom_equal expected, output_buffer
552
+ end
553
+
554
+ def test_nested_fields_for_with_index_and_parent_fields
555
+ form_for('post', @post, :index => 1) do |c|
556
+ concat c.text_field(:title)
557
+ c.fields_for('comment', @comment, :index => 1) do |r|
558
+ concat r.text_field(:name)
559
+ end
560
+ end
561
+
562
+ expected = "<form action='http://www.example.com' method='post'>" +
563
+ "<input name='post[1][title]' size='30' type='text' id='post_1_title' value='Hello World' />" +
564
+ "<input name='post[1][comment][1][name]' size='30' type='text' id='post_1_comment_1_name' value='new comment' />" +
565
+ "</form>"
566
+
567
+ assert_dom_equal expected, output_buffer
568
+ end
569
+
570
+ def test_form_for_with_index_and_nested_fields_for
571
+ form_for(:post, @post, :index => 1) do |f|
572
+ f.fields_for(:comment, @post) do |c|
573
+ concat c.text_field(:title)
574
+ end
575
+ end
576
+
577
+ expected = "<form action='http://www.example.com' method='post'>" +
578
+ "<input name='post[1][comment][title]' size='30' type='text' id='post_1_comment_title' value='Hello World' />" +
579
+ "</form>"
580
+
581
+ assert_dom_equal expected, output_buffer
582
+ end
583
+
584
+ def test_nested_fields_for_with_index_on_both
585
+ form_for(:post, @post, :index => 1) do |f|
586
+ f.fields_for(:comment, @post, :index => 5) do |c|
587
+ concat c.text_field(:title)
588
+ end
589
+ end
590
+
591
+ expected = "<form action='http://www.example.com' method='post'>" +
592
+ "<input name='post[1][comment][5][title]' size='30' type='text' id='post_1_comment_5_title' value='Hello World' />" +
593
+ "</form>"
594
+
595
+ assert_dom_equal expected, output_buffer
596
+ end
597
+
598
+ def test_nested_fields_for_with_auto_index
599
+ form_for("post[]", @post) do |f|
600
+ f.fields_for(:comment, @post) do |c|
601
+ concat c.text_field(:title)
602
+ end
603
+ end
604
+
605
+ expected = "<form action='http://www.example.com' method='post'>" +
606
+ "<input name='post[123][comment][title]' size='30' type='text' id='post_123_comment_title' value='Hello World' />" +
607
+ "</form>"
608
+
609
+ assert_dom_equal expected, output_buffer
610
+ end
611
+
612
+ def test_nested_fields_for_with_index_radio_button
613
+ form_for(:post, @post) do |f|
614
+ f.fields_for(:comment, @post, :index => 5) do |c|
615
+ concat c.radio_button(:title, "hello")
616
+ end
617
+ end
618
+
619
+ expected = "<form action='http://www.example.com' method='post'>" +
620
+ "<input name='post[comment][5][title]' type='radio' id='post_comment_5_title_hello' value='hello' />" +
621
+ "</form>"
622
+
623
+ assert_dom_equal expected, output_buffer
624
+ end
625
+
626
+ def test_nested_fields_for_with_auto_index_on_both
627
+ form_for("post[]", @post) do |f|
628
+ f.fields_for("comment[]", @post) do |c|
629
+ concat c.text_field(:title)
630
+ end
631
+ end
632
+
633
+ expected = "<form action='http://www.example.com' method='post'>" +
634
+ "<input name='post[123][comment][123][title]' size='30' type='text' id='post_123_comment_123_title' value='Hello World' />" +
635
+ "</form>"
636
+
637
+ assert_dom_equal expected, output_buffer
638
+ end
639
+
640
+ def test_nested_fields_for_with_index_and_auto_index
641
+ form_for("post[]", @post) do |f|
642
+ f.fields_for(:comment, @post, :index => 5) do |c|
643
+ concat c.text_field(:title)
644
+ end
645
+ end
646
+
647
+ form_for(:post, @post, :index => 1) do |f|
648
+ f.fields_for("comment[]", @post) do |c|
649
+ concat c.text_field(:title)
650
+ end
651
+ end
652
+
653
+ expected = "<form action='http://www.example.com' method='post'>" +
654
+ "<input name='post[123][comment][5][title]' size='30' type='text' id='post_123_comment_5_title' value='Hello World' />" +
655
+ "</form>" +
656
+ "<form action='http://www.example.com' method='post'>" +
657
+ "<input name='post[1][comment][123][title]' size='30' type='text' id='post_1_comment_123_title' value='Hello World' />" +
658
+ "</form>"
659
+
660
+ assert_dom_equal expected, output_buffer
661
+ end
662
+
663
+ def test_nested_fields_for_with_a_new_record_on_a_nested_attributes_one_to_one_association
664
+ @post.author = Author.new
665
+
666
+ form_for(:post, @post) do |f|
667
+ concat f.text_field(:title)
668
+ f.fields_for(:author) do |af|
669
+ concat af.text_field(:name)
670
+ end
671
+ end
672
+
673
+ expected = '<form action="http://www.example.com" method="post">' +
674
+ '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
675
+ '<input id="post_author_attributes_name" name="post[author_attributes][name]" size="30" type="text" value="new author" />' +
676
+ '</form>'
677
+
678
+ assert_dom_equal expected, output_buffer
679
+ end
680
+
681
+ def test_nested_fields_for_with_explicitly_passed_object_on_a_nested_attributes_one_to_one_association
682
+ form_for(:post, @post) do |f|
683
+ f.fields_for(:author, Author.new(123)) do |af|
684
+ assert_not_nil af.object
685
+ assert_equal 123, af.object.id
686
+ end
687
+ end
688
+ end
689
+
690
+ def test_nested_fields_for_with_an_existing_record_on_a_nested_attributes_one_to_one_association
691
+ @post.author = Author.new(321)
692
+
693
+ form_for(:post, @post) do |f|
694
+ concat f.text_field(:title)
695
+ f.fields_for(:author) do |af|
696
+ concat af.text_field(:name)
697
+ end
698
+ end
699
+
700
+ expected = '<form action="http://www.example.com" method="post">' +
701
+ '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
702
+ '<input id="post_author_attributes_name" name="post[author_attributes][name]" size="30" type="text" value="author #321" />' +
703
+ '<input id="post_author_attributes_id" name="post[author_attributes][id]" type="hidden" value="321" />' +
704
+ '</form>'
705
+
706
+ assert_dom_equal expected, output_buffer
707
+ end
708
+
709
+ def test_nested_fields_for_with_existing_records_on_a_nested_attributes_one_to_one_association_with_explicit_hidden_field_placement
710
+ @post.author = Author.new(321)
711
+
712
+ form_for(:post, @post) do |f|
713
+ concat f.text_field(:title)
714
+ f.fields_for(:author) do |af|
715
+ concat af.hidden_field(:id)
716
+ concat af.text_field(:name)
717
+ end
718
+ end
719
+
720
+ expected = '<form action="http://www.example.com" method="post">' +
721
+ '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
722
+ '<input id="post_author_attributes_id" name="post[author_attributes][id]" type="hidden" value="321" />' +
723
+ '<input id="post_author_attributes_name" name="post[author_attributes][name]" size="30" type="text" value="author #321" />' +
724
+ '</form>'
725
+
726
+ assert_dom_equal expected, output_buffer
727
+ end
728
+
729
+ def test_nested_fields_for_with_existing_records_on_a_nested_attributes_collection_association
730
+ @post.comments = Array.new(2) { |id| Comment.new(id + 1) }
731
+
732
+ form_for(:post, @post) do |f|
733
+ concat f.text_field(:title)
734
+ @post.comments.each do |comment|
735
+ f.fields_for(:comments, comment) do |cf|
736
+ concat cf.text_field(:name)
737
+ end
738
+ end
739
+ end
740
+
741
+ expected = '<form action="http://www.example.com" method="post">' +
742
+ '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
743
+ '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #1" />' +
744
+ '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="1" />' +
745
+ '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="comment #2" />' +
746
+ '<input id="post_comments_attributes_1_id" name="post[comments_attributes][1][id]" type="hidden" value="2" />' +
747
+ '</form>'
748
+
749
+ assert_dom_equal expected, output_buffer
750
+ end
751
+
752
+ def test_nested_fields_for_with_existing_records_on_a_nested_attributes_collection_association_with_explicit_hidden_field_placement
753
+ @post.comments = Array.new(2) { |id| Comment.new(id + 1) }
754
+
755
+ form_for(:post, @post) do |f|
756
+ concat f.text_field(:title)
757
+ @post.comments.each do |comment|
758
+ f.fields_for(:comments, comment) do |cf|
759
+ concat cf.hidden_field(:id)
760
+ concat cf.text_field(:name)
761
+ end
762
+ end
763
+ end
764
+
765
+ expected = '<form action="http://www.example.com" method="post">' +
766
+ '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
767
+ '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="1" />' +
768
+ '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #1" />' +
769
+ '<input id="post_comments_attributes_1_id" name="post[comments_attributes][1][id]" type="hidden" value="2" />' +
770
+ '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="comment #2" />' +
771
+ '</form>'
772
+
773
+ assert_dom_equal expected, output_buffer
774
+ end
775
+
776
+ def test_nested_fields_for_with_new_records_on_a_nested_attributes_collection_association
777
+ @post.comments = [Comment.new, Comment.new]
778
+
779
+ form_for(:post, @post) do |f|
780
+ concat f.text_field(:title)
781
+ @post.comments.each do |comment|
782
+ f.fields_for(:comments, comment) do |cf|
783
+ concat cf.text_field(:name)
784
+ end
785
+ end
786
+ end
787
+
788
+ expected = '<form action="http://www.example.com" method="post">' +
789
+ '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
790
+ '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="new comment" />' +
791
+ '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="new comment" />' +
792
+ '</form>'
793
+
794
+ assert_dom_equal expected, output_buffer
795
+ end
796
+
797
+ def test_nested_fields_for_with_existing_and_new_records_on_a_nested_attributes_collection_association
798
+ @post.comments = [Comment.new(321), Comment.new]
799
+
800
+ form_for(:post, @post) do |f|
801
+ concat f.text_field(:title)
802
+ @post.comments.each do |comment|
803
+ f.fields_for(:comments, comment) do |cf|
804
+ concat cf.text_field(:name)
805
+ end
806
+ end
807
+ end
808
+
809
+ expected = '<form action="http://www.example.com" method="post">' +
810
+ '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
811
+ '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #321" />' +
812
+ '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="321" />' +
813
+ '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="new comment" />' +
814
+ '</form>'
815
+
816
+ assert_dom_equal expected, output_buffer
817
+ end
818
+
819
+ def test_nested_fields_for_with_an_empty_supplied_attributes_collection
820
+ form_for(:post, @post) do |f|
821
+ concat f.text_field(:title)
822
+ f.fields_for(:comments, []) do |cf|
823
+ concat cf.text_field(:name)
824
+ end
825
+ end
826
+
827
+ expected = '<form action="http://www.example.com" method="post">' +
828
+ '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
829
+ '</form>'
830
+
831
+ assert_dom_equal expected, output_buffer
832
+ end
833
+
834
+ def test_nested_fields_for_with_existing_records_on_a_supplied_nested_attributes_collection
835
+ @post.comments = Array.new(2) { |id| Comment.new(id + 1) }
836
+
837
+ form_for(:post, @post) do |f|
838
+ concat f.text_field(:title)
839
+ f.fields_for(:comments, @post.comments) do |cf|
840
+ concat cf.text_field(:name)
841
+ end
842
+ end
843
+
844
+ expected = '<form action="http://www.example.com" method="post">' +
845
+ '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
846
+ '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #1" />' +
847
+ '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="1" />' +
848
+ '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="comment #2" />' +
849
+ '<input id="post_comments_attributes_1_id" name="post[comments_attributes][1][id]" type="hidden" value="2" />' +
850
+ '</form>'
851
+
852
+ assert_dom_equal expected, output_buffer
853
+ end
854
+
855
+ def test_nested_fields_for_on_a_nested_attributes_collection_association_yields_only_builder
856
+ @post.comments = [Comment.new(321), Comment.new]
857
+ yielded_comments = []
858
+
859
+ form_for(:post, @post) do |f|
860
+ concat f.text_field(:title)
861
+ f.fields_for(:comments) do |cf|
862
+ concat cf.text_field(:name)
863
+ yielded_comments << cf.object
864
+ end
865
+ end
866
+
867
+ expected = '<form action="http://www.example.com" method="post">' +
868
+ '<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
869
+ '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #321" />' +
870
+ '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="321" />' +
871
+ '<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="new comment" />' +
872
+ '</form>'
873
+
874
+ assert_dom_equal expected, output_buffer
875
+ assert_equal yielded_comments, @post.comments
876
+ end
877
+
878
+ def test_nested_fields_for_with_child_index_option_override_on_a_nested_attributes_collection_association
879
+ @post.comments = []
880
+
881
+ form_for(:post, @post) do |f|
882
+ f.fields_for(:comments, Comment.new(321), :child_index => 'abc') do |cf|
883
+ concat cf.text_field(:name)
884
+ end
885
+ end
886
+
887
+ expected = '<form action="http://www.example.com" method="post">' +
888
+ '<input id="post_comments_attributes_abc_name" name="post[comments_attributes][abc][name]" size="30" type="text" value="comment #321" />' +
889
+ '<input id="post_comments_attributes_abc_id" name="post[comments_attributes][abc][id]" type="hidden" value="321" />' +
890
+ '</form>'
891
+
892
+ assert_dom_equal expected, output_buffer
893
+ end
894
+
895
+ def test_nested_fields_uses_unique_indices_for_different_collection_associations
896
+ @post.comments = [Comment.new(321)]
897
+ @post.tags = [Tag.new(123), Tag.new(456)]
898
+ @post.comments[0].relevances = []
899
+ @post.tags[0].relevances = []
900
+ @post.tags[1].relevances = []
901
+ form_for(:post, @post) do |f|
902
+ f.fields_for(:comments, @post.comments[0]) do |cf|
903
+ concat cf.text_field(:name)
904
+ cf.fields_for(:relevances, CommentRelevance.new(314)) do |crf|
905
+ concat crf.text_field(:value)
906
+ end
907
+ end
908
+ f.fields_for(:tags, @post.tags[0]) do |tf|
909
+ concat tf.text_field(:value)
910
+ tf.fields_for(:relevances, TagRelevance.new(3141)) do |trf|
911
+ concat trf.text_field(:value)
912
+ end
913
+ end
914
+ f.fields_for('tags', @post.tags[1]) do |tf|
915
+ concat tf.text_field(:value)
916
+ tf.fields_for(:relevances, TagRelevance.new(31415)) do |trf|
917
+ concat trf.text_field(:value)
918
+ end
919
+ end
920
+ end
921
+
922
+ expected = '<form action="http://www.example.com" method="post">' +
923
+ '<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #321" />' +
924
+ '<input id="post_comments_attributes_0_relevances_attributes_0_value" name="post[comments_attributes][0][relevances_attributes][0][value]" size="30" type="text" value="commentrelevance #314" />' +
925
+ '<input id="post_comments_attributes_0_relevances_attributes_0_id" name="post[comments_attributes][0][relevances_attributes][0][id]" type="hidden" value="314" />' +
926
+ '<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="321" />' +
927
+ '<input id="post_tags_attributes_0_value" name="post[tags_attributes][0][value]" size="30" type="text" value="tag #123" />' +
928
+ '<input id="post_tags_attributes_0_relevances_attributes_0_value" name="post[tags_attributes][0][relevances_attributes][0][value]" size="30" type="text" value="tagrelevance #3141" />' +
929
+ '<input id="post_tags_attributes_0_relevances_attributes_0_id" name="post[tags_attributes][0][relevances_attributes][0][id]" type="hidden" value="3141" />' +
930
+ '<input id="post_tags_attributes_0_id" name="post[tags_attributes][0][id]" type="hidden" value="123" />' +
931
+ '<input id="post_tags_attributes_1_value" name="post[tags_attributes][1][value]" size="30" type="text" value="tag #456" />' +
932
+ '<input id="post_tags_attributes_1_relevances_attributes_0_value" name="post[tags_attributes][1][relevances_attributes][0][value]" size="30" type="text" value="tagrelevance #31415" />' +
933
+ '<input id="post_tags_attributes_1_relevances_attributes_0_id" name="post[tags_attributes][1][relevances_attributes][0][id]" type="hidden" value="31415" />' +
934
+ '<input id="post_tags_attributes_1_id" name="post[tags_attributes][1][id]" type="hidden" value="456" />' +
935
+ '</form>'
936
+
937
+ assert_dom_equal expected, output_buffer
938
+ end
939
+
940
+ def test_fields_for
941
+ fields_for(:post, @post) do |f|
942
+ concat f.text_field(:title)
943
+ concat f.text_area(:body)
944
+ concat f.check_box(:secret)
945
+ end
946
+
947
+ expected =
948
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
949
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
950
+ "<input name='post[secret]' type='hidden' value='0' />" +
951
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
952
+
953
+ assert_dom_equal expected, output_buffer
954
+ end
955
+
956
+ def test_fields_for_with_index
957
+ fields_for("post[]", @post) do |f|
958
+ concat f.text_field(:title)
959
+ concat f.text_area(:body)
960
+ concat f.check_box(:secret)
961
+ end
962
+
963
+ expected =
964
+ "<input name='post[123][title]' size='30' type='text' id='post_123_title' value='Hello World' />" +
965
+ "<textarea name='post[123][body]' id='post_123_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
966
+ "<input name='post[123][secret]' type='hidden' value='0' />" +
967
+ "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />"
968
+
969
+ assert_dom_equal expected, output_buffer
970
+ end
971
+
972
+ def test_fields_for_with_nil_index_option_override
973
+ fields_for("post[]", @post, :index => nil) do |f|
974
+ concat f.text_field(:title)
975
+ concat f.text_area(:body)
976
+ concat f.check_box(:secret)
977
+ end
978
+
979
+ expected =
980
+ "<input name='post[][title]' size='30' type='text' id='post__title' value='Hello World' />" +
981
+ "<textarea name='post[][body]' id='post__body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
982
+ "<input name='post[][secret]' type='hidden' value='0' />" +
983
+ "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />"
984
+
985
+ assert_dom_equal expected, output_buffer
986
+ end
987
+
988
+ def test_fields_for_with_index_option_override
989
+ fields_for("post[]", @post, :index => "abc") do |f|
990
+ concat f.text_field(:title)
991
+ concat f.text_area(:body)
992
+ concat f.check_box(:secret)
993
+ end
994
+
995
+ expected =
996
+ "<input name='post[abc][title]' size='30' type='text' id='post_abc_title' value='Hello World' />" +
997
+ "<textarea name='post[abc][body]' id='post_abc_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
998
+ "<input name='post[abc][secret]' type='hidden' value='0' />" +
999
+ "<input name='post[abc][secret]' checked='checked' type='checkbox' id='post_abc_secret' value='1' />"
1000
+
1001
+ assert_dom_equal expected, output_buffer
1002
+ end
1003
+
1004
+ def test_fields_for_without_object
1005
+ fields_for(:post) do |f|
1006
+ concat f.text_field(:title)
1007
+ concat f.text_area(:body)
1008
+ concat f.check_box(:secret)
1009
+ end
1010
+
1011
+ expected =
1012
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
1013
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
1014
+ "<input name='post[secret]' type='hidden' value='0' />" +
1015
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
1016
+
1017
+ assert_dom_equal expected, output_buffer
1018
+ end
1019
+
1020
+ def test_fields_for_with_only_object
1021
+ fields_for(@post) do |f|
1022
+ concat f.text_field(:title)
1023
+ concat f.text_area(:body)
1024
+ concat f.check_box(:secret)
1025
+ end
1026
+
1027
+ expected =
1028
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
1029
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
1030
+ "<input name='post[secret]' type='hidden' value='0' />" +
1031
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />"
1032
+
1033
+ assert_dom_equal expected, output_buffer
1034
+ end
1035
+
1036
+ def test_fields_for_object_with_bracketed_name
1037
+ fields_for("author[post]", @post) do |f|
1038
+ concat f.label(:title)
1039
+ concat f.text_field(:title)
1040
+ end
1041
+
1042
+ assert_dom_equal "<label for=\"author_post_title\">Title</label>" +
1043
+ "<input name='author[post][title]' size='30' type='text' id='author_post_title' value='Hello World' />",
1044
+ output_buffer
1045
+ end
1046
+
1047
+ def test_fields_for_object_with_bracketed_name_and_index
1048
+ fields_for("author[post]", @post, :index => 1) do |f|
1049
+ concat f.label(:title)
1050
+ concat f.text_field(:title)
1051
+ end
1052
+
1053
+ assert_dom_equal "<label for=\"author_post_1_title\">Title</label>" +
1054
+ "<input name='author[post][1][title]' size='30' type='text' id='author_post_1_title' value='Hello World' />",
1055
+ output_buffer
1056
+ end
1057
+
1058
+ def test_form_builder_does_not_have_form_for_method
1059
+ assert ! ActionView::Helpers::FormBuilder.instance_methods.include?('form_for')
1060
+ end
1061
+
1062
+ def test_form_for_and_fields_for
1063
+ form_for(:post, @post, :html => { :id => 'create-post' }) do |post_form|
1064
+ concat post_form.text_field(:title)
1065
+ concat post_form.text_area(:body)
1066
+
1067
+ fields_for(:parent_post, @post) do |parent_fields|
1068
+ concat parent_fields.check_box(:secret)
1069
+ end
1070
+ end
1071
+
1072
+ expected =
1073
+ "<form action='http://www.example.com' id='create-post' method='post'>" +
1074
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
1075
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
1076
+ "<input name='parent_post[secret]' type='hidden' value='0' />" +
1077
+ "<input name='parent_post[secret]' checked='checked' type='checkbox' id='parent_post_secret' value='1' />" +
1078
+ "</form>"
1079
+
1080
+ assert_dom_equal expected, output_buffer
1081
+ end
1082
+
1083
+ def test_form_for_and_fields_for_with_object
1084
+ form_for(:post, @post, :html => { :id => 'create-post' }) do |post_form|
1085
+ concat post_form.text_field(:title)
1086
+ concat post_form.text_area(:body)
1087
+
1088
+ post_form.fields_for(@comment) do |comment_fields|
1089
+ concat comment_fields.text_field(:name)
1090
+ end
1091
+ end
1092
+
1093
+ expected =
1094
+ "<form action='http://www.example.com' id='create-post' method='post'>" +
1095
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
1096
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
1097
+ "<input name='post[comment][name]' type='text' id='post_comment_name' value='new comment' size='30' />" +
1098
+ "</form>"
1099
+
1100
+ assert_dom_equal expected, output_buffer
1101
+ end
1102
+
1103
+ class LabelledFormBuilder < ActionView::Helpers::FormBuilder
1104
+ (field_helpers - %w(hidden_field)).each do |selector|
1105
+ src = <<-END_SRC
1106
+ def #{selector}(field, *args, &proc)
1107
+ ("<label for='\#{field}'>\#{field.to_s.humanize}:</label> " + super + "<br/>").html_safe!
1108
+ end
1109
+ END_SRC
1110
+ class_eval src, __FILE__, __LINE__
1111
+ end
1112
+ end
1113
+
1114
+ def test_form_for_with_labelled_builder
1115
+ form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
1116
+ concat f.text_field(:title)
1117
+ concat f.text_area(:body)
1118
+ concat f.check_box(:secret)
1119
+ end
1120
+
1121
+ expected =
1122
+ "<form action='http://www.example.com' method='post'>" +
1123
+ "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
1124
+ "<label for='body'>Body:</label> <textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea><br/>" +
1125
+ "<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' /><br/>" +
1126
+ "</form>"
1127
+
1128
+ assert_dom_equal expected, output_buffer
1129
+ end
1130
+
1131
+ def test_default_form_builder
1132
+ old_default_form_builder, ActionView::Base.default_form_builder =
1133
+ ActionView::Base.default_form_builder, LabelledFormBuilder
1134
+
1135
+ form_for(:post, @post) do |f|
1136
+ concat f.text_field(:title)
1137
+ concat f.text_area(:body)
1138
+ concat f.check_box(:secret)
1139
+ end
1140
+
1141
+ expected =
1142
+ "<form action='http://www.example.com' method='post'>" +
1143
+ "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
1144
+ "<label for='body'>Body:</label> <textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea><br/>" +
1145
+ "<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' /><br/>" +
1146
+ "</form>"
1147
+
1148
+ assert_dom_equal expected, output_buffer
1149
+ ensure
1150
+ ActionView::Base.default_form_builder = old_default_form_builder
1151
+ end
1152
+
1153
+ def test_default_form_builder_with_active_record_helpers
1154
+ form_for(:post, @post) do |f|
1155
+ concat f.error_message_on('author_name')
1156
+ concat f.error_messages
1157
+ end
1158
+
1159
+ expected = %(<form action='http://www.example.com' method='post'>) +
1160
+ %(<div class='formError'>can't be empty</div>) +
1161
+ %(<div class="errorExplanation" id="errorExplanation"><h2>1 error prohibited this post from being saved</h2><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li></ul></div>) +
1162
+ %(</form>)
1163
+
1164
+ assert_dom_equal expected, output_buffer
1165
+
1166
+ end
1167
+
1168
+ def test_default_form_builder_no_instance_variable
1169
+ post = @post
1170
+ @post = nil
1171
+
1172
+ form_for(:post, post) do |f|
1173
+ concat f.error_message_on('author_name')
1174
+ concat f.error_messages
1175
+ end
1176
+
1177
+ expected = %(<form action='http://www.example.com' method='post'>) +
1178
+ %(<div class='formError'>can't be empty</div>) +
1179
+ %(<div class="errorExplanation" id="errorExplanation"><h2>1 error prohibited this post from being saved</h2><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li></ul></div>) +
1180
+ %(</form>)
1181
+
1182
+ assert_dom_equal expected, output_buffer
1183
+
1184
+ end
1185
+
1186
+ # Perhaps this test should be moved to prototype helper tests.
1187
+ def test_remote_form_for_with_labelled_builder
1188
+ self.extend ActionView::Helpers::PrototypeHelper
1189
+
1190
+ remote_form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
1191
+ concat f.text_field(:title)
1192
+ concat f.text_area(:body)
1193
+ concat f.check_box(:secret)
1194
+ end
1195
+
1196
+ expected =
1197
+ %(<form action="http://www.example.com" onsubmit="new Ajax.Request('http://www.example.com', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;" method="post">) +
1198
+ "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
1199
+ "<label for='body'>Body:</label> <textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea><br/>" +
1200
+ "<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' /><br/>" +
1201
+ "</form>"
1202
+
1203
+ assert_dom_equal expected, output_buffer
1204
+ end
1205
+
1206
+ def test_fields_for_with_labelled_builder
1207
+ fields_for(:post, @post, :builder => LabelledFormBuilder) do |f|
1208
+ concat f.text_field(:title)
1209
+ concat f.text_area(:body)
1210
+ concat f.check_box(:secret)
1211
+ end
1212
+
1213
+ expected =
1214
+ "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
1215
+ "<label for='body'>Body:</label> <textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea><br/>" +
1216
+ "<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' /><br/>"
1217
+
1218
+ assert_dom_equal expected, output_buffer
1219
+ end
1220
+
1221
+ def test_form_for_with_labelled_builder_with_nested_fields_for_without_options_hash
1222
+ klass = nil
1223
+
1224
+ form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
1225
+ f.fields_for(:comments, Comment.new) do |nested_fields|
1226
+ klass = nested_fields.class
1227
+ ''
1228
+ end
1229
+ end
1230
+
1231
+ assert_equal LabelledFormBuilder, klass
1232
+ end
1233
+
1234
+ def test_form_for_with_labelled_builder_with_nested_fields_for_with_options_hash
1235
+ klass = nil
1236
+
1237
+ form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
1238
+ f.fields_for(:comments, Comment.new, :index => 'foo') do |nested_fields|
1239
+ klass = nested_fields.class
1240
+ ''
1241
+ end
1242
+ end
1243
+
1244
+ assert_equal LabelledFormBuilder, klass
1245
+ end
1246
+
1247
+ class LabelledFormBuilderSubclass < LabelledFormBuilder; end
1248
+
1249
+ def test_form_for_with_labelled_builder_with_nested_fields_for_with_custom_builder
1250
+ klass = nil
1251
+
1252
+ form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
1253
+ f.fields_for(:comments, Comment.new, :builder => LabelledFormBuilderSubclass) do |nested_fields|
1254
+ klass = nested_fields.class
1255
+ ''
1256
+ end
1257
+ end
1258
+
1259
+ assert_equal LabelledFormBuilderSubclass, klass
1260
+ end
1261
+
1262
+ def test_form_for_with_html_options_adds_options_to_form_tag
1263
+ form_for(:post, @post, :html => {:id => 'some_form', :class => 'some_class'}) do |f| end
1264
+ expected = "<form action=\"http://www.example.com\" class=\"some_class\" id=\"some_form\" method=\"post\"></form>"
1265
+
1266
+ assert_dom_equal expected, output_buffer
1267
+ end
1268
+
1269
+ def test_form_for_with_string_url_option
1270
+ form_for(:post, @post, :url => 'http://www.otherdomain.com') do |f| end
1271
+
1272
+ assert_equal '<form action="http://www.otherdomain.com" method="post"></form>', output_buffer
1273
+ end
1274
+
1275
+ def test_form_for_with_hash_url_option
1276
+ form_for(:post, @post, :url => {:controller => 'controller', :action => 'action'}) do |f| end
1277
+
1278
+ assert_equal 'controller', @controller.url_for_options[:controller]
1279
+ assert_equal 'action', @controller.url_for_options[:action]
1280
+ end
1281
+
1282
+ def test_form_for_with_record_url_option
1283
+ form_for(:post, @post, :url => @post) do |f| end
1284
+
1285
+ expected = "<form action=\"/posts/123\" method=\"post\"></form>"
1286
+ assert_equal expected, output_buffer
1287
+ end
1288
+
1289
+ def test_form_for_with_existing_object
1290
+ form_for(@post) do |f| end
1291
+
1292
+ expected = "<form action=\"/posts/123\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0;display:inline\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
1293
+ assert_equal expected, output_buffer
1294
+ end
1295
+
1296
+ def test_form_for_with_new_object
1297
+ post = Post.new
1298
+ post.new_record = true
1299
+ def post.id() nil end
1300
+
1301
+ form_for(post) do |f| end
1302
+
1303
+ expected = "<form action=\"/posts\" class=\"new_post\" id=\"new_post\" method=\"post\"></form>"
1304
+ assert_equal expected, output_buffer
1305
+ end
1306
+
1307
+ def test_form_for_with_existing_object_in_list
1308
+ @post.new_record = false
1309
+ @comment.save
1310
+
1311
+ form_for([@post, @comment]) {}
1312
+
1313
+ expected = %(<form action="#{comment_path(@post, @comment)}" class="edit_comment" id="edit_comment_1" method="post"><div style="margin:0;padding:0;display:inline"><input name="_method" type="hidden" value="put" /></div></form>)
1314
+ assert_dom_equal expected, output_buffer
1315
+ end
1316
+
1317
+ def test_form_for_with_new_object_in_list
1318
+ @post.new_record = false
1319
+
1320
+ form_for([@post, @comment]) {}
1321
+
1322
+ expected = %(<form action="#{comments_path(@post)}" class="new_comment" id="new_comment" method="post"></form>)
1323
+ assert_dom_equal expected, output_buffer
1324
+ end
1325
+
1326
+ def test_form_for_with_existing_object_and_namespace_in_list
1327
+ @post.new_record = false
1328
+ @comment.save
1329
+
1330
+ form_for([:admin, @post, @comment]) {}
1331
+
1332
+ expected = %(<form action="#{admin_comment_path(@post, @comment)}" class="edit_comment" id="edit_comment_1" method="post"><div style="margin:0;padding:0;display:inline"><input name="_method" type="hidden" value="put" /></div></form>)
1333
+ assert_dom_equal expected, output_buffer
1334
+ end
1335
+
1336
+ def test_form_for_with_new_object_and_namespace_in_list
1337
+ @post.new_record = false
1338
+
1339
+ form_for([:admin, @post, @comment]) {}
1340
+
1341
+ expected = %(<form action="#{admin_comments_path(@post)}" class="new_comment" id="new_comment" method="post"></form>)
1342
+ assert_dom_equal expected, output_buffer
1343
+ end
1344
+
1345
+ def test_form_for_with_existing_object_and_custom_url
1346
+ form_for(@post, :url => "/super_posts") do |f| end
1347
+
1348
+ expected = "<form action=\"/super_posts\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0;display:inline\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
1349
+ assert_equal expected, output_buffer
1350
+ end
1351
+
1352
+ def test_remote_form_for_with_html_options_adds_options_to_form_tag
1353
+ self.extend ActionView::Helpers::PrototypeHelper
1354
+
1355
+ remote_form_for(:post, @post, :html => {:id => 'some_form', :class => 'some_class'}) do |f| end
1356
+ expected = "<form action=\"http://www.example.com\" class=\"some_class\" id=\"some_form\" method=\"post\" onsubmit=\"new Ajax.Request('http://www.example.com', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;\"></form>"
1357
+
1358
+ assert_dom_equal expected, output_buffer
1359
+ end
1360
+
1361
+ protected
1362
+ def comments_path(post)
1363
+ "/posts/#{post.id}/comments"
1364
+ end
1365
+ alias_method :post_comments_path, :comments_path
1366
+
1367
+ def comment_path(post, comment)
1368
+ "/posts/#{post.id}/comments/#{comment.id}"
1369
+ end
1370
+ alias_method :post_comment_path, :comment_path
1371
+
1372
+ def admin_comments_path(post)
1373
+ "/admin/posts/#{post.id}/comments"
1374
+ end
1375
+ alias_method :admin_post_comments_path, :admin_comments_path
1376
+
1377
+ def admin_comment_path(post, comment)
1378
+ "/admin/posts/#{post.id}/comments/#{comment.id}"
1379
+ end
1380
+ alias_method :admin_post_comment_path, :admin_comment_path
1381
+
1382
+ def posts_path
1383
+ "/posts"
1384
+ end
1385
+
1386
+ def post_path(post)
1387
+ "/posts/#{post.id}"
1388
+ end
1389
+
1390
+ def protect_against_forgery?
1391
+ false
1392
+ end
1393
+ end