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,700 @@
1
+ require 'abstract_unit'
2
+ require 'controller/fake_controllers'
3
+
4
+ class TestTest < ActionController::TestCase
5
+ class TestController < ActionController::Base
6
+ def no_op
7
+ render :text => 'dummy'
8
+ end
9
+
10
+ def set_flash
11
+ flash["test"] = ">#{flash["test"]}<"
12
+ render :text => 'ignore me'
13
+ end
14
+
15
+ def set_flash_now
16
+ flash.now["test_now"] = ">#{flash["test_now"]}<"
17
+ render :text => 'ignore me'
18
+ end
19
+
20
+ def set_session
21
+ session['string'] = 'A wonder'
22
+ session[:symbol] = 'it works'
23
+ render :text => 'Success'
24
+ end
25
+
26
+ def reset_the_session
27
+ reset_session
28
+ render :text => 'ignore me'
29
+ end
30
+
31
+ def render_raw_post
32
+ raise ActiveSupport::TestCase::Assertion, "#raw_post is blank" if request.raw_post.blank?
33
+ render :text => request.raw_post
34
+ end
35
+
36
+ def render_body
37
+ render :text => request.body.read
38
+ end
39
+
40
+ def test_params
41
+ render :text => params.inspect
42
+ end
43
+
44
+ def test_uri
45
+ render :text => request.request_uri
46
+ end
47
+
48
+ def test_query_string
49
+ render :text => request.query_string
50
+ end
51
+
52
+ def test_html_output
53
+ render :text => <<HTML
54
+ <html>
55
+ <body>
56
+ <a href="/"><img src="/images/button.png" /></a>
57
+ <div id="foo">
58
+ <ul>
59
+ <li class="item">hello</li>
60
+ <li class="item">goodbye</li>
61
+ </ul>
62
+ </div>
63
+ <div id="bar">
64
+ <form action="/somewhere">
65
+ Name: <input type="text" name="person[name]" id="person_name" />
66
+ </form>
67
+ </div>
68
+ </body>
69
+ </html>
70
+ HTML
71
+ end
72
+
73
+ def test_xml_output
74
+ response.content_type = "application/xml"
75
+ render :text => <<XML
76
+ <?xml version="1.0" encoding="UTF-8"?>
77
+ <root>
78
+ <area>area is an empty tag in HTML, raising an error if not in xml mode</area>
79
+ </root>
80
+ XML
81
+ end
82
+
83
+ def test_only_one_param
84
+ render :text => (params[:left] && params[:right]) ? "EEP, Both here!" : "OK"
85
+ end
86
+
87
+ def test_remote_addr
88
+ render :text => (request.remote_addr || "not specified")
89
+ end
90
+
91
+ def test_file_upload
92
+ render :text => params[:file].size
93
+ end
94
+
95
+ def test_send_file
96
+ send_file(File.expand_path(__FILE__))
97
+ end
98
+
99
+ def redirect_to_same_controller
100
+ redirect_to :controller => 'test', :action => 'test_uri', :id => 5
101
+ end
102
+
103
+ def redirect_to_different_controller
104
+ redirect_to :controller => 'fail', :id => 5
105
+ end
106
+
107
+ def create
108
+ head :created, :location => 'created resource'
109
+ end
110
+
111
+ private
112
+ def rescue_action(e)
113
+ raise e
114
+ end
115
+
116
+ def generate_url(opts)
117
+ url_for(opts.merge(:action => "test_uri"))
118
+ end
119
+ end
120
+
121
+ def setup
122
+ @controller = TestController.new
123
+ @request = ActionController::TestRequest.new
124
+ @response = ActionController::TestResponse.new
125
+ ActionController::Routing.use_controllers! %w(content admin/user test_test/test)
126
+ ActionController::Routing::Routes.load_routes!
127
+ end
128
+
129
+ def teardown
130
+ ActionController::Routing::Routes.reload
131
+ end
132
+
133
+ def test_raw_post_handling
134
+ params = {:page => {:name => 'page name'}, 'some key' => 123}
135
+ post :render_raw_post, params.dup
136
+
137
+ assert_equal params.to_query, @response.body
138
+ end
139
+
140
+ def test_body_stream
141
+ params = { :page => { :name => 'page name' }, 'some key' => 123 }
142
+
143
+ post :render_body, params.dup
144
+
145
+ assert_equal params.to_query, @response.body
146
+ end
147
+
148
+ def test_process_without_flash
149
+ process :set_flash
150
+ assert_equal '><', flash['test']
151
+ end
152
+
153
+ def test_process_with_flash
154
+ process :set_flash, nil, nil, { "test" => "value" }
155
+ assert_equal '>value<', flash['test']
156
+ end
157
+
158
+ def test_process_with_flash_now
159
+ process :set_flash_now, nil, nil, { "test_now" => "value_now" }
160
+ assert_equal '>value_now<', flash['test_now']
161
+ end
162
+
163
+ def test_process_with_session
164
+ process :set_session
165
+ assert_equal 'A wonder', session['string'], "A value stored in the session should be available by string key"
166
+ assert_equal 'A wonder', session[:string], "Test session hash should allow indifferent access"
167
+ assert_equal 'it works', session['symbol'], "Test session hash should allow indifferent access"
168
+ assert_equal 'it works', session[:symbol], "Test session hash should allow indifferent access"
169
+ end
170
+
171
+ def test_process_with_session_arg
172
+ process :no_op, nil, { 'string' => 'value1', :symbol => 'value2' }
173
+ assert_equal 'value1', session['string']
174
+ assert_equal 'value1', session[:string]
175
+ assert_equal 'value2', session['symbol']
176
+ assert_equal 'value2', session[:symbol]
177
+ end
178
+
179
+ def test_session_is_cleared_from_controller_after_reset_session
180
+ process :set_session
181
+ process :reset_the_session
182
+ assert_equal Hash.new, @controller.session.to_hash
183
+ end
184
+
185
+ def test_session_is_cleared_from_response_after_reset_session
186
+ process :set_session
187
+ process :reset_the_session
188
+ assert_equal Hash.new, @response.session.to_hash
189
+ end
190
+
191
+ def test_session_is_cleared_from_request_after_reset_session
192
+ process :set_session
193
+ process :reset_the_session
194
+ assert_equal Hash.new, @request.session.to_hash
195
+ end
196
+
197
+ def test_process_with_request_uri_with_no_params
198
+ process :test_uri
199
+ assert_equal "/test_test/test/test_uri", @response.body
200
+ end
201
+
202
+ def test_process_with_request_uri_with_params
203
+ process :test_uri, :id => 7
204
+ assert_equal "/test_test/test/test_uri/7", @response.body
205
+ end
206
+
207
+ def test_process_with_request_uri_with_params_with_explicit_uri
208
+ @request.set_REQUEST_URI "/explicit/uri"
209
+ process :test_uri, :id => 7
210
+ assert_equal "/explicit/uri", @response.body
211
+ end
212
+
213
+ def test_process_with_query_string
214
+ process :test_query_string, :q => 'test'
215
+ assert_equal "q=test", @response.body
216
+ end
217
+
218
+ def test_process_with_query_string_with_explicit_uri
219
+ @request.set_REQUEST_URI "/explicit/uri?q=test?extra=question"
220
+ process :test_query_string
221
+ assert_equal "q=test?extra=question", @response.body
222
+ end
223
+
224
+ def test_multiple_calls
225
+ process :test_only_one_param, :left => true
226
+ assert_equal "OK", @response.body
227
+ process :test_only_one_param, :right => true
228
+ assert_equal "OK", @response.body
229
+ end
230
+
231
+ def test_assert_tag_tag
232
+ process :test_html_output
233
+
234
+ # there is a 'form' tag
235
+ assert_tag :tag => 'form'
236
+ # there is not an 'hr' tag
237
+ assert_no_tag :tag => 'hr'
238
+ end
239
+
240
+ def test_assert_tag_attributes
241
+ process :test_html_output
242
+
243
+ # there is a tag with an 'id' of 'bar'
244
+ assert_tag :attributes => { :id => "bar" }
245
+ # there is no tag with a 'name' of 'baz'
246
+ assert_no_tag :attributes => { :name => "baz" }
247
+ end
248
+
249
+ def test_assert_tag_parent
250
+ process :test_html_output
251
+
252
+ # there is a tag with a parent 'form' tag
253
+ assert_tag :parent => { :tag => "form" }
254
+ # there is no tag with a parent of 'input'
255
+ assert_no_tag :parent => { :tag => "input" }
256
+ end
257
+
258
+ def test_assert_tag_child
259
+ process :test_html_output
260
+
261
+ # there is a tag with a child 'input' tag
262
+ assert_tag :child => { :tag => "input" }
263
+ # there is no tag with a child 'strong' tag
264
+ assert_no_tag :child => { :tag => "strong" }
265
+ end
266
+
267
+ def test_assert_tag_ancestor
268
+ process :test_html_output
269
+
270
+ # there is a 'li' tag with an ancestor having an id of 'foo'
271
+ assert_tag :ancestor => { :attributes => { :id => "foo" } }, :tag => "li"
272
+ # there is no tag of any kind with an ancestor having an href matching 'foo'
273
+ assert_no_tag :ancestor => { :attributes => { :href => /foo/ } }
274
+ end
275
+
276
+ def test_assert_tag_descendant
277
+ process :test_html_output
278
+
279
+ # there is a tag with a descendant 'li' tag
280
+ assert_tag :descendant => { :tag => "li" }
281
+ # there is no tag with a descendant 'html' tag
282
+ assert_no_tag :descendant => { :tag => "html" }
283
+ end
284
+
285
+ def test_assert_tag_sibling
286
+ process :test_html_output
287
+
288
+ # there is a tag with a sibling of class 'item'
289
+ assert_tag :sibling => { :attributes => { :class => "item" } }
290
+ # there is no tag with a sibling 'ul' tag
291
+ assert_no_tag :sibling => { :tag => "ul" }
292
+ end
293
+
294
+ def test_assert_tag_after
295
+ process :test_html_output
296
+
297
+ # there is a tag following a sibling 'div' tag
298
+ assert_tag :after => { :tag => "div" }
299
+ # there is no tag following a sibling tag with id 'bar'
300
+ assert_no_tag :after => { :attributes => { :id => "bar" } }
301
+ end
302
+
303
+ def test_assert_tag_before
304
+ process :test_html_output
305
+
306
+ # there is a tag preceding a tag with id 'bar'
307
+ assert_tag :before => { :attributes => { :id => "bar" } }
308
+ # there is no tag preceding a 'form' tag
309
+ assert_no_tag :before => { :tag => "form" }
310
+ end
311
+
312
+ def test_assert_tag_children_count
313
+ process :test_html_output
314
+
315
+ # there is a tag with 2 children
316
+ assert_tag :children => { :count => 2 }
317
+ # in particular, there is a <ul> tag with two children (a nameless pair of <li>s)
318
+ assert_tag :tag => 'ul', :children => { :count => 2 }
319
+ # there is no tag with 4 children
320
+ assert_no_tag :children => { :count => 4 }
321
+ end
322
+
323
+ def test_assert_tag_children_less_than
324
+ process :test_html_output
325
+
326
+ # there is a tag with less than 5 children
327
+ assert_tag :children => { :less_than => 5 }
328
+ # there is no 'ul' tag with less than 2 children
329
+ assert_no_tag :children => { :less_than => 2 }, :tag => "ul"
330
+ end
331
+
332
+ def test_assert_tag_children_greater_than
333
+ process :test_html_output
334
+
335
+ # there is a 'body' tag with more than 1 children
336
+ assert_tag :children => { :greater_than => 1 }, :tag => "body"
337
+ # there is no tag with more than 10 children
338
+ assert_no_tag :children => { :greater_than => 10 }
339
+ end
340
+
341
+ def test_assert_tag_children_only
342
+ process :test_html_output
343
+
344
+ # there is a tag containing only one child with an id of 'foo'
345
+ assert_tag :children => { :count => 1,
346
+ :only => { :attributes => { :id => "foo" } } }
347
+ # there is no tag containing only one 'li' child
348
+ assert_no_tag :children => { :count => 1, :only => { :tag => "li" } }
349
+ end
350
+
351
+ def test_assert_tag_content
352
+ process :test_html_output
353
+
354
+ # the output contains the string "Name"
355
+ assert_tag :content => /Name/
356
+ # the output does not contain the string "test"
357
+ assert_no_tag :content => /test/
358
+ end
359
+
360
+ def test_assert_tag_multiple
361
+ process :test_html_output
362
+
363
+ # there is a 'div', id='bar', with an immediate child whose 'action'
364
+ # attribute matches the regexp /somewhere/.
365
+ assert_tag :tag => "div", :attributes => { :id => "bar" },
366
+ :child => { :attributes => { :action => /somewhere/ } }
367
+
368
+ # there is no 'div', id='foo', with a 'ul' child with more than
369
+ # 2 "li" children.
370
+ assert_no_tag :tag => "div", :attributes => { :id => "foo" },
371
+ :child => {
372
+ :tag => "ul",
373
+ :children => { :greater_than => 2,
374
+ :only => { :tag => "li" } } }
375
+ end
376
+
377
+ def test_assert_tag_children_without_content
378
+ process :test_html_output
379
+
380
+ # there is a form tag with an 'input' child which is a self closing tag
381
+ assert_tag :tag => "form",
382
+ :children => { :count => 1,
383
+ :only => { :tag => "input" } }
384
+
385
+ # the body tag has an 'a' child which in turn has an 'img' child
386
+ assert_tag :tag => "body",
387
+ :children => { :count => 1,
388
+ :only => { :tag => "a",
389
+ :children => { :count => 1,
390
+ :only => { :tag => "img" } } } }
391
+ end
392
+
393
+ def test_should_not_impose_childless_html_tags_in_xml
394
+ process :test_xml_output
395
+
396
+ begin
397
+ $stderr = StringIO.new
398
+ assert_select 'area' #This will cause a warning if content is processed as HTML
399
+ $stderr.rewind && err = $stderr.read
400
+ ensure
401
+ $stderr = STDERR
402
+ end
403
+
404
+ assert err.empty?
405
+ end
406
+
407
+ def test_assert_tag_attribute_matching
408
+ @response.body = '<input type="text" name="my_name">'
409
+ assert_tag :tag => 'input',
410
+ :attributes => { :name => /my/, :type => 'text' }
411
+ assert_no_tag :tag => 'input',
412
+ :attributes => { :name => 'my', :type => 'text' }
413
+ assert_no_tag :tag => 'input',
414
+ :attributes => { :name => /^my$/, :type => 'text' }
415
+ end
416
+
417
+ def test_assert_tag_content_matching
418
+ @response.body = "<p>hello world</p>"
419
+ assert_tag :tag => "p", :content => "hello world"
420
+ assert_tag :tag => "p", :content => /hello/
421
+ assert_no_tag :tag => "p", :content => "hello"
422
+ end
423
+
424
+ def test_assert_generates
425
+ assert_generates 'controller/action/5', :controller => 'controller', :action => 'action', :id => '5'
426
+ assert_generates 'controller/action/7', {:id => "7"}, {:controller => "controller", :action => "action"}
427
+ assert_generates 'controller/action/5', {:controller => "controller", :action => "action", :id => "5", :name => "bob"}, {}, {:name => "bob"}
428
+ assert_generates 'controller/action/7', {:id => "7", :name => "bob"}, {:controller => "controller", :action => "action"}, {:name => "bob"}
429
+ assert_generates 'controller/action/7', {:id => "7"}, {:controller => "controller", :action => "action", :name => "bob"}, {}
430
+ end
431
+
432
+ def test_assert_routing
433
+ assert_routing 'content', :controller => 'content', :action => 'index'
434
+ end
435
+
436
+ def test_assert_routing_with_method
437
+ with_routing do |set|
438
+ set.draw { |map| map.resources(:content) }
439
+ assert_routing({ :method => 'post', :path => 'content' }, { :controller => 'content', :action => 'create' })
440
+ end
441
+ end
442
+
443
+ def test_assert_routing_in_module
444
+ assert_routing 'admin/user', :controller => 'admin/user', :action => 'index'
445
+ end
446
+
447
+ def test_params_passing
448
+ get :test_params, :page => {:name => "Page name", :month => '4', :year => '2004', :day => '6'}
449
+ parsed_params = eval(@response.body)
450
+ assert_equal(
451
+ {'controller' => 'test_test/test', 'action' => 'test_params',
452
+ 'page' => {'name' => "Page name", 'month' => '4', 'year' => '2004', 'day' => '6'}},
453
+ parsed_params
454
+ )
455
+ end
456
+
457
+ def test_id_converted_to_string
458
+ get :test_params, :id => 20, :foo => Object.new
459
+ assert_kind_of String, @request.path_parameters['id']
460
+ end
461
+
462
+ def test_array_path_parameter_handled_properly
463
+ with_routing do |set|
464
+ set.draw do |map|
465
+ map.connect 'file/*path', :controller => 'test_test/test', :action => 'test_params'
466
+ map.connect ':controller/:action/:id'
467
+ end
468
+
469
+ get :test_params, :path => ['hello', 'world']
470
+ assert_equal ['hello', 'world'], @request.path_parameters['path']
471
+ assert_equal 'hello/world', @request.path_parameters['path'].to_s
472
+ end
473
+ end
474
+
475
+ def test_assert_realistic_path_parameters
476
+ get :test_params, :id => 20, :foo => Object.new
477
+
478
+ # All elements of path_parameters should use string keys
479
+ @request.path_parameters.keys.each do |key|
480
+ assert_kind_of String, key
481
+ end
482
+ end
483
+
484
+ def test_with_routing_places_routes_back
485
+ assert ActionController::Routing::Routes
486
+ routes_id = ActionController::Routing::Routes.object_id
487
+
488
+ begin
489
+ with_routing { raise 'fail' }
490
+ fail 'Should not be here.'
491
+ rescue RuntimeError
492
+ end
493
+
494
+ assert ActionController::Routing::Routes
495
+ assert_equal routes_id, ActionController::Routing::Routes.object_id
496
+ end
497
+
498
+ def test_remote_addr
499
+ get :test_remote_addr
500
+ assert_equal "0.0.0.0", @response.body
501
+
502
+ @request.remote_addr = "192.0.0.1"
503
+ get :test_remote_addr
504
+ assert_equal "192.0.0.1", @response.body
505
+ end
506
+
507
+ def test_header_properly_reset_after_remote_http_request
508
+ xhr :get, :test_params
509
+ assert_nil @request.env['HTTP_X_REQUESTED_WITH']
510
+ end
511
+
512
+ def test_header_properly_reset_after_get_request
513
+ get :test_params
514
+ @request.recycle!
515
+ assert_nil @request.instance_variable_get("@request_method")
516
+ end
517
+
518
+ def test_params_reset_after_post_request
519
+ post :no_op, :foo => "bar"
520
+ assert_equal "bar", @request.params[:foo]
521
+ @request.recycle!
522
+ post :no_op
523
+ assert @request.params[:foo].blank?
524
+ end
525
+
526
+ %w(controller response request).each do |variable|
527
+ %w(get post put delete head process).each do |method|
528
+ define_method("test_#{variable}_missing_for_#{method}_raises_error") do
529
+ remove_instance_variable "@#{variable}"
530
+ begin
531
+ send(method, :test_remote_addr)
532
+ assert false, "expected RuntimeError, got nothing"
533
+ rescue RuntimeError => error
534
+ assert true
535
+ assert_match %r{@#{variable} is nil}, error.message
536
+ rescue => error
537
+ assert false, "expected RuntimeError, got #{error.class}"
538
+ end
539
+ end
540
+ end
541
+ end
542
+
543
+ FILES_DIR = File.dirname(__FILE__) + '/../fixtures/multipart'
544
+
545
+ if RUBY_VERSION < '1.9'
546
+ READ_BINARY = 'rb'
547
+ READ_PLAIN = 'r'
548
+ else
549
+ READ_BINARY = 'rb:binary'
550
+ READ_PLAIN = 'r:binary'
551
+ end
552
+
553
+ def test_test_uploaded_file
554
+ filename = 'mona_lisa.jpg'
555
+ path = "#{FILES_DIR}/#{filename}"
556
+ content_type = 'image/png'
557
+ expected = File.read(path)
558
+ expected.force_encoding(Encoding::BINARY) if expected.respond_to?(:force_encoding)
559
+
560
+ file = ActionController::TestUploadedFile.new(path, content_type)
561
+ assert_equal filename, file.original_filename
562
+ assert_equal content_type, file.content_type
563
+ assert_equal file.path, file.local_path
564
+ assert_equal expected, file.read
565
+
566
+ new_content_type = "new content_type"
567
+ file.content_type = new_content_type
568
+ assert_equal new_content_type, file.content_type
569
+
570
+ end
571
+
572
+ def test_test_uploaded_file_with_binary
573
+ filename = 'mona_lisa.jpg'
574
+ path = "#{FILES_DIR}/#{filename}"
575
+ content_type = 'image/png'
576
+
577
+ binary_uploaded_file = ActionController::TestUploadedFile.new(path, content_type, :binary)
578
+ assert_equal File.open(path, READ_BINARY).read, binary_uploaded_file.read
579
+
580
+ plain_uploaded_file = ActionController::TestUploadedFile.new(path, content_type)
581
+ assert_equal File.open(path, READ_PLAIN).read, plain_uploaded_file.read
582
+ end
583
+
584
+ def test_fixture_file_upload_with_binary
585
+ filename = 'mona_lisa.jpg'
586
+ path = "#{FILES_DIR}/#{filename}"
587
+ content_type = 'image/jpg'
588
+
589
+ binary_file_upload = fixture_file_upload(path, content_type, :binary)
590
+ assert_equal File.open(path, READ_BINARY).read, binary_file_upload.read
591
+
592
+ plain_file_upload = fixture_file_upload(path, content_type)
593
+ assert_equal File.open(path, READ_PLAIN).read, plain_file_upload.read
594
+ end
595
+
596
+ def test_fixture_file_upload
597
+ post :test_file_upload, :file => fixture_file_upload(FILES_DIR + "/mona_lisa.jpg", "image/jpg")
598
+ assert_equal '159528', @response.body
599
+ end
600
+
601
+ def test_test_uploaded_file_exception_when_file_doesnt_exist
602
+ assert_raise(RuntimeError) { ActionController::TestUploadedFile.new('non_existent_file') }
603
+ end
604
+
605
+ def test_redirect_url_only_cares_about_location_header
606
+ get :create
607
+ assert_response :created
608
+
609
+ # Redirect url doesn't care that it wasn't a :redirect response.
610
+ assert_equal 'created resource', @response.redirect_url
611
+ assert_equal @response.redirect_url, redirect_to_url
612
+
613
+ # Must be a :redirect response.
614
+ assert_raise(ActiveSupport::TestCase::Assertion) do
615
+ assert_redirected_to 'created resource'
616
+ end
617
+ end
618
+
619
+ def test_binary_content_works_with_send_file
620
+ get :test_send_file
621
+ assert_nothing_raised(NoMethodError) { @response.binary_content }
622
+ end
623
+
624
+ protected
625
+ def with_foo_routing
626
+ with_routing do |set|
627
+ set.draw do |map|
628
+ map.generate_url 'foo', :controller => 'test'
629
+ map.connect ':controller/:action/:id'
630
+ end
631
+ yield set
632
+ end
633
+ end
634
+ end
635
+
636
+ class CleanBacktraceTest < ActionController::TestCase
637
+ def test_should_reraise_the_same_object
638
+ exception = ActiveSupport::TestCase::Assertion.new('message')
639
+ clean_backtrace { raise exception }
640
+ rescue Exception => caught
641
+ assert_equal exception.object_id, caught.object_id
642
+ assert_equal exception.message, caught.message
643
+ end
644
+
645
+ def test_should_clean_assertion_lines_from_backtrace
646
+ path = File.expand_path("#{File.dirname(__FILE__)}/../../lib/action_controller")
647
+ exception = ActiveSupport::TestCase::Assertion.new('message')
648
+ exception.set_backtrace ["#{path}/abc", "#{path}/assertions/def"]
649
+ clean_backtrace { raise exception }
650
+ rescue Exception => caught
651
+ assert_equal ["#{path}/abc"], caught.backtrace
652
+ end
653
+
654
+ def test_should_only_clean_assertion_failure_errors
655
+ clean_backtrace do
656
+ raise "can't touch this", [File.expand_path("#{File.dirname(__FILE__)}/../../lib/action_controller/assertions/abc")]
657
+ end
658
+ rescue => caught
659
+ assert !caught.backtrace.empty?
660
+ end
661
+ end
662
+
663
+ class InferringClassNameTest < ActionController::TestCase
664
+ def test_determine_controller_class
665
+ assert_equal ContentController, determine_class("ContentControllerTest")
666
+ end
667
+
668
+ def test_determine_controller_class_with_nonsense_name
669
+ assert_nil determine_class("HelloGoodBye")
670
+ end
671
+
672
+ def test_determine_controller_class_with_sensible_name_where_no_controller_exists
673
+ assert_nil determine_class("NoControllerWithThisNameTest")
674
+ end
675
+
676
+ private
677
+ def determine_class(name)
678
+ ActionController::TestCase.determine_default_controller_class(name)
679
+ end
680
+ end
681
+
682
+ class CrazyNameTest < ActionController::TestCase
683
+ tests ContentController
684
+
685
+ def test_controller_class_can_be_set_manually_not_just_inferred
686
+ assert_equal ContentController, self.class.controller_class
687
+ end
688
+ end
689
+
690
+ class NamedRoutesControllerTest < ActionController::TestCase
691
+ tests ContentController
692
+
693
+ def test_should_be_able_to_use_named_routes_before_a_request_is_done
694
+ with_routing do |set|
695
+ set.draw { |map| map.resources :contents }
696
+ assert_equal 'http://test.host/contents/new', new_content_url
697
+ assert_equal 'http://test.host/contents/1', content_url(:id => 1)
698
+ end
699
+ end
700
+ end