actionpack 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (513) hide show
  1. data/CHANGELOG +15 -64
  2. data/README +39 -48
  3. data/lib/abstract_controller.rb +22 -0
  4. data/lib/abstract_controller/base.rb +191 -0
  5. data/lib/abstract_controller/callbacks.rb +113 -0
  6. data/lib/abstract_controller/collector.rb +30 -0
  7. data/lib/abstract_controller/compatibility.rb +18 -0
  8. data/lib/abstract_controller/helpers.rb +163 -0
  9. data/lib/abstract_controller/layouts.rb +413 -0
  10. data/lib/abstract_controller/localized_cache.rb +49 -0
  11. data/lib/abstract_controller/logger.rb +13 -0
  12. data/lib/abstract_controller/rendering.rb +238 -0
  13. data/lib/{action_controller → abstract_controller}/translation.rb +1 -1
  14. data/lib/action_controller.rb +68 -102
  15. data/lib/action_controller/base.rb +77 -1409
  16. data/lib/action_controller/caching.rb +58 -45
  17. data/lib/action_controller/caching/actions.rb +100 -114
  18. data/lib/action_controller/caching/fragments.rb +17 -19
  19. data/lib/action_controller/caching/pages.rb +12 -6
  20. data/lib/action_controller/caching/sweeping.rb +42 -0
  21. data/lib/action_controller/deprecated.rb +5 -0
  22. data/lib/action_controller/deprecated/dispatcher.rb +28 -0
  23. data/lib/action_controller/deprecated/integration_test.rb +2 -0
  24. data/lib/action_controller/deprecated/performance_test.rb +1 -0
  25. data/lib/action_controller/metal.rb +125 -0
  26. data/lib/action_controller/metal/compatibility.rb +141 -0
  27. data/lib/action_controller/metal/conditional_get.rb +86 -0
  28. data/lib/action_controller/metal/configuration.rb +28 -0
  29. data/lib/action_controller/metal/cookies.rb +17 -0
  30. data/lib/action_controller/metal/exceptions.rb +46 -0
  31. data/lib/action_controller/metal/flash.rb +28 -0
  32. data/lib/action_controller/metal/head.rb +33 -0
  33. data/lib/action_controller/metal/helpers.rb +116 -0
  34. data/lib/action_controller/metal/hide_actions.rb +50 -0
  35. data/lib/action_controller/{http_authentication.rb → metal/http_authentication.rb} +18 -15
  36. data/lib/action_controller/metal/instrumentation.rb +99 -0
  37. data/lib/action_controller/metal/mime_responds.rb +300 -0
  38. data/lib/action_controller/metal/rack_delegation.rb +35 -0
  39. data/lib/action_controller/metal/redirecting.rb +90 -0
  40. data/lib/action_controller/metal/renderers.rb +95 -0
  41. data/lib/action_controller/metal/rendering.rb +69 -0
  42. data/lib/action_controller/metal/request_forgery_protection.rb +115 -0
  43. data/lib/action_controller/metal/rescue.rb +13 -0
  44. data/lib/action_controller/metal/responder.rb +220 -0
  45. data/lib/action_controller/{session_management.rb → metal/session_management.rb} +5 -14
  46. data/lib/action_controller/{streaming.rb → metal/streaming.rb} +13 -12
  47. data/lib/action_controller/metal/testing.rb +42 -0
  48. data/lib/action_controller/metal/url_for.rb +157 -0
  49. data/lib/action_controller/{verification.rb → metal/verification.rb} +41 -41
  50. data/lib/action_controller/middleware.rb +38 -0
  51. data/lib/action_controller/polymorphic_routes.rb +20 -26
  52. data/lib/action_controller/railtie.rb +30 -0
  53. data/lib/action_controller/railties/subscriber.rb +63 -0
  54. data/lib/action_controller/record_identifier.rb +3 -16
  55. data/lib/action_controller/test_case.rb +156 -18
  56. data/lib/action_controller/url_rewriter.rb +47 -200
  57. data/lib/action_controller/vendor/html-scanner.rb +16 -12
  58. data/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
  59. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +12 -9
  60. data/lib/action_dispatch.rb +88 -0
  61. data/lib/action_dispatch/http/cache.rb +123 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +98 -0
  63. data/lib/{action_controller → action_dispatch/http}/headers.rb +8 -8
  64. data/lib/action_dispatch/http/mime_negotiation.rb +101 -0
  65. data/lib/{action_controller → action_dispatch/http}/mime_type.rb +30 -11
  66. data/lib/{action_controller → action_dispatch/http}/mime_types.rb +5 -3
  67. data/lib/action_dispatch/http/parameters.rb +49 -0
  68. data/lib/action_dispatch/http/request.rb +223 -0
  69. data/lib/action_dispatch/http/response.rb +209 -0
  70. data/lib/action_dispatch/http/upload.rb +48 -0
  71. data/lib/action_dispatch/http/url.rb +129 -0
  72. data/lib/action_dispatch/middleware/callbacks.rb +50 -0
  73. data/lib/action_dispatch/middleware/cascade.rb +29 -0
  74. data/lib/action_dispatch/middleware/cookies.rb +216 -0
  75. data/lib/{action_controller → action_dispatch/middleware}/flash.rb +51 -90
  76. data/lib/action_dispatch/middleware/head.rb +18 -0
  77. data/lib/action_dispatch/middleware/params_parser.rb +78 -0
  78. data/lib/action_dispatch/middleware/rescue.rb +26 -0
  79. data/lib/action_dispatch/middleware/session/abstract_store.rb +209 -0
  80. data/lib/{action_controller → action_dispatch/middleware}/session/cookie_store.rb +56 -60
  81. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
  82. data/lib/action_dispatch/middleware/show_exceptions.rb +173 -0
  83. data/lib/{action_controller/middleware_stack.rb → action_dispatch/middleware/stack.rb} +23 -13
  84. data/lib/action_dispatch/middleware/static.rb +44 -0
  85. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_request_and_response.erb +10 -3
  86. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_trace.erb +4 -4
  87. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
  88. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/layout.erb +2 -2
  89. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/missing_template.erb +0 -0
  90. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/routing_error.erb +0 -0
  91. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/template_error.erb +3 -3
  92. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/unknown_action.erb +0 -0
  93. data/lib/action_dispatch/railtie.rb +15 -0
  94. data/lib/action_dispatch/routing.rb +217 -0
  95. data/lib/action_dispatch/routing/deprecated_mapper.rb +877 -0
  96. data/lib/action_dispatch/routing/mapper.rb +649 -0
  97. data/lib/action_dispatch/routing/route.rb +55 -0
  98. data/lib/action_dispatch/routing/route_set.rb +445 -0
  99. data/lib/action_dispatch/testing/assertions.rb +21 -0
  100. data/lib/action_dispatch/testing/assertions/dom.rb +37 -0
  101. data/lib/{action_controller/assertions/model_assertions.rb → action_dispatch/testing/assertions/model.rb} +2 -4
  102. data/lib/action_dispatch/testing/assertions/response.rb +154 -0
  103. data/lib/{action_controller/assertions/routing_assertions.rb → action_dispatch/testing/assertions/routing.rb} +72 -34
  104. data/lib/{action_controller/assertions/selector_assertions.rb → action_dispatch/testing/assertions/selector.rb} +14 -11
  105. data/lib/{action_controller/assertions/tag_assertions.rb → action_dispatch/testing/assertions/tag.rb} +25 -14
  106. data/lib/{action_controller → action_dispatch/testing}/integration.rb +173 -406
  107. data/lib/action_dispatch/testing/performance_test.rb +17 -0
  108. data/lib/action_dispatch/testing/test_process.rb +42 -0
  109. data/lib/action_dispatch/testing/test_request.rb +83 -0
  110. data/lib/action_dispatch/testing/test_response.rb +136 -0
  111. data/lib/action_pack/version.rb +3 -3
  112. data/lib/action_view.rb +29 -26
  113. data/lib/action_view/base.rb +101 -148
  114. data/lib/action_view/context.rb +44 -0
  115. data/lib/action_view/helpers.rb +6 -4
  116. data/lib/action_view/helpers/{active_record_helper.rb → active_model_helper.rb} +63 -63
  117. data/lib/action_view/helpers/asset_tag_helper.rb +166 -31
  118. data/lib/action_view/helpers/cache_helper.rb +1 -1
  119. data/lib/action_view/helpers/capture_helper.rb +40 -8
  120. data/lib/action_view/helpers/csrf_helper.rb +2 -4
  121. data/lib/action_view/helpers/date_helper.rb +14 -15
  122. data/lib/action_view/helpers/form_helper.rb +121 -24
  123. data/lib/action_view/helpers/form_options_helper.rb +26 -25
  124. data/lib/action_view/helpers/form_tag_helper.rb +42 -33
  125. data/lib/action_view/helpers/javascript_helper.rb +1 -109
  126. data/lib/action_view/helpers/number_helper.rb +4 -1
  127. data/lib/action_view/helpers/prototype_helper.rb +75 -499
  128. data/lib/action_view/helpers/raw_output_helper.rb +1 -1
  129. data/lib/action_view/helpers/record_tag_helper.rb +3 -3
  130. data/lib/action_view/helpers/sanitize_helper.rb +3 -2
  131. data/lib/action_view/helpers/scriptaculous_helper.rb +89 -53
  132. data/lib/action_view/helpers/tag_helper.rb +12 -13
  133. data/lib/action_view/helpers/text_helper.rb +33 -38
  134. data/lib/action_view/helpers/translation_helper.rb +11 -35
  135. data/lib/action_view/helpers/url_helper.rb +140 -134
  136. data/lib/action_view/locale/en.yml +34 -28
  137. data/lib/action_view/paths.rb +27 -24
  138. data/lib/action_view/railtie.rb +17 -0
  139. data/lib/action_view/railties/subscriber.rb +24 -0
  140. data/lib/action_view/{partials.rb → render/partials.rb} +161 -51
  141. data/lib/action_view/render/rendering.rb +117 -0
  142. data/lib/action_view/template.rb +88 -217
  143. data/lib/action_view/template/error.rb +105 -0
  144. data/lib/action_view/template/handler.rb +41 -0
  145. data/lib/action_view/template/handlers.rb +54 -0
  146. data/lib/action_view/{template_handlers → template/handlers}/builder.rb +6 -6
  147. data/lib/action_view/template/handlers/erb.rb +58 -0
  148. data/lib/action_view/{template_handlers → template/handlers}/rjs.rb +8 -3
  149. data/lib/action_view/template/resolver.rb +164 -0
  150. data/lib/action_view/template/text.rb +40 -0
  151. data/lib/action_view/test_case.rb +18 -18
  152. metadata +165 -420
  153. data/RUNNING_UNIT_TESTS +0 -24
  154. data/Rakefile +0 -158
  155. data/install.rb +0 -30
  156. data/lib/action_controller/assertions/dom_assertions.rb +0 -55
  157. data/lib/action_controller/assertions/response_assertions.rb +0 -169
  158. data/lib/action_controller/benchmarking.rb +0 -107
  159. data/lib/action_controller/caching/sweeper.rb +0 -45
  160. data/lib/action_controller/cgi_ext.rb +0 -15
  161. data/lib/action_controller/cgi_ext/cookie.rb +0 -112
  162. data/lib/action_controller/cgi_ext/query_extension.rb +0 -22
  163. data/lib/action_controller/cgi_ext/stdinput.rb +0 -24
  164. data/lib/action_controller/cgi_process.rb +0 -77
  165. data/lib/action_controller/cookies.rb +0 -197
  166. data/lib/action_controller/dispatcher.rb +0 -133
  167. data/lib/action_controller/failsafe.rb +0 -87
  168. data/lib/action_controller/filters.rb +0 -680
  169. data/lib/action_controller/helpers.rb +0 -225
  170. data/lib/action_controller/layout.rb +0 -286
  171. data/lib/action_controller/middlewares.rb +0 -14
  172. data/lib/action_controller/mime_responds.rb +0 -193
  173. data/lib/action_controller/params_parser.rb +0 -77
  174. data/lib/action_controller/performance_test.rb +0 -15
  175. data/lib/action_controller/rack_lint_patch.rb +0 -36
  176. data/lib/action_controller/reloader.rb +0 -54
  177. data/lib/action_controller/request.rb +0 -518
  178. data/lib/action_controller/request_forgery_protection.rb +0 -116
  179. data/lib/action_controller/rescue.rb +0 -183
  180. data/lib/action_controller/resources.rb +0 -682
  181. data/lib/action_controller/response.rb +0 -237
  182. data/lib/action_controller/routing.rb +0 -388
  183. data/lib/action_controller/routing/builder.rb +0 -197
  184. data/lib/action_controller/routing/optimisations.rb +0 -130
  185. data/lib/action_controller/routing/recognition_optimisation.rb +0 -167
  186. data/lib/action_controller/routing/route.rb +0 -265
  187. data/lib/action_controller/routing/route_set.rb +0 -503
  188. data/lib/action_controller/routing/routing_ext.rb +0 -49
  189. data/lib/action_controller/routing/segments.rb +0 -343
  190. data/lib/action_controller/session/abstract_store.rb +0 -276
  191. data/lib/action_controller/session/mem_cache_store.rb +0 -60
  192. data/lib/action_controller/status_codes.rb +0 -88
  193. data/lib/action_controller/string_coercion.rb +0 -29
  194. data/lib/action_controller/templates/rescues/diagnostics.erb +0 -11
  195. data/lib/action_controller/test_process.rb +0 -580
  196. data/lib/action_controller/uploaded_file.rb +0 -44
  197. data/lib/action_view/helpers/benchmark_helper.rb +0 -54
  198. data/lib/action_view/inline_template.rb +0 -19
  199. data/lib/action_view/reloadable_template.rb +0 -117
  200. data/lib/action_view/renderable.rb +0 -109
  201. data/lib/action_view/renderable_partial.rb +0 -53
  202. data/lib/action_view/template_error.rb +0 -99
  203. data/lib/action_view/template_handler.rb +0 -34
  204. data/lib/action_view/template_handlers.rb +0 -48
  205. data/lib/action_view/template_handlers/erb.rb +0 -25
  206. data/lib/actionpack.rb +0 -2
  207. data/test/abstract_unit.rb +0 -78
  208. data/test/active_record_unit.rb +0 -104
  209. data/test/activerecord/active_record_store_test.rb +0 -221
  210. data/test/activerecord/render_partial_with_record_identification_test.rb +0 -188
  211. data/test/adv_attr_test.rb +0 -20
  212. data/test/controller/action_pack_assertions_test.rb +0 -545
  213. data/test/controller/addresses_render_test.rb +0 -37
  214. data/test/controller/assert_select_test.rb +0 -735
  215. data/test/controller/base_test.rb +0 -217
  216. data/test/controller/benchmark_test.rb +0 -32
  217. data/test/controller/caching_test.rb +0 -743
  218. data/test/controller/capture_test.rb +0 -66
  219. data/test/controller/content_type_test.rb +0 -178
  220. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  221. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  222. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  223. data/test/controller/cookie_test.rb +0 -208
  224. data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -32
  225. data/test/controller/dispatcher_test.rb +0 -144
  226. data/test/controller/dom_assertions_test.rb +0 -53
  227. data/test/controller/failsafe_test.rb +0 -60
  228. data/test/controller/fake_controllers.rb +0 -33
  229. data/test/controller/fake_models.rb +0 -19
  230. data/test/controller/filter_params_test.rb +0 -52
  231. data/test/controller/filters_test.rb +0 -885
  232. data/test/controller/flash_test.rb +0 -174
  233. data/test/controller/header_test.rb +0 -14
  234. data/test/controller/helper_test.rb +0 -224
  235. data/test/controller/html-scanner/cdata_node_test.rb +0 -15
  236. data/test/controller/html-scanner/document_test.rb +0 -148
  237. data/test/controller/html-scanner/node_test.rb +0 -89
  238. data/test/controller/html-scanner/sanitizer_test.rb +0 -300
  239. data/test/controller/html-scanner/tag_node_test.rb +0 -238
  240. data/test/controller/html-scanner/text_node_test.rb +0 -50
  241. data/test/controller/html-scanner/tokenizer_test.rb +0 -131
  242. data/test/controller/http_basic_authentication_test.rb +0 -113
  243. data/test/controller/http_digest_authentication_test.rb +0 -254
  244. data/test/controller/integration_test.rb +0 -526
  245. data/test/controller/layout_test.rb +0 -215
  246. data/test/controller/localized_templates_test.rb +0 -24
  247. data/test/controller/logging_test.rb +0 -46
  248. data/test/controller/middleware_stack_test.rb +0 -90
  249. data/test/controller/mime_responds_test.rb +0 -536
  250. data/test/controller/mime_type_test.rb +0 -93
  251. data/test/controller/output_escaping_test.rb +0 -19
  252. data/test/controller/polymorphic_routes_test.rb +0 -297
  253. data/test/controller/rack_test.rb +0 -308
  254. data/test/controller/record_identifier_test.rb +0 -139
  255. data/test/controller/redirect_test.rb +0 -285
  256. data/test/controller/reloader_test.rb +0 -125
  257. data/test/controller/render_test.rb +0 -1783
  258. data/test/controller/request/json_params_parsing_test.rb +0 -65
  259. data/test/controller/request/multipart_params_parsing_test.rb +0 -177
  260. data/test/controller/request/query_string_parsing_test.rb +0 -129
  261. data/test/controller/request/test_request_test.rb +0 -35
  262. data/test/controller/request/url_encoded_params_parsing_test.rb +0 -146
  263. data/test/controller/request/xml_params_parsing_test.rb +0 -103
  264. data/test/controller/request_forgery_protection_test.rb +0 -233
  265. data/test/controller/request_test.rb +0 -398
  266. data/test/controller/rescue_test.rb +0 -541
  267. data/test/controller/resources_test.rb +0 -1393
  268. data/test/controller/routing_test.rb +0 -2592
  269. data/test/controller/selector_test.rb +0 -628
  270. data/test/controller/send_file_test.rb +0 -171
  271. data/test/controller/session/abstract_store_test.rb +0 -64
  272. data/test/controller/session/cookie_store_test.rb +0 -354
  273. data/test/controller/session/mem_cache_store_test.rb +0 -187
  274. data/test/controller/session/test_session_test.rb +0 -58
  275. data/test/controller/test_test.rb +0 -700
  276. data/test/controller/translation_test.rb +0 -26
  277. data/test/controller/url_rewriter_test.rb +0 -395
  278. data/test/controller/verification_test.rb +0 -270
  279. data/test/controller/view_paths_test.rb +0 -141
  280. data/test/controller/webservice_test.rb +0 -273
  281. data/test/fixtures/_top_level_partial.html.erb +0 -1
  282. data/test/fixtures/_top_level_partial_only.erb +0 -1
  283. data/test/fixtures/addresses/list.erb +0 -1
  284. data/test/fixtures/alternate_helpers/foo_helper.rb +0 -3
  285. data/test/fixtures/bad_customers/_bad_customer.html.erb +0 -1
  286. data/test/fixtures/companies.yml +0 -24
  287. data/test/fixtures/company.rb +0 -10
  288. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +0 -1
  289. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +0 -1
  290. data/test/fixtures/content_type/render_default_for_rjs.rjs +0 -1
  291. data/test/fixtures/content_type/render_default_for_rxml.rxml +0 -1
  292. data/test/fixtures/customers/_customer.html.erb +0 -1
  293. data/test/fixtures/db_definitions/sqlite.sql +0 -49
  294. data/test/fixtures/developer.rb +0 -9
  295. data/test/fixtures/developers.yml +0 -21
  296. data/test/fixtures/developers/_developer.erb +0 -1
  297. data/test/fixtures/developers_projects.yml +0 -13
  298. data/test/fixtures/failsafe/500.html +0 -1
  299. data/test/fixtures/fun/games/_game.erb +0 -1
  300. data/test/fixtures/fun/games/hello_world.erb +0 -1
  301. data/test/fixtures/fun/serious/games/_game.erb +0 -1
  302. data/test/fixtures/functional_caching/_partial.erb +0 -3
  303. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +0 -3
  304. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +0 -6
  305. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +0 -5
  306. data/test/fixtures/functional_caching/fragment_cached.html.erb +0 -2
  307. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +0 -1
  308. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +0 -2
  309. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +0 -1
  310. data/test/fixtures/good_customers/_good_customer.html.erb +0 -1
  311. data/test/fixtures/helpers/abc_helper.rb +0 -5
  312. data/test/fixtures/helpers/fun/games_helper.rb +0 -3
  313. data/test/fixtures/helpers/fun/pdf_helper.rb +0 -3
  314. data/test/fixtures/layout_tests/abs_path_layout.rhtml +0 -1
  315. data/test/fixtures/layout_tests/alt/hello.rhtml +0 -1
  316. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  317. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +0 -1
  318. data/test/fixtures/layout_tests/layouts/item.rhtml +0 -1
  319. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +0 -1
  320. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +0 -1
  321. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +0 -1
  322. data/test/fixtures/layout_tests/views/hello.rhtml +0 -1
  323. data/test/fixtures/layouts/_column.html.erb +0 -2
  324. data/test/fixtures/layouts/block_with_layout.erb +0 -3
  325. data/test/fixtures/layouts/builder.builder +0 -3
  326. data/test/fixtures/layouts/default_html.html.erb +0 -1
  327. data/test/fixtures/layouts/partial_with_layout.erb +0 -3
  328. data/test/fixtures/layouts/standard.erb +0 -1
  329. data/test/fixtures/layouts/talk_from_action.erb +0 -2
  330. data/test/fixtures/layouts/xhr.html.erb +0 -2
  331. data/test/fixtures/layouts/yield.erb +0 -2
  332. data/test/fixtures/localized/hello_world.de.html +0 -1
  333. data/test/fixtures/localized/hello_world.en.html +0 -1
  334. data/test/fixtures/mascot.rb +0 -3
  335. data/test/fixtures/mascots.yml +0 -4
  336. data/test/fixtures/mascots/_mascot.html.erb +0 -1
  337. data/test/fixtures/multipart/binary_file +0 -0
  338. data/test/fixtures/multipart/boundary_problem_file +0 -10
  339. data/test/fixtures/multipart/bracketed_param +0 -5
  340. data/test/fixtures/multipart/empty +0 -10
  341. data/test/fixtures/multipart/hello.txt +0 -1
  342. data/test/fixtures/multipart/large_text_file +0 -10
  343. data/test/fixtures/multipart/mixed_files +0 -0
  344. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  345. data/test/fixtures/multipart/none +0 -9
  346. data/test/fixtures/multipart/single_parameter +0 -5
  347. data/test/fixtures/multipart/text_file +0 -10
  348. data/test/fixtures/override/test/hello_world.erb +0 -1
  349. data/test/fixtures/override2/layouts/test/sub.erb +0 -1
  350. data/test/fixtures/post_test/layouts/post.html.erb +0 -1
  351. data/test/fixtures/post_test/layouts/super_post.iphone.erb +0 -1
  352. data/test/fixtures/post_test/post/index.html.erb +0 -1
  353. data/test/fixtures/post_test/post/index.iphone.erb +0 -1
  354. data/test/fixtures/post_test/super_post/index.html.erb +0 -1
  355. data/test/fixtures/post_test/super_post/index.iphone.erb +0 -1
  356. data/test/fixtures/project.rb +0 -3
  357. data/test/fixtures/projects.yml +0 -7
  358. data/test/fixtures/projects/_project.erb +0 -1
  359. data/test/fixtures/public/404.html +0 -1
  360. data/test/fixtures/public/500.da.html +0 -1
  361. data/test/fixtures/public/500.html +0 -1
  362. data/test/fixtures/public/absolute/test.css +0 -23
  363. data/test/fixtures/public/absolute/test.js +0 -63
  364. data/test/fixtures/public/images/rails.png +0 -0
  365. data/test/fixtures/public/javascripts/application.js +0 -1
  366. data/test/fixtures/public/javascripts/bank.js +0 -1
  367. data/test/fixtures/public/javascripts/controls.js +0 -1
  368. data/test/fixtures/public/javascripts/dragdrop.js +0 -1
  369. data/test/fixtures/public/javascripts/effects.js +0 -1
  370. data/test/fixtures/public/javascripts/prototype.js +0 -1
  371. data/test/fixtures/public/javascripts/robber.js +0 -1
  372. data/test/fixtures/public/javascripts/subdir/subdir.js +0 -1
  373. data/test/fixtures/public/javascripts/version.1.0.js +0 -1
  374. data/test/fixtures/public/stylesheets/bank.css +0 -1
  375. data/test/fixtures/public/stylesheets/robber.css +0 -1
  376. data/test/fixtures/public/stylesheets/subdir/subdir.css +0 -1
  377. data/test/fixtures/public/stylesheets/version.1.0.css +0 -1
  378. data/test/fixtures/quiz/questions/_question.html.erb +0 -1
  379. data/test/fixtures/replies.yml +0 -15
  380. data/test/fixtures/replies/_reply.erb +0 -1
  381. data/test/fixtures/reply.rb +0 -7
  382. data/test/fixtures/respond_to/all_types_with_layout.html.erb +0 -1
  383. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +0 -1
  384. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +0 -1
  385. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +0 -1
  386. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +0 -1
  387. data/test/fixtures/respond_to/layouts/missing.html.erb +0 -1
  388. data/test/fixtures/respond_to/layouts/standard.html.erb +0 -1
  389. data/test/fixtures/respond_to/layouts/standard.iphone.erb +0 -1
  390. data/test/fixtures/respond_to/using_defaults.html.erb +0 -1
  391. data/test/fixtures/respond_to/using_defaults.js.rjs +0 -1
  392. data/test/fixtures/respond_to/using_defaults.xml.builder +0 -1
  393. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +0 -1
  394. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +0 -1
  395. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +0 -1
  396. data/test/fixtures/scope/test/modgreet.erb +0 -1
  397. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +0 -10
  398. data/test/fixtures/shared.html.erb +0 -1
  399. data/test/fixtures/symlink_parent/symlinked_layout.erb +0 -5
  400. data/test/fixtures/test/_counter.html.erb +0 -1
  401. data/test/fixtures/test/_customer.erb +0 -1
  402. data/test/fixtures/test/_customer_counter.erb +0 -1
  403. data/test/fixtures/test/_customer_counter_with_as.erb +0 -1
  404. data/test/fixtures/test/_customer_greeting.erb +0 -1
  405. data/test/fixtures/test/_customer_with_var.erb +0 -1
  406. data/test/fixtures/test/_form.erb +0 -1
  407. data/test/fixtures/test/_from_helper.erb +0 -1
  408. data/test/fixtures/test/_hash_greeting.erb +0 -1
  409. data/test/fixtures/test/_hash_object.erb +0 -2
  410. data/test/fixtures/test/_hello.builder +0 -1
  411. data/test/fixtures/test/_labelling_form.erb +0 -1
  412. data/test/fixtures/test/_layout_for_block_with_args.html.erb +0 -3
  413. data/test/fixtures/test/_layout_for_partial.html.erb +0 -3
  414. data/test/fixtures/test/_local_inspector.html.erb +0 -1
  415. data/test/fixtures/test/_one.html.erb +0 -1
  416. data/test/fixtures/test/_partial.erb +0 -1
  417. data/test/fixtures/test/_partial.html.erb +0 -1
  418. data/test/fixtures/test/_partial.js.erb +0 -1
  419. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +0 -1
  420. data/test/fixtures/test/_partial_only.erb +0 -1
  421. data/test/fixtures/test/_partial_with_only_html_version.html.erb +0 -1
  422. data/test/fixtures/test/_person.erb +0 -2
  423. data/test/fixtures/test/_raise.html.erb +0 -1
  424. data/test/fixtures/test/_two.html.erb +0 -1
  425. data/test/fixtures/test/_utf8_partial.html.erb +0 -1
  426. data/test/fixtures/test/_utf8_partial_magic.html.erb +0 -2
  427. data/test/fixtures/test/action_talk_to_layout.erb +0 -2
  428. data/test/fixtures/test/array_translation.erb +0 -1
  429. data/test/fixtures/test/calling_partial_with_layout.html.erb +0 -1
  430. data/test/fixtures/test/capturing.erb +0 -4
  431. data/test/fixtures/test/content_for.erb +0 -2
  432. data/test/fixtures/test/content_for_concatenated.erb +0 -3
  433. data/test/fixtures/test/content_for_with_parameter.erb +0 -2
  434. data/test/fixtures/test/delete_with_js.rjs +0 -2
  435. data/test/fixtures/test/dont_pick_me +0 -1
  436. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +0 -1
  437. data/test/fixtures/test/enum_rjs_test.rjs +0 -6
  438. data/test/fixtures/test/formatted_html_erb.html.erb +0 -1
  439. data/test/fixtures/test/formatted_xml_erb.builder +0 -1
  440. data/test/fixtures/test/formatted_xml_erb.html.erb +0 -1
  441. data/test/fixtures/test/formatted_xml_erb.xml.erb +0 -1
  442. data/test/fixtures/test/greeting.erb +0 -1
  443. data/test/fixtures/test/greeting.js.rjs +0 -1
  444. data/test/fixtures/test/hello.builder +0 -4
  445. data/test/fixtures/test/hello_world.da.html.erb +0 -1
  446. data/test/fixtures/test/hello_world.erb +0 -1
  447. data/test/fixtures/test/hello_world.erb~ +0 -1
  448. data/test/fixtures/test/hello_world.pt-BR.html.erb +0 -1
  449. data/test/fixtures/test/hello_world_container.builder +0 -3
  450. data/test/fixtures/test/hello_world_from_rxml.builder +0 -4
  451. data/test/fixtures/test/hello_world_with_layout_false.erb +0 -1
  452. data/test/fixtures/test/hello_xml_world.builder +0 -11
  453. data/test/fixtures/test/hyphen-ated.erb +0 -1
  454. data/test/fixtures/test/implicit_content_type.atom.builder +0 -2
  455. data/test/fixtures/test/list.erb +0 -1
  456. data/test/fixtures/test/malformed/malformed.en.html.erb~ +0 -1
  457. data/test/fixtures/test/malformed/malformed.erb~ +0 -1
  458. data/test/fixtures/test/malformed/malformed.html.erb~ +0 -1
  459. data/test/fixtures/test/nested_layout.erb +0 -3
  460. data/test/fixtures/test/non_erb_block_content_for.builder +0 -4
  461. data/test/fixtures/test/potential_conflicts.erb +0 -4
  462. data/test/fixtures/test/render_explicit_html_template.js.rjs +0 -1
  463. data/test/fixtures/test/render_file_from_template.html.erb +0 -1
  464. data/test/fixtures/test/render_file_with_ivar.erb +0 -1
  465. data/test/fixtures/test/render_file_with_locals.erb +0 -1
  466. data/test/fixtures/test/render_implicit_html_template.js.rjs +0 -1
  467. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +0 -1
  468. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +0 -1
  469. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +0 -1
  470. data/test/fixtures/test/render_to_string_test.erb +0 -1
  471. data/test/fixtures/test/scoped_array_translation.erb +0 -1
  472. data/test/fixtures/test/sub_template_raise.html.erb +0 -1
  473. data/test/fixtures/test/template.erb +0 -1
  474. data/test/fixtures/test/translation.erb +0 -1
  475. data/test/fixtures/test/update_element_with_capture.erb +0 -9
  476. data/test/fixtures/test/using_layout_around_block.html.erb +0 -1
  477. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +0 -1
  478. data/test/fixtures/test/utf8.html.erb +0 -4
  479. data/test/fixtures/test/utf8_magic.html.erb +0 -5
  480. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +0 -5
  481. data/test/fixtures/topic.rb +0 -3
  482. data/test/fixtures/topics.yml +0 -22
  483. data/test/fixtures/topics/_topic.html.erb +0 -1
  484. data/test/template/active_record_helper_i18n_test.rb +0 -51
  485. data/test/template/active_record_helper_test.rb +0 -302
  486. data/test/template/asset_tag_helper_test.rb +0 -770
  487. data/test/template/atom_feed_helper_test.rb +0 -315
  488. data/test/template/benchmark_helper_test.rb +0 -86
  489. data/test/template/compiled_templates_test.rb +0 -204
  490. data/test/template/date_helper_i18n_test.rb +0 -121
  491. data/test/template/date_helper_test.rb +0 -2603
  492. data/test/template/erb_util_test.rb +0 -36
  493. data/test/template/form_helper_test.rb +0 -1447
  494. data/test/template/form_options_helper_i18n_test.rb +0 -27
  495. data/test/template/form_options_helper_test.rb +0 -811
  496. data/test/template/form_tag_helper_test.rb +0 -356
  497. data/test/template/javascript_helper_test.rb +0 -106
  498. data/test/template/number_helper_i18n_test.rb +0 -69
  499. data/test/template/number_helper_test.rb +0 -132
  500. data/test/template/prototype_helper_test.rb +0 -639
  501. data/test/template/raw_output_helper_test.rb +0 -21
  502. data/test/template/record_tag_helper_test.rb +0 -58
  503. data/test/template/render_test.rb +0 -329
  504. data/test/template/sanitize_helper_test.rb +0 -57
  505. data/test/template/scriptaculous_helper_test.rb +0 -90
  506. data/test/template/tag_helper_test.rb +0 -98
  507. data/test/template/template_test.rb +0 -32
  508. data/test/template/test_test.rb +0 -54
  509. data/test/template/text_helper_test.rb +0 -601
  510. data/test/template/translation_helper_test.rb +0 -95
  511. data/test/template/url_helper_test.rb +0 -641
  512. data/test/testing_sandbox.rb +0 -15
  513. data/test/view/test_case_test.rb +0 -176
