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,147 @@
1
+ require 'abstract_unit'
2
+
3
+ class FlashTest < ActionController::TestCase
4
+ class TestController < ActionController::Base
5
+ def set_flash
6
+ flash["that"] = "hello"
7
+ render :inline => "hello"
8
+ end
9
+
10
+ def set_flash_now
11
+ flash.now["that"] = "hello"
12
+ flash.now["foo"] ||= "bar"
13
+ flash.now["foo"] ||= "err"
14
+ @flashy = flash.now["that"]
15
+ @flash_copy = {}.update flash
16
+ render :inline => "hello"
17
+ end
18
+
19
+ def attempt_to_use_flash_now
20
+ @flash_copy = {}.update flash
21
+ @flashy = flash["that"]
22
+ render :inline => "hello"
23
+ end
24
+
25
+ def use_flash
26
+ @flash_copy = {}.update flash
27
+ @flashy = flash["that"]
28
+ render :inline => "hello"
29
+ end
30
+
31
+ def use_flash_and_keep_it
32
+ @flash_copy = {}.update flash
33
+ @flashy = flash["that"]
34
+ flash.keep
35
+ render :inline => "hello"
36
+ end
37
+
38
+ def use_flash_and_update_it
39
+ flash.update("this" => "hello again")
40
+ @flash_copy = {}.update flash
41
+ render :inline => "hello"
42
+ end
43
+
44
+ def use_flash_after_reset_session
45
+ flash["that"] = "hello"
46
+ @flashy_that = flash["that"]
47
+ reset_session
48
+ @flashy_that_reset = flash["that"]
49
+ flash["this"] = "good-bye"
50
+ @flashy_this = flash["this"]
51
+ render :inline => "hello"
52
+ end
53
+
54
+ def rescue_action(e)
55
+ raise unless ActionView::MissingTemplate === e
56
+ end
57
+
58
+ # methods for test_sweep_after_halted_filter_chain
59
+ before_filter :halt_and_redir, :only => "filter_halting_action"
60
+
61
+ def std_action
62
+ @flash_copy = {}.update(flash)
63
+ end
64
+
65
+ def filter_halting_action
66
+ @flash_copy = {}.update(flash)
67
+ end
68
+
69
+ def halt_and_redir
70
+ flash["foo"] = "bar"
71
+ redirect_to :action => "std_action"
72
+ @flash_copy = {}.update(flash)
73
+ end
74
+ end
75
+
76
+ tests TestController
77
+
78
+ def test_flash
79
+ get :set_flash
80
+
81
+ get :use_flash
82
+ assert_equal "hello", @response.template.assigns["flash_copy"]["that"]
83
+ assert_equal "hello", @response.template.assigns["flashy"]
84
+
85
+ get :use_flash
86
+ assert_nil @response.template.assigns["flash_copy"]["that"], "On second flash"
87
+ end
88
+
89
+ def test_keep_flash
90
+ get :set_flash
91
+
92
+ get :use_flash_and_keep_it
93
+ assert_equal "hello", @response.template.assigns["flash_copy"]["that"]
94
+ assert_equal "hello", @response.template.assigns["flashy"]
95
+
96
+ get :use_flash
97
+ assert_equal "hello", @response.template.assigns["flash_copy"]["that"], "On second flash"
98
+
99
+ get :use_flash
100
+ assert_nil @response.template.assigns["flash_copy"]["that"], "On third flash"
101
+ end
102
+
103
+ def test_flash_now
104
+ get :set_flash_now
105
+ assert_equal "hello", @response.template.assigns["flash_copy"]["that"]
106
+ assert_equal "bar" , @response.template.assigns["flash_copy"]["foo"]
107
+ assert_equal "hello", @response.template.assigns["flashy"]
108
+
109
+ get :attempt_to_use_flash_now
110
+ assert_nil @response.template.assigns["flash_copy"]["that"]
111
+ assert_nil @response.template.assigns["flash_copy"]["foo"]
112
+ assert_nil @response.template.assigns["flashy"]
113
+ end
114
+
115
+ def test_update_flash
116
+ get :set_flash
117
+ get :use_flash_and_update_it
118
+ assert_equal "hello", @response.template.assigns["flash_copy"]["that"]
119
+ assert_equal "hello again", @response.template.assigns["flash_copy"]["this"]
120
+ get :use_flash
121
+ assert_nil @response.template.assigns["flash_copy"]["that"], "On second flash"
122
+ assert_equal "hello again", @response.template.assigns["flash_copy"]["this"], "On second flash"
123
+ end
124
+
125
+ def test_flash_after_reset_session
126
+ get :use_flash_after_reset_session
127
+ assert_equal "hello", @response.template.assigns["flashy_that"]
128
+ assert_equal "good-bye", @response.template.assigns["flashy_this"]
129
+ assert_nil @response.template.assigns["flashy_that_reset"]
130
+ end
131
+
132
+ def test_sweep_after_halted_filter_chain
133
+ get :std_action
134
+ assert_nil @response.template.assigns["flash_copy"]["foo"]
135
+ get :filter_halting_action
136
+ assert_equal "bar", @response.template.assigns["flash_copy"]["foo"]
137
+ get :std_action # follow redirection
138
+ assert_equal "bar", @response.template.assigns["flash_copy"]["foo"]
139
+ get :std_action
140
+ assert_nil @response.template.assigns["flash_copy"]["foo"]
141
+ end
142
+
143
+ def test_does_not_set_the_session_if_the_flash_is_empty
144
+ get :std_action
145
+ assert_nil session["flash"]
146
+ end
147
+ end
@@ -0,0 +1,14 @@
1
+ require 'abstract_unit'
2
+
3
+ class HeaderTest < Test::Unit::TestCase
4
+ def setup
5
+ @headers = ActionController::Http::Headers.new("HTTP_CONTENT_TYPE"=>"text/plain")
6
+ end
7
+
8
+ def test_content_type_works
9
+ assert_equal "text/plain", @headers["Content-Type"]
10
+ assert_equal "text/plain", @headers["content-type"]
11
+ assert_equal "text/plain", @headers["CONTENT_TYPE"]
12
+ assert_equal "text/plain", @headers["HTTP_CONTENT_TYPE"]
13
+ end
14
+ end
@@ -0,0 +1,224 @@
1
+ require 'abstract_unit'
2
+
3
+ ActionController::Base.helpers_dir = File.dirname(__FILE__) + '/../fixtures/helpers'
4
+
5
+ class TestController < ActionController::Base
6
+ attr_accessor :delegate_attr
7
+ def delegate_method() end
8
+ def rescue_action(e) raise end
9
+ end
10
+
11
+ module Fun
12
+ class GamesController < ActionController::Base
13
+ def render_hello_world
14
+ render :inline => "hello: <%= stratego %>"
15
+ end
16
+
17
+ def rescue_action(e) raise end
18
+ end
19
+
20
+ class PdfController < ActionController::Base
21
+ def test
22
+ render :inline => "test: <%= foobar %>"
23
+ end
24
+
25
+ def rescue_action(e) raise end
26
+ end
27
+ end
28
+
29
+ class ApplicationController < ActionController::Base
30
+ helper :all
31
+ end
32
+
33
+ module LocalAbcHelper
34
+ def a() end
35
+ def b() end
36
+ def c() end
37
+ end
38
+
39
+ class HelperTest < Test::Unit::TestCase
40
+ def setup
41
+ # Increment symbol counter.
42
+ @symbol = (@@counter ||= 'A0').succ!.dup
43
+
44
+ # Generate new controller class.
45
+ controller_class_name = "Helper#{@symbol}Controller"
46
+ eval("class #{controller_class_name} < TestController; end")
47
+ @controller_class = self.class.const_get(controller_class_name)
48
+
49
+ # Set default test helper.
50
+ self.test_helper = LocalAbcHelper
51
+ end
52
+
53
+ def test_deprecated_helper
54
+ assert_equal expected_helper_methods, missing_methods
55
+ assert_nothing_raised { @controller_class.helper TestHelper }
56
+ assert_equal [], missing_methods
57
+ end
58
+
59
+ def test_declare_helper
60
+ require 'abc_helper'
61
+ self.test_helper = AbcHelper
62
+ assert_equal expected_helper_methods, missing_methods
63
+ assert_nothing_raised { @controller_class.helper :abc }
64
+ assert_equal [], missing_methods
65
+ end
66
+
67
+ def test_declare_missing_helper
68
+ assert_equal expected_helper_methods, missing_methods
69
+ assert_raise(MissingSourceFile) { @controller_class.helper :missing }
70
+ end
71
+
72
+ def test_declare_missing_file_from_helper
73
+ require 'broken_helper'
74
+ rescue LoadError => e
75
+ assert_nil(/\bbroken_helper\b/.match(e.to_s)[1])
76
+ end
77
+
78
+ def test_helper_block
79
+ assert_nothing_raised {
80
+ @controller_class.helper { def block_helper_method; end }
81
+ }
82
+ assert master_helper_methods.include?('block_helper_method')
83
+ end
84
+
85
+ def test_helper_block_include
86
+ assert_equal expected_helper_methods, missing_methods
87
+ assert_nothing_raised {
88
+ @controller_class.helper { include HelperTest::TestHelper }
89
+ }
90
+ assert [], missing_methods
91
+ end
92
+
93
+ def test_helper_method
94
+ assert_nothing_raised { @controller_class.helper_method :delegate_method }
95
+ assert master_helper_methods.include?('delegate_method')
96
+ end
97
+
98
+ def test_helper_attr
99
+ assert_nothing_raised { @controller_class.helper_attr :delegate_attr }
100
+ assert master_helper_methods.include?('delegate_attr')
101
+ assert master_helper_methods.include?('delegate_attr=')
102
+ end
103
+
104
+ def test_helper_for_nested_controller
105
+ request = ActionController::TestRequest.new
106
+ response = ActionController::TestResponse.new
107
+ request.action = 'render_hello_world'
108
+
109
+ assert_equal 'hello: Iz guuut!', Fun::GamesController.process(request, response).body
110
+ end
111
+
112
+ def test_helper_for_acronym_controller
113
+ request = ActionController::TestRequest.new
114
+ response = ActionController::TestResponse.new
115
+ request.action = 'test'
116
+
117
+ assert_equal 'test: baz', Fun::PdfController.process(request, response).body
118
+ end
119
+
120
+ def test_all_helpers
121
+ methods = ApplicationController.master_helper_module.instance_methods.map(&:to_s)
122
+
123
+ # abc_helper.rb
124
+ assert methods.include?('bare_a')
125
+
126
+ # fun/games_helper.rb
127
+ assert methods.include?('stratego')
128
+
129
+ # fun/pdf_helper.rb
130
+ assert methods.include?('foobar')
131
+ end
132
+
133
+ def test_all_helpers_with_alternate_helper_dir
134
+ @controller_class.helpers_dir = File.dirname(__FILE__) + '/../fixtures/alternate_helpers'
135
+
136
+ # Reload helpers
137
+ @controller_class.master_helper_module = Module.new
138
+ @controller_class.helper :all
139
+
140
+ # helpers/abc_helper.rb should not be included
141
+ assert !master_helper_methods.include?('bare_a')
142
+
143
+ # alternate_helpers/foo_helper.rb
144
+ assert master_helper_methods.include?('baz')
145
+ end
146
+
147
+ def test_helper_proxy
148
+ methods = ApplicationController.helpers.methods.map(&:to_s)
149
+
150
+ # ActionView
151
+ assert methods.include?('pluralize')
152
+
153
+ # abc_helper.rb
154
+ assert methods.include?('bare_a')
155
+
156
+ # fun/games_helper.rb
157
+ assert methods.include?('stratego')
158
+
159
+ # fun/pdf_helper.rb
160
+ assert methods.include?('foobar')
161
+ end
162
+
163
+ private
164
+ def expected_helper_methods
165
+ TestHelper.instance_methods.map(&:to_s)
166
+ end
167
+
168
+ def master_helper_methods
169
+ @controller_class.master_helper_module.instance_methods.map(&:to_s)
170
+ end
171
+
172
+ def missing_methods
173
+ expected_helper_methods - master_helper_methods
174
+ end
175
+
176
+ def test_helper=(helper_module)
177
+ silence_warnings { self.class.const_set('TestHelper', helper_module) }
178
+ end
179
+ end
180
+
181
+
182
+ class IsolatedHelpersTest < Test::Unit::TestCase
183
+ class A < ActionController::Base
184
+ def index
185
+ render :inline => '<%= shout %>'
186
+ end
187
+
188
+ def rescue_action(e) raise end
189
+ end
190
+
191
+ class B < A
192
+ helper { def shout; 'B' end }
193
+
194
+ def index
195
+ render :inline => '<%= shout %>'
196
+ end
197
+ end
198
+
199
+ class C < A
200
+ helper { def shout; 'C' end }
201
+
202
+ def index
203
+ render :inline => '<%= shout %>'
204
+ end
205
+ end
206
+
207
+ def setup
208
+ @request = ActionController::TestRequest.new
209
+ @response = ActionController::TestResponse.new
210
+ @request.action = 'index'
211
+ end
212
+
213
+ def test_helper_in_a
214
+ assert_raise(NameError) { A.process(@request, @response) }
215
+ end
216
+
217
+ def test_helper_in_b
218
+ assert_equal 'B', B.process(@request, @response).body
219
+ end
220
+
221
+ def test_helper_in_c
222
+ assert_equal 'C', C.process(@request, @response).body
223
+ end
224
+ end
@@ -0,0 +1,15 @@
1
+ require 'abstract_unit'
2
+
3
+ class CDATANodeTest < Test::Unit::TestCase
4
+ def setup
5
+ @node = HTML::CDATA.new(nil, 0, 0, "<p>howdy</p>")
6
+ end
7
+
8
+ def test_to_s
9
+ assert_equal "<![CDATA[<p>howdy</p>]]>", @node.to_s
10
+ end
11
+
12
+ def test_content
13
+ assert_equal "<p>howdy</p>", @node.content
14
+ end
15
+ end
@@ -0,0 +1,148 @@
1
+ require 'abstract_unit'
2
+
3
+ class DocumentTest < Test::Unit::TestCase
4
+ def test_handle_doctype
5
+ doc = nil
6
+ assert_nothing_raised do
7
+ doc = HTML::Document.new <<-HTML.strip
8
+ <!DOCTYPE "blah" "blah" "blah">
9
+ <html>
10
+ </html>
11
+ HTML
12
+ end
13
+ assert_equal 3, doc.root.children.length
14
+ assert_equal %{<!DOCTYPE "blah" "blah" "blah">}, doc.root.children[0].content
15
+ assert_match %r{\s+}m, doc.root.children[1].content
16
+ assert_equal "html", doc.root.children[2].name
17
+ end
18
+
19
+ def test_find_img
20
+ doc = HTML::Document.new <<-HTML.strip
21
+ <html>
22
+ <body>
23
+ <p><img src="hello.gif"></p>
24
+ </body>
25
+ </html>
26
+ HTML
27
+ assert doc.find(:tag=>"img", :attributes=>{"src"=>"hello.gif"})
28
+ end
29
+
30
+ def test_find_all
31
+ doc = HTML::Document.new <<-HTML.strip
32
+ <html>
33
+ <body>
34
+ <p class="test"><img src="hello.gif"></p>
35
+ <div class="foo">
36
+ <p class="test">something</p>
37
+ <p>here is <em class="test">more</em></p>
38
+ </div>
39
+ </body>
40
+ </html>
41
+ HTML
42
+ all = doc.find_all :attributes => { :class => "test" }
43
+ assert_equal 3, all.length
44
+ assert_equal [ "p", "p", "em" ], all.map { |n| n.name }
45
+ end
46
+
47
+ def test_find_with_text
48
+ doc = HTML::Document.new <<-HTML.strip
49
+ <html>
50
+ <body>
51
+ <p>Some text</p>
52
+ </body>
53
+ </html>
54
+ HTML
55
+ assert doc.find(:content => "Some text")
56
+ assert doc.find(:tag => "p", :child => { :content => "Some text" })
57
+ assert doc.find(:tag => "p", :child => "Some text")
58
+ assert doc.find(:tag => "p", :content => "Some text")
59
+ end
60
+
61
+ def test_parse_xml
62
+ assert_nothing_raised { HTML::Document.new("<tags><tag/></tags>", true, true) }
63
+ assert_nothing_raised { HTML::Document.new("<outer><link>something</link></outer>", true, true) }
64
+ end
65
+
66
+ def test_parse_document
67
+ doc = HTML::Document.new(<<-HTML)
68
+ <div>
69
+ <h2>blah</h2>
70
+ <table>
71
+ </table>
72
+ </div>
73
+ HTML
74
+ assert_not_nil doc.find(:tag => "div", :children => { :count => 1, :only => { :tag => "table" } })
75
+ end
76
+
77
+ def test_tag_nesting_nothing_to_s
78
+ doc = HTML::Document.new("<tag></tag>")
79
+ assert_equal "<tag></tag>", doc.root.to_s
80
+ end
81
+
82
+ def test_tag_nesting_space_to_s
83
+ doc = HTML::Document.new("<tag> </tag>")
84
+ assert_equal "<tag> </tag>", doc.root.to_s
85
+ end
86
+
87
+ def test_tag_nesting_text_to_s
88
+ doc = HTML::Document.new("<tag>text</tag>")
89
+ assert_equal "<tag>text</tag>", doc.root.to_s
90
+ end
91
+
92
+ def test_tag_nesting_tag_to_s
93
+ doc = HTML::Document.new("<tag><nested /></tag>")
94
+ assert_equal "<tag><nested /></tag>", doc.root.to_s
95
+ end
96
+
97
+ def test_parse_cdata
98
+ doc = HTML::Document.new(<<-HTML)
99
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
100
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
101
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
102
+ <head>
103
+ <title><![CDATA[<br>]]></title>
104
+ </head>
105
+ <body>
106
+ <p>this document has &lt;br&gt; for a title</p>
107
+ </body>
108
+ </html>
109
+ HTML
110
+
111
+ assert_nil doc.find(:tag => "title", :descendant => { :tag => "br" })
112
+ assert doc.find(:tag => "title", :child => "<br>")
113
+ end
114
+
115
+ def test_find_empty_tag
116
+ doc = HTML::Document.new("<div id='map'></div>")
117
+ assert_nil doc.find(:tag => "div", :attributes => { :id => "map" }, :content => /./)
118
+ assert doc.find(:tag => "div", :attributes => { :id => "map" }, :content => /\A\Z/)
119
+ assert doc.find(:tag => "div", :attributes => { :id => "map" }, :content => /^$/)
120
+ assert doc.find(:tag => "div", :attributes => { :id => "map" }, :content => "")
121
+ assert doc.find(:tag => "div", :attributes => { :id => "map" }, :content => nil)
122
+ end
123
+
124
+ def test_parse_invalid_document
125
+ assert_nothing_raised do
126
+ doc = HTML::Document.new("<html>
127
+ <table>
128
+ <tr>
129
+ <td style=\"color: #FFFFFF; height: 17px; onclick=\"window.location.href='http://www.rmeinc.com/about_rme.aspx'\" style=\"cursor:pointer; height: 17px;\"; nowrap onclick=\"window.location.href='http://www.rmeinc.com/about_rme.aspx'\" onmouseout=\"this.bgColor='#0066cc'; this.style.color='#FFFFFF'\" onmouseover=\"this.bgColor='#ffffff'; this.style.color='#0033cc'\">About Us</td>
130
+ </tr>
131
+ </table>
132
+ </html>")
133
+ end
134
+ end
135
+
136
+ def test_invalid_document_raises_exception_when_strict
137
+ assert_raise RuntimeError do
138
+ doc = HTML::Document.new("<html>
139
+ <table>
140
+ <tr>
141
+ <td style=\"color: #FFFFFF; height: 17px; onclick=\"window.location.href='http://www.rmeinc.com/about_rme.aspx'\" style=\"cursor:pointer; height: 17px;\"; nowrap onclick=\"window.location.href='http://www.rmeinc.com/about_rme.aspx'\" onmouseout=\"this.bgColor='#0066cc'; this.style.color='#FFFFFF'\" onmouseover=\"this.bgColor='#ffffff'; this.style.color='#0033cc'\">About Us</td>
142
+ </tr>
143
+ </table>
144
+ </html>", true)
145
+ end
146
+ end
147
+
148
+ end
@@ -0,0 +1,89 @@
1
+ require 'abstract_unit'
2
+
3
+ class NodeTest < Test::Unit::TestCase
4
+
5
+ class MockNode
6
+ def initialize(matched, value)
7
+ @matched = matched
8
+ @value = value
9
+ end
10
+
11
+ def find(conditions)
12
+ @matched && self
13
+ end
14
+
15
+ def to_s
16
+ @value.to_s
17
+ end
18
+ end
19
+
20
+ def setup
21
+ @node = HTML::Node.new("parent")
22
+ @node.children.concat [MockNode.new(false,1), MockNode.new(true,"two"), MockNode.new(false,:three)]
23
+ end
24
+
25
+ def test_match
26
+ assert !@node.match("foo")
27
+ end
28
+
29
+ def test_tag
30
+ assert !@node.tag?
31
+ end
32
+
33
+ def test_to_s
34
+ assert_equal "1twothree", @node.to_s
35
+ end
36
+
37
+ def test_find
38
+ assert_equal "two", @node.find('blah').to_s
39
+ end
40
+
41
+ def test_parse_strict
42
+ s = "<b foo='hello'' bar='baz'>"
43
+ assert_raise(RuntimeError) { HTML::Node.parse(nil,0,0,s) }
44
+ end
45
+
46
+ def test_parse_relaxed
47
+ s = "<b foo='hello'' bar='baz'>"
48
+ node = nil
49
+ assert_nothing_raised { node = HTML::Node.parse(nil,0,0,s,false) }
50
+ assert node.attributes.has_key?("foo")
51
+ assert !node.attributes.has_key?("bar")
52
+ end
53
+
54
+ def test_to_s_with_boolean_attrs
55
+ s = "<b foo bar>"
56
+ node = HTML::Node.parse(nil,0,0,s)
57
+ assert node.attributes.has_key?("foo")
58
+ assert node.attributes.has_key?("bar")
59
+ assert "<b foo bar>", node.to_s
60
+ end
61
+
62
+ def test_parse_with_unclosed_tag
63
+ s = "<span onmouseover='bang'"
64
+ node = nil
65
+ assert_nothing_raised { node = HTML::Node.parse(nil,0,0,s,false) }
66
+ assert node.attributes.has_key?("onmouseover")
67
+ end
68
+
69
+ def test_parse_with_valid_cdata_section
70
+ s = "<![CDATA[<span>contents</span>]]>"
71
+ node = nil
72
+ assert_nothing_raised { node = HTML::Node.parse(nil,0,0,s,false) }
73
+ assert_kind_of HTML::CDATA, node
74
+ assert_equal '<span>contents</span>', node.content
75
+ end
76
+
77
+ def test_parse_strict_with_unterminated_cdata_section
78
+ s = "<![CDATA[neverending..."
79
+ assert_raise(RuntimeError) { HTML::Node.parse(nil,0,0,s) }
80
+ end
81
+
82
+ def test_parse_relaxed_with_unterminated_cdata_section
83
+ s = "<![CDATA[neverending..."
84
+ node = nil
85
+ assert_nothing_raised { node = HTML::Node.parse(nil,0,0,s,false) }
86
+ assert_kind_of HTML::CDATA, node
87
+ assert_equal 'neverending...', node.content
88
+ end
89
+ end