actionpack-rack-upgrade 2.3.14

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 (441) hide show
  1. data/CHANGELOG +5250 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +158 -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 +169 -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 +1425 -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 +197 -0
  27. data/lib/action_controller/dispatcher.rb +133 -0
  28. data/lib/action_controller/failsafe.rb +87 -0
  29. data/lib/action_controller/filters.rb +680 -0
  30. data/lib/action_controller/flash.rb +213 -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 +708 -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 +495 -0
  48. data/lib/action_controller/request_forgery_protection.rb +116 -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 +237 -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 +503 -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 +276 -0
  61. data/lib/action_controller/session/cookie_store.rb +240 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +60 -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 +229 -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/helpers/active_record_helper.rb +305 -0
  93. data/lib/action_view/helpers/asset_tag_helper.rb +695 -0
  94. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  95. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  96. data/lib/action_view/helpers/cache_helper.rb +39 -0
  97. data/lib/action_view/helpers/capture_helper.rb +136 -0
  98. data/lib/action_view/helpers/csrf_helper.rb +14 -0
  99. data/lib/action_view/helpers/date_helper.rb +989 -0
  100. data/lib/action_view/helpers/debug_helper.rb +38 -0
  101. data/lib/action_view/helpers/form_helper.rb +1118 -0
  102. data/lib/action_view/helpers/form_options_helper.rb +599 -0
  103. data/lib/action_view/helpers/form_tag_helper.rb +490 -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 +251 -0
  111. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  112. data/lib/action_view/helpers/tag_helper.rb +151 -0
  113. data/lib/action_view/helpers/text_helper.rb +597 -0
  114. data/lib/action_view/helpers/translation_helper.rb +67 -0
  115. data/lib/action_view/helpers/url_helper.rb +637 -0
  116. data/lib/action_view/helpers.rb +61 -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 +241 -0
  120. data/lib/action_view/paths.rb +77 -0
  121. data/lib/action_view/reloadable_template.rb +117 -0
  122. data/lib/action_view/renderable.rb +109 -0
  123. data/lib/action_view/renderable_partial.rb +53 -0
  124. data/lib/action_view/template.rb +252 -0
  125. data/lib/action_view/template_error.rb +99 -0
  126. data/lib/action_view/template_handler.rb +34 -0
  127. data/lib/action_view/template_handlers/builder.rb +17 -0
  128. data/lib/action_view/template_handlers/erb.rb +25 -0
  129. data/lib/action_view/template_handlers/rjs.rb +13 -0
  130. data/lib/action_view/template_handlers.rb +48 -0
  131. data/lib/action_view/test_case.rb +162 -0
  132. data/lib/action_view.rb +58 -0
  133. data/lib/actionpack.rb +2 -0
  134. data/test/abstract_unit.rb +78 -0
  135. data/test/active_record_unit.rb +104 -0
  136. data/test/activerecord/active_record_store_test.rb +221 -0
  137. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  138. data/test/adv_attr_test.rb +20 -0
  139. data/test/controller/action_pack_assertions_test.rb +545 -0
  140. data/test/controller/addresses_render_test.rb +37 -0
  141. data/test/controller/assert_select_test.rb +735 -0
  142. data/test/controller/base_test.rb +217 -0
  143. data/test/controller/benchmark_test.rb +32 -0
  144. data/test/controller/caching_test.rb +743 -0
  145. data/test/controller/capture_test.rb +66 -0
  146. data/test/controller/content_type_test.rb +178 -0
  147. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  148. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  150. data/test/controller/cookie_test.rb +208 -0
  151. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  152. data/test/controller/dispatcher_test.rb +144 -0
  153. data/test/controller/dom_assertions_test.rb +53 -0
  154. data/test/controller/failsafe_test.rb +60 -0
  155. data/test/controller/fake_controllers.rb +33 -0
  156. data/test/controller/fake_models.rb +19 -0
  157. data/test/controller/filter_params_test.rb +52 -0
  158. data/test/controller/filters_test.rb +885 -0
  159. data/test/controller/flash_test.rb +174 -0
  160. data/test/controller/header_test.rb +14 -0
  161. data/test/controller/helper_test.rb +224 -0
  162. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  163. data/test/controller/html-scanner/document_test.rb +148 -0
  164. data/test/controller/html-scanner/node_test.rb +89 -0
  165. data/test/controller/html-scanner/sanitizer_test.rb +281 -0
  166. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  167. data/test/controller/html-scanner/text_node_test.rb +50 -0
  168. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  169. data/test/controller/http_basic_authentication_test.rb +113 -0
  170. data/test/controller/http_digest_authentication_test.rb +254 -0
  171. data/test/controller/integration_test.rb +526 -0
  172. data/test/controller/layout_test.rb +215 -0
  173. data/test/controller/localized_templates_test.rb +24 -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/output_escaping_test.rb +19 -0
  179. data/test/controller/polymorphic_routes_test.rb +297 -0
  180. data/test/controller/rack_test.rb +308 -0
  181. data/test/controller/record_identifier_test.rb +139 -0
  182. data/test/controller/redirect_test.rb +285 -0
  183. data/test/controller/reloader_test.rb +125 -0
  184. data/test/controller/render_test.rb +1783 -0
  185. data/test/controller/request/json_params_parsing_test.rb +65 -0
  186. data/test/controller/request/multipart_params_parsing_test.rb +177 -0
  187. data/test/controller/request/query_string_parsing_test.rb +120 -0
  188. data/test/controller/request/test_request_test.rb +35 -0
  189. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  190. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  191. data/test/controller/request_forgery_protection_test.rb +233 -0
  192. data/test/controller/request_test.rb +395 -0
  193. data/test/controller/rescue_test.rb +541 -0
  194. data/test/controller/resources_test.rb +1393 -0
  195. data/test/controller/routing_test.rb +2592 -0
  196. data/test/controller/selector_test.rb +628 -0
  197. data/test/controller/send_file_test.rb +171 -0
  198. data/test/controller/session/abstract_store_test.rb +64 -0
  199. data/test/controller/session/cookie_store_test.rb +354 -0
  200. data/test/controller/session/mem_cache_store_test.rb +187 -0
  201. data/test/controller/session/test_session_test.rb +58 -0
  202. data/test/controller/test_test.rb +700 -0
  203. data/test/controller/translation_test.rb +26 -0
  204. data/test/controller/url_rewriter_test.rb +395 -0
  205. data/test/controller/verification_test.rb +270 -0
  206. data/test/controller/view_paths_test.rb +141 -0
  207. data/test/controller/webservice_test.rb +260 -0
  208. data/test/fixtures/_top_level_partial.html.erb +1 -0
  209. data/test/fixtures/_top_level_partial_only.erb +1 -0
  210. data/test/fixtures/addresses/list.erb +1 -0
  211. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  212. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  213. data/test/fixtures/companies.yml +24 -0
  214. data/test/fixtures/company.rb +10 -0
  215. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  216. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  217. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  218. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  219. data/test/fixtures/customers/_customer.html.erb +1 -0
  220. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  221. data/test/fixtures/developer.rb +9 -0
  222. data/test/fixtures/developers/_developer.erb +1 -0
  223. data/test/fixtures/developers.yml +21 -0
  224. data/test/fixtures/developers_projects.yml +13 -0
  225. data/test/fixtures/failsafe/500.html +1 -0
  226. data/test/fixtures/fun/games/_game.erb +1 -0
  227. data/test/fixtures/fun/games/hello_world.erb +1 -0
  228. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  229. data/test/fixtures/functional_caching/_partial.erb +3 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  231. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  232. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  233. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  235. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  236. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  237. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  238. data/test/fixtures/helpers/abc_helper.rb +5 -0
  239. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  240. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  241. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  242. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  243. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  244. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  246. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  247. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  248. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  249. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  250. data/test/fixtures/layouts/_column.html.erb +2 -0
  251. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  252. data/test/fixtures/layouts/builder.builder +3 -0
  253. data/test/fixtures/layouts/default_html.html.erb +1 -0
  254. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  255. data/test/fixtures/layouts/standard.erb +1 -0
  256. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  257. data/test/fixtures/layouts/xhr.html.erb +2 -0
  258. data/test/fixtures/layouts/yield.erb +2 -0
  259. data/test/fixtures/localized/hello_world.de.html +1 -0
  260. data/test/fixtures/localized/hello_world.en.html +1 -0
  261. data/test/fixtures/mascot.rb +3 -0
  262. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  263. data/test/fixtures/mascots.yml +4 -0
  264. data/test/fixtures/multipart/binary_file +0 -0
  265. data/test/fixtures/multipart/boundary_problem_file +10 -0
  266. data/test/fixtures/multipart/bracketed_param +5 -0
  267. data/test/fixtures/multipart/empty +10 -0
  268. data/test/fixtures/multipart/hello.txt +1 -0
  269. data/test/fixtures/multipart/large_text_file +10 -0
  270. data/test/fixtures/multipart/mixed_files +0 -0
  271. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  272. data/test/fixtures/multipart/none +9 -0
  273. data/test/fixtures/multipart/single_parameter +5 -0
  274. data/test/fixtures/multipart/text_file +10 -0
  275. data/test/fixtures/override/test/hello_world.erb +1 -0
  276. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  277. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  278. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  279. data/test/fixtures/post_test/post/index.html.erb +1 -0
  280. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  281. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  282. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  283. data/test/fixtures/project.rb +3 -0
  284. data/test/fixtures/projects/_project.erb +1 -0
  285. data/test/fixtures/projects.yml +7 -0
  286. data/test/fixtures/public/404.html +1 -0
  287. data/test/fixtures/public/500.da.html +1 -0
  288. data/test/fixtures/public/500.html +1 -0
  289. data/test/fixtures/public/absolute/test.css +23 -0
  290. data/test/fixtures/public/absolute/test.js +63 -0
  291. data/test/fixtures/public/images/rails.png +0 -0
  292. data/test/fixtures/public/javascripts/application.js +1 -0
  293. data/test/fixtures/public/javascripts/bank.js +1 -0
  294. data/test/fixtures/public/javascripts/controls.js +1 -0
  295. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  296. data/test/fixtures/public/javascripts/effects.js +1 -0
  297. data/test/fixtures/public/javascripts/prototype.js +1 -0
  298. data/test/fixtures/public/javascripts/robber.js +1 -0
  299. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  300. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  301. data/test/fixtures/public/stylesheets/bank.css +1 -0
  302. data/test/fixtures/public/stylesheets/robber.css +1 -0
  303. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  304. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  305. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  306. data/test/fixtures/replies/_reply.erb +1 -0
  307. data/test/fixtures/replies.yml +15 -0
  308. data/test/fixtures/reply.rb +7 -0
  309. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  310. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  311. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  312. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  313. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  314. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  315. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  316. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  318. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  319. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  320. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  321. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  322. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  323. data/test/fixtures/scope/test/modgreet.erb +1 -0
  324. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +10 -0
  325. data/test/fixtures/shared.html.erb +1 -0
  326. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  327. data/test/fixtures/test/_counter.html.erb +1 -0
  328. data/test/fixtures/test/_customer.erb +1 -0
  329. data/test/fixtures/test/_customer_counter.erb +1 -0
  330. data/test/fixtures/test/_customer_counter_with_as.erb +1 -0
  331. data/test/fixtures/test/_customer_greeting.erb +1 -0
  332. data/test/fixtures/test/_customer_with_var.erb +1 -0
  333. data/test/fixtures/test/_form.erb +1 -0
  334. data/test/fixtures/test/_from_helper.erb +1 -0
  335. data/test/fixtures/test/_hash_greeting.erb +1 -0
  336. data/test/fixtures/test/_hash_object.erb +2 -0
  337. data/test/fixtures/test/_hello.builder +1 -0
  338. data/test/fixtures/test/_labelling_form.erb +1 -0
  339. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  340. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  341. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  342. data/test/fixtures/test/_one.html.erb +1 -0
  343. data/test/fixtures/test/_partial.erb +1 -0
  344. data/test/fixtures/test/_partial.html.erb +1 -0
  345. data/test/fixtures/test/_partial.js.erb +1 -0
  346. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  347. data/test/fixtures/test/_partial_only.erb +1 -0
  348. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  349. data/test/fixtures/test/_person.erb +2 -0
  350. data/test/fixtures/test/_raise.html.erb +1 -0
  351. data/test/fixtures/test/_two.html.erb +1 -0
  352. data/test/fixtures/test/_utf8_partial.html.erb +1 -0
  353. data/test/fixtures/test/_utf8_partial_magic.html.erb +2 -0
  354. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  355. data/test/fixtures/test/array_translation.erb +1 -0
  356. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  357. data/test/fixtures/test/capturing.erb +4 -0
  358. data/test/fixtures/test/content_for.erb +2 -0
  359. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  360. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  361. data/test/fixtures/test/delete_with_js.rjs +2 -0
  362. data/test/fixtures/test/dont_pick_me +1 -0
  363. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  364. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  365. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  366. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  367. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  368. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  369. data/test/fixtures/test/greeting.erb +1 -0
  370. data/test/fixtures/test/greeting.js.rjs +1 -0
  371. data/test/fixtures/test/hello.builder +4 -0
  372. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  373. data/test/fixtures/test/hello_world.erb +1 -0
  374. data/test/fixtures/test/hello_world.erb~ +1 -0
  375. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  376. data/test/fixtures/test/hello_world_container.builder +3 -0
  377. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  378. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  379. data/test/fixtures/test/hello_xml_world.builder +11 -0
  380. data/test/fixtures/test/hyphen-ated.erb +1 -0
  381. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  382. data/test/fixtures/test/list.erb +1 -0
  383. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  384. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  385. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  386. data/test/fixtures/test/nested_layout.erb +3 -0
  387. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  388. data/test/fixtures/test/potential_conflicts.erb +4 -0
  389. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  390. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  391. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  392. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  393. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  394. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  395. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  396. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  397. data/test/fixtures/test/render_to_string_test.erb +1 -0
  398. data/test/fixtures/test/scoped_array_translation.erb +1 -0
  399. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  400. data/test/fixtures/test/template.erb +1 -0
  401. data/test/fixtures/test/translation.erb +1 -0
  402. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  403. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  404. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  405. data/test/fixtures/test/utf8.html.erb +4 -0
  406. data/test/fixtures/test/utf8_magic.html.erb +5 -0
  407. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +5 -0
  408. data/test/fixtures/topic.rb +3 -0
  409. data/test/fixtures/topics/_topic.html.erb +1 -0
  410. data/test/fixtures/topics.yml +22 -0
  411. data/test/template/active_record_helper_i18n_test.rb +51 -0
  412. data/test/template/active_record_helper_test.rb +302 -0
  413. data/test/template/asset_tag_helper_test.rb +770 -0
  414. data/test/template/atom_feed_helper_test.rb +315 -0
  415. data/test/template/benchmark_helper_test.rb +86 -0
  416. data/test/template/compiled_templates_test.rb +204 -0
  417. data/test/template/date_helper_i18n_test.rb +121 -0
  418. data/test/template/date_helper_test.rb +2603 -0
  419. data/test/template/erb_util_test.rb +36 -0
  420. data/test/template/form_helper_test.rb +1447 -0
  421. data/test/template/form_options_helper_i18n_test.rb +27 -0
  422. data/test/template/form_options_helper_test.rb +811 -0
  423. data/test/template/form_tag_helper_test.rb +356 -0
  424. data/test/template/javascript_helper_test.rb +106 -0
  425. data/test/template/number_helper_i18n_test.rb +69 -0
  426. data/test/template/number_helper_test.rb +132 -0
  427. data/test/template/prototype_helper_test.rb +639 -0
  428. data/test/template/raw_output_helper_test.rb +21 -0
  429. data/test/template/record_tag_helper_test.rb +58 -0
  430. data/test/template/render_test.rb +329 -0
  431. data/test/template/sanitize_helper_test.rb +57 -0
  432. data/test/template/scriptaculous_helper_test.rb +90 -0
  433. data/test/template/tag_helper_test.rb +98 -0
  434. data/test/template/template_test.rb +32 -0
  435. data/test/template/test_test.rb +54 -0
  436. data/test/template/text_helper_test.rb +597 -0
  437. data/test/template/translation_helper_test.rb +95 -0
  438. data/test/template/url_helper_test.rb +641 -0
  439. data/test/testing_sandbox.rb +15 -0
  440. data/test/view/test_case_test.rb +176 -0
  441. metadata +519 -0
