eactionpack 2.1.2

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 (338) hide show
  1. data/CHANGELOG +7 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +469 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +146 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller.rb +79 -0
  8. data/lib/action_controller/assertions.rb +69 -0
  9. data/lib/action_controller/assertions/dom_assertions.rb +39 -0
  10. data/lib/action_controller/assertions/model_assertions.rb +20 -0
  11. data/lib/action_controller/assertions/response_assertions.rb +172 -0
  12. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  13. data/lib/action_controller/assertions/selector_assertions.rb +491 -0
  14. data/lib/action_controller/assertions/tag_assertions.rb +130 -0
  15. data/lib/action_controller/base.rb +1288 -0
  16. data/lib/action_controller/benchmarking.rb +94 -0
  17. data/lib/action_controller/caching.rb +72 -0
  18. data/lib/action_controller/caching/actions.rb +144 -0
  19. data/lib/action_controller/caching/fragments.rb +138 -0
  20. data/lib/action_controller/caching/pages.rb +154 -0
  21. data/lib/action_controller/caching/sql_cache.rb +18 -0
  22. data/lib/action_controller/caching/sweeping.rb +97 -0
  23. data/lib/action_controller/cgi_ext.rb +16 -0
  24. data/lib/action_controller/cgi_ext/cookie.rb +110 -0
  25. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  26. data/lib/action_controller/cgi_ext/session.rb +73 -0
  27. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  28. data/lib/action_controller/cgi_process.rb +223 -0
  29. data/lib/action_controller/components.rb +166 -0
  30. data/lib/action_controller/cookies.rb +96 -0
  31. data/lib/action_controller/dispatcher.rb +162 -0
  32. data/lib/action_controller/filters.rb +642 -0
  33. data/lib/action_controller/flash.rb +172 -0
  34. data/lib/action_controller/headers.rb +31 -0
  35. data/lib/action_controller/helpers.rb +221 -0
  36. data/lib/action_controller/http_authentication.rb +124 -0
  37. data/lib/action_controller/integration.rb +634 -0
  38. data/lib/action_controller/layout.rb +309 -0
  39. data/lib/action_controller/mime_responds.rb +173 -0
  40. data/lib/action_controller/mime_type.rb +186 -0
  41. data/lib/action_controller/mime_types.rb +20 -0
  42. data/lib/action_controller/polymorphic_routes.rb +191 -0
  43. data/lib/action_controller/record_identifier.rb +102 -0
  44. data/lib/action_controller/request.rb +764 -0
  45. data/lib/action_controller/request_forgery_protection.rb +140 -0
  46. data/lib/action_controller/request_profiler.rb +169 -0
  47. data/lib/action_controller/rescue.rb +258 -0
  48. data/lib/action_controller/resources.rb +572 -0
  49. data/lib/action_controller/response.rb +76 -0
  50. data/lib/action_controller/routing.rb +387 -0
  51. data/lib/action_controller/routing/builder.rb +203 -0
  52. data/lib/action_controller/routing/optimisations.rb +120 -0
  53. data/lib/action_controller/routing/recognition_optimisation.rb +162 -0
  54. data/lib/action_controller/routing/route.rb +240 -0
  55. data/lib/action_controller/routing/route_set.rb +436 -0
  56. data/lib/action_controller/routing/routing_ext.rb +46 -0
  57. data/lib/action_controller/routing/segments.rb +283 -0
  58. data/lib/action_controller/session/active_record_store.rb +340 -0
  59. data/lib/action_controller/session/cookie_store.rb +166 -0
  60. data/lib/action_controller/session/drb_server.rb +32 -0
  61. data/lib/action_controller/session/drb_store.rb +35 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +98 -0
  63. data/lib/action_controller/session_management.rb +158 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +155 -0
  66. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  67. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  68. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  69. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  70. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  71. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  72. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  73. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  74. data/lib/action_controller/test_case.rb +83 -0
  75. data/lib/action_controller/test_process.rb +526 -0
  76. data/lib/action_controller/url_rewriter.rb +142 -0
  77. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  78. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  79. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  80. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  81. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  82. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  83. data/lib/action_controller/verification.rb +130 -0
  84. data/lib/action_pack.rb +24 -0
  85. data/lib/action_pack/version.rb +9 -0
  86. data/lib/action_view.rb +44 -0
  87. data/lib/action_view/base.rb +335 -0
  88. data/lib/action_view/helpers/active_record_helper.rb +276 -0
  89. data/lib/action_view/helpers/asset_tag_helper.rb +599 -0
  90. data/lib/action_view/helpers/atom_feed_helper.rb +143 -0
  91. data/lib/action_view/helpers/benchmark_helper.rb +33 -0
  92. data/lib/action_view/helpers/cache_helper.rb +40 -0
  93. data/lib/action_view/helpers/capture_helper.rb +161 -0
  94. data/lib/action_view/helpers/date_helper.rb +711 -0
  95. data/lib/action_view/helpers/debug_helper.rb +31 -0
  96. data/lib/action_view/helpers/form_helper.rb +767 -0
  97. data/lib/action_view/helpers/form_options_helper.rb +458 -0
  98. data/lib/action_view/helpers/form_tag_helper.rb +458 -0
  99. data/lib/action_view/helpers/javascript_helper.rb +148 -0
  100. data/lib/action_view/helpers/number_helper.rb +186 -0
  101. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  102. data/lib/action_view/helpers/record_tag_helper.rb +59 -0
  103. data/lib/action_view/helpers/sanitize_helper.rb +229 -0
  104. data/lib/action_view/helpers/tag_helper.rb +134 -0
  105. data/lib/action_view/helpers/text_helper.rb +507 -0
  106. data/lib/action_view/helpers/url_helper.rb +573 -0
  107. data/lib/action_view/inline_template.rb +20 -0
  108. data/lib/action_view/partial_template.rb +70 -0
  109. data/lib/action_view/partials.rb +158 -0
  110. data/lib/action_view/template.rb +125 -0
  111. data/lib/action_view/template_error.rb +110 -0
  112. data/lib/action_view/template_finder.rb +176 -0
  113. data/lib/action_view/template_handler.rb +34 -0
  114. data/lib/action_view/template_handlers/builder.rb +27 -0
  115. data/lib/action_view/template_handlers/compilable.rb +128 -0
  116. data/lib/action_view/template_handlers/erb.rb +56 -0
  117. data/lib/action_view/test_case.rb +58 -0
  118. data/lib/actionpack.rb +1 -0
  119. data/test/abstract_unit.rb +36 -0
  120. data/test/active_record_unit.rb +105 -0
  121. data/test/activerecord/active_record_store_test.rb +141 -0
  122. data/test/activerecord/render_partial_with_record_identification_test.rb +191 -0
  123. data/test/adv_attr_test.rb +20 -0
  124. data/test/controller/action_pack_assertions_test.rb +543 -0
  125. data/test/controller/addresses_render_test.rb +43 -0
  126. data/test/controller/assert_select_test.rb +331 -0
  127. data/test/controller/base_test.rb +219 -0
  128. data/test/controller/benchmark_test.rb +32 -0
  129. data/test/controller/caching_test.rb +581 -0
  130. data/test/controller/capture_test.rb +89 -0
  131. data/test/controller/cgi_test.rb +116 -0
  132. data/test/controller/components_test.rb +140 -0
  133. data/test/controller/content_type_test.rb +139 -0
  134. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  135. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  136. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  137. data/test/controller/cookie_test.rb +146 -0
  138. data/test/controller/custom_handler_test.rb +45 -0
  139. data/test/controller/deprecation/deprecated_base_methods_test.rb +37 -0
  140. data/test/controller/dispatcher_test.rb +105 -0
  141. data/test/controller/fake_controllers.rb +33 -0
  142. data/test/controller/fake_models.rb +11 -0
  143. data/test/controller/filter_params_test.rb +49 -0
  144. data/test/controller/filters_test.rb +881 -0
  145. data/test/controller/flash_test.rb +146 -0
  146. data/test/controller/header_test.rb +14 -0
  147. data/test/controller/helper_test.rb +210 -0
  148. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  149. data/test/controller/html-scanner/document_test.rb +148 -0
  150. data/test/controller/html-scanner/node_test.rb +89 -0
  151. data/test/controller/html-scanner/sanitizer_test.rb +269 -0
  152. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  153. data/test/controller/html-scanner/text_node_test.rb +50 -0
  154. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  155. data/test/controller/http_authentication_test.rb +54 -0
  156. data/test/controller/integration_test.rb +252 -0
  157. data/test/controller/integration_upload_test.rb +43 -0
  158. data/test/controller/layout_test.rb +255 -0
  159. data/test/controller/mime_responds_test.rb +514 -0
  160. data/test/controller/mime_type_test.rb +84 -0
  161. data/test/controller/new_render_test.rb +843 -0
  162. data/test/controller/polymorphic_routes_test.rb +174 -0
  163. data/test/controller/record_identifier_test.rb +139 -0
  164. data/test/controller/redirect_test.rb +289 -0
  165. data/test/controller/render_test.rb +484 -0
  166. data/test/controller/request_forgery_protection_test.rb +305 -0
  167. data/test/controller/request_test.rb +928 -0
  168. data/test/controller/rescue_test.rb +517 -0
  169. data/test/controller/resources_test.rb +873 -0
  170. data/test/controller/routing_test.rb +2464 -0
  171. data/test/controller/selector_test.rb +628 -0
  172. data/test/controller/send_file_test.rb +138 -0
  173. data/test/controller/session/cookie_store_test.rb +258 -0
  174. data/test/controller/session/mem_cache_store_test.rb +181 -0
  175. data/test/controller/session_fixation_test.rb +89 -0
  176. data/test/controller/session_management_test.rb +178 -0
  177. data/test/controller/test_test.rb +695 -0
  178. data/test/controller/url_rewriter_test.rb +310 -0
  179. data/test/controller/verification_test.rb +270 -0
  180. data/test/controller/view_paths_test.rb +140 -0
  181. data/test/controller/webservice_test.rb +229 -0
  182. data/test/fixtures/addresses/list.erb +1 -0
  183. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  184. data/test/fixtures/companies.yml +24 -0
  185. data/test/fixtures/company.rb +10 -0
  186. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  187. data/test/fixtures/content_type/render_default_for_js.js.erb +1 -0
  188. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  189. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  190. data/test/fixtures/customers/_customer.html.erb +1 -0
  191. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  192. data/test/fixtures/developer.rb +9 -0
  193. data/test/fixtures/developers.yml +21 -0
  194. data/test/fixtures/developers_projects.yml +13 -0
  195. data/test/fixtures/fun/games/hello_world.erb +1 -0
  196. data/test/fixtures/functional_caching/_partial.erb +3 -0
  197. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  198. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  199. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  200. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  201. data/test/fixtures/helpers/abc_helper.rb +5 -0
  202. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  203. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  204. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  205. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  206. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  207. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  208. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  209. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  210. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  211. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  212. data/test/fixtures/layouts/builder.builder +3 -0
  213. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  214. data/test/fixtures/layouts/standard.erb +1 -0
  215. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  216. data/test/fixtures/layouts/yield.erb +2 -0
  217. data/test/fixtures/mascot.rb +3 -0
  218. data/test/fixtures/mascots.yml +4 -0
  219. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  220. data/test/fixtures/multipart/binary_file +0 -0
  221. data/test/fixtures/multipart/boundary_problem_file +10 -0
  222. data/test/fixtures/multipart/bracketed_param +5 -0
  223. data/test/fixtures/multipart/large_text_file +10 -0
  224. data/test/fixtures/multipart/mixed_files +0 -0
  225. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  226. data/test/fixtures/multipart/single_parameter +5 -0
  227. data/test/fixtures/multipart/text_file +10 -0
  228. data/test/fixtures/override/test/hello_world.erb +1 -0
  229. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  230. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  231. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  232. data/test/fixtures/post_test/post/index.html.erb +1 -0
  233. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  234. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  235. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  236. data/test/fixtures/project.rb +3 -0
  237. data/test/fixtures/projects.yml +7 -0
  238. data/test/fixtures/public/404.html +1 -0
  239. data/test/fixtures/public/500.html +1 -0
  240. data/test/fixtures/public/images/rails.png +0 -0
  241. data/test/fixtures/public/javascripts/application.js +1 -0
  242. data/test/fixtures/public/javascripts/bank.js +1 -0
  243. data/test/fixtures/public/javascripts/robber.js +1 -0
  244. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  245. data/test/fixtures/public/stylesheets/bank.css +1 -0
  246. data/test/fixtures/public/stylesheets/robber.css +1 -0
  247. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  248. data/test/fixtures/replies.yml +15 -0
  249. data/test/fixtures/reply.rb +7 -0
  250. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  251. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  252. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  253. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  254. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  255. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  256. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  257. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  258. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  259. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  260. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  261. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  262. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  263. data/test/fixtures/scope/test/modgreet.erb +1 -0
  264. data/test/fixtures/shared.html.erb +1 -0
  265. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  266. data/test/fixtures/test/_customer.erb +1 -0
  267. data/test/fixtures/test/_customer_counter.erb +1 -0
  268. data/test/fixtures/test/_customer_greeting.erb +1 -0
  269. data/test/fixtures/test/_form.erb +1 -0
  270. data/test/fixtures/test/_hash_greeting.erb +1 -0
  271. data/test/fixtures/test/_hash_object.erb +2 -0
  272. data/test/fixtures/test/_hello.builder +1 -0
  273. data/test/fixtures/test/_labelling_form.erb +1 -0
  274. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  275. data/test/fixtures/test/_partial.erb +1 -0
  276. data/test/fixtures/test/_partial.html.erb +1 -0
  277. data/test/fixtures/test/_partial.js.erb +1 -0
  278. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  279. data/test/fixtures/test/_partial_only.erb +1 -0
  280. data/test/fixtures/test/_person.erb +2 -0
  281. data/test/fixtures/test/_raise.html.erb +1 -0
  282. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  283. data/test/fixtures/test/block_content_for.erb +2 -0
  284. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  285. data/test/fixtures/test/capturing.erb +4 -0
  286. data/test/fixtures/test/content_for.erb +2 -0
  287. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  288. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  289. data/test/fixtures/test/delete_with_js.rjs +2 -0
  290. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  291. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  292. data/test/fixtures/test/erb_content_for.erb +2 -0
  293. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  294. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  295. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  296. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  297. data/test/fixtures/test/greeting.erb +1 -0
  298. data/test/fixtures/test/greeting.js.rjs +1 -0
  299. data/test/fixtures/test/hello.builder +4 -0
  300. data/test/fixtures/test/hello_world.erb +1 -0
  301. data/test/fixtures/test/hello_world_container.builder +3 -0
  302. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  303. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  304. data/test/fixtures/test/hello_xml_world.builder +11 -0
  305. data/test/fixtures/test/list.erb +1 -0
  306. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  307. data/test/fixtures/test/potential_conflicts.erb +4 -0
  308. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  309. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  310. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  311. data/test/fixtures/test/render_to_string_test.erb +1 -0
  312. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  313. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  314. data/test/fixtures/topic.rb +3 -0
  315. data/test/fixtures/topics.yml +22 -0
  316. data/test/fixtures/topics/_topic.html.erb +1 -0
  317. data/test/template/active_record_helper_test.rb +268 -0
  318. data/test/template/asset_tag_helper_test.rb +514 -0
  319. data/test/template/atom_feed_helper_test.rb +179 -0
  320. data/test/template/benchmark_helper_test.rb +60 -0
  321. data/test/template/date_helper_test.rb +1791 -0
  322. data/test/template/deprecated_erb_variable_test.rb +9 -0
  323. data/test/template/erb_util_test.rb +24 -0
  324. data/test/template/form_helper_test.rb +885 -0
  325. data/test/template/form_options_helper_test.rb +1333 -0
  326. data/test/template/form_tag_helper_test.rb +272 -0
  327. data/test/template/javascript_helper_test.rb +73 -0
  328. data/test/template/number_helper_test.rb +97 -0
  329. data/test/template/record_tag_helper_test.rb +54 -0
  330. data/test/template/sanitize_helper_test.rb +48 -0
  331. data/test/template/tag_helper_test.rb +77 -0
  332. data/test/template/template_finder_test.rb +73 -0
  333. data/test/template/template_object_test.rb +95 -0
  334. data/test/template/test_test.rb +56 -0
  335. data/test/template/text_helper_test.rb +367 -0
  336. data/test/template/url_helper_test.rb +544 -0
  337. data/test/testing_sandbox.rb +15 -0
  338. metadata +469 -0