@@ -1,4 +1,6 @@
1
- module ActionController
1
+ require 'action_controller/vendor/html-scanner'
2
+
3
+ module ActionDispatch
2
4
  module Assertions
3
5
  # Pair of assertions to testing elements in the HTML output of the response.
4
6
  module TagAssertions
@@ -76,10 +78,10 @@ module ActionController
76
78
  # # Assert that there is a "span" containing between 2 and 4 "em" tags
77
79
  # # as immediate children
78
80
  # assert_tag :tag => "span",
79
- # :children => { :count => 2..4, :only => { :tag => "em" } }
81
+ # :children => { :count => 2..4, :only => { :tag => "em" } }
80
82
  #
81
83
  # # Get funky: assert that there is a "div", with an "ul" ancestor
82
- # # and an "li" parent (with "class" = "enum"), and containing a
84
+ # # and an "li" parent (with "class" = "enum"), and containing a
83
85
  # # "span" descendant that contains text matching /hello world/
84
86
  # assert_tag :tag => "div",
85
87
  # :ancestor => { :tag => "ul" },
@@ -94,13 +96,11 @@ module ActionController
94
96
  # that allow optional closing tags (p, li, td). <em>You must explicitly
95
97
  # close all of your tags to use these assertions.</em>
96
98
  def assert_tag(*opts)
