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,93 @@
1
+ require 'abstract_unit'
2
+
3
+ class MimeTypeTest < Test::Unit::TestCase
4
+ Mime::Type.register "image/png", :png
5
+ Mime::Type.register "application/pdf", :pdf
6
+
7
+ def test_parse_single
8
+ Mime::LOOKUP.keys.each do |mime_type|
9
+ assert_equal [Mime::Type.lookup(mime_type)], Mime::Type.parse(mime_type)
10
+ end
11
+ end
12
+
13
+ def test_parse_without_q
14
+ accept = "text/xml,application/xhtml+xml,text/yaml,application/xml,text/html,image/png,text/plain,application/pdf,*/*"
15
+ expect = [Mime::HTML, Mime::XML, Mime::YAML, Mime::PNG, Mime::TEXT, Mime::PDF, Mime::ALL]
16
+ assert_equal expect, Mime::Type.parse(accept)
17
+ end
18
+
19
+ def test_parse_with_q
20
+ accept = "text/xml,application/xhtml+xml,text/yaml; q=0.3,application/xml,text/html; q=0.8,image/png,text/plain; q=0.5,application/pdf,*/*; q=0.2"
21
+ expect = [Mime::HTML, Mime::XML, Mime::PNG, Mime::PDF, Mime::TEXT, Mime::YAML, Mime::ALL]
22
+ assert_equal expect, Mime::Type.parse(accept)
23
+ end
24
+
25
+ # Accept header send with user HTTP_USER_AGENT: Sunrise/0.42j (Windows XP)
26
+ def test_parse_crappy_broken_acceptlines
27
+ accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/*,,*/*;q=0.5"
28
+ expect = [Mime::HTML, Mime::XML, "image/*", Mime::TEXT, Mime::ALL]
29
+ assert_equal expect, Mime::Type.parse(accept).collect { |c| c.to_s }
30
+ end
31
+
32
+ # Accept header send with user HTTP_USER_AGENT: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1)
33
+ def test_parse_crappy_broken_acceptlines2
34
+ accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, , pronto/1.00.00, sslvpn/1.00.00.00, */*"
35
+ expect = ['image/gif', 'image/x-xbitmap', 'image/jpeg','image/pjpeg', 'application/x-shockwave-flash', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/msword', 'pronto/1.00.00', 'sslvpn/1.00.00.00', Mime::ALL ]
36
+ assert_equal expect, Mime::Type.parse(accept).collect { |c| c.to_s }
37
+ end
38
+
39
+ def test_custom_type
40
+ Mime::Type.register("image/gif", :gif)
41
+ assert_nothing_raised do
42
+ Mime::GIF
43
+ assert_equal Mime::GIF, Mime::SET.last
44
+ end
45
+ ensure
46
+ Mime.module_eval { remove_const :GIF if const_defined?(:GIF) }
47
+ end
48
+
49
+ def test_type_should_be_equal_to_symbol
50
+ assert_equal Mime::HTML, 'application/xhtml+xml'
51
+ assert_equal Mime::HTML, :html
52
+ end
53
+
54
+ def test_type_convenience_methods
55
+ # Don't test Mime::ALL, since it Mime::ALL#html? == true
56
+ types = Mime::SET.to_a.map(&:to_sym).uniq - [:all]
57
+
58
+ # Remove custom Mime::Type instances set in other tests, like Mime::GIF and Mime::IPHONE
59
+ types.delete_if { |type| !Mime.const_defined?(type.to_s.upcase) }
60
+
61
+ types.each do |type|
62
+ mime = Mime.const_get(type.to_s.upcase)
63
+ assert mime.send("#{type}?"), "#{mime.inspect} is not #{type}?"
64
+ invalid_types = types - [type]
65
+ invalid_types.delete(:html) if Mime::Type.html_types.include?(type)
66
+ invalid_types.each { |other_type| assert !mime.send("#{other_type}?"), "#{mime.inspect} is #{other_type}?" }
67
+ end
68
+ end
69
+
70
+ def test_mime_all_is_html
71
+ assert Mime::ALL.all?, "Mime::ALL is not all?"
72
+ assert Mime::ALL.html?, "Mime::ALL is not html?"
73
+ end
74
+
75
+ def test_verifiable_mime_types
76
+ all_types = Mime::SET.to_a.map(&:to_sym)
77
+ all_types.uniq!
78
+ # Remove custom Mime::Type instances set in other tests, like Mime::GIF and Mime::IPHONE
79
+ all_types.delete_if { |type| !Mime.const_defined?(type.to_s.upcase) }
80
+ verified, unverified = all_types.partition { |type| Mime::Type.browser_generated_types.include? type }
81
+ assert verified.each { |type| assert Mime.const_get(type.to_s.upcase).verify_request?, "Verifiable Mime Type is not verified: #{type.inspect}" }
82
+ assert unverified.each { |type| assert !Mime.const_get(type.to_s.upcase).verify_request?, "Nonverifiable Mime Type is verified: #{type.inspect}" }
83
+ end
84
+
85
+ def test_regexp_matcher
86
+ assert Mime::JS =~ "text/javascript"
87
+ assert Mime::JS =~ "application/javascript"
88
+ assert Mime::JS !~ "text/html"
89
+ assert !(Mime::JS !~ "text/javascript")
90
+ assert !(Mime::JS !~ "application/javascript")
91
+ assert Mime::HTML =~ 'application/xhtml+xml'
92
+ end
93
+ end
@@ -0,0 +1,297 @@
1
+ require 'abstract_unit'
2
+
3
+ class Article
4
+ attr_reader :id
5
+ def save; @id = 1 end
6
+ def new_record?; @id.nil? end
7
+ def name
8
+ model = self.class.name.downcase
9
+ @id.nil? ? "new #{model}" : "#{model} ##{@id}"
10
+ end
11
+ end
12
+
13
+ class Response < Article
14
+ def post_id; 1 end
15
+ end
16
+
17
+ class Tag < Article
18
+ def response_id; 1 end
19
+ end
20
+
21
+ class Tax
22
+ attr_reader :id
23
+ def save; @id = 1 end
24
+ def new_record?; @id.nil? end
25
+ def name
26
+ model = self.class.name.downcase
27
+ @id.nil? ? "new #{model}" : "#{model} ##{@id}"
28
+ end
29
+ end
30
+
31
+ class Fax < Tax
32
+ def store_id; 1 end
33
+ end
34
+
35
+ # TODO: test nested models
36
+ class Response::Nested < Response; end
37
+
38
+ class PolymorphicRoutesTest < ActiveSupport::TestCase
39
+ include ActionController::PolymorphicRoutes
40
+
41
+ def setup
42
+ @article = Article.new
43
+ @response = Response.new
44
+ @tax = Tax.new
45
+ @fax = Fax.new
46
+ end
47
+
48
+ def test_with_record
49
+ @article.save
50
+ expects(:article_url).with(@article)
51
+ polymorphic_url(@article)
52
+ end
53
+
54
+ def test_with_new_record
55
+ expects(:articles_url).with()
56
+ @article.expects(:new_record?).returns(true)
57
+ polymorphic_url(@article)
58
+ end
59
+
60
+ def test_with_record_and_action
61
+ expects(:new_article_url).with()
62
+ @article.expects(:new_record?).never
63
+ polymorphic_url(@article, :action => 'new')
64
+ end
65
+
66
+ def test_url_helper_prefixed_with_new
67
+ expects(:new_article_url).with()
68
+ new_polymorphic_url(@article)
69
+ end
70
+
71
+ def test_url_helper_prefixed_with_edit
72
+ @article.save
73
+ expects(:edit_article_url).with(@article)
74
+ edit_polymorphic_url(@article)
75
+ end
76
+
77
+ def test_url_helper_prefixed_with_edit_with_url_options
78
+ @article.save
79
+ expects(:edit_article_url).with(@article, :param1 => '10')
80
+ edit_polymorphic_url(@article, :param1 => '10')
81
+ end
82
+
83
+ def test_url_helper_with_url_options
84
+ @article.save
85
+ expects(:article_url).with(@article, :param1 => '10')
86
+ polymorphic_url(@article, :param1 => '10')
87
+ end
88
+
89
+ def test_formatted_url_helper_is_deprecated
90
+ expects(:articles_url).with(:format => :pdf)
91
+ assert_deprecated do
92
+ formatted_polymorphic_url([@article, :pdf])
93
+ end
94
+ end
95
+
96
+ def test_format_option
97
+ @article.save
98
+ expects(:article_url).with(@article, :format => :pdf)
99
+ polymorphic_url(@article, :format => :pdf)
100
+ end
101
+
102
+ def test_format_option_with_url_options
103
+ @article.save
104
+ expects(:article_url).with(@article, :format => :pdf, :param1 => '10')
105
+ polymorphic_url(@article, :format => :pdf, :param1 => '10')
106
+ end
107
+
108
+ def test_id_and_format_option
109
+ @article.save
110
+ expects(:article_url).with(:id => @article, :format => :pdf)
111
+ polymorphic_url(:id => @article, :format => :pdf)
112
+ end
113
+
114
+ def test_with_nested
115
+ @response.save
116
+ expects(:article_response_url).with(@article, @response)
117
+ polymorphic_url([@article, @response])
118
+ end
119
+
120
+ def test_with_nested_unsaved
121
+ expects(:article_responses_url).with(@article)
122
+ polymorphic_url([@article, @response])
123
+ end
124
+
125
+ def test_new_with_array_and_namespace
126
+ expects(:new_admin_article_url).with()
127
+ polymorphic_url([:admin, @article], :action => 'new')
128
+ end
129
+
130
+ def test_unsaved_with_array_and_namespace
131
+ expects(:admin_articles_url).with()
132
+ polymorphic_url([:admin, @article])
133
+ end
134
+
135
+ def test_nested_unsaved_with_array_and_namespace
136
+ @article.save
137
+ expects(:admin_article_url).with(@article)
138
+ polymorphic_url([:admin, @article])
139
+ expects(:admin_article_responses_url).with(@article)
140
+ polymorphic_url([:admin, @article, @response])
141
+ end
142
+
143
+ def test_nested_with_array_and_namespace
144
+ @response.save
145
+ expects(:admin_article_response_url).with(@article, @response)
146
+ polymorphic_url([:admin, @article, @response])
147
+
148
+ # a ridiculously long named route tests correct ordering of namespaces and nesting:
149
+ @tag = Tag.new
150
+ @tag.save
151
+ expects(:site_admin_article_response_tag_url).with(@article, @response, @tag)
152
+ polymorphic_url([:site, :admin, @article, @response, @tag])
153
+ end
154
+
155
+ def test_nesting_with_array_ending_in_singleton_resource
156
+ expects(:article_response_url).with(@article)
157
+ polymorphic_url([@article, :response])
158
+ end
159
+
160
+ def test_nesting_with_array_containing_singleton_resource
161
+ @tag = Tag.new
162
+ @tag.save
163
+ expects(:article_response_tag_url).with(@article, @tag)
164
+ polymorphic_url([@article, :response, @tag])
165
+ end
166
+
167
+ def test_nesting_with_array_containing_namespace_and_singleton_resource
168
+ @tag = Tag.new
169
+ @tag.save
170
+ expects(:admin_article_response_tag_url).with(@article, @tag)
171
+ polymorphic_url([:admin, @article, :response, @tag])
172
+ end
173
+
174
+ def test_nesting_with_array_containing_singleton_resource_and_format
175
+ @tag = Tag.new
176
+ @tag.save
177
+ expects(:article_response_tag_url).with(@article, @tag, :format => :pdf)
178
+ polymorphic_url([@article, :response, @tag], :format => :pdf)
179
+ end
180
+
181
+ def test_nesting_with_array_containing_singleton_resource_and_format_option
182
+ @tag = Tag.new
183
+ @tag.save
184
+ expects(:article_response_tag_url).with(@article, @tag, :format => :pdf)
185
+ polymorphic_url([@article, :response, @tag], :format => :pdf)
186
+ end
187
+
188
+ def test_nesting_with_array_containing_nil
189
+ expects(:article_response_url).with(@article)
190
+ polymorphic_url([@article, nil, :response])
191
+ end
192
+
193
+ def test_with_array_containing_single_object
194
+ @article.save
195
+ expects(:article_url).with(@article)
196
+ polymorphic_url([nil, @article])
197
+ end
198
+
199
+ def test_with_array_containing_single_name
200
+ @article.save
201
+ expects(:articles_url)
202
+ polymorphic_url([:articles])
203
+ end
204
+
205
+ # TODO: Needs to be updated to correctly know about whether the object is in a hash or not
206
+ def xtest_with_hash
207
+ expects(:article_url).with(@article)
208
+ @article.save
209
+ polymorphic_url(:id => @article)
210
+ end
211
+
212
+ def test_polymorphic_path_accepts_options
213
+ expects(:new_article_path).with()
214
+ polymorphic_path(@article, :action => :new)
215
+ end
216
+
217
+ def test_polymorphic_path_does_not_modify_arguments
218
+ expects(:admin_article_responses_url).with(@article)
219
+ path = [:admin, @article, @response]
220
+ assert_no_difference 'path.size' do
221
+ polymorphic_url(path)
222
+ end
223
+ end
224
+
225
+ # Tests for names where .plural.singular doesn't round-trip
226
+ def test_with_irregular_plural_record
227
+ @tax.save
228
+ expects(:taxis_url).with(@tax)
229
+ polymorphic_url(@tax)
230
+ end
231
+
232
+ def test_with_irregular_plural_new_record
233
+ expects(:taxes_url).with()
234
+ @tax.expects(:new_record?).returns(true)
235
+ polymorphic_url(@tax)
236
+ end
237
+
238
+ def test_with_irregular_plural_record_and_action
239
+ expects(:new_taxis_url).with()
240
+ @tax.expects(:new_record?).never
241
+ polymorphic_url(@tax, :action => 'new')
242
+ end
243
+
244
+ def test_irregular_plural_url_helper_prefixed_with_new
245
+ expects(:new_taxis_url).with()
246
+ new_polymorphic_url(@tax)
247
+ end
248
+
249
+ def test_irregular_plural_url_helper_prefixed_with_edit
250
+ @tax.save
251
+ expects(:edit_taxis_url).with(@tax)
252
+ edit_polymorphic_url(@tax)
253
+ end
254
+
255
+ def test_with_nested_irregular_plurals
256
+ @fax.save
257
+ expects(:taxis_faxis_url).with(@tax, @fax)
258
+ polymorphic_url([@tax, @fax])
259
+ end
260
+
261
+ def test_with_nested_unsaved_irregular_plurals
262
+ expects(:taxis_faxes_url).with(@tax)
263
+ polymorphic_url([@tax, @fax])
264
+ end
265
+
266
+ def test_new_with_irregular_plural_array_and_namespace
267
+ expects(:new_admin_taxis_url).with()
268
+ polymorphic_url([:admin, @tax], :action => 'new')
269
+ end
270
+
271
+ def test_unsaved_with_irregular_plural_array_and_namespace
272
+ expects(:admin_taxes_url).with()
273
+ polymorphic_url([:admin, @tax])
274
+ end
275
+
276
+ def test_nesting_with_irregular_plurals_and_array_ending_in_singleton_resource
277
+ expects(:taxis_faxis_url).with(@tax)
278
+ polymorphic_url([@tax, :faxis])
279
+ end
280
+
281
+ def test_with_array_containing_single_irregular_plural_object
282
+ @tax.save
283
+ expects(:taxis_url).with(@tax)
284
+ polymorphic_url([nil, @tax])
285
+ end
286
+
287
+ def test_with_array_containing_single_name_irregular_plural
288
+ @tax.save
289
+ expects(:taxes_url)
290
+ polymorphic_url([:taxes])
291
+ end
292
+
293
+ def test_with_array_containing_symbols
294
+ expects(:new_article_url).with()
295
+ polymorphic_url([:new, :article])
296
+ end
297
+ end
@@ -0,0 +1,311 @@
1
+ require 'abstract_unit'
2
+
3
+ class BaseRackTest < ActiveSupport::TestCase
4
+ def setup
5
+ @env = {
6
+ "HTTP_MAX_FORWARDS" => "10",
7
+ "SERVER_NAME" => "glu.ttono.us",
8
+ "FCGI_ROLE" => "RESPONDER",
9
+ "AUTH_TYPE" => "Basic",
10
+ "HTTP_X_FORWARDED_HOST" => "glu.ttono.us",
11
+ "HTTP_ACCEPT_CHARSET" => "UTF-8",
12
+ "HTTP_ACCEPT_ENCODING" => "gzip, deflate",
13
+ "HTTP_CACHE_CONTROL" => "no-cache, max-age=0",
14
+ "HTTP_PRAGMA" => "no-cache",
15
+ "HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en)",
16
+ "PATH_INFO" => "/homepage/",
17
+ "HTTP_ACCEPT_LANGUAGE" => "en",
18
+ "HTTP_NEGOTIATE" => "trans",
19
+ "HTTP_HOST" => "glu.ttono.us:8007",
20
+ "HTTP_REFERER" => "http://www.google.com/search?q=glu.ttono.us",
21
+ "HTTP_FROM" => "googlebot",
22
+ "SERVER_PROTOCOL" => "HTTP/1.1",
23
+ "REDIRECT_URI" => "/dispatch.fcgi",
24
+ "SCRIPT_NAME" => "/dispatch.fcgi",
25
+ "SERVER_ADDR" => "207.7.108.53",
26
+ "REMOTE_ADDR" => "207.7.108.53",
27
+ "REMOTE_HOST" => "google.com",
28
+ "REMOTE_IDENT" => "kevin",
29
+ "REMOTE_USER" => "kevin",
30
+ "SERVER_SOFTWARE" => "lighttpd/1.4.5",
31
+ "HTTP_COOKIE" => "_session_id=c84ace84796670c052c6ceb2451fb0f2; is_admin=yes",
32
+ "HTTP_X_FORWARDED_SERVER" => "glu.ttono.us",
33
+ "REQUEST_URI" => "/admin",
34
+ "DOCUMENT_ROOT" => "/home/kevinc/sites/typo/public",
35
+ "PATH_TRANSLATED" => "/home/kevinc/sites/typo/public/homepage/",
36
+ "SERVER_PORT" => "8007",
37
+ "QUERY_STRING" => "",
38
+ "REMOTE_PORT" => "63137",
39
+ "GATEWAY_INTERFACE" => "CGI/1.1",
40
+ "HTTP_X_FORWARDED_FOR" => "65.88.180.234",
41
+ "HTTP_ACCEPT" => "*/*",
42
+ "SCRIPT_FILENAME" => "/home/kevinc/sites/typo/public/dispatch.fcgi",
43
+ "REDIRECT_STATUS" => "200",
44
+ "REQUEST_METHOD" => "GET"
45
+ }
46
+ @request = ActionController::Request.new(@env)
47
+ # some Nokia phone browsers omit the space after the semicolon separator.
48
+ # some developers have grown accustomed to using comma in cookie values.
49
+ @alt_cookie_fmt_request = ActionController::Request.new(@env.merge({"HTTP_COOKIE"=>"_session_id=c84ace847,96670c052c6ceb2451fb0f2;is_admin=yes"}))
50
+ end
51
+
52
+ def default_test; end
53
+
54
+ private
55
+
56
+ def set_content_data(data)
57
+ @request.env['REQUEST_METHOD'] = 'POST'
58
+ @request.env['CONTENT_LENGTH'] = data.length
59
+ @request.env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'
60
+ @request.env['rack.input'] = StringIO.new(data)
61
+ end
62
+ end
63
+
64
+ class RackRequestTest < BaseRackTest
65
+ def test_proxy_request
66
+ assert_equal 'glu.ttono.us', @request.host_with_port
67
+ end
68
+
69
+ def test_http_host
70
+ @env.delete "HTTP_X_FORWARDED_HOST"
71
+ @env['HTTP_HOST'] = "rubyonrails.org:8080"
72
+ assert_equal "rubyonrails.org", @request.host
73
+ assert_equal "rubyonrails.org:8080", @request.host_with_port
74
+
75
+ @env['HTTP_X_FORWARDED_HOST'] = "www.firsthost.org, www.secondhost.org"
76
+ assert_equal "www.secondhost.org", @request.host
77
+ end
78
+
79
+ def test_http_host_with_default_port_overrides_server_port
80
+ @env.delete "HTTP_X_FORWARDED_HOST"
81
+ @env['HTTP_HOST'] = "rubyonrails.org"
82
+ assert_equal "rubyonrails.org", @request.host_with_port
83
+ end
84
+
85
+ def test_host_with_port_defaults_to_server_name_if_no_host_headers
86
+ @env.delete "HTTP_X_FORWARDED_HOST"
87
+ @env.delete "HTTP_HOST"
88
+ assert_equal "glu.ttono.us:8007", @request.host_with_port
89
+ end
90
+
91
+ def test_host_with_port_falls_back_to_server_addr_if_necessary
92
+ @env.delete "HTTP_X_FORWARDED_HOST"
93
+ @env.delete "HTTP_HOST"
94
+ @env.delete "SERVER_NAME"
95
+ assert_equal "207.7.108.53", @request.host
96
+ assert_equal 8007, @request.port
97
+ assert_equal "207.7.108.53:8007", @request.host_with_port
98
+ end
99
+
100
+ def test_host_with_port_if_http_standard_port_is_specified
101
+ @env['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:80"
102
+ assert_equal "glu.ttono.us", @request.host_with_port
103
+ end
104
+
105
+ def test_host_with_port_if_https_standard_port_is_specified
106
+ @env['HTTP_X_FORWARDED_PROTO'] = "https"
107
+ @env['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:443"
108
+ assert_equal "glu.ttono.us", @request.host_with_port
109
+ end
110
+
111
+ def test_host_if_ipv6_reference
112
+ @env.delete "HTTP_X_FORWARDED_HOST"
113
+ @env['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]"
114
+ assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host
115
+ end
116
+
117
+ def test_host_if_ipv6_reference_with_port
118
+ @env.delete "HTTP_X_FORWARDED_HOST"
119
+ @env['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]:8008"
120
+ assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host
121
+ end
122
+
123
+ def test_cgi_environment_variables
124
+ assert_equal "Basic", @request.auth_type
125
+ assert_equal 0, @request.content_length
126
+ assert_equal nil, @request.content_type
127
+ assert_equal "CGI/1.1", @request.gateway_interface
128
+ assert_equal "*/*", @request.accept
129
+ assert_equal "UTF-8", @request.accept_charset
130
+ assert_equal "gzip, deflate", @request.accept_encoding
131
+ assert_equal "en", @request.accept_language
132
+ assert_equal "no-cache, max-age=0", @request.cache_control
133
+ assert_equal "googlebot", @request.from
134
+ assert_equal "glu.ttono.us", @request.host
135
+ assert_equal "trans", @request.negotiate
136
+ assert_equal "no-cache", @request.pragma
137
+ assert_equal "http://www.google.com/search?q=glu.ttono.us", @request.referer
138
+ assert_equal "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en)", @request.user_agent
139
+ assert_equal "/homepage/", @request.path_info
140
+ assert_equal "/home/kevinc/sites/typo/public/homepage/", @request.path_translated
141
+ assert_equal "", @request.query_string
142
+ assert_equal "207.7.108.53", @request.remote_addr
143
+ assert_equal "google.com", @request.remote_host
144
+ assert_equal "kevin", @request.remote_ident
145
+ assert_equal "kevin", @request.remote_user
146
+ assert_equal :get, @request.request_method
147
+ assert_equal "/dispatch.fcgi", @request.script_name
148
+ assert_equal "glu.ttono.us", @request.server_name
149
+ assert_equal 8007, @request.server_port
150
+ assert_equal "HTTP/1.1", @request.server_protocol
151
+ assert_equal "lighttpd", @request.server_software
152
+ end
153
+
154
+ def test_cookie_syntax_resilience
155
+ cookies = @request.cookies
156
+ assert_equal "c84ace84796670c052c6ceb2451fb0f2", cookies["_session_id"], cookies.inspect
157
+ assert_equal "yes", cookies["is_admin"], cookies.inspect
158
+
159
+ alt_cookies = @alt_cookie_fmt_request.cookies
160
+ #assert_equal "c84ace847,96670c052c6ceb2451fb0f2", alt_cookies["_session_id"], alt_cookies.inspect
161
+ assert_equal "yes", alt_cookies["is_admin"], alt_cookies.inspect
162
+ end
163
+ end
164
+
165
+ class RackRequestParamsParsingTest < BaseRackTest
166
+ def test_doesnt_break_when_content_type_has_charset
167
+ set_content_data 'flamenco=love'
168
+
169
+ assert_equal({"flamenco"=> "love"}, @request.request_parameters)
170
+ end
171
+
172
+ def test_doesnt_interpret_request_uri_as_query_string_when_missing
173
+ @request.env['REQUEST_URI'] = 'foo'
174
+ assert_equal({}, @request.query_parameters)
175
+ end
176
+ end
177
+
178
+ class RackRequestContentTypeTest < BaseRackTest
179
+ def test_html_content_type_verification
180
+ @request.env['CONTENT_TYPE'] = Mime::HTML.to_s
181
+ assert @request.content_type.verify_request?
182
+ end
183
+
184
+ def test_xml_content_type_verification
185
+ @request.env['CONTENT_TYPE'] = Mime::XML.to_s
186
+ assert !@request.content_type.verify_request?
187
+ end
188
+ end
189
+
190
+ class RackRequestNeedsRewoundTest < BaseRackTest
191
+ def test_body_should_be_rewound
192
+ data = 'foo'
193
+ @env['rack.input'] = StringIO.new(data)
194
+ @env['CONTENT_LENGTH'] = data.length
195
+ @env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'
196
+
197
+ # Read the request body by parsing params.
198
+ request = ActionController::Request.new(@env)
199
+ request.request_parameters
200
+
201
+ # Should have rewound the body.
202
+ assert_equal 0, request.body.pos
203
+ end
204
+ end
205
+
206
+ class RackResponseTest < BaseRackTest
207
+ def setup
208
+ super
209
+ @response = ActionController::Response.new
210
+ end
211
+
212
+ def test_simple_output
213
+ @response.body = "Hello, World!"
214
+ @response.prepare!
215
+
216
+ status, headers, body = @response.to_a
217
+ assert_equal 200, status
218
+ assert_equal({
219
+ "Content-Type" => "text/html; charset=utf-8",
220
+ "Cache-Control" => "private, max-age=0, must-revalidate",
221
+ "ETag" => '"65a8e27d8879283831b664bd8b7f0ad4"',
222
+ "Set-Cookie" => "",
223
+ "Content-Length" => "13"
224
+ }, headers)
225
+
226
+ parts = []
227
+ body.each { |part| parts << part }
228
+ assert_equal ["Hello, World!"], parts
229
+ end
230
+
231
+ def test_utf8_output
232
+ @response.body = [1090, 1077, 1089, 1090].pack("U*")
233
+ @response.prepare!
234
+
235
+ status, headers, body = @response.to_a
236
+ assert_equal 200, status
237
+ assert_equal({
238
+ "Content-Type" => "text/html; charset=utf-8",
239
+ "Cache-Control" => "private, max-age=0, must-revalidate",
240
+ "ETag" => '"ebb5e89e8a94e9dd22abf5d915d112b2"',
241
+ "Set-Cookie" => "",
242
+ "Content-Length" => "8"
243
+ }, headers)
244
+ end
245
+
246
+ def test_streaming_block
247
+ @response.body = Proc.new do |response, output|
248
+ 5.times { |n| output.write(n) }
249
+ end
250
+ @response.prepare!
251
+
252
+ status, headers, body = @response.to_a
253
+ assert_equal 200, status
254
+ assert_equal({
255
+ "Content-Type" => "text/html; charset=utf-8",
256
+ "Cache-Control" => "no-cache",
257
+ "Set-Cookie" => ""
258
+ }, headers)
259
+
260
+ parts = []
261
+ body.each { |part| parts << part }
262
+ assert_equal ["0", "1", "2", "3", "4"], parts
263
+ end
264
+
265
+ def test_streaming_block_with_flush_is_deprecated
266
+ @response.body = Proc.new do |response, output|
267
+ 5.times do |n|
268
+ output.write(n)
269
+ output.flush
270
+ end
271
+ end
272
+
273
+ assert_deprecated(/output.flush is no longer needed/) do
274
+ @response.prepare!
275
+ status, headers, body = @response.to_a
276
+
277
+ parts = []
278
+ body.each { |part| parts << part }
279
+ end
280
+ end
281
+ end
282
+
283
+ class RackResponseHeadersTest < BaseRackTest
284
+ def setup
285
+ super
286
+ @response = ActionController::Response.new
287
+ @response.status = "200 OK"
288
+ end
289
+
290
+ def test_content_type
291
+ [204, 304].each do |c|
292
+ @response.status = c.to_s
293
+ assert !response_headers.has_key?("Content-Type"), "#{c} should not have Content-Type header"
294
+ end
295
+
296
+ [200, 302, 404, 500].each do |c|
297
+ @response.status = c.to_s
298
+ assert response_headers.has_key?("Content-Type"), "#{c} did not have Content-Type header"
299
+ end
300
+ end
301
+
302
+ def test_status
303
+ assert !response_headers.has_key?('Status')
304
+ end
305
+
306
+ private
307
+ def response_headers
308
+ @response.prepare!
309
+ @response.to_a[1]
310
+ end
311
+ end