@@ -0,0 +1,9 @@
1
+ require 'abstract_unit'
2
+
3
+ class DeprecatedErbVariableTest < ActionView::TestCase
4
+ def test_setting_erb_variable_warns
5
+ assert_deprecated 'erb_variable' do
6
+ ActionView::Base.erb_variable = '_erbout'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ require 'abstract_unit'
2
+
3
+ class ErbUtilTest < Test::Unit::TestCase
4
+ include ERB::Util
5
+
6
+ ERB::Util::HTML_ESCAPE.each do |given, expected|
7
+ define_method "test_html_escape_#{expected.gsub /\W/, ''}" do
8
+ assert_equal expected, html_escape(given)
9
+ end
10
+
11
+ unless given == '"'
12
+ define_method "test_json_escape_#{expected.gsub /\W/, ''}" do
13
+ assert_equal ERB::Util::JSON_ESCAPE[given], json_escape(given)
14
+ end
15
+ end
16
+ end
17
+
18
+ def test_rest_in_ascii
19
+ (0..127).to_a.map(&:chr).each do |chr|
20
+ next if %w(& " < >).include?(chr)
21
+ assert_equal chr, html_escape(chr)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,885 @@
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
+ end
19
+
20
+ class Comment
21
+ attr_reader :id
22
+ attr_reader :post_id
23
+ def save; @id = 1; @post_id = 1 end
24
+ def new_record?; @id.nil? end
25
+ def name
26
+ @id.nil? ? 'new comment' : "comment ##{@id}"
27
+ end
28
+ end
29
+ end
30
+
31
+ class Comment::Nested < Comment; end
32
+
33
+
34
+ class FormHelperTest < ActionView::TestCase
35
+ tests ActionView::Helpers::FormHelper
36
+
37
+ def setup
38
+ @post = Post.new
39
+ @comment = Comment.new
40
+ def @post.errors()
41
+ Class.new{
42
+ def on(field); "can't be empty" if field == "author_name"; end
43
+ def empty?() false end
44
+ def count() 1 end
45
+ def full_messages() [ "Author name can't be empty" ] end
46
+ }.new
47
+ end
48
+ def @post.id; 123; end
49
+ def @post.id_before_type_cast; 123; end
50
+ def @post.to_param; '123'; end
51
+
52
+ @post.title = "Hello World"
53
+ @post.author_name = ""
54
+ @post.body = "Back to the hill and over it again!"
55
+ @post.secret = 1
56
+ @post.written_on = Date.new(2004, 6, 15)
57
+
58
+ @controller = Class.new do
59
+ attr_reader :url_for_options
60
+ def url_for(options)
61
+ @url_for_options = options
62
+ "http://www.example.com"
63
+ end
64
+ end
65
+ @controller = @controller.new
66
+ end
67
+
68
+ def test_label
69
+ assert_dom_equal('<label for="post_title">Title</label>', label("post", "title"))
70
+ assert_dom_equal('<label for="post_title">The title goes here</label>', label("post", "title", "The title goes here"))
71
+ assert_dom_equal(
72
+ '<label class="title_label" for="post_title">Title</label>',
73
+ label("post", "title", nil, :class => 'title_label')
74
+ )
75
+ assert_dom_equal('<label for="post_secret">Secret?</label>', label("post", "secret?"))
76
+ end
77
+
78
+ def test_label_with_symbols
79
+ assert_dom_equal('<label for="post_title">Title</label>', label(:post, :title))
80
+ assert_dom_equal('<label for="post_secret">Secret?</label>', label(:post, :secret?))
81
+ end
82
+
83
+ def test_label_with_for_attribute_as_symbol
84
+ assert_dom_equal('<label for="my_for">Title</label>', label(:post, :title, nil, :for => "my_for"))
85
+ end
86
+
87
+ def test_label_with_for_attribute_as_string
88
+ assert_dom_equal('<label for="my_for">Title</label>', label(:post, :title, nil, "for" => "my_for"))
89
+ end
90
+
91
+ def test_text_field
92
+ assert_dom_equal(
93
+ '<input id="post_title" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title")
94
+ )
95
+ assert_dom_equal(
96
+ '<input id="post_title" name="post[title]" size="30" type="password" value="Hello World" />', password_field("post", "title")
97
+ )
98
+ assert_dom_equal(
99
+ '<input id="person_name" name="person[name]" size="30" type="password" />', password_field("person", "name")
100
+ )
101
+ end
102
+
103
+ def test_text_field_with_escapes
104
+ @post.title = "<b>Hello World</b>"
105
+ assert_dom_equal(
106
+ '<input id="post_title" name="post[title]" size="30" type="text" value="&lt;b&gt;Hello World&lt;/b&gt;" />', text_field("post", "title")
107
+ )
108
+ end
109
+
110
+ def test_text_field_with_html_entities
111
+ @post.title = "The HTML Entity for & is &amp;"
112
+ assert_dom_equal(
113
+ '<input id="post_title" name="post[title]" size="30" type="text" value="The HTML Entity for &amp; is &amp;amp;" />',
114
+ text_field("post", "title")
115
+ )
116
+ end
117
+
118
+ def test_text_field_with_options
119
+ expected = '<input id="post_title" name="post[title]" size="35" type="text" value="Hello World" />'
120
+ assert_dom_equal expected, text_field("post", "title", "size" => 35)
121
+ assert_dom_equal expected, text_field("post", "title", :size => 35)
122
+ end
123
+
124
+ def test_text_field_assuming_size
125
+ expected = '<input id="post_title" maxlength="35" name="post[title]" size="35" type="text" value="Hello World" />'
126
+ assert_dom_equal expected, text_field("post", "title", "maxlength" => 35)
127
+ assert_dom_equal expected, text_field("post", "title", :maxlength => 35)
128
+ end
129
+
130
+ def test_text_field_removing_size
131
+ expected = '<input id="post_title" maxlength="35" name="post[title]" type="text" value="Hello World" />'
132
+ assert_dom_equal expected, text_field("post", "title", "maxlength" => 35, "size" => nil)
133
+ assert_dom_equal expected, text_field("post", "title", :maxlength => 35, :size => nil)
134
+ end
135
+
136
+ def test_text_field_doesnt_change_param_values
137
+ object_name = 'post[]'
138
+ expected = '<input id="post_123_title" name="post[123][title]" size="30" type="text" value="Hello World" />'
139
+ assert_equal expected, text_field(object_name, "title")
140
+ assert_equal object_name, "post[]"
141
+ end
142
+
143
+ def test_hidden_field
144
+ assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="Hello World" />',
145
+ hidden_field("post", "title")
146
+ assert_dom_equal '<input id="post_secret" name="post[secret]" type="hidden" value="1" />',
147
+ hidden_field("post", "secret?")
148
+ end
149
+
150
+ def test_hidden_field_with_escapes
151
+ @post.title = "<b>Hello World</b>"
152
+ assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="&lt;b&gt;Hello World&lt;/b&gt;" />',
153
+ hidden_field("post", "title")
154
+ end
155
+
156
+ def test_text_field_with_options
157
+ assert_dom_equal '<input id="post_title" name="post[title]" type="hidden" value="Something Else" />',
158
+ hidden_field("post", "title", :value => "Something Else")
159
+ end
160
+
161
+ def test_check_box
162
+ assert_dom_equal(
163
+ '<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
164
+ check_box("post", "secret")
165
+ )
166
+ @post.secret = 0
167
+ assert_dom_equal(
168
+ '<input id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
169
+ check_box("post", "secret")
170
+ )
171
+ assert_dom_equal(
172
+ '<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
173
+ check_box("post", "secret" ,{"checked"=>"checked"})
174
+ )
175
+ @post.secret = true
176
+ assert_dom_equal(
177
+ '<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
178
+ check_box("post", "secret")
179
+ )
180
+ assert_dom_equal(
181
+ '<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
182
+ check_box("post", "secret?")
183
+ )
184
+
185
+ @post.secret = ['0']
186
+ assert_dom_equal(
187
+ '<input id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
188
+ check_box("post", "secret")
189
+ )
190
+ @post.secret = ['1']
191
+ assert_dom_equal(
192
+ '<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
193
+ check_box("post", "secret")
194
+ )
195
+ end
196
+
197
+ def test_check_box_with_explicit_checked_and_unchecked_values
198
+ @post.secret = "on"
199
+ assert_dom_equal(
200
+ '<input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="on" /><input name="post[secret]" type="hidden" value="off" />',
201
+ check_box("post", "secret", {}, "on", "off")
202
+ )
203
+ end
204
+
205
+ def test_checkbox_disabled_still_submits_checked_value
206
+ assert_dom_equal(
207
+ '<input checked="checked" disabled="disabled" id="post_secret" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="1" />',
208
+ check_box("post", "secret", { :disabled => :true })
209
+ )
210
+ end
211
+
212
+ def test_radio_button
213
+ assert_dom_equal('<input checked="checked" id="post_title_hello_world" name="post[title]" type="radio" value="Hello World" />',
214
+ radio_button("post", "title", "Hello World")
215
+ )
216
+ assert_dom_equal('<input id="post_title_goodbye_world" name="post[title]" type="radio" value="Goodbye World" />',
217
+ radio_button("post", "title", "Goodbye World")
218
+ )
219
+ assert_dom_equal('<input id="item_subobject_title_inside_world" name="item[subobject][title]" type="radio" value="inside world"/>',
220
+ radio_button("item[subobject]", "title", "inside world")
221
+ )
222
+ end
223
+
224
+ def test_radio_button_is_checked_with_integers
225
+ assert_dom_equal('<input checked="checked" id="post_secret_1" name="post[secret]" type="radio" value="1" />',
226
+ radio_button("post", "secret", "1")
227
+ )
228
+ end
229
+
230
+ def test_radio_button_respects_passed_in_id
231
+ assert_dom_equal('<input checked="checked" id="foo" name="post[secret]" type="radio" value="1" />',
232
+ radio_button("post", "secret", "1", :id=>"foo")
233
+ )
234
+ end
235
+
236
+ def test_text_area
237
+ assert_dom_equal(
238
+ '<textarea cols="40" id="post_body" name="post[body]" rows="20">Back to the hill and over it again!</textarea>',
239
+ text_area("post", "body")
240
+ )
241
+ end
242
+
243
+ def test_text_area_with_escapes
244
+ @post.body = "Back to <i>the</i> hill and over it again!"
245
+ assert_dom_equal(
246
+ '<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>',
247
+ text_area("post", "body")
248
+ )
249
+ end
250
+
251
+ def test_text_area_with_alternate_value
252
+ assert_dom_equal(
253
+ '<textarea cols="40" id="post_body" name="post[body]" rows="20">Testing alternate values.</textarea>',
254
+ text_area("post", "body", :value => 'Testing alternate values.')
255
+ )
256
+ end
257
+
258
+ def test_text_area_with_html_entities
259
+ @post.body = "The HTML Entity for & is &amp;"
260
+ assert_dom_equal(
261
+ '<textarea cols="40" id="post_body" name="post[body]" rows="20">The HTML Entity for &amp; is &amp;amp;</textarea>',
262
+ text_area("post", "body")
263
+ )
264
+ end
265
+
266
+ def test_text_area_with_size_option
267
+ assert_dom_equal(
268
+ '<textarea cols="183" id="post_body" name="post[body]" rows="820">Back to the hill and over it again!</textarea>',
269
+ text_area("post", "body", :size => "183x820")
270
+ )
271
+ end
272
+
273
+ def test_explicit_name
274
+ assert_dom_equal(
275
+ '<input id="post_title" name="dont guess" size="30" type="text" value="Hello World" />', text_field("post", "title", "name" => "dont guess")
276
+ )
277
+ assert_dom_equal(
278
+ '<textarea cols="40" id="post_body" name="really!" rows="20">Back to the hill and over it again!</textarea>',
279
+ text_area("post", "body", "name" => "really!")
280
+ )
281
+ assert_dom_equal(
282
+ '<input checked="checked" id="post_secret" name="i mean it" type="checkbox" value="1" /><input name="i mean it" type="hidden" value="0" />',
283
+ check_box("post", "secret", "name" => "i mean it")
284
+ )
285
+ assert_dom_equal text_field("post", "title", "name" => "dont guess"),
286
+ text_field("post", "title", :name => "dont guess")
287
+ assert_dom_equal text_area("post", "body", "name" => "really!"),
288
+ text_area("post", "body", :name => "really!")
289
+ assert_dom_equal check_box("post", "secret", "name" => "i mean it"),
290
+ check_box("post", "secret", :name => "i mean it")
291
+ end
292
+
293
+ def test_explicit_id
294
+ assert_dom_equal(
295
+ '<input id="dont guess" name="post[title]" size="30" type="text" value="Hello World" />', text_field("post", "title", "id" => "dont guess")
296
+ )
297
+ assert_dom_equal(
298
+ '<textarea cols="40" id="really!" name="post[body]" rows="20">Back to the hill and over it again!</textarea>',
299
+ text_area("post", "body", "id" => "really!")
300
+ )
301
+ assert_dom_equal(
302
+ '<input checked="checked" id="i mean it" name="post[secret]" type="checkbox" value="1" /><input name="post[secret]" type="hidden" value="0" />',
303
+ check_box("post", "secret", "id" => "i mean it")
304
+ )
305
+ assert_dom_equal text_field("post", "title", "id" => "dont guess"),
306
+ text_field("post", "title", :id => "dont guess")
307
+ assert_dom_equal text_area("post", "body", "id" => "really!"),
308
+ text_area("post", "body", :id => "really!")
309
+ assert_dom_equal check_box("post", "secret", "id" => "i mean it"),
310
+ check_box("post", "secret", :id => "i mean it")
311
+ end
312
+
313
+ def test_auto_index
314
+ pid = @post.id
315
+ assert_dom_equal(
316
+ "<label for=\"post_#{pid}_title\">Title</label>",
317
+ label("post[]", "title")
318
+ )
319
+ assert_dom_equal(
320
+ "<input id=\"post_#{pid}_title\" name=\"post[#{pid}][title]\" size=\"30\" type=\"text\" value=\"Hello World\" />", text_field("post[]","title")
321
+ )
322
+ assert_dom_equal(
323
+ "<textarea cols=\"40\" id=\"post_#{pid}_body\" name=\"post[#{pid}][body]\" rows=\"20\">Back to the hill and over it again!</textarea>",
324
+ text_area("post[]", "body")
325
+ )
326
+ assert_dom_equal(
327
+ "<input checked=\"checked\" id=\"post_#{pid}_secret\" name=\"post[#{pid}][secret]\" type=\"checkbox\" value=\"1\" /><input name=\"post[#{pid}][secret]\" type=\"hidden\" value=\"0\" />",
328
+ check_box("post[]", "secret")
329
+ )
330
+ assert_dom_equal(
331
+ "<input checked=\"checked\" id=\"post_#{pid}_title_hello_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Hello World\" />",
332
+ radio_button("post[]", "title", "Hello World")
333
+ )
334
+ assert_dom_equal("<input id=\"post_#{pid}_title_goodbye_world\" name=\"post[#{pid}][title]\" type=\"radio\" value=\"Goodbye World\" />",
335
+ radio_button("post[]", "title", "Goodbye World")
336
+ )
337
+ end
338
+
339
+ def test_form_for
340
+ _erbout = ''
341
+
342
+ form_for(:post, @post, :html => { :id => 'create-post' }) do |f|
343
+ _erbout.concat f.label(:title)
344
+ _erbout.concat f.text_field(:title)
345
+ _erbout.concat f.text_area(:body)
346
+ _erbout.concat f.check_box(:secret)
347
+ _erbout.concat f.submit('Create post')
348
+ end
349
+
350
+ expected =
351
+ "<form action='http://www.example.com' id='create-post' method='post'>" +
352
+ "<label for='post_title'>Title</label>" +
353
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
354
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
355
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
356
+ "<input name='post[secret]' type='hidden' value='0' />" +
357
+ "<input name='commit' id='post_submit' type='submit' value='Create post' />" +
358
+ "</form>"
359
+
360
+ assert_dom_equal expected, _erbout
361
+ end
362
+
363
+ def test_form_for_with_method
364
+ _erbout = ''
365
+
366
+ form_for(:post, @post, :html => { :id => 'create-post', :method => :put }) do |f|
367
+ _erbout.concat f.text_field(:title)
368
+ _erbout.concat f.text_area(:body)
369
+ _erbout.concat f.check_box(:secret)
370
+ end
371
+
372
+ expected =
373
+ "<form action='http://www.example.com' id='create-post' method='post'>" +
374
+ "<div style='margin:0;padding:0'><input name='_method' type='hidden' value='put' /></div>" +
375
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
376
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
377
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
378
+ "<input name='post[secret]' type='hidden' value='0' />" +
379
+ "</form>"
380
+
381
+ assert_dom_equal expected, _erbout
382
+ end
383
+
384
+ def test_form_for_without_object
385
+ _erbout = ''
386
+
387
+ form_for(:post, :html => { :id => 'create-post' }) do |f|
388
+ _erbout.concat f.text_field(:title)
389
+ _erbout.concat f.text_area(:body)
390
+ _erbout.concat f.check_box(:secret)
391
+ end
392
+
393
+ expected =
394
+ "<form action='http://www.example.com' id='create-post' method='post'>" +
395
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
396
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
397
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
398
+ "<input name='post[secret]' type='hidden' value='0' />" +
399
+ "</form>"
400
+
401
+ assert_dom_equal expected, _erbout
402
+ end
403
+
404
+ def test_form_for_with_index
405
+ _erbout = ''
406
+
407
+ form_for("post[]", @post) do |f|
408
+ _erbout.concat f.label(:title)
409
+ _erbout.concat f.text_field(:title)
410
+ _erbout.concat f.text_area(:body)
411
+ _erbout.concat f.check_box(:secret)
412
+ end
413
+
414
+ expected =
415
+ "<form action='http://www.example.com' method='post'>" +
416
+ "<label for=\"post_123_title\">Title</label>" +
417
+ "<input name='post[123][title]' size='30' type='text' id='post_123_title' value='Hello World' />" +
418
+ "<textarea name='post[123][body]' id='post_123_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
419
+ "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />" +
420
+ "<input name='post[123][secret]' type='hidden' value='0' />" +
421
+ "</form>"
422
+
423
+ assert_dom_equal expected, _erbout
424
+ end
425
+
426
+ def test_form_for_with_nil_index_option_override
427
+ _erbout = ''
428
+
429
+ form_for("post[]", @post, :index => nil) do |f|
430
+ _erbout.concat f.text_field(:title)
431
+ _erbout.concat f.text_area(:body)
432
+ _erbout.concat f.check_box(:secret)
433
+ end
434
+
435
+ expected =
436
+ "<form action='http://www.example.com' method='post'>" +
437
+ "<input name='post[][title]' size='30' type='text' id='post__title' value='Hello World' />" +
438
+ "<textarea name='post[][body]' id='post__body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
439
+ "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />" +
440
+ "<input name='post[][secret]' type='hidden' value='0' />" +
441
+ "</form>"
442
+
443
+ assert_dom_equal expected, _erbout
444
+ end
445
+
446
+ def test_nested_fields_for
447
+ _erbout = ''
448
+ form_for(:post, @post) do |f|
449
+ f.fields_for(:comment, @post) do |c|
450
+ _erbout.concat c.text_field(:title)
451
+ end
452
+ end
453
+
454
+ expected = "<form action='http://www.example.com' method='post'>" +
455
+ "<input name='post[comment][title]' size='30' type='text' id='post_comment_title' value='Hello World' />" +
456
+ "</form>"
457
+
458
+ assert_dom_equal expected, _erbout
459
+ end
460
+
461
+ def test_fields_for
462
+ _erbout = ''
463
+
464
+ fields_for(:post, @post) do |f|
465
+ _erbout.concat f.text_field(:title)
466
+ _erbout.concat f.text_area(:body)
467
+ _erbout.concat f.check_box(:secret)
468
+ end
469
+
470
+ expected =
471
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
472
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
473
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
474
+ "<input name='post[secret]' type='hidden' value='0' />"
475
+
476
+ assert_dom_equal expected, _erbout
477
+ end
478
+
479
+ def test_fields_for_with_index
480
+ _erbout = ''
481
+
482
+ fields_for("post[]", @post) do |f|
483
+ _erbout.concat f.text_field(:title)
484
+ _erbout.concat f.text_area(:body)
485
+ _erbout.concat f.check_box(:secret)
486
+ end
487
+
488
+ expected =
489
+ "<input name='post[123][title]' size='30' type='text' id='post_123_title' value='Hello World' />" +
490
+ "<textarea name='post[123][body]' id='post_123_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
491
+ "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />" +
492
+ "<input name='post[123][secret]' type='hidden' value='0' />"
493
+
494
+ assert_dom_equal expected, _erbout
495
+ end
496
+
497
+ def test_fields_for_with_nil_index_option_override
498
+ _erbout = ''
499
+
500
+ fields_for("post[]", @post, :index => nil) do |f|
501
+ _erbout.concat f.text_field(:title)
502
+ _erbout.concat f.text_area(:body)
503
+ _erbout.concat f.check_box(:secret)
504
+ end
505
+
506
+ expected =
507
+ "<input name='post[][title]' size='30' type='text' id='post__title' value='Hello World' />" +
508
+ "<textarea name='post[][body]' id='post__body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
509
+ "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />" +
510
+ "<input name='post[][secret]' type='hidden' value='0' />"
511
+
512
+ assert_dom_equal expected, _erbout
513
+ end
514
+
515
+ def test_fields_for_with_index_option_override
516
+ _erbout = ''
517
+
518
+ fields_for("post[]", @post, :index => "abc") do |f|
519
+ _erbout.concat f.text_field(:title)
520
+ _erbout.concat f.text_area(:body)
521
+ _erbout.concat f.check_box(:secret)
522
+ end
523
+
524
+ expected =
525
+ "<input name='post[abc][title]' size='30' type='text' id='post_abc_title' value='Hello World' />" +
526
+ "<textarea name='post[abc][body]' id='post_abc_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
527
+ "<input name='post[abc][secret]' checked='checked' type='checkbox' id='post_abc_secret' value='1' />" +
528
+ "<input name='post[abc][secret]' type='hidden' value='0' />"
529
+
530
+ assert_dom_equal expected, _erbout
531
+ end
532
+
533
+ def test_fields_for_without_object
534
+ _erbout = ''
535
+ fields_for(:post) do |f|
536
+ _erbout.concat f.text_field(:title)
537
+ _erbout.concat f.text_area(:body)
538
+ _erbout.concat f.check_box(:secret)
539
+ end
540
+
541
+ expected =
542
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
543
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
544
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
545
+ "<input name='post[secret]' type='hidden' value='0' />"
546
+
547
+ assert_dom_equal expected, _erbout
548
+ end
549
+
550
+ def test_fields_for_with_only_object
551
+ _erbout = ''
552
+ fields_for(@post) do |f|
553
+ _erbout.concat f.text_field(:title)
554
+ _erbout.concat f.text_area(:body)
555
+ _erbout.concat f.check_box(:secret)
556
+ end
557
+
558
+ expected =
559
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
560
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
561
+ "<input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
562
+ "<input name='post[secret]' type='hidden' value='0' />"
563
+
564
+ assert_dom_equal expected, _erbout
565
+ end
566
+
567
+ def test_fields_for_object_with_bracketed_name
568
+ _erbout = ''
569
+ fields_for("author[post]", @post) do |f|
570
+ _erbout.concat f.label(:title)
571
+ _erbout.concat f.text_field(:title)
572
+ end
573
+
574
+ assert_dom_equal "<label for=\"author_post_title\">Title</label>" +
575
+ "<input name='author[post][title]' size='30' type='text' id='author_post_title' value='Hello World' />",
576
+ _erbout
577
+ end
578
+
579
+ def test_fields_for_object_with_bracketed_name_and_index
580
+ _erbout = ''
581
+ fields_for("author[post]", @post, :index => 1) do |f|
582
+ _erbout.concat f.label(:title)
583
+ _erbout.concat f.text_field(:title)
584
+ end
585
+
586
+ assert_dom_equal "<label for=\"author_post_1_title\">Title</label>" +
587
+ "<input name='author[post][1][title]' size='30' type='text' id='author_post_1_title' value='Hello World' />",
588
+ _erbout
589
+ end
590
+
591
+ def test_form_builder_does_not_have_form_for_method
592
+ assert ! ActionView::Helpers::FormBuilder.instance_methods.include?('form_for')
593
+ end
594
+
595
+ def test_form_for_and_fields_for
596
+ _erbout = ''
597
+
598
+ form_for(:post, @post, :html => { :id => 'create-post' }) do |post_form|
599
+ _erbout.concat post_form.text_field(:title)
600
+ _erbout.concat post_form.text_area(:body)
601
+
602
+ fields_for(:parent_post, @post) do |parent_fields|
603
+ _erbout.concat parent_fields.check_box(:secret)
604
+ end
605
+ end
606
+
607
+ expected =
608
+ "<form action='http://www.example.com' id='create-post' method='post'>" +
609
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
610
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
611
+ "<input name='parent_post[secret]' checked='checked' type='checkbox' id='parent_post_secret' value='1' />" +
612
+ "<input name='parent_post[secret]' type='hidden' value='0' />" +
613
+ "</form>"
614
+
615
+ assert_dom_equal expected, _erbout
616
+ end
617
+
618
+ def test_form_for_and_fields_for_with_object
619
+ _erbout = ''
620
+
621
+ form_for(:post, @post, :html => { :id => 'create-post' }) do |post_form|
622
+ _erbout.concat post_form.text_field(:title)
623
+ _erbout.concat post_form.text_area(:body)
624
+
625
+ post_form.fields_for(@comment) do |comment_fields|
626
+ _erbout.concat comment_fields.text_field(:name)
627
+ end
628
+ end
629
+
630
+ expected =
631
+ "<form action='http://www.example.com' id='create-post' method='post'>" +
632
+ "<input name='post[title]' size='30' type='text' id='post_title' value='Hello World' />" +
633
+ "<textarea name='post[body]' id='post_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" +
634
+ "<input name='post[comment][name]' type='text' id='post_comment_name' value='new comment' size='30' />" +
635
+ "</form>"
636
+
637
+ assert_dom_equal expected, _erbout
638
+ end
639
+
640
+ class LabelledFormBuilder < ActionView::Helpers::FormBuilder
641
+ (field_helpers - %w(hidden_field)).each do |selector|
642
+ src = <<-END_SRC
643
+ def #{selector}(field, *args, &proc)
644
+ "<label for='\#{field}'>\#{field.to_s.humanize}:</label> " + super + "<br/>"
645
+ end
646
+ END_SRC
647
+ class_eval src, __FILE__, __LINE__
648
+ end
649
+ end
650
+
651
+ def test_form_for_with_labelled_builder
652
+ _erbout = ''
653
+
654
+ form_for(:post, @post, :builder => LabelledFormBuilder) do |f|
655
+ _erbout.concat f.text_field(:title)
656
+ _erbout.concat f.text_area(:body)
657
+ _erbout.concat f.check_box(:secret)
658
+ end
659
+
660
+ expected =
661
+ "<form action='http://www.example.com' method='post'>" +
662
+ "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
663
+ "<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/>" +
664
+ "<label for='secret'>Secret:</label> <input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
665
+ "<input name='post[secret]' type='hidden' value='0' /><br/>" +
666
+ "</form>"
667
+
668
+ assert_dom_equal expected, _erbout
669
+ end
670
+
671
+ def test_default_form_builder
672
+ old_default_form_builder, ActionView::Base.default_form_builder =
673
+ ActionView::Base.default_form_builder, LabelledFormBuilder
674
+
675
+ _erbout = ''
676
+ form_for(:post, @post) do |f|
677
+ _erbout.concat f.text_field(:title)
678
+ _erbout.concat f.text_area(:body)
679
+ _erbout.concat f.check_box(:secret)
680
+ end
681
+
682
+ expected =
683
+ "<form action='http://www.example.com' method='post'>" +
684
+ "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
685
+ "<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/>" +
686
+ "<label for='secret'>Secret:</label> <input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
687
+ "<input name='post[secret]' type='hidden' value='0' /><br/>" +
688
+ "</form>"
689
+
690
+ assert_dom_equal expected, _erbout
691
+ ensure
692
+ ActionView::Base.default_form_builder = old_default_form_builder
693
+ end
694
+
695
+ def test_default_form_builder_with_active_record_helpers
696
+
697
+ _erbout = ''
698
+ form_for(:post, @post) do |f|
699
+ _erbout.concat f.error_message_on('author_name')
700
+ _erbout.concat f.error_messages
701
+ end
702
+
703
+ expected = %(<form action='http://www.example.com' method='post'>) +
704
+ %(<div class='formError'>can't be empty</div>) +
705
+ %(<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>) +
706
+ %(</form>)
707
+
708
+ assert_dom_equal expected, _erbout
709
+
710
+ end
711
+
712
+ def test_default_form_builder_no_instance_variable
713
+ post = @post
714
+ @post = nil
715
+
716
+ _erbout = ''
717
+ form_for(:post, post) do |f|
718
+ _erbout.concat f.error_message_on('author_name')
719
+ _erbout.concat f.error_messages
720
+ end
721
+
722
+ expected = %(<form action='http://www.example.com' method='post'>) +
723
+ %(<div class='formError'>can't be empty</div>) +
724
+ %(<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>) +
725
+ %(</form>)
726
+
727
+ assert_dom_equal expected, _erbout
728
+
729
+ end
730
+
731
+ def test_fields_for_with_labelled_builder
732
+ _erbout = ''
733
+
734
+ fields_for(:post, @post, :builder => LabelledFormBuilder) do |f|
735
+ _erbout.concat f.text_field(:title)
736
+ _erbout.concat f.text_area(:body)
737
+ _erbout.concat f.check_box(:secret)
738
+ end
739
+
740
+ expected =
741
+ "<label for='title'>Title:</label> <input name='post[title]' size='30' type='text' id='post_title' value='Hello World' /><br/>" +
742
+ "<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/>" +
743
+ "<label for='secret'>Secret:</label> <input name='post[secret]' checked='checked' type='checkbox' id='post_secret' value='1' />" +
744
+ "<input name='post[secret]' type='hidden' value='0' /><br/>"
745
+
746
+ assert_dom_equal expected, _erbout
747
+ end
748
+
749
+ def test_form_for_with_html_options_adds_options_to_form_tag
750
+ _erbout = ''
751
+
752
+ form_for(:post, @post, :html => {:id => 'some_form', :class => 'some_class'}) do |f| end
753
+ expected = "<form action=\"http://www.example.com\" class=\"some_class\" id=\"some_form\" method=\"post\"></form>"
754
+
755
+ assert_dom_equal expected, _erbout
756
+ end
757
+
758
+ def test_form_for_with_string_url_option
759
+ _erbout = ''
760
+
761
+ form_for(:post, @post, :url => 'http://www.otherdomain.com') do |f| end
762
+
763
+ assert_equal '<form action="http://www.otherdomain.com" method="post"></form>', _erbout
764
+ end
765
+
766
+ def test_form_for_with_hash_url_option
767
+ _erbout = ''
768
+
769
+ form_for(:post, @post, :url => {:controller => 'controller', :action => 'action'}) do |f| end
770
+
771
+ assert_equal 'controller', @controller.url_for_options[:controller]
772
+ assert_equal 'action', @controller.url_for_options[:action]
773
+ end
774
+
775
+ def test_form_for_with_record_url_option
776
+ _erbout = ''
777
+
778
+ form_for(:post, @post, :url => @post) do |f| end
779
+
780
+ expected = "<form action=\"/posts/123\" method=\"post\"></form>"
781
+ assert_equal expected, _erbout
782
+ end
783
+
784
+ def test_form_for_with_existing_object
785
+ _erbout = ''
786
+
787
+ form_for(@post) do |f| end
788
+
789
+ expected = "<form action=\"/posts/123\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
790
+ assert_equal expected, _erbout
791
+ end
792
+
793
+ def test_form_for_with_new_object
794
+ _erbout = ''
795
+
796
+ post = Post.new
797
+ post.new_record = true
798
+ def post.id() nil end
799
+
800
+ form_for(post) do |f| end
801
+
802
+ expected = "<form action=\"/posts\" class=\"new_post\" id=\"new_post\" method=\"post\"></form>"
803
+ assert_equal expected, _erbout
804
+ end
805
+
806
+ def test_form_for_with_existing_object_in_list
807
+ @post.new_record = false
808
+ @comment.save
809
+ _erbout = ''
810
+ form_for([@post, @comment]) {}
811
+
812
+ expected = %(<form action="#{comment_path(@post, @comment)}" class="edit_comment" id="edit_comment_1" method="post"><div style="margin:0;padding:0"><input name="_method" type="hidden" value="put" /></div></form>)
813
+ assert_dom_equal expected, _erbout
814
+ end
815
+
816
+ def test_form_for_with_new_object_in_list
817
+ @post.new_record = false
818
+ _erbout = ''
819
+ form_for([@post, @comment]) {}
820
+
821
+ expected = %(<form action="#{comments_path(@post)}" class="new_comment" id="new_comment" method="post"></form>)
822
+ assert_dom_equal expected, _erbout
823
+ end
824
+
825
+ def test_form_for_with_existing_object_and_namespace_in_list
826
+ @post.new_record = false
827
+ @comment.save
828
+ _erbout = ''
829
+ form_for([:admin, @post, @comment]) {}
830
+
831
+ expected = %(<form action="#{admin_comment_path(@post, @comment)}" class="edit_comment" id="edit_comment_1" method="post"><div style="margin:0;padding:0"><input name="_method" type="hidden" value="put" /></div></form>)
832
+ assert_dom_equal expected, _erbout
833
+ end
834
+
835
+ def test_form_for_with_new_object_and_namespace_in_list
836
+ @post.new_record = false
837
+ _erbout = ''
838
+ form_for([:admin, @post, @comment]) {}
839
+
840
+ expected = %(<form action="#{admin_comments_path(@post)}" class="new_comment" id="new_comment" method="post"></form>)
841
+ assert_dom_equal expected, _erbout
842
+ end
843
+
844
+ def test_form_for_with_existing_object_and_custom_url
845
+ _erbout = ''
846
+
847
+ form_for(@post, :url => "/super_posts") do |f| end
848
+
849
+ expected = "<form action=\"/super_posts\" class=\"edit_post\" id=\"edit_post_123\" method=\"post\"><div style=\"margin:0;padding:0\"><input name=\"_method\" type=\"hidden\" value=\"put\" /></div></form>"
850
+ assert_equal expected, _erbout
851
+ end
852
+
853
+ protected
854
+ def comments_path(post)
855
+ "/posts/#{post.id}/comments"
856
+ end
857
+ alias_method :post_comments_path, :comments_path
858
+
859
+ def comment_path(post, comment)
860
+ "/posts/#{post.id}/comments/#{comment.id}"
861
+ end
862
+ alias_method :post_comment_path, :comment_path
863
+
864
+ def admin_comments_path(post)
865
+ "/admin/posts/#{post.id}/comments"
866
+ end
867
+ alias_method :admin_post_comments_path, :admin_comments_path
868
+
869
+ def admin_comment_path(post, comment)
870
+ "/admin/posts/#{post.id}/comments/#{comment.id}"
871
+ end
872
+ alias_method :admin_post_comment_path, :admin_comment_path
873
+
874
+ def posts_path
875
+ "/posts"
876
+ end
877
+
878
+ def post_path(post)
879
+ "/posts/#{post.id}"
880
+ end
881
+
882
+ def protect_against_forgery?
883
+ false
884
+ end
885
+ end