97
- clean_backtrace do
98
- opts = opts.size > 1 ? opts.last.merge({ :tag => opts.first.to_s }) : opts.first
99
- tag = find_tag(opts)
100
- assert tag, "expected tag, but no tag found matching #{opts.inspect} in:\n#{@response.body.inspect}"
101
- end
99
+ opts = opts.size > 1 ? opts.last.merge({ :tag => opts.first.to_s }) : opts.first
100
+ tag = find_tag(opts)
101
+ assert tag, "expected tag, but no tag found matching #{opts.inspect} in:\n#{@response.body.inspect}"
102
102
  end
103
-
103
+
104
104
  # Identical to +assert_tag+, but asserts that a matching tag does _not_
105
105
  # exist. (See +assert_tag+ for a full discussion of the syntax.)
106
106
  #
@@ -116,11 +116,22 @@ module ActionController
116
116
  # assert_no_tag :tag => "p",
117
117
  # :children => { :count => 1..3, :only => { :tag => "img" } }
118
118
  def assert_no_tag(*opts)
119
- clean_backtrace do
120
- opts = opts.size > 1 ? opts.last.merge({ :tag => opts.first.to_s }) : opts.first
121
- tag = find_tag(opts)
122
- assert !tag, "expected no tag, but found tag matching #{opts.inspect} in:\n#{@response.body.inspect}"
123
- end
119
+ opts = opts.size > 1 ? opts.last.merge({ :tag => opts.first.to_s }) : opts.first
120
+ tag = find_tag(opts)
121
+ assert !tag, "expected no tag, but found tag matching #{opts.inspect} in:\n#{@response.body.inspect}"
122
+ end
123
+
124
+ def find_tag(conditions)
125
+ html_document.find(conditions)
126
+ end
127
+
128
+ def find_all_tag(conditions)
129
+ html_document.find_all(conditions)
130
+ end
131
+
132
+ def html_document
133
+ xml = @response.content_type =~ /xml$/
134
+ @html_document ||= HTML::Document.new(@response.body, false, xml)
124
135
  end
