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,58 @@
1
+ require 'abstract_unit'
2
+
3
+ class Post
4
+ def id
5
+ 45
6
+ end
7
+ def body
8
+ "What a wonderful world!"
9
+ end
10
+ end
11
+
12
+ class RecordTagHelperTest < ActionView::TestCase
13
+ tests ActionView::Helpers::RecordTagHelper
14
+
15
+ def setup
16
+ @post = Post.new
17
+ end
18
+
19
+ def test_content_tag_for
20
+ expected = %(<li class="post bar" id="post_45"></li>)
21
+ actual = content_tag_for(:li, @post, :class => 'bar') { }
22
+ assert_dom_equal expected, actual
23
+ end
24
+
25
+ def test_content_tag_for_prefix
26
+ expected = %(<ul class="post" id="archived_post_45"></ul>)
27
+ actual = content_tag_for(:ul, @post, :archived) { }
28
+ assert_dom_equal expected, actual
29
+ end
30
+
31
+ def test_content_tag_for_with_extra_html_tags
32
+ expected = %(<tr class="post bar" id="post_45" style='background-color: #f0f0f0'></tr>)
33
+ actual = content_tag_for(:tr, @post, {:class => "bar", :style => "background-color: #f0f0f0"}) { }
34
+ assert_dom_equal expected, actual
35
+ end
36
+
37
+ def test_block_not_in_erb_multiple_calls
38
+ expected = %(<div class="post bar" id="post_45">#{@post.body}</div>)
39
+ actual = div_for(@post, :class => "bar") { @post.body }
40
+ assert_dom_equal expected, actual
41
+ actual = div_for(@post, :class => "bar") { @post.body }
42
+ assert_dom_equal expected, actual
43
+ end
44
+
45
+ def test_block_works_with_content_tag_for_in_erb
46
+ __in_erb_template = ''
47
+ expected = %(<tr class="post" id="post_45">#{@post.body}</tr>)
48
+ actual = content_tag_for(:tr, @post) { concat @post.body }
49
+ assert_dom_equal expected, actual
50
+ end
51
+
52
+ def test_div_for_in_erb
53
+ __in_erb_template = ''
54
+ expected = %(<div class="post bar" id="post_45">#{@post.body}</div>)
55
+ actual = div_for(@post, :class => "bar") { concat @post.body }
56
+ assert_dom_equal expected, actual
57
+ end
58
+ end
@@ -0,0 +1,290 @@
1
+ # encoding: utf-8
2
+ require 'abstract_unit'
3
+ require 'controller/fake_models'
4
+
5
+ module RenderTestCases
6
+ def setup_view(paths)
7
+ @assigns = { :secret => 'in the sauce' }
8
+ @view = ActionView::Base.new(paths, @assigns)
9
+
10
+ # Reload and register danish language for testing
11
+ I18n.reload!
12
+ I18n.backend.store_translations 'da', {}
13
+ I18n.backend.store_translations 'pt-BR', {}
14
+
15
+ # Ensure original are still the same since we are reindexing view paths
16
+ assert_equal ORIGINAL_LOCALES, I18n.available_locales.map(&:to_s).sort
17
+ end
18
+
19
+ def test_render_file
20
+ assert_equal "Hello world!", @view.render(:file => "test/hello_world.erb")
21
+ end
22
+
23
+ def test_render_file_not_using_full_path
24
+ assert_equal "Hello world!", @view.render(:file => "test/hello_world.erb")
25
+ end
26
+
27
+ def test_render_file_without_specific_extension
28
+ assert_equal "Hello world!", @view.render(:file => "test/hello_world")
29
+ end
30
+
31
+ def test_render_file_with_localization
32
+ old_locale = I18n.locale
33
+ I18n.locale = :da
34
+ assert_equal "Hey verden", @view.render(:file => "test/hello_world")
35
+ ensure
36
+ I18n.locale = old_locale
37
+ end
38
+
39
+ def test_render_file_with_dashed_locale
40
+ old_locale = I18n.locale
41
+ I18n.locale = :"pt-BR"
42
+ assert_equal "Ola mundo", @view.render(:file => "test/hello_world")
43
+ ensure
44
+ I18n.locale = old_locale
45
+ end
46
+
47
+ def test_render_implicit_html_template_from_xhr_request
48
+ old_format = @view.template_format
49
+ @view.template_format = :js
50
+ assert_equal "Hello HTML!", @view.render(:file => "test/render_implicit_html_template_from_xhr_request")
51
+ ensure
52
+ @view.template_format = old_format
53
+ end
54
+
55
+ def test_render_implicit_html_template_from_xhr_request_with_localization
56
+ old_locale = I18n.locale
57
+ old_format = @view.template_format
58
+ I18n.locale = :da
59
+ @view.template_format = :js
60
+ assert_equal "Hey HTML!\n", @view.render(:file => "test/render_implicit_html_template_from_xhr_request")
61
+ ensure
62
+ I18n.locale = old_locale
63
+ @view.template_format = old_format
64
+ end
65
+
66
+ def test_render_file_at_top_level
67
+ assert_equal 'Elastica', @view.render(:file => '/shared')
68
+ end
69
+
70
+ def test_render_file_with_full_path
71
+ template_path = File.join(File.dirname(__FILE__), '../fixtures/test/hello_world.erb')
72
+ assert_equal "Hello world!", @view.render(:file => template_path)
73
+ end
74
+
75
+ def test_render_file_with_instance_variables
76
+ assert_equal "The secret is in the sauce\n", @view.render(:file => "test/render_file_with_ivar.erb")
77
+ end
78
+
79
+ def test_render_file_with_locals
80
+ locals = { :secret => 'in the sauce' }
81
+ assert_equal "The secret is in the sauce\n", @view.render(:file => "test/render_file_with_locals.erb", :locals => locals)
82
+ end
83
+
84
+ def test_render_file_not_using_full_path_with_dot_in_path
85
+ assert_equal "The secret is in the sauce\n", @view.render(:file => "test/dot.directory/render_file_with_ivar")
86
+ end
87
+
88
+ def test_render_has_access_current_template
89
+ assert_equal "test/template.erb", @view.render(:file => "test/template.erb")
90
+ end
91
+
92
+ def test_render_update
93
+ # TODO: You should not have to stub out template because template is self!
94
+ @view.instance_variable_set(:@template, @view)
95
+ assert_equal 'alert("Hello, World!");', @view.render(:update) { |page| page.alert('Hello, World!') }
96
+ end
97
+
98
+ def test_render_partial_from_default
99
+ assert_equal "only partial", @view.render("test/partial_only")
100
+ end
101
+
102
+ def test_render_partial
103
+ assert_equal "only partial", @view.render(:partial => "test/partial_only")
104
+ end
105
+
106
+ def test_render_partial_with_format
107
+ assert_equal 'partial html', @view.render(:partial => 'test/partial')
108
+ end
109
+
110
+ def test_render_partial_at_top_level
111
+ # file fixtures/_top_level_partial_only.erb (not fixtures/test)
112
+ assert_equal 'top level partial', @view.render(:partial => '/top_level_partial_only')
113
+ end
114
+
115
+ def test_render_partial_with_format_at_top_level
116
+ # file fixtures/_top_level_partial.html.erb (not fixtures/test, with format extension)
117
+ assert_equal 'top level partial html', @view.render(:partial => '/top_level_partial')
118
+ end
119
+
120
+ def test_render_partial_with_locals
121
+ assert_equal "5", @view.render(:partial => "test/counter", :locals => { :counter_counter => 5 })
122
+ end
123
+
124
+ def test_render_partial_with_locals_from_default
125
+ assert_equal "only partial", @view.render("test/partial_only", :counter_counter => 5)
126
+ end
127
+
128
+ def test_render_partial_with_errors
129
+ @view.render(:partial => "test/raise")
130
+ flunk "Render did not raise TemplateError"
131
+ rescue ActionView::TemplateError => e
132
+ assert_match "undefined local variable or method `doesnt_exist'", e.message
133
+ assert_equal "", e.sub_template_message
134
+ assert_equal "1", e.line_number
135
+ assert_equal File.expand_path("#{FIXTURE_LOAD_PATH}/test/_raise.html.erb"), e.file_name
136
+ end
137
+
138
+ def test_render_sub_template_with_errors
139
+ @view.render(:file => "test/sub_template_raise")
140
+ flunk "Render did not raise TemplateError"
141
+ rescue ActionView::TemplateError => e
142
+ assert_match "undefined local variable or method `doesnt_exist'", e.message
143
+ assert_equal "Trace of template inclusion: #{File.expand_path("#{FIXTURE_LOAD_PATH}/test/sub_template_raise.html.erb")}", e.sub_template_message
144
+ assert_equal "1", e.line_number
145
+ assert_equal File.expand_path("#{FIXTURE_LOAD_PATH}/test/_raise.html.erb"), e.file_name
146
+ end
147
+
148
+ def test_render_object
149
+ assert_equal "Hello: david", @view.render(:partial => "test/customer", :object => Customer.new("david"))
150
+ end
151
+
152
+ def test_render_partial_collection
153
+ assert_equal "Hello: davidHello: mary", @view.render(:partial => "test/customer", :collection => [ Customer.new("david"), Customer.new("mary") ])
154
+ end
155
+
156
+ def test_render_partial_collection_as
157
+ assert_equal "david david davidmary mary mary",
158
+ @view.render(:partial => "test/customer_with_var", :collection => [ Customer.new("david"), Customer.new("mary") ], :as => :customer)
159
+ end
160
+
161
+ def test_render_partial_collection_without_as
162
+ assert_equal "local_inspector,local_inspector_counter,object",
163
+ @view.render(:partial => "test/local_inspector", :collection => [ Customer.new("mary") ])
164
+ end
165
+
166
+ def test_render_partial_with_empty_collection_should_return_nil
167
+ assert_nil @view.render(:partial => "test/customer", :collection => [])
168
+ end
169
+
170
+ def test_render_partial_with_nil_collection_should_return_nil
171
+ assert_nil @view.render(:partial => "test/customer", :collection => nil)
172
+ end
173
+
174
+ def test_render_partial_with_nil_values_in_collection
175
+ assert_equal "Hello: davidHello: Anonymous", @view.render(:partial => "test/customer", :collection => [ Customer.new("david"), nil ])
176
+ end
177
+
178
+ def test_render_partial_with_empty_array_should_return_nil
179
+ assert_nil @view.render(:partial => [])
180
+ end
181
+
182
+ # TODO: The reason for this test is unclear, improve documentation
183
+ def test_render_partial_and_fallback_to_layout
184
+ assert_equal "Before (Josh)\n\nAfter", @view.render(:partial => "test/layout_for_partial", :locals => { :name => "Josh" })
185
+ end
186
+
187
+ # TODO: The reason for this test is unclear, improve documentation
188
+ def test_render_missing_xml_partial_and_raise_missing_template
189
+ @view.template_format = :xml
190
+ assert_raise(ActionView::MissingTemplate) { @view.render(:partial => "test/layout_for_partial") }
191
+ end
192
+
193
+ def test_render_inline
194
+ assert_equal "Hello, World!", @view.render(:inline => "Hello, World!")
195
+ end
196
+
197
+ def test_render_inline_with_locals
198
+ assert_equal "Hello, Josh!", @view.render(:inline => "Hello, <%= name %>!", :locals => { :name => "Josh" })
199
+ end
200
+
201
+ def test_render_fallbacks_to_erb_for_unknown_types
202
+ assert_equal "Hello, World!", @view.render(:inline => "Hello, World!", :type => :bar)
203
+ end
204
+
205
+ CustomHandler = lambda do |template|
206
+ "@output_buffer = ''\n" +
207
+ "@output_buffer << 'source: #{template.source.inspect}'\n"
208
+ end
209
+
210
+ def test_render_inline_with_compilable_custom_type
211
+ ActionView::Template.register_template_handler :foo, CustomHandler
212
+ assert_equal 'source: "Hello, World!"', @view.render(:inline => "Hello, World!", :type => :foo)
213
+ end
214
+
215
+ def test_render_inline_with_locals_and_compilable_custom_type
216
+ ActionView::Template.register_template_handler :foo, CustomHandler
217
+ assert_equal 'source: "Hello, <%= name %>!"', @view.render(:inline => "Hello, <%= name %>!", :locals => { :name => "Josh" }, :type => :foo)
218
+ end
219
+
220
+ class LegacyHandler < ActionView::TemplateHandler
221
+ def render(template, local_assigns)
222
+ "source: #{template.source}; locals: #{local_assigns.inspect}"
223
+ end
224
+ end
225
+
226
+ def test_render_legacy_handler_with_custom_type
227
+ ActionView::Template.register_template_handler :foo, LegacyHandler
228
+ assert_equal 'source: Hello, <%= name %>!; locals: {:name=>"Josh"}', @view.render(:inline => "Hello, <%= name %>!", :locals => { :name => "Josh" }, :type => :foo)
229
+ end
230
+
231
+ def test_render_ignores_templates_with_malformed_template_handlers
232
+ %w(malformed malformed.erb malformed.html.erb malformed.en.html.erb).each do |name|
233
+ assert_raise(ActionView::MissingTemplate) { @view.render(:file => "test/malformed/#{name}") }
234
+ end
235
+ end
236
+
237
+ def test_template_with_malformed_template_handler_is_reachable_through_its_exact_filename
238
+ assert_equal "Don't render me!", @view.render(:file => 'test/malformed/malformed.html.erb~')
239
+ end
240
+
241
+ def test_render_with_layout
242
+ assert_equal %(<title></title>\nHello world!\n),
243
+ @view.render(:file => "test/hello_world.erb", :layout => "layouts/yield")
244
+ end
245
+
246
+ def test_render_with_nested_layout
247
+ assert_equal %(<title>title</title>\n<div id="column">column</div>\n<div id="content">content</div>\n),
248
+ @view.render(:file => "test/nested_layout.erb", :layout => "layouts/yield")
249
+ end
250
+
251
+ if '1.9'.respond_to?(:force_encoding)
252
+ def test_render_utf8_template
253
+ result = @view.render(:file => "test/utf8.html.erb", :layouts => "layouts/yield")
254
+ assert_equal "Русский текст\n日本語のテキスト", result
255
+ assert_equal Encoding::UTF_8, result.encoding
256
+ end
257
+ end
258
+ end
259
+
260
+ module TemplatesSetupTeardown
261
+ def setup_view_paths_for(new_cache_template_loading)
262
+ @previous_cache_template_loading, ActionView::Base.cache_template_loading = ActionView::Base.cache_template_loading, new_cache_template_loading
263
+ view_paths = new_cache_template_loading ? CACHED_VIEW_PATHS : ActionView::Base.process_view_paths(CACHED_VIEW_PATHS.map(&:to_s))
264
+ assert_equal(new_cache_template_loading ? ActionView::Template::EagerPath : ActionView::ReloadableTemplate::ReloadablePath, view_paths.first.class)
265
+ setup_view(view_paths)
266
+ end
267
+
268
+ def teardown
269
+ ActionView::Base.cache_template_loading = @previous_cache_template_loading
270
+ end
271
+ end
272
+
273
+ class CachedRenderTest < Test::Unit::TestCase
274
+ include TemplatesSetupTeardown
275
+ include RenderTestCases
276
+
277
+ def setup
278
+ setup_view_paths_for(cache_templates = true)
279
+ end
280
+ end
281
+
282
+ class ReloadableRenderTest < Test::Unit::TestCase
283
+ include TemplatesSetupTeardown
284
+ include RenderTestCases
285
+
286
+ def setup
287
+ setup_view_paths_for(cache_templates = false)
288
+ end
289
+ end
290
+
@@ -0,0 +1,57 @@
1
+ require 'abstract_unit'
2
+ require 'testing_sandbox'
3
+
4
+ # The exhaustive tests are in test/controller/html/sanitizer_test.rb.
5
+ # This tests the that the helpers hook up correctly to the sanitizer classes.
6
+ class SanitizeHelperTest < ActionView::TestCase
7
+ tests ActionView::Helpers::SanitizeHelper
8
+ include TestingSandbox
9
+
10
+ def test_strip_links
11
+ assert_equal "Dont touch me", strip_links("Dont touch me")
12
+ assert_equal "<a<a", strip_links("<a<a")
13
+ assert_equal "on my mind\nall day long", strip_links("<a href='almost'>on my mind</a>\n<A href='almost'>all day long</A>")
14
+ assert_equal "0wn3d", strip_links("<a href='http://www.rubyonrails.com/'><a href='http://www.rubyonrails.com/' onlclick='steal()'>0wn3d</a></a>")
15
+ assert_equal "Magic", strip_links("<a href='http://www.rubyonrails.com/'>Mag<a href='http://www.ruby-lang.org/'>ic")
16
+ assert_equal "FrrFox", strip_links("<href onlclick='steal()'>FrrFox</a></href>")
17
+ assert_equal "My mind\nall <b>day</b> long", strip_links("<a href='almost'>My mind</a>\n<A href='almost'>all <b>day</b> long</A>")
18
+ assert_equal "all <b>day</b> long", strip_links("<<a>a href='hello'>all <b>day</b> long<</A>/a>")
19
+ end
20
+
21
+ def test_sanitize_form
22
+ assert_sanitized "<form action=\"/foo/bar\" method=\"post\"><input></form>", ''
23
+ end
24
+
25
+ def test_should_sanitize_illegal_style_properties
26
+ raw = %(display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;)
27
+ expected = %(display: block; width: 100%; height: 100%; background-color: black; background-image: ; background-x: center; background-y: center;)
28
+ assert_equal expected, sanitize_css(raw)
29
+ end
30
+
31
+ def test_strip_tags
32
+ assert_equal("<<<bad html", strip_tags("<<<bad html"))
33
+ assert_equal("<<", strip_tags("<<<bad html>"))
34
+ assert_equal("Dont touch me", strip_tags("Dont touch me"))
35
+ assert_equal("This is a test.", strip_tags("<p>This <u>is<u> a <a href='test.html'><strong>test</strong></a>.</p>"))
36
+ assert_equal("Weirdos", strip_tags("Wei<<a>a onclick='alert(document.cookie);'</a>/>rdos"))
37
+ assert_equal("This is a test.", strip_tags("This is a test."))
38
+ assert_equal(
39
+ %{This is a test.\n\n\nIt no longer contains any HTML.\n}, strip_tags(
40
+ %{<title>This is <b>a <a href="" target="_blank">test</a></b>.</title>\n\n<!-- it has a comment -->\n\n<p>It no <b>longer <strong>contains <em>any <strike>HTML</strike></em>.</strong></b></p>\n}))
41
+ assert_equal "This has a here.", strip_tags("This has a <!-- comment --> here.")
42
+ [nil, '', ' '].each do |blank|
43
+ stripped = strip_tags(blank)
44
+ assert_equal blank, stripped
45
+ assert stripped.html_safe? unless blank.nil?
46
+ end
47
+ assert strip_tags("<script>").html_safe?
48
+ end
49
+
50
+ def test_sanitize_is_marked_safe
51
+ assert sanitize("<html><script></script></html>").html_safe?
52
+ end
53
+
54
+ def assert_sanitized(text, expected = nil)
55
+ assert_equal((expected || text), sanitize(text))
56
+ end
57
+ end
@@ -0,0 +1,90 @@
1
+ require 'abstract_unit'
2
+
3
+ class ScriptaculousHelperTest < ActionView::TestCase
4
+ tests ActionView::Helpers::ScriptaculousHelper
5
+
6
+ def setup
7
+ @controller = Class.new do
8
+ def url_for(options)
9
+ url = "http://www.example.com/"
10
+ url << options[:action].to_s if options and options[:action]
11
+ url
12
+ end
13
+ end.new
14
+ end
15
+
16
+ def test_effect
17
+ assert_equal "new Effect.Highlight(\"posts\",{});", visual_effect(:highlight, "posts")
18
+ assert_equal "new Effect.Highlight(\"posts\",{});", visual_effect("highlight", :posts)
19
+ assert_equal "new Effect.Highlight(\"posts\",{});", visual_effect(:highlight, :posts)
20
+ assert_equal "new Effect.Fade(\"fademe\",{duration:4.0});", visual_effect(:fade, "fademe", :duration => 4.0)
21
+ assert_equal "new Effect.Shake(element,{});", visual_effect(:shake)
22
+ assert_equal "new Effect.DropOut(\"dropme\",{queue:'end'});", visual_effect(:drop_out, 'dropme', :queue => :end)
23
+ assert_equal "new Effect.Highlight(\"status\",{endcolor:'#EEEEEE'});", visual_effect(:highlight, 'status', :endcolor => '#EEEEEE')
24
+ assert_equal "new Effect.Highlight(\"status\",{restorecolor:'#500000', startcolor:'#FEFEFE'});", visual_effect(:highlight, 'status', :restorecolor => '#500000', :startcolor => '#FEFEFE')
25
+
26
+ # chop the queue params into a comma separated list
27
+ beginning, ending = 'new Effect.DropOut("dropme",{queue:{', '}});'
28
+ ve = [
29
+ visual_effect(:drop_out, 'dropme', :queue => {:position => "end", :scope => "test", :limit => 2}),
30
+ visual_effect(:drop_out, 'dropme', :queue => {:scope => :list, :limit => 2}),
31
+ visual_effect(:drop_out, 'dropme', :queue => {:position => :end, :scope => :test, :limit => 2})
32
+ ].collect { |v| v[beginning.length..-ending.length-1].split(',') }
33
+
34
+ assert ve[0].include?("limit:2")
35
+ assert ve[0].include?("scope:'test'")
36
+ assert ve[0].include?("position:'end'")
37
+
38
+ assert ve[1].include?("limit:2")
39
+ assert ve[1].include?("scope:'list'")
40
+
41
+ assert ve[2].include?("limit:2")
42
+ assert ve[2].include?("scope:'test'")
43
+ assert ve[2].include?("position:'end'")
44
+ end
45
+
46
+ def test_toggle_effects
47
+ assert_equal "Effect.toggle(\"posts\",'appear',{});", visual_effect(:toggle_appear, "posts")
48
+ assert_equal "Effect.toggle(\"posts\",'slide',{});", visual_effect(:toggle_slide, "posts")
49
+ assert_equal "Effect.toggle(\"posts\",'blind',{});", visual_effect(:toggle_blind, "posts")
50
+ assert_equal "Effect.toggle(\"posts\",'appear',{});", visual_effect("toggle_appear", "posts")
51
+ assert_equal "Effect.toggle(\"posts\",'slide',{});", visual_effect("toggle_slide", "posts")
52
+ assert_equal "Effect.toggle(\"posts\",'blind',{});", visual_effect("toggle_blind", "posts")
53
+ end
54
+
55
+
56
+ def test_sortable_element
57
+ assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>),
58
+ sortable_element("mylist", :url => { :action => "order" })
59
+ assert_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}, tag:'div'})\n//]]>\n</script>),
60
+ sortable_element("mylist", :tag => "div", :constraint => "horizontal", :url => { :action => "order" })
61
+ assert_dom_equal %|<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', containment:['list1','list2'], onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>|,
62
+ sortable_element("mylist", :containment => ['list1','list2'], :constraint => "horizontal", :url => { :action => "order" })
63
+ assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', containment:'list1', onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>),
64
+ sortable_element("mylist", :containment => 'list1', :constraint => "horizontal", :url => { :action => "order" })
65
+ end
66
+
67
+ def test_draggable_element
68
+ assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nnew Draggable(\"product_13\", {})\n//]]>\n</script>),
69
+ draggable_element("product_13")
70
+ assert_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nnew Draggable(\"product_13\", {revert:true})\n//]]>\n</script>),
71
+ draggable_element("product_13", :revert => true)
72
+ end
73
+
74
+ def test_drop_receiving_element
75
+ assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nDroppables.add(\"droptarget1\", {onDrop:function(element){new Ajax.Request('http://www.example.com/', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}})\n//]]>\n</script>),
76
+ drop_receiving_element("droptarget1")
77
+ assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nDroppables.add(\"droptarget1\", {accept:'products', onDrop:function(element){new Ajax.Request('http://www.example.com/', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}})\n//]]>\n</script>),
78
+ drop_receiving_element("droptarget1", :accept => 'products')
79
+ assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nDroppables.add(\"droptarget1\", {accept:'products', onDrop:function(element){new Ajax.Updater('infobox', 'http://www.example.com/', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}})\n//]]>\n</script>),
80
+ drop_receiving_element("droptarget1", :accept => 'products', :update => 'infobox')
81
+ assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nDroppables.add(\"droptarget1\", {accept:['tshirts','mugs'], onDrop:function(element){new Ajax.Updater('infobox', 'http://www.example.com/', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}})\n//]]>\n</script>),
82
+ drop_receiving_element("droptarget1", :accept => ['tshirts','mugs'], :update => 'infobox')
83
+ assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nDroppables.add("droptarget1", {hoverclass:'dropready', onDrop:function(element){if (confirm('Are you sure?')) { new Ajax.Request('http://www.example.com/update_drop', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)}); }}})\n//]]>\n</script>),
84
+ drop_receiving_element('droptarget1', :hoverclass=>'dropready', :url=>{:action=>'update_drop'}, :confirm => 'Are you sure?')
85
+
86
+ end
87
+ def protect_against_forgery?
88
+ false
89
+ end
90
+ end
@@ -0,0 +1,98 @@
1
+ require 'abstract_unit'
2
+
3
+ class TagHelperTest < ActionView::TestCase
4
+ tests ActionView::Helpers::TagHelper
5
+
6
+ def test_tag
7
+ assert_equal "<br />", tag("br")
8
+ assert_equal "<br clear=\"left\" />", tag(:br, :clear => "left")
9
+ assert_equal "<br>", tag("br", nil, true)
10
+ end
11
+
12
+ def test_tag_options
13
+ str = tag("p", "class" => "show", :class => "elsewhere")
14
+ assert_match /class="show"/, str
15
+ assert_match /class="elsewhere"/, str
16
+ end
17
+
18
+ def test_tag_options_rejects_nil_option
19
+ assert_equal "<p />", tag("p", :ignored => nil)
20
+ end
21
+
22
+ def test_tag_options_accepts_false_option
23
+ assert_equal "<p value=\"false\" />", tag("p", :value => false)
24
+ end
25
+
26
+ def test_tag_options_accepts_blank_option
27
+ assert_equal "<p included=\"\" />", tag("p", :included => '')
28
+ end
29
+
30
+ def test_tag_options_converts_boolean_option
31
+ assert_equal '<p disabled="disabled" multiple="multiple" readonly="readonly" />',
32
+ tag("p", :disabled => true, :multiple => true, :readonly => true)
33
+ end
34
+
35
+ def test_content_tag
36
+ assert_equal "<a href=\"create\">Create</a>", content_tag("a", "Create", "href" => "create")
37
+ assert content_tag("a", "Create", "href" => "create").html_safe?
38
+ assert_equal content_tag("a", "Create", "href" => "create"),
39
+ content_tag("a", "Create", :href => "create")
40
+ end
41
+
42
+ def test_content_tag_with_block_in_erb
43
+ __in_erb_template = ''
44
+ content_tag(:div) { concat "Hello world!" }
45
+ assert_dom_equal "<div>Hello world!</div>", output_buffer
46
+ end
47
+
48
+ def test_content_tag_with_block_and_options_in_erb
49
+ __in_erb_template = ''
50
+ content_tag(:div, :class => "green") { concat "Hello world!" }
51
+ assert_dom_equal %(<div class="green">Hello world!</div>), output_buffer
52
+ end
53
+
54
+ def test_content_tag_with_block_and_options_out_of_erb
55
+ assert_dom_equal %(<div class="green">Hello world!</div>), content_tag(:div, :class => "green") { "Hello world!" }
56
+ end
57
+
58
+ def test_content_tag_with_block_and_options_outside_out_of_erb
59
+ assert_equal content_tag("a", "Create", :href => "create"),
60
+ content_tag("a", "href" => "create") { "Create" }
61
+ end
62
+
63
+ def test_content_tag_nested_in_content_tag_out_of_erb
64
+ assert_equal content_tag("p", content_tag("b", "Hello")),
65
+ content_tag("p") { content_tag("b", "Hello") },
66
+ output_buffer
67
+ end
68
+
69
+ def test_content_tag_nested_in_content_tag_in_erb
70
+ __in_erb_template = true
71
+ content_tag("p") { concat content_tag("b", "Hello") }
72
+ assert_equal '<p><b>Hello</b></p>', output_buffer
73
+ end
74
+
75
+ def test_cdata_section
76
+ assert_equal "<![CDATA[<hello world>]]>", cdata_section("<hello world>")
77
+ end
78
+
79
+ def test_escape_once
80
+ assert_equal '1 &lt; 2 &amp; 3', escape_once('1 < 2 &amp; 3')
81
+ end
82
+
83
+ def test_double_escaping_attributes
84
+ ['1&amp;2', '1 &lt; 2', '&#8220;test&#8220;'].each do |escaped|
85
+ assert_equal %(<a href="#{escaped}" />), tag('a', :href => escaped)
86
+ end
87
+ end
88
+
89
+ def test_skip_invalid_escaped_attributes
90
+ ['&1;', '&#1dfa3;', '& #123;'].each do |escaped|
91
+ assert_equal %(<a href="#{escaped.gsub /&/, '&amp;'}" />), tag('a', :href => escaped)
92
+ end
93
+ end
94
+
95
+ def test_disable_escaping
96
+ assert_equal '<a href="&amp;" />', tag('a', { :href => '&amp;' }, false, false)
97
+ end
98
+ end
@@ -0,0 +1,32 @@
1
+ require 'abstract_unit'
2
+
3
+ class TemplateTest < Test::Unit::TestCase
4
+ def test_template_path_parsing
5
+ with_options :base_path => nil, :name => 'abc', :locale => nil, :format => 'html', :extension => 'erb' do |t|
6
+ t.assert_parses_template_path 'abc.en.html.erb', :locale => 'en'
7
+ t.assert_parses_template_path 'abc.en.plain.html.erb', :locale => 'en', :format => 'plain.html'
8
+ t.assert_parses_template_path 'abc.html.erb'
9
+ t.assert_parses_template_path 'abc.plain.html.erb', :format => 'plain.html'
10
+ t.assert_parses_template_path 'abc.erb', :format => nil
11
+ t.assert_parses_template_path 'abc.html', :extension => nil
12
+
13
+ t.assert_parses_template_path '_abc.html.erb', :name => '_abc'
14
+
15
+ t.assert_parses_template_path 'test/abc.html.erb', :base_path => 'test'
16
+ t.assert_parses_template_path './test/abc.html.erb', :base_path => './test'
17
+ t.assert_parses_template_path '../test/abc.html.erb', :base_path => '../test'
18
+
19
+ t.assert_parses_template_path 'abc', :extension => nil, :format => nil, :name => nil
20
+ t.assert_parses_template_path 'abc.xxx', :extension => nil, :format => 'xxx', :name => 'abc'
21
+ t.assert_parses_template_path 'abc.html.xxx', :extension => nil, :format => 'xxx', :name => 'abc'
22
+ end
23
+ end
24
+
25
+ private
26
+ def assert_parses_template_path(path, parse_results)
27
+ template = ActionView::Template.new(path, '')
28
+ parse_results.each_pair do |k, v|
29
+ assert_block(%Q{Expected template to parse #{k.inspect} from "#{path}" as #{v.inspect}, but got #{template.send(k).inspect}}) { v == template.send(k) }
30
+ end
31
+ end
32
+ end