@@ -0,0 +1,162 @@
1
+ require 'active_support/test_case'
2
+
3
+ module ActionView
4
+ class Base
5
+ alias_method :initialize_without_template_tracking, :initialize
6
+ def initialize(*args)
7
+ @_rendered = { :template => nil, :partials => Hash.new(0) }
8
+ initialize_without_template_tracking(*args)
9
+ end
10
+ end
11
+
12
+ module Renderable
13
+ alias_method :render_without_template_tracking, :render
14
+ def render(view, local_assigns = {})
15
+ if respond_to?(:path) && !is_a?(InlineTemplate)
16
+ rendered = view.instance_variable_get(:@_rendered)
17
+ rendered[:partials][self] += 1 if is_a?(RenderablePartial)
18
+ rendered[:template] ||= self
19
+ end
20
+ render_without_template_tracking(view, local_assigns)
21
+ end
22
+ end
23
+
24
+ class TestCase < ActiveSupport::TestCase
25
+ class TestController < ActionController::Base
26
+ attr_accessor :request, :response, :params
27
+
28
+ def self.controller_path
29
+ ''
30
+ end
31
+
32
+ def initialize
33
+ @request = ActionController::TestRequest.new
34
+ @response = ActionController::TestResponse.new
35
+
36
+ @params = {}
37
+ send(:initialize_current_url)
38
+ end
39
+ end
40
+
41
+ include ActionController::TestCase::Assertions
42
+ include ActionController::TestProcess
43
+
44
+ include ActionController::PolymorphicRoutes
45
+ include ActionController::RecordIdentifier
46
+
47
+ include ActionView::Helpers
48
+ include ActionController::Helpers
49
+
50
+ class_inheritable_accessor :helper_class
51
+ attr_accessor :controller, :output_buffer, :rendered
52
+
53
+ setup :setup_with_controller
54
+ def setup_with_controller
55
+ @controller = TestController.new
56
+ @output_buffer = ''
57
+ @rendered = ''
58
+
59
+ self.class.send(:include_helper_modules!)
60
+ make_test_case_available_to_view!
61
+ end
62
+
63
+ def render(options = {}, local_assigns = {}, &block)
64
+ @rendered << output = _view.render(options, local_assigns, &block)
65
+ output
66
+ end
67
+
68
+ def protect_against_forgery?
69
+ false
70
+ end
71
+
72
+ class << self
73
+ def tests(helper_class)
74
+ self.helper_class = helper_class
75
+ end
76
+
77
+ def helper_class
78
+ if current_helper_class = read_inheritable_attribute(:helper_class)
79
+ current_helper_class
80
+ else
81
+ self.helper_class = determine_default_helper_class(name)
82
+ end
83
+ end
84
+
85
+ def determine_default_helper_class(name)
86
+ name.sub(/Test$/, '').constantize
87
+ rescue NameError
88
+ nil
89
+ end
90
+
91
+ def helper_method(*methods)
92
+ # Almost a duplicate from ActionController::Helpers
93
+ methods.flatten.each do |method|
94
+ master_helper_module.module_eval <<-end_eval
95
+ def #{method}(*args, &block) # def current_user(*args, &block)
96
+ _test_case.send(%(#{method}), *args, &block) # test_case.send(%(current_user), *args, &block)
97
+ end # end
98
+ end_eval
99
+ end
100
+ end
101
+
102
+ private
103
+ def include_helper_modules!
104
+ helper(helper_class) if helper_class
105
+ include master_helper_module
106
+ end
107
+ end
108
+
109
+ private
110
+ def make_test_case_available_to_view!
111
+ test_case_instance = self
112
+ master_helper_module.module_eval do
113
+ define_method(:_test_case) { test_case_instance }
114
+ private :_test_case
115
+ end
116
+ end
117
+
118
+ def _view
119
+ view = ActionView::Base.new(ActionController::Base.view_paths, _assigns, @controller)
120
+ view.helpers.include master_helper_module
121
+ view.output_buffer = self.output_buffer
122
+ view
123
+ end
124
+
125
+ # Support the selector assertions
126
+ #
127
+ # Need to experiment if this priority is the best one: rendered => output_buffer
128
+ def response_from_page_or_rjs
129
+ HTML::Document.new(rendered.blank? ? output_buffer : rendered).root
130
+ end
131
+
132
+ EXCLUDE_IVARS = %w{
133
+ @output_buffer
134
+ @fixture_cache
135
+ @method_name
136
+ @_result
137
+ @loaded_fixtures
138
+ @test_passed
139
+ @view
140
+ }
141
+
142
+ def _instance_variables
143
+ instance_variables - EXCLUDE_IVARS
144
+ end
145
+
146
+ def _assigns
147
+ _instance_variables.inject({}) do |hash, var|
148
+ name = var[1..-1].to_sym
149
+ hash[name] = instance_variable_get(var)
150
+ hash
151
+ end
152
+ end
153
+
154
+ def method_missing(selector, *args)
155
+ if ActionController::Routing::Routes.named_routes.helpers.include?(selector)
156
+ @controller.__send__(selector, *args)
157
+ else
158
+ super
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,58 @@
1
+ #--
2
+ # Copyright (c) 2004-2010 David Heinemeier Hansson
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ begin
25
+ require 'active_support'
26
+ rescue LoadError
27
+ activesupport_path = "#{File.dirname(__FILE__)}/../../activesupport/lib"
28
+ if File.directory?(activesupport_path)
29
+ $:.unshift activesupport_path
30
+ require 'active_support'
31
+ end
32
+ end
33
+
34
+ module ActionView
35
+ def self.load_all!
36
+ [Base, InlineTemplate, TemplateError]
37
+ end
38
+
39
+ autoload :Base, 'action_view/base'
40
+ autoload :Helpers, 'action_view/helpers'
41
+ autoload :InlineTemplate, 'action_view/inline_template'
42
+ autoload :Partials, 'action_view/partials'
43
+ autoload :PathSet, 'action_view/paths'
44
+ autoload :Renderable, 'action_view/renderable'
45
+ autoload :RenderablePartial, 'action_view/renderable_partial'
46
+ autoload :Template, 'action_view/template'
47
+ autoload :ReloadableTemplate, 'action_view/reloadable_template'
48
+ autoload :TemplateError, 'action_view/template_error'
49
+ autoload :TemplateHandler, 'action_view/template_handler'
50
+ autoload :TemplateHandlers, 'action_view/template_handlers'
51
+ autoload :Helpers, 'action_view/helpers'
52
+ end
53
+
54
+ require 'active_support/core_ext/string/output_safety'
55
+
56
+ ActionView::SafeBuffer = ActiveSupport::Deprecation::DeprecatedConstantProxy.new('ActionView::SafeBuffer', 'ActiveSupport::SafeBuffer')
57
+
58
+ I18n.load_path << "#{File.dirname(__FILE__)}/action_view/locale/en.yml"
data/lib/actionpack.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'action_pack'
2
+ ActiveSupport::Deprecation.warn 'require "actionpack" is deprecated and will be removed in Rails 3. Use require "action_pack" instead.'
@@ -0,0 +1,78 @@
1
+ $:.unshift File.expand_path('../../lib', __FILE__)
2
+ $:.unshift File.expand_path('../../../activesupport/lib', __FILE__)
3
+ $:.unshift File.expand_path('../fixtures/helpers', __FILE__)
4
+ $:.unshift File.expand_path('../fixtures/alternate_helpers', __FILE__)
5
+
6
+ require 'rubygems'
7
+ require 'yaml'
8
+ require 'stringio'
9
+ require 'test/unit'
10
+
11
+ gem 'mocha', '>= 0.9.7'
12
+ require 'mocha'
13
+
14
+ begin
15
+ require 'ruby-debug'
16
+ Debugger.settings[:autoeval] = true
17
+ Debugger.start
18
+ rescue LoadError
19
+ # Debugging disabled. `gem install ruby-debug` to enable.
20
+ end
21
+
22
+ require 'action_controller'
23
+ require 'action_controller/cgi_ext'
24
+ require 'action_controller/test_process'
25
+ require 'action_view/test_case'
26
+
27
+ # Show backtraces for deprecated behavior for quicker cleanup.
28
+ ActiveSupport::Deprecation.debug = true
29
+
30
+ ActionController::Base.logger = nil
31
+ ActionController::Routing::Routes.reload rescue nil
32
+
33
+ ActionController::Base.session_store = nil
34
+
35
+ # Register languages for testing
36
+ I18n.backend.store_translations 'da', "da" => {}
37
+ I18n.backend.store_translations 'pt-BR', "pt-BR" => {}
38
+ ORIGINAL_LOCALES = I18n.available_locales.map(&:to_s).sort
39
+
40
+ FIXTURE_LOAD_PATH = File.join(File.dirname(__FILE__), 'fixtures')
41
+ ActionView::Base.cache_template_loading = true
42
+ ActionController::Base.view_paths = FIXTURE_LOAD_PATH
43
+ CACHED_VIEW_PATHS = ActionView::Base.cache_template_loading? ?
44
+ ActionController::Base.view_paths :
45
+ ActionController::Base.view_paths.map {|path| ActionView::Template::EagerPath.new(path.to_s)}
46
+
47
+ class DummyMutex
48
+ def lock
49
+ @locked = true
50
+ end
51
+
52
+ def unlock
53
+ @locked = false
54
+ end
55
+
56
+ def locked?
57
+ @locked
58
+ end
59
+ end
60
+
61
+ class ActionController::IntegrationTest < ActiveSupport::TestCase
62
+ def with_autoload_path(path)
63
+ path = File.join(File.dirname(__FILE__), "fixtures", path)
64
+ if ActiveSupport::Dependencies.autoload_paths.include?(path)
65
+ yield
66
+ else
67
+ begin
68
+ ActiveSupport::Dependencies.autoload_paths << path
69
+ yield
70
+ ensure
71
+ ActiveSupport::Dependencies.autoload_paths.reject! {|p| p == path}
72
+ ActiveSupport::Dependencies.clear
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ ActionController::Reloader.default_lock = DummyMutex.new
@@ -0,0 +1,104 @@
1
+ require 'abstract_unit'
2
+
3
+ # Define the essentials
4
+ class ActiveRecordTestConnector
5
+ cattr_accessor :able_to_connect
6
+ cattr_accessor :connected
7
+
8
+ # Set our defaults
9
+ self.connected = false
10
+ self.able_to_connect = true
11
+ end
12
+
13
+ # Try to grab AR
14
+ if defined?(ActiveRecord) && defined?(Fixtures)
15
+ $stderr.puts 'Active Record is already loaded, running tests'
16
+ else
17
+ $stderr.print 'Attempting to load Active Record... '
18
+ begin
19
+ PATH_TO_AR = File.expand_path('../../../activerecord/lib', __FILE__)
20
+ raise LoadError, "#{PATH_TO_AR} doesn't exist" unless File.directory?(PATH_TO_AR)
21
+ $LOAD_PATH.unshift PATH_TO_AR
22
+ require 'active_record'
23
+ require 'active_record/fixtures'
24
+ $stderr.puts 'success'
25
+ rescue LoadError => e
26
+ $stderr.print "failed. Skipping Active Record assertion tests: #{e}"
27
+ ActiveRecordTestConnector.able_to_connect = false
28
+ end
29
+ end
30
+ $stderr.flush
31
+
32
+
33
+ # Define the rest of the connector
34
+ class ActiveRecordTestConnector
35
+ class << self
36
+ def setup
37
+ unless self.connected || !self.able_to_connect
38
+ setup_connection
39
+ load_schema
40
+ require_fixture_models
41
+ self.connected = true
42
+ end
43
+ rescue Exception => e # errors from ActiveRecord setup
44
+ $stderr.puts "\nSkipping ActiveRecord assertion tests: #{e}"
45
+ #$stderr.puts " #{e.backtrace.join("\n ")}\n"
46
+ self.able_to_connect = false
47
+ end
48
+
49
+ private
50
+ def setup_connection
51
+ if Object.const_defined?(:ActiveRecord)
52
+ defaults = { :database => ':memory:' }
53
+ begin
54
+ adapter = defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3'
55
+ options = defaults.merge :adapter => adapter, :timeout => 500
56
+ ActiveRecord::Base.establish_connection(options)
57
+ ActiveRecord::Base.configurations = { 'sqlite3_ar_integration' => options }
58
+ ActiveRecord::Base.connection
59
+ rescue Exception # errors from establishing a connection
60
+ $stderr.puts 'SQLite 3 unavailable; trying SQLite 2.'
61
+ options = defaults.merge :adapter => 'sqlite'
62
+ ActiveRecord::Base.establish_connection(options)
63
+ ActiveRecord::Base.configurations = { 'sqlite2_ar_integration' => options }
64
+ ActiveRecord::Base.connection
65
+ end
66
+
67
+ Object.send(:const_set, :QUOTED_TYPE, ActiveRecord::Base.connection.quote_column_name('type')) unless Object.const_defined?(:QUOTED_TYPE)
68
+ else
69
+ raise "Can't setup connection since ActiveRecord isn't loaded."
70
+ end
71
+ end
72
+
73
+ # Load actionpack sqlite tables
74
+ def load_schema
75
+ File.read(File.dirname(__FILE__) + "/fixtures/db_definitions/sqlite.sql").split(';').each do |sql|
76
+ ActiveRecord::Base.connection.execute(sql) unless sql.blank?
77
+ end
78
+ end
79
+
80
+ def require_fixture_models
81
+ Dir.glob(File.dirname(__FILE__) + "/fixtures/*.rb").each {|f| require f}
82
+ end
83
+ end
84
+ end
85
+
86
+ class ActiveRecordTestCase < ActionController::TestCase
87
+ include ActiveRecord::TestFixtures
88
+
89
+ # Set our fixture path
90
+ if ActiveRecordTestConnector.able_to_connect
91
+ self.fixture_path = [FIXTURE_LOAD_PATH]
92
+ self.use_transactional_fixtures = false
93
+ end
94
+
95
+ def self.fixtures(*args)
96
+ super if ActiveRecordTestConnector.connected
97
+ end
98
+
99
+ def run(*args)
100
+ super if ActiveRecordTestConnector.connected
101
+ end
102
+ end
103
+
104
+ ActiveRecordTestConnector.setup
@@ -0,0 +1,221 @@
1
+ require 'active_record_unit'
2
+
3
+ class ActiveRecordStoreTest < ActionController::IntegrationTest
4
+ DispatcherApp = ActionController::Dispatcher.new
5
+ SessionApp = ActiveRecord::SessionStore.new(DispatcherApp,
6
+ :key => '_session_id')
7
+ SessionAppWithFixation = ActiveRecord::SessionStore.new(DispatcherApp,
8
+ :key => '_session_id', :cookie_only => false)
9
+
10
+ class TestController < ActionController::Base
11
+ def no_session_access
12
+ head :ok
13
+ end
14
+
15
+ def set_session_value
16
+ session[:foo] = params[:foo] || "bar"
17
+ head :ok
18
+ end
19
+
20
+ def get_session_value
21
+ render :text => "foo: #{session[:foo].inspect}"
22
+ end
23
+
24
+ def get_session_id
25
+ render :text => "#{request.session_options[:id]}"
26
+ end
27
+
28
+ def call_reset_session
29
+ session[:foo]
30
+ reset_session
31
+ session[:foo] = "baz"
32
+ head :ok
33
+ end
34
+
35
+ def rescue_action(e) raise end
36
+ end
37
+
38
+ def setup
39
+ ActiveRecord::SessionStore.session_class.create_table!
40
+ @integration_session = open_session(SessionApp)
41
+ end
42
+
43
+ def teardown
44
+ ActiveRecord::SessionStore.session_class.drop_table!
45
+ end
46
+
47
+ %w{ session sql_bypass }.each do |class_name|
48
+ define_method("test_setting_and_getting_session_value_with_#{class_name}_store") do
49
+ with_store class_name do
50
+ with_test_route_set do
51
+ get '/set_session_value'
52
+ assert_response :success
53
+ assert cookies['_session_id']
54
+
55
+ get '/get_session_value'
56
+ assert_response :success
57
+ assert_equal 'foo: "bar"', response.body
58
+
59
+ get '/set_session_value', :foo => "baz"
60
+ assert_response :success
61
+ assert cookies['_session_id']
62
+
63
+ get '/get_session_value'
64
+ assert_response :success
65
+ assert_equal 'foo: "baz"', response.body
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ def test_getting_nil_session_value
72
+ with_test_route_set do
73
+ get '/get_session_value'
74
+ assert_response :success
75
+ assert_equal 'foo: nil', response.body
76
+ end
77
+ end
78
+
79
+ def test_setting_session_value_after_session_reset
80
+ with_test_route_set do
81
+ get '/set_session_value'
82
+ assert_response :success
83
+ assert cookies['_session_id']
84
+ session_id = cookies['_session_id']
85
+
86
+ get '/call_reset_session'
87
+ assert_response :success
88
+ assert_not_equal [], headers['Set-Cookie']
89
+
90
+ get '/get_session_value'
91
+ assert_response :success
92
+ assert_equal 'foo: "baz"', response.body
93
+
94
+ get '/get_session_id'
95
+ assert_response :success
96
+ assert_not_equal session_id, response.body
97
+ end
98
+ end
99
+
100
+ def test_getting_session_id
101
+ with_test_route_set do
102
+ get '/set_session_value'
103
+ assert_response :success
104
+ assert cookies['_session_id']
105
+ session_id = cookies['_session_id']
106
+
107
+ get '/get_session_id'
108
+ assert_response :success
109
+ assert_equal session_id, response.body
110
+ end
111
+ end
112
+
113
+ def test_getting_session_value
114
+ with_test_route_set do
115
+ get '/set_session_value'
116
+ assert_response :success
117
+ assert cookies['_session_id']
118
+
119
+ get '/get_session_value'
120
+ assert_response :success
121
+ assert_equal nil, headers['Set-Cookie'], "should not resend the cookie again if session_id cookie is already exists"
122
+ session_id = cookies["_session_id"]
123
+
124
+ get '/call_reset_session'
125
+ assert_response :success
126
+ assert_not_equal [], headers['Set-Cookie']
127
+
128
+ cookies["_session_id"] = session_id # replace our new session_id with our old, pre-reset session_id
129
+
130
+ get '/get_session_value'
131
+ assert_response :success
132
+ assert_equal 'foo: nil', response.body, "data for this session should have been obliterated from the database"
133
+ end
134
+ end
135
+
136
+ def test_getting_from_nonexistent_session
137
+ with_test_route_set do
138
+ get '/get_session_value'
139
+ assert_response :success
140
+ assert_equal 'foo: nil', response.body
141
+ assert_nil cookies['_session_id'], "should only create session on write, not read"
142
+ end
143
+ end
144
+
145
+ def test_prevents_session_fixation
146
+ with_test_route_set do
147
+ get '/set_session_value'
148
+ assert_response :success
149
+ assert cookies['_session_id']
150
+
151
+ get '/get_session_value'
152
+ assert_response :success
153
+ assert_equal 'foo: "bar"', response.body
154
+ session_id = cookies['_session_id']
155
+ assert session_id
156
+
157
+ reset!
158
+
159
+ get '/set_session_value', :_session_id => session_id, :foo => "baz"
160
+ assert_response :success
161
+ assert_equal nil, cookies['_session_id']
162
+
163
+ get '/get_session_value', :_session_id => session_id
164
+ assert_response :success
165
+ assert_equal 'foo: nil', response.body
166
+ assert_equal nil, cookies['_session_id']
167
+ end
168
+ end
169
+
170
+ def test_allows_session_fixation
171
+ @integration_session = open_session(SessionAppWithFixation)
172
+
173
+ with_test_route_set do
174
+ get '/set_session_value'
175
+ assert_response :success
176
+ assert cookies['_session_id']
177
+
178
+ get '/get_session_value'
179
+ assert_response :success
180
+ assert_equal 'foo: "bar"', response.body
181
+ session_id = cookies['_session_id']
182
+ assert session_id
183
+
184
+ reset!
185
+ @integration_session = open_session(SessionAppWithFixation)
186
+
187
+ get '/set_session_value', :_session_id => session_id, :foo => "baz"
188
+ assert_response :success
189
+ assert_equal session_id, cookies['_session_id']
190
+
191
+ get '/get_session_value', :_session_id => session_id
192
+ assert_response :success
193
+ assert_equal 'foo: "baz"', response.body
194
+ assert_equal session_id, cookies['_session_id']
195
+ end
196
+ end
197
+
198
+ private
199
+ def with_test_route_set
200
+ with_routing do |set|
201
+ set.draw do |map|
202
+ map.with_options :controller => "active_record_store_test/test" do |c|
203
+ c.connect "/:action"
204
+ end
205
+ end
206
+ yield
207
+ end
208
+ end
209
+
210
+ def with_store(class_name)
211
+ begin
212
+ session_class = ActiveRecord::SessionStore.session_class
213
+ ActiveRecord::SessionStore.session_class = "ActiveRecord::SessionStore::#{class_name.camelize}".constantize
214
+ yield
215
+ rescue
216
+ ActiveRecord::SessionStore.session_class = session_class
217
+ raise
218
+ end
219
+ end
220
+
221
+ end