125
136
  end
126
137
  end
@@ -1,10 +1,118 @@
1
1
  require 'stringio'
2
2
  require 'uri'
3
- require 'active_support/test_case'
4
- require 'action_controller/rack_lint_patch'
3
+ require 'active_support/core_ext/object/metaclass'
4
+ require 'rack/test'
5
5
 
6
- module ActionController
6
+ module ActionDispatch
7
7
  module Integration #:nodoc:
8
+ module RequestHelpers
9
+ # Performs a GET request with the given parameters.
10
+ #
11
+ # - +path+: The URI (as a String) on which you want to perform a GET
12
+ # request.
13
+ # - +parameters+: The HTTP parameters that you want to pass. This may
14
+ # be +nil+,
15
+ # a Hash, or a String that is appropriately encoded
16
+ # (<tt>application/x-www-form-urlencoded</tt> or
17
+ # <tt>multipart/form-data</tt>).
18
+ # - +headers+: Additional HTTP headers to pass, as a Hash. The keys will
19
+ # automatically be upcased, with the prefix 'HTTP_' added if needed.
20
+ #
21
+ # This method returns an Response object, which one can use to
22
+ # inspect the details of the response. Furthermore, if this method was
23
+ # called from an ActionDispatch::IntegrationTest object, then that
24
+ # object's <tt>@response</tt> instance variable will point to the same
25
+ # response object.
26
+ #
27
+ # You can also perform POST, PUT, DELETE, and HEAD requests with +post+,
28
+ # +put+, +delete+, and +head+.
29
+ def get(path, parameters = nil, headers = nil)
30
+ process :get, path, parameters, headers
31
+ end
32
+
33
+ # Performs a POST request with the given parameters. See get() for more
34
+ # details.
35
+ def post(path, parameters = nil, headers = nil)
36
+ process :post, path, parameters, headers
37
+ end
38
+
39
+ # Performs a PUT request with the given parameters. See get() for more
40
+ # details.
41
+ def put(path, parameters = nil, headers = nil)
42
+ process :put, path, parameters, headers
43
+ end
44
+
45
+ # Performs a DELETE request with the given parameters. See get() for
46
+ # more details.
47
+ def delete(path, parameters = nil, headers = nil)
48
+ process :delete, path, parameters, headers
49
+ end
50
+
51
+ # Performs a HEAD request with the given parameters. See get() for more
52
+ # details.
53
+ def head(path, parameters = nil, headers = nil)
54
+ process :head, path, parameters, headers
55
+ end
56
+
57
+ # Performs an XMLHttpRequest request with the given parameters, mirroring
58
+ # a request from the Prototype library.
59
+ #
60
+ # The request_method is :get, :post, :put, :delete or :head; the
61
+ # parameters are +nil+, a hash, or a url-encoded or multipart string;
62
+ # the headers are a hash. Keys are automatically upcased and prefixed
63
+ # with 'HTTP_' if not already.
64
+ def xml_http_request(request_method, path, parameters = nil, headers = nil)
65
+ headers ||= {}
66
+ headers['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
67
+ headers['HTTP_ACCEPT'] ||= [Mime::JS, Mime::HTML, Mime::XML, 'text/xml', Mime::ALL].join(', ')
68
+ process(request_method, path, parameters, headers)
69
+ end
70
+ alias xhr :xml_http_request
71
+
72
+ # Follow a single redirect response. If the last response was not a
73
+ # redirect, an exception will be raised. Otherwise, the redirect is
74
+ # performed on the location header.
75
+ def follow_redirect!
76
+ raise "not a redirect! #{status} #{status_message}" unless redirect?
77
+ get(response.location)
78
+ status
79
+ end
80
+
81
+ # Performs a request using the specified method, following any subsequent
82
+ # redirect. Note that the redirects are followed until the response is
83
+ # not a redirect--this means you may run into an infinite loop if your
84
+ # redirect loops back to itself.
85
+ def request_via_redirect(http_method, path, parameters = nil, headers = nil)
86
+ process(http_method, path, parameters, headers)
87
+ follow_redirect! while redirect?
88
+ status
89
+ end
90
+
91
+ # Performs a GET request, following any subsequent redirect.
92
+ # See +request_via_redirect+ for more information.
93
+ def get_via_redirect(path, parameters = nil, headers = nil)
94
+ request_via_redirect(:get, path, parameters, headers)
95
+ end
96
+
97
+ # Performs a POST request, following any subsequent redirect.
98
+ # See +request_via_redirect+ for more information.
99
+ def post_via_redirect(path, parameters = nil, headers = nil)
100
+ request_via_redirect(:post, path, parameters, headers)
101
+ end
102
+
103
+ # Performs a PUT request, following any subsequent redirect.
104
+ # See +request_via_redirect+ for more information.
105
+ def put_via_redirect(path, parameters = nil, headers = nil)
106
+ request_via_redirect(:put, path, parameters, headers)
107
+ end
108
+
109
+ # Performs a DELETE request, following any subsequent redirect.
110
+ # See +request_via_redirect+ for more information.
111
+ def delete_via_redirect(path, parameters = nil, headers = nil)
112
+ request_via_redirect(:delete, path, parameters, headers)
113
+ end
114
+ end
115
+
8
116
  # An integration Session instance represents a set of requests and responses
9
117
  # performed sequentially by some virtual user. Because you can instantiate
10
118
  # multiple sessions and run them side-by-side, you can also mimic (to some
@@ -14,24 +122,18 @@ module ActionController
14
122
  # IntegrationTest#open_session, rather than instantiating
15
123
  # Integration::Session directly.
16
124
  class Session
17
- include Test::Unit::Assertions
18
- include ActionController::TestCase::Assertions
19
- include ActionController::TestProcess
20
-
21
- # Rack application to use
22
- attr_accessor :application
125
+ DEFAULT_HOST = "www.example.com"
23
126
 
24
- # The integer HTTP status code of the last request.
25
- attr_reader :status
26
-
27
- # The status message that accompanied the status code of the last request.
28
- attr_reader :status_message
127
+ include Test::Unit::Assertions
128
+ include TestProcess, RequestHelpers, Assertions
29
129
 
30
- # The body of the last request.
31
- attr_reader :body
130
+ %w( status status_message headers body redirect? ).each do |method|
131
+ delegate method, :to => :response, :allow_nil => true
132
+ end
32
133
 
33
- # The URI of the last request.
34
- attr_reader :path
134
+ %w( path ).each do |method|
135
+ delegate method, :to => :request, :allow_nil => true
136
+ end
35
137
 
36
138
  # The hostname used in the last request.
37
139
  attr_accessor :host
@@ -44,10 +146,9 @@ module ActionController
44
146
 
45
147
  # A map of the cookies returned by the last response, and which will be
46
148
  # sent with the next request.
47
- attr_reader :cookies
48
-
49
- # A map of the headers returned by the last response.
50
- attr_reader :headers
149
+ def cookies
150
+ @mock_session.cookie_jar
151
+ end
51
152
 
52
153
  # A reference to the controller instance used by the last request.
53
154
  attr_reader :controller
@@ -61,12 +162,9 @@ module ActionController
61
162
  # A running counter of the number of requests processed.
62
163
  attr_accessor :request_count
63
164
 
64
- class MultiPartNeededException < Exception
65
- end
66
-
67
165
  # Create and initialize a new Session instance.
68
- def initialize(app = nil)
69
- @application = app || ActionController::Dispatcher.new
166
+ def initialize(app)
167
+ @app = app
70
168
  reset!
71
169
  end
72
170
 
@@ -76,14 +174,12 @@ module ActionController
76
174
  #
77
175
  # session.reset!
78
176
  def reset!
79
- @status = @path = @headers = nil
80
- @result = @status_message = nil
81
177
  @https = false
82
- @cookies = {}
178
+ @mock_session = Rack::MockSession.new(@app, DEFAULT_HOST)
83
179
  @controller = @request = @response = nil
84
180
  @request_count = 0
85
181
 
86
- self.host = "www.example.com"
182
+ self.host = DEFAULT_HOST
87
183
  self.remote_addr = "127.0.0.1"
88
184
  self.accept = "text/xml,application/xml,application/xhtml+xml," +
89
185
  "text/html;q=0.9,text/plain;q=0.8,image/png," +
@@ -91,12 +187,12 @@ module ActionController
91
187
 
92
188
  unless defined? @named_routes_configured
93
189
  # install the named routes in this session instance.
94
- klass = class << self; self; end
95
- Routing::Routes.install_helpers(klass)
190
+ klass = metaclass
191
+ ActionController::Routing::Routes.install_helpers(klass)
96
192
 
97
193
  # the helpers are made protected by default--we make them public for
98
194
  # easier access during testing and troubleshooting.
99
- klass.module_eval { public *Routing::Routes.named_routes.helpers }
195
+ klass.module_eval { public *ActionController::Routing::Routes.named_routes.helpers }
100
196
  @named_routes_configured = true
101
197
  end
102
198
  end
@@ -125,117 +221,6 @@ module ActionController
125
221
  @host = name
126
222
  end
127
223
 
128
- # Follow a single redirect response. If the last response was not a
129
- # redirect, an exception will be raised. Otherwise, the redirect is
130
- # performed on the location header.
131
- def follow_redirect!
132
- raise "not a redirect! #{@status} #{@status_message}" unless redirect?
133
- get(interpret_uri(headers['location']))
134
- status
135
- end
136
-
137
- # Performs a request using the specified method, following any subsequent
138
- # redirect. Note that the redirects are followed until the response is
139
- # not a redirect--this means you may run into an infinite loop if your
140
- # redirect loops back to itself.
141
- def request_via_redirect(http_method, path, parameters = nil, headers = nil)
142
- send(http_method, path, parameters, headers)
143
- follow_redirect! while redirect?
144
- status
145
- end
146
-
147
- # Performs a GET request, following any subsequent redirect.
148
- # See +request_via_redirect+ for more information.
149
- def get_via_redirect(path, parameters = nil, headers = nil)
150
- request_via_redirect(:get, path, parameters, headers)
151
- end
152
-
153
- # Performs a POST request, following any subsequent redirect.
154
- # See +request_via_redirect+ for more information.
155
- def post_via_redirect(path, parameters = nil, headers = nil)
156
- request_via_redirect(:post, path, parameters, headers)
157
- end
158
-
159
- # Performs a PUT request, following any subsequent redirect.
160
- # See +request_via_redirect+ for more information.
161
- def put_via_redirect(path, parameters = nil, headers = nil)
162
- request_via_redirect(:put, path, parameters, headers)
163
- end
164
-
165
- # Performs a DELETE request, following any subsequent redirect.
166
- # See +request_via_redirect+ for more information.
167
- def delete_via_redirect(path, parameters = nil, headers = nil)
168
- request_via_redirect(:delete, path, parameters, headers)
169
- end
170
-
171
- # Returns +true+ if the last response was a redirect.
172
- def redirect?
173
- status/100 == 3
174
- end
175
-
176
- # Performs a GET request with the given parameters.
177
- #
178
- # - +path+: The URI (as a String) on which you want to perform a GET
179
- # request.
180
- # - +parameters+: The HTTP parameters that you want to pass. This may
181
- # be +nil+,
182
- # a Hash, or a String that is appropriately encoded
183
- # (<tt>application/x-www-form-urlencoded</tt> or
184
- # <tt>multipart/form-data</tt>).
185
- # - +headers+: Additional HTTP headers to pass, as a Hash. The keys will
186
- # automatically be upcased, with the prefix 'HTTP_' added if needed.
187
- #
188
- # This method returns an Response object, which one can use to
189
- # inspect the details of the response. Furthermore, if this method was
190
- # called from an ActionController::IntegrationTest object, then that
191
- # object's <tt>@response</tt> instance variable will point to the same
192
- # response object.
193
- #
194
- # You can also perform POST, PUT, DELETE, and HEAD requests with +post+,
195
- # +put+, +delete+, and +head+.
196
- def get(path, parameters = nil, headers = nil)
197
- process :get, path, parameters, headers
198
- end
199
-
200
- # Performs a POST request with the given parameters. See get() for more
201
- # details.
202
- def post(path, parameters = nil, headers = nil)
203
- process :post, path, parameters, headers
204
- end
205
-
206
- # Performs a PUT request with the given parameters. See get() for more
207
- # details.
208
- def put(path, parameters = nil, headers = nil)
209
- process :put, path, parameters, headers
210
- end
211
-
212
- # Performs a DELETE request with the given parameters. See get() for
213
- # more details.
214
- def delete(path, parameters = nil, headers = nil)
215
- process :delete, path, parameters, headers
216
- end
217
-
218
- # Performs a HEAD request with the given parameters. See get() for more
219
- # details.
220
- def head(path, parameters = nil, headers = nil)
221
- process :head, path, parameters, headers
222
- end
223
-
224
- # Performs an XMLHttpRequest request with the given parameters, mirroring
225
- # a request from the Prototype library.
226
- #
227
- # The request_method is :get, :post, :put, :delete or :head; the
228
- # parameters are +nil+, a hash, or a url-encoded or multipart string;
229
- # the headers are a hash. Keys are automatically upcased and prefixed
230
- # with 'HTTP_' if not already.
231
- def xml_http_request(request_method, path, parameters = nil, headers = nil)
232
- headers ||= {}
233
- headers['X-Requested-With'] = 'XMLHttpRequest'
234
- headers['Accept'] ||= [Mime::JS, Mime::HTML, Mime::XML, 'text/xml', Mime::ALL].join(', ')
235
- process(request_method, path, parameters, headers)
236
- end
237
- alias xhr :xml_http_request
238
-
239
224
  # Returns the URL for the given options, according to the rules specified
240
225
  # in the application's routes.
241
226
  def url_for(options)
@@ -245,135 +230,55 @@ module ActionController
245
230
  end
246
231
 
247
232
  private
248
- # Tailors the session based on the given URI, setting the HTTPS value
249
- # and the hostname.
250
- def interpret_uri(path)
251
- location = URI.parse(path)
252
- https! URI::HTTPS === location if location.scheme
253
- host! location.host if location.host
254
- location.query ? "#{location.path}?#{location.query}" : location.path
255
- end
256
233
 
257
234
  # Performs the actual request.
258
- def process(method, path, parameters = nil, headers = nil)
259
- data = requestify(parameters)
260
- path = interpret_uri(path) if path =~ %r{://}
261
- path = "/#{path}" unless path[0] == ?/
262
- @path = path
263
- env = {}
264
-
265
- if method == :get
266
- env["QUERY_STRING"] = data
267
- data = nil
235
+ def process(method, path, parameters = nil, rack_environment = nil)
236
+ if path =~ %r{://}
237
+ location = URI.parse(path)
238
+ https! URI::HTTPS === location if location.scheme
239
+ host! location.host if location.host
240
+ path = location.query ? "#{location.path}?#{location.query}" : location.path
268
241
  end
269
242
 
270
- env["QUERY_STRING"] ||= ""
243
+ unless ActionController::Base < ActionController::Testing
244
+ ActionController::Base.class_eval do
245
+ include ActionController::Testing
246
+ end
247
+ end
271
248
 
272
- data ||= ''
273
- data.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
274
- data = data.is_a?(IO) ? data : StringIO.new(data)
249
+ env = {
250
+ :method => method,
251
+ :params => parameters,
275
252
 
276
- env.update(
277
- "REQUEST_METHOD" => method.to_s.upcase,
278
253
  "SERVER_NAME" => host,
279
254
  "SERVER_PORT" => (https? ? "443" : "80"),
280
255
  "HTTPS" => https? ? "on" : "off",
281
256
  "rack.url_scheme" => https? ? "https" : "http",
282
- "SCRIPT_NAME" => "",
283
257
 
284
258
  "REQUEST_URI" => path,
285
- "PATH_INFO" => path,
286
259
  "HTTP_HOST" => host,
287
260
  "REMOTE_ADDR" => remote_addr,
288
261
  "CONTENT_TYPE" => "application/x-www-form-urlencoded",
289
- "CONTENT_LENGTH" => data ? data.length.to_s : nil,
290
262
  "HTTP_ACCEPT" => accept,
291
263
 
292
- "rack.version" => [0,1],
293
- "rack.input" => data,
294
- "rack.errors" => StringIO.new,
295
- "rack.multithread" => true,
296
- "rack.multiprocess" => true,
297
- "rack.run_once" => false
298
- )
299
-
300
- env['HTTP_COOKIE'] = encode_cookies if cookies.any?
264
+ "action_dispatch.show_exceptions" => false
265
+ }
301
266
 
302
- (headers || {}).each do |key, value|
303
- key = key.to_s.upcase.gsub(/-/, "_")
304
- key = "HTTP_#{key}" unless env.has_key?(key) || key =~ /^HTTP_/
267
+ (rack_environment || {}).each do |key, value|
305
268
  env[key] = value
306
269
  end
307
270
 
308
- [ControllerCapture, ActionController::ProcessWithTest].each do |mod|
309
- unless ActionController::Base < mod
310
- ActionController::Base.class_eval { include mod }
311
- end
312
- end
313
-
314
- ActionController::Base.clear_last_instantiation!
271
+ session = Rack::Test::Session.new(@mock_session)
272
+ session.request(path, env)
315
273
 
316
- app = Rack::Lint.new(@application)
317
- status, headers, body = app.call(env)
318
274
  @request_count += 1
319
-
275
+ @request = ActionDispatch::Request.new(session.last_request.env)
276
+ @response = ActionDispatch::TestResponse.from_response(@mock_session.last_response)
320
277
  @html_document = nil
321
278
 
322
- @status = status.to_i
323
- @status_message = StatusCodes::STATUS_CODES[@status]
324
-
325
- @headers = Rack::Utils::HeaderHash.new(headers)
326
-
327
- cookies = @headers['Set-Cookie']
328
- cookies = cookies.to_s.split("\n") unless cookies.is_a?(Array)
329
- cookies.each do |cookie|
330
- name, value = cookie.match(/^([^=]*)=([^;]*);/)[1,2]
331
- @cookies[name] = value
332
- end
333
-
334
- @body = ""
335
- if body.respond_to?(:to_str)
336
- @body << body
337
- else
338
- body.each { |part| @body << part }
339
- end
340
-
341
- if @controller = ActionController::Base.last_instantiation
342
- @request = @controller.request
343
- @response = @controller.response
344
- @controller.send(:set_test_assigns)
345
- else
346
- # Decorate responses from Rack Middleware and Rails Metal
347
- # as an Response for the purposes of integration testing
348
- @response = Response.new
349
- @response.status = status.to_s
350
- @response.headers.replace(@headers)
351
- @response.body = @body
352
- end
353
-
354
- # Decorate the response with the standard behavior of the
355
- # TestResponse so that things like assert_response can be
356
- # used in integration tests.
357
- @response.extend(TestResponseBehavior)
358
-
359
- body.close if body.respond_to?(:close)
360
-
361
- return @status
362
- rescue MultiPartNeededException
363
- boundary = "----------XnJLe9ZIbbGUYtzPQJ16u1"
364
- status = process(method, path,
365
- multipart_body(parameters, boundary),
366
- (headers || {}).merge(
367
- {"CONTENT_TYPE" => "multipart/form-data; boundary=#{boundary}"}))
368
- return status
369
- end
279
+ @controller = session.last_request.env['action_controller.instance']
370
280
 
371
- # Encode the cookies hash in a format suitable for passing to a
372
- # request.
373
- def encode_cookies
374
- cookies.inject("") do |string, (name, value)|
375
- string << "#{name}=#{value}; "
376
- end
281
+ return response.status
377
282
  end
378
283
 
379
284
  # Get a temporary URL writer object
@@ -386,118 +291,13 @@ module ActionController
386
291
  "SERVER_PORT" => https? ? "443" : "80",
387
292
  "HTTPS" => https? ? "on" : "off"
388
293
  }
389
- UrlRewriter.new(Request.new(env), {})
390
- end
391
-
392
- def name_with_prefix(prefix, name)
393
- prefix ? "#{prefix}[#{name}]" : name.to_s
294
+ ActionController::UrlRewriter.new(ActionDispatch::Request.new(env), {})
394
295
  end
395
-
396
- # Convert the given parameters to a request string. The parameters may
397
- # be a string, +nil+, or a Hash.
398
- def requestify(parameters, prefix=nil)
399
- if TestUploadedFile === parameters
400
- raise MultiPartNeededException
401
- elsif Hash === parameters
402
- return nil if parameters.empty?
403
- parameters.map { |k,v|
404
- requestify(v, name_with_prefix(prefix, k))
405
- }.join("&")
406
- elsif Array === parameters
407
- parameters.map { |v|
408
- requestify(v, name_with_prefix(prefix, ""))
409
- }.join("&")
410
- elsif prefix.nil?
411
- parameters
412
- else
413
- "#{CGI.escape(prefix)}=#{CGI.escape(parameters.to_s)}"
414
- end
415
- end
416
-
417
- def multipart_requestify(params, first=true)
418
- Array.new.tap do |p|
419
- params.each do |key, value|
420
- k = first ? key.to_s : "[#{key.to_s}]"
421
- if Hash === value
422
- multipart_requestify(value, false).each do |subkey, subvalue|
423
- p << [k + subkey, subvalue]
424
- end
425
- elsif Array === value
426
- value.each do |element|
427
- if Hash === element || Array === element
428
- multipart_requestify(element, false).each do |subkey, subvalue|
429
- p << ["#{k}[]#{subkey}", subvalue]
430
- end
431
- else
432
- p << ["#{k}[]", element]
433
- end
434
- end
435
- else
436
- p << [k, value]
437
- end
438
- end
439
- end
440
- end
441
-
442
- def multipart_body(params, boundary)
443
- multipart_requestify(params).map do |key, value|
444
- if value.respond_to?(:original_filename)
445
- File.open(value.path, "rb") do |f|
446
- f.set_encoding(Encoding::BINARY) if f.respond_to?(:set_encoding)
447
-
448
- <<-EOF
449
- --#{boundary}\r
450
- Content-Disposition: form-data; name="#{key}"; filename="#{CGI.escape(value.original_filename)}"\r
451
- Content-Type: #{value.content_type}\r
452
- Content-Length: #{File.stat(value.path).size}\r
453
- \r
454
- #{f.read}\r
455
- EOF
456
- end
457
- else
458
- <<-EOF
459
- --#{boundary}\r
460
- Content-Disposition: form-data; name="#{key}"\r
461
- \r
462
- #{value}\r
463
- EOF
464
- end
465
- end.join("")+"--#{boundary}--\r"
466
- end
467
-
468
- end
469
-
470
- # A module used to extend ActionController::Base, so that integration tests
471
- # can capture the controller used to satisfy a request.
472
- module ControllerCapture #:nodoc:
473
- def self.included(base)
474
- base.extend(ClassMethods)
475
- base.class_eval do
476
- class << self
477
- alias_method_chain :new, :capture
478
- end
479
- end
480
- end
481
-
482
- module ClassMethods #:nodoc:
483
- mattr_accessor :last_instantiation
484
-
485
- def clear_last_instantiation!
486
- self.last_instantiation = nil
487
- end
488
-
489
- def new_with_capture(*args)
490
- controller = new_without_capture(*args)
491
- self.last_instantiation ||= controller
492
- controller
493
- end
494
- end
495
296
  end
496
297
 
497
298
  module Runner
498
- def initialize(*args)
499
- super
500
- @integration_session = nil
299
+ def app
300
+ @app
501
301
  end
502
302
 
503
303
  # Reset the current session. This is useful for testing multiple sessions
@@ -512,7 +312,7 @@ EOF
512
312
  reset! unless @integration_session
513
313
  # reset the html_document variable, but only for new get/post calls
514
314
  @html_document = nil unless %w(cookies assigns).include?(method)
515
- @integration_session.__send__(method, *args).tap do
315
+ returning @integration_session.__send__(method, *args) do
516
316
  copy_session_variables!
517
317
  end
518
318
  end
@@ -528,15 +328,15 @@ EOF
528
328
  # By default, a single session is automatically created for you, but you
529
329
  # can use this method to open multiple sessions that ought to be tested
530
330
  # simultaneously.
531
- def open_session(application = nil)
532
- session = Integration::Session.new(application)
331
+ def open_session(app = nil)
332
+ session = Integration::Session.new(app || self.app)
533
333
 
534
334
  # delegate the fixture accessors back to the test instance
535
335
  extras = Module.new { attr_accessor :delegate, :test_result }
536
336
  if self.class.respond_to?(:fixture_table_names)
537
337
  self.class.fixture_table_names.each do |table_name|
538
338
  name = table_name.tr(".", "_")
539
- next unless respond_to?(name, true)
339
+ next unless respond_to?(name)
540
340
  extras.__send__(:define_method, name) { |*args|
541
341
  delegate.send(name, *args)
542
342
  }
@@ -568,7 +368,7 @@ EOF
568
368
  def method_missing(sym, *args, &block)
569
369
  reset! unless @integration_session
570
370
  if @integration_session.respond_to?(sym)
571
- @integration_session.__send__(sym, *args, &block).tap do
371
+ returning @integration_session.__send__(sym, *args, &block) do
572
372
  copy_session_variables!
573
373
  end
574
374
  else
@@ -586,7 +386,7 @@ EOF
586
386
  # At its simplest, you simply extend IntegrationTest and write your tests
587
387
  # using the get/post methods:
588
388
  #
589
- # require "#{File.dirname(__FILE__)}/test_helper"
389
+ # require "test_helper"
590
390
  #
591
391
  # class ExampleTest < ActionController::IntegrationTest
592
392
  # fixtures :people
@@ -610,7 +410,7 @@ EOF
610
410
  # powerful testing DSL that is specific for your application. You can even
611
411
  # reference any named routes you happen to have defined!
612
412
  #
613
- # require "#{File.dirname(__FILE__)}/test_helper"
413
+ # require "test_helper"
614
414
  #
615
415
  # class AdvancedTest < ActionController::IntegrationTest
616
416
  # fixtures :people, :rooms
@@ -656,53 +456,20 @@ EOF
656
456
  class IntegrationTest < ActiveSupport::TestCase
657
457
  include Integration::Runner
658
458
 
659
- # Work around a bug in test/unit caused by the default test being named
660
- # as a symbol (:default_test), which causes regex test filters
661
- # (like "ruby test.rb -n /foo/") to fail because =~ doesn't work on
662
- # symbols.
663
- def initialize(name) #:nodoc:
664
- super(name.to_s)
665
- end
459
+ @@app = nil
666
460
 
667
- # Work around test/unit's requirement that every subclass of TestCase have
668
- # at least one test method. Note that this implementation extends to all
669
- # subclasses, as well, so subclasses of IntegrationTest may also exist
670
- # without any test methods.
671
- def run(*args) #:nodoc:
672
- return if @method_name == "default_test"
673
- super
461
+ def self.app
462
+ # DEPRECATE Rails application fallback
463
+ # This should be set by the initializer
464
+ @@app || (defined?(Rails.application) && Rails.application) || nil
674
465
  end
675
466
 
676
- # Because of how use_instantiated_fixtures and use_transactional_fixtures
677
- # are defined, we need to treat them as special cases. Otherwise, users
678
- # would potentially have to set their values for both Test::Unit::TestCase
679
- # ActionController::IntegrationTest, since by the time the value is set on
680
- # TestCase, IntegrationTest has already been defined and cannot inherit
681
- # changes to those variables. So, we make those two attributes
682
- # copy-on-write.
683
-
684
- class << self
685
- def use_transactional_fixtures=(flag) #:nodoc:
686
- @_use_transactional_fixtures = true
687
- @use_transactional_fixtures = flag
688
- end
689
-
690
- def use_instantiated_fixtures=(flag) #:nodoc:
691
- @_use_instantiated_fixtures = true
692
- @use_instantiated_fixtures = flag
693
- end
694
-
695
- def use_transactional_fixtures #:nodoc:
696
- @_use_transactional_fixtures ?
697
- @use_transactional_fixtures :
698
- superclass.use_transactional_fixtures
699
- end
467
+ def self.app=(app)
468
+ @@app = app
469
+ end
700
470
 
701
- def use_instantiated_fixtures #:nodoc:
702
- @_use_instantiated_fixtures ?
703
- @use_instantiated_fixtures :
704
- superclass.use_instantiated_fixtures
705
- end
471
+ def app
472
+ super || self.class.app
706
473
  end
707
474
  end
708
475
  end