actionpack 1.13.6 → 2.0.0

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 (317) hide show
  1. data/CHANGELOG +1400 -20
  2. data/MIT-LICENSE +1 -1
  3. data/README +5 -5
  4. data/RUNNING_UNIT_TESTS +4 -5
  5. data/Rakefile +5 -6
  6. data/install.rb +2 -2
  7. data/lib/action_controller.rb +11 -15
  8. data/lib/action_controller/assertions.rb +12 -25
  9. data/lib/action_controller/assertions/dom_assertions.rb +18 -4
  10. data/lib/action_controller/assertions/model_assertions.rb +8 -1
  11. data/lib/action_controller/assertions/response_assertions.rb +35 -12
  12. data/lib/action_controller/assertions/routing_assertions.rb +56 -12
  13. data/lib/action_controller/assertions/selector_assertions.rb +105 -38
  14. data/lib/action_controller/assertions/tag_assertions.rb +28 -15
  15. data/lib/action_controller/base.rb +318 -250
  16. data/lib/action_controller/benchmarking.rb +33 -29
  17. data/lib/action_controller/caching.rb +130 -64
  18. data/lib/action_controller/cgi_ext.rb +16 -0
  19. data/lib/action_controller/cgi_ext/{cookie_performance_fix.rb → cookie.rb} +25 -40
  20. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  21. data/lib/action_controller/cgi_ext/session.rb +73 -0
  22. data/lib/action_controller/cgi_ext/stdinput.rb +23 -0
  23. data/lib/action_controller/cgi_process.rb +34 -57
  24. data/lib/action_controller/components.rb +19 -36
  25. data/lib/action_controller/cookies.rb +10 -9
  26. data/lib/action_controller/dispatcher.rb +195 -0
  27. data/lib/action_controller/filters.rb +35 -34
  28. data/lib/action_controller/flash.rb +30 -35
  29. data/lib/action_controller/helpers.rb +121 -47
  30. data/lib/action_controller/http_authentication.rb +126 -0
  31. data/lib/action_controller/integration.rb +105 -101
  32. data/lib/action_controller/layout.rb +59 -47
  33. data/lib/action_controller/mime_responds.rb +57 -68
  34. data/lib/action_controller/mime_type.rb +43 -80
  35. data/lib/action_controller/mime_types.rb +20 -0
  36. data/lib/action_controller/polymorphic_routes.rb +88 -0
  37. data/lib/action_controller/record_identifier.rb +91 -0
  38. data/lib/action_controller/request.rb +553 -88
  39. data/lib/action_controller/request_forgery_protection.rb +126 -0
  40. data/lib/action_controller/request_profiler.rb +138 -0
  41. data/lib/action_controller/rescue.rb +185 -69
  42. data/lib/action_controller/resources.rb +211 -172
  43. data/lib/action_controller/response.rb +49 -8
  44. data/lib/action_controller/routing.rb +359 -236
  45. data/lib/action_controller/routing_optimisation.rb +119 -0
  46. data/lib/action_controller/session/active_record_store.rb +3 -2
  47. data/lib/action_controller/session/cookie_store.rb +161 -0
  48. data/lib/action_controller/session/mem_cache_store.rb +9 -16
  49. data/lib/action_controller/session_management.rb +17 -8
  50. data/lib/action_controller/streaming.rb +6 -3
  51. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  52. data/lib/action_controller/templates/rescues/{_trace.rhtml → _trace.erb} +0 -0
  53. data/lib/action_controller/templates/rescues/{diagnostics.rhtml → diagnostics.erb} +2 -2
  54. data/lib/action_controller/templates/rescues/{layout.rhtml → layout.erb} +0 -0
  55. data/lib/action_controller/templates/rescues/{missing_template.rhtml → missing_template.erb} +0 -0
  56. data/lib/action_controller/templates/rescues/{routing_error.rhtml → routing_error.erb} +0 -0
  57. data/lib/action_controller/templates/rescues/{template_error.rhtml → template_error.erb} +2 -2
  58. data/lib/action_controller/templates/rescues/{unknown_action.rhtml → unknown_action.erb} +0 -0
  59. data/lib/action_controller/test_case.rb +53 -0
  60. data/lib/action_controller/test_process.rb +59 -46
  61. data/lib/action_controller/url_rewriter.rb +48 -24
  62. data/lib/action_controller/vendor/html-scanner/html/document.rb +7 -4
  63. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  64. data/lib/action_controller/vendor/html-scanner/html/selector.rb +11 -6
  65. data/lib/action_controller/verification.rb +27 -21
  66. data/lib/action_pack.rb +1 -1
  67. data/lib/action_pack/version.rb +4 -4
  68. data/lib/action_view.rb +2 -3
  69. data/lib/action_view/base.rb +218 -63
  70. data/lib/action_view/compiled_templates.rb +1 -2
  71. data/lib/action_view/helpers/active_record_helper.rb +35 -17
  72. data/lib/action_view/helpers/asset_tag_helper.rb +395 -87
  73. data/lib/action_view/helpers/atom_feed_helper.rb +111 -0
  74. data/lib/action_view/helpers/benchmark_helper.rb +12 -5
  75. data/lib/action_view/helpers/cache_helper.rb +29 -0
  76. data/lib/action_view/helpers/capture_helper.rb +97 -63
  77. data/lib/action_view/helpers/date_helper.rb +295 -35
  78. data/lib/action_view/helpers/debug_helper.rb +6 -2
  79. data/lib/action_view/helpers/form_helper.rb +354 -111
  80. data/lib/action_view/helpers/form_options_helper.rb +171 -109
  81. data/lib/action_view/helpers/form_tag_helper.rb +332 -76
  82. data/lib/action_view/helpers/javascript_helper.rb +35 -11
  83. data/lib/action_view/helpers/javascripts/controls.js +484 -354
  84. data/lib/action_view/helpers/javascripts/dragdrop.js +88 -58
  85. data/lib/action_view/helpers/javascripts/effects.js +396 -364
  86. data/lib/action_view/helpers/javascripts/prototype.js +2817 -1107
  87. data/lib/action_view/helpers/number_helper.rb +84 -60
  88. data/lib/action_view/helpers/prototype_helper.rb +419 -43
  89. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  90. data/lib/action_view/helpers/record_tag_helper.rb +59 -0
  91. data/lib/action_view/helpers/sanitize_helper.rb +223 -0
  92. data/lib/action_view/helpers/scriptaculous_helper.rb +63 -4
  93. data/lib/action_view/helpers/tag_helper.rb +69 -39
  94. data/lib/action_view/helpers/text_helper.rb +221 -148
  95. data/lib/action_view/helpers/url_helper.rb +283 -165
  96. data/lib/action_view/partials.rb +134 -62
  97. data/lib/action_view/template_error.rb +4 -12
  98. data/lib/actionpack.rb +1 -0
  99. data/test/abstract_unit.rb +21 -1
  100. data/test/action_view_test.rb +26 -0
  101. data/test/active_record_unit.rb +12 -20
  102. data/test/activerecord/active_record_store_test.rb +2 -2
  103. data/test/activerecord/render_partial_with_record_identification_test.rb +74 -0
  104. data/test/controller/action_pack_assertions_test.rb +21 -152
  105. data/test/controller/addresses_render_test.rb +2 -7
  106. data/test/controller/assert_select_test.rb +120 -14
  107. data/test/controller/base_test.rb +11 -13
  108. data/test/controller/caching_test.rb +125 -5
  109. data/test/controller/capture_test.rb +23 -16
  110. data/test/controller/cgi_test.rb +66 -391
  111. data/test/controller/components_test.rb +31 -42
  112. data/test/controller/content_type_test.rb +1 -1
  113. data/test/controller/cookie_test.rb +42 -14
  114. data/test/controller/deprecation/deprecated_base_methods_test.rb +1 -42
  115. data/test/controller/dispatcher_test.rb +123 -0
  116. data/test/controller/fake_models.rb +5 -0
  117. data/test/controller/filters_test.rb +44 -7
  118. data/test/controller/flash_test.rb +46 -2
  119. data/test/controller/fragment_store_setting_test.rb +10 -8
  120. data/test/controller/helper_test.rb +19 -2
  121. data/test/controller/html-scanner/document_test.rb +124 -0
  122. data/test/controller/html-scanner/node_test.rb +69 -0
  123. data/test/controller/html-scanner/sanitizer_test.rb +250 -0
  124. data/test/controller/html-scanner/tag_node_test.rb +239 -0
  125. data/test/controller/html-scanner/text_node_test.rb +51 -0
  126. data/test/controller/html-scanner/tokenizer_test.rb +125 -0
  127. data/test/controller/http_authentication_test.rb +54 -0
  128. data/test/controller/integration_test.rb +12 -26
  129. data/test/controller/layout_test.rb +64 -12
  130. data/test/controller/mime_responds_test.rb +193 -38
  131. data/test/controller/mime_type_test.rb +30 -8
  132. data/test/controller/new_render_test.rb +104 -22
  133. data/test/controller/polymorphic_routes_test.rb +98 -0
  134. data/test/controller/record_identifier_test.rb +103 -0
  135. data/test/controller/redirect_test.rb +120 -18
  136. data/test/controller/render_test.rb +195 -45
  137. data/test/controller/request_forgery_protection_test.rb +217 -0
  138. data/test/controller/request_test.rb +545 -27
  139. data/test/controller/rescue_test.rb +501 -0
  140. data/test/controller/resources_test.rb +258 -132
  141. data/test/controller/routing_test.rb +502 -106
  142. data/test/controller/selector_test.rb +5 -5
  143. data/test/controller/send_file_test.rb +17 -7
  144. data/test/controller/session/cookie_store_test.rb +246 -0
  145. data/test/controller/session/mem_cache_store_test.rb +182 -0
  146. data/test/controller/session_fixation_test.rb +8 -11
  147. data/test/controller/session_management_test.rb +7 -7
  148. data/test/controller/test_test.rb +150 -38
  149. data/test/controller/url_rewriter_test.rb +87 -12
  150. data/test/controller/verification_test.rb +11 -0
  151. data/test/controller/view_paths_test.rb +137 -0
  152. data/test/controller/webservice_test.rb +11 -75
  153. data/test/fixtures/addresses/{list.rhtml → list.erb} +0 -0
  154. data/test/fixtures/db_definitions/sqlite.sql +2 -1
  155. data/test/fixtures/developer.rb +2 -0
  156. data/test/fixtures/fun/games/{hello_world.rhtml → hello_world.erb} +0 -0
  157. data/test/fixtures/helpers/fun/pdf_helper.rb +1 -1
  158. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  159. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  160. data/test/fixtures/layouts/{builder.rxml → builder.builder} +0 -0
  161. data/test/fixtures/layouts/{standard.rhtml → standard.erb} +0 -0
  162. data/test/fixtures/layouts/{talk_from_action.rhtml → talk_from_action.erb} +0 -0
  163. data/test/fixtures/layouts/{yield.rhtml → yield.erb} +0 -0
  164. data/test/fixtures/multipart/binary_file +0 -0
  165. data/test/fixtures/multipart/bracketed_param +5 -0
  166. data/test/fixtures/override/test/hello_world.erb +1 -0
  167. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  168. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  169. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  170. data/test/fixtures/post_test/post/index.html.erb +1 -0
  171. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  172. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  173. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  174. data/test/fixtures/public/404.html +1 -0
  175. data/test/fixtures/public/500.html +1 -0
  176. data/test/fixtures/public/javascripts/application.js +0 -1
  177. data/test/fixtures/public/javascripts/bank.js +1 -0
  178. data/test/fixtures/public/javascripts/robber.js +1 -0
  179. data/test/fixtures/public/stylesheets/bank.css +1 -0
  180. data/test/fixtures/public/stylesheets/robber.css +1 -0
  181. data/test/fixtures/replies.yml +2 -0
  182. data/test/fixtures/reply.rb +2 -1
  183. data/test/fixtures/respond_to/{all_types_with_layout.rhtml → all_types_with_layout.html.erb} +0 -0
  184. data/test/fixtures/respond_to/{all_types_with_layout.rjs → all_types_with_layout.js.rjs} +0 -0
  185. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  186. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  187. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  188. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  189. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  190. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  191. data/test/fixtures/respond_to/{using_defaults.rhtml → using_defaults.html.erb} +0 -0
  192. data/test/fixtures/respond_to/{using_defaults.rjs → using_defaults.js.rjs} +0 -0
  193. data/test/fixtures/respond_to/{using_defaults.rxml → using_defaults.xml.builder} +0 -0
  194. data/test/fixtures/respond_to/{using_defaults_with_type_list.rhtml → using_defaults_with_type_list.html.erb} +0 -0
  195. data/test/fixtures/respond_to/{using_defaults_with_type_list.rjs → using_defaults_with_type_list.js.rjs} +0 -0
  196. data/test/fixtures/respond_to/{using_defaults_with_type_list.rxml → using_defaults_with_type_list.xml.builder} +0 -0
  197. data/test/fixtures/scope/test/{modgreet.rhtml → modgreet.erb} +0 -0
  198. data/test/fixtures/test/{_customer.rhtml → _customer.erb} +0 -0
  199. data/test/fixtures/test/{_customer_greeting.rhtml → _customer_greeting.erb} +0 -0
  200. data/test/fixtures/test/_hash_greeting.erb +1 -0
  201. data/test/fixtures/test/_hash_object.erb +2 -0
  202. data/test/fixtures/test/{_hello.rxml → _hello.builder} +0 -0
  203. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  204. data/test/fixtures/test/_partial.erb +1 -0
  205. data/test/fixtures/test/_partial.html.erb +1 -0
  206. data/test/fixtures/test/_partial.js.erb +1 -0
  207. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  208. data/test/fixtures/test/{_partial_only.rhtml → _partial_only.erb} +0 -0
  209. data/test/fixtures/test/{_person.rhtml → _person.erb} +0 -0
  210. data/test/fixtures/test/{action_talk_to_layout.rhtml → action_talk_to_layout.erb} +0 -0
  211. data/test/fixtures/test/{block_content_for.rhtml → block_content_for.erb} +0 -0
  212. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  213. data/test/fixtures/test/{capturing.rhtml → capturing.erb} +0 -0
  214. data/test/fixtures/test/{content_for.rhtml → content_for.erb} +0 -0
  215. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  216. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  217. data/test/fixtures/test/dot.directory/{render_file_with_ivar.rhtml → render_file_with_ivar.erb} +0 -0
  218. data/test/fixtures/test/{erb_content_for.rhtml → erb_content_for.erb} +0 -0
  219. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  220. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  221. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  222. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  223. data/test/fixtures/test/{greeting.rhtml → greeting.erb} +0 -0
  224. data/test/fixtures/test/{hello.rxml → hello.builder} +0 -0
  225. data/test/fixtures/test/{hello_world.rxml → hello_world.builder} +0 -0
  226. data/test/fixtures/test/{hello_world.rhtml → hello_world.erb} +0 -0
  227. data/test/fixtures/test/{hello_world_container.rxml → hello_world_container.builder} +0 -0
  228. data/test/fixtures/test/{hello_world_with_layout_false.rhtml → hello_world_with_layout_false.erb} +0 -0
  229. data/test/fixtures/test/{hello_xml_world.rxml → hello_xml_world.builder} +0 -0
  230. data/test/fixtures/test/list.erb +1 -0
  231. data/test/fixtures/test/{non_erb_block_content_for.rxml → non_erb_block_content_for.builder} +0 -0
  232. data/test/fixtures/test/{potential_conflicts.rhtml → potential_conflicts.erb} +0 -0
  233. data/test/fixtures/test/{render_file_with_ivar.rhtml → render_file_with_ivar.erb} +0 -0
  234. data/test/fixtures/test/{render_file_with_locals.rhtml → render_file_with_locals.erb} +0 -0
  235. data/test/fixtures/test/{render_to_string_test.rhtml → render_to_string_test.erb} +0 -0
  236. data/test/fixtures/test/{update_element_with_capture.rhtml → update_element_with_capture.erb} +0 -0
  237. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  238. data/test/fixtures/topic.rb +1 -1
  239. data/test/template/active_record_helper_test.rb +67 -20
  240. data/test/template/asset_tag_helper_test.rb +222 -54
  241. data/test/template/atom_feed_helper_test.rb +101 -0
  242. data/test/template/benchmark_helper_test.rb +2 -2
  243. data/test/template/compiled_templates_test.rb +76 -32
  244. data/test/template/date_helper_test.rb +125 -9
  245. data/test/template/form_helper_test.rb +326 -33
  246. data/test/template/form_options_helper_test.rb +822 -15
  247. data/test/template/form_tag_helper_test.rb +96 -30
  248. data/test/template/javascript_helper_test.rb +61 -13
  249. data/test/template/number_helper_test.rb +12 -11
  250. data/test/template/prototype_helper_test.rb +185 -24
  251. data/test/template/sanitize_helper_test.rb +49 -0
  252. data/test/template/scriptaculous_helper_test.rb +9 -3
  253. data/test/template/tag_helper_test.rb +13 -2
  254. data/test/template/text_helper_test.rb +38 -52
  255. data/test/template/url_helper_test.rb +216 -46
  256. metadata +144 -116
  257. data/examples/.htaccess +0 -24
  258. data/examples/address_book/index.rhtml +0 -33
  259. data/examples/address_book/layout.rhtml +0 -8
  260. data/examples/address_book_controller.cgi +0 -9
  261. data/examples/address_book_controller.fcgi +0 -6
  262. data/examples/address_book_controller.rb +0 -52
  263. data/examples/address_book_controller.rbx +0 -4
  264. data/examples/benchmark.rb +0 -52
  265. data/examples/benchmark_with_ar.fcgi +0 -89
  266. data/examples/blog_controller.cgi +0 -53
  267. data/examples/debate/index.rhtml +0 -14
  268. data/examples/debate/new_topic.rhtml +0 -22
  269. data/examples/debate/topic.rhtml +0 -32
  270. data/examples/debate_controller.cgi +0 -57
  271. data/lib/action_controller/assertions/deprecated_assertions.rb +0 -228
  272. data/lib/action_controller/cgi_ext/cgi_ext.rb +0 -36
  273. data/lib/action_controller/cgi_ext/cgi_methods.rb +0 -211
  274. data/lib/action_controller/cgi_ext/pstore_performance_fix.rb +0 -30
  275. data/lib/action_controller/cgi_ext/raw_post_data_fix.rb +0 -95
  276. data/lib/action_controller/cgi_ext/session_performance_fix.rb +0 -30
  277. data/lib/action_controller/deprecated_dependencies.rb +0 -65
  278. data/lib/action_controller/deprecated_redirects.rb +0 -17
  279. data/lib/action_controller/deprecated_request_methods.rb +0 -34
  280. data/lib/action_controller/macros/auto_complete.rb +0 -53
  281. data/lib/action_controller/macros/in_place_editing.rb +0 -33
  282. data/lib/action_controller/pagination.rb +0 -408
  283. data/lib/action_controller/scaffolding.rb +0 -189
  284. data/lib/action_controller/templates/rescues/_request_and_response.rhtml +0 -44
  285. data/lib/action_controller/templates/scaffolds/edit.rhtml +0 -7
  286. data/lib/action_controller/templates/scaffolds/layout.rhtml +0 -69
  287. data/lib/action_controller/templates/scaffolds/list.rhtml +0 -27
  288. data/lib/action_controller/templates/scaffolds/new.rhtml +0 -6
  289. data/lib/action_controller/templates/scaffolds/show.rhtml +0 -9
  290. data/lib/action_controller/vendor/xml_node.rb +0 -97
  291. data/lib/action_view/helpers/deprecated_helper.rb +0 -37
  292. data/lib/action_view/helpers/java_script_macros_helper.rb +0 -233
  293. data/lib/action_view/helpers/pagination_helper.rb +0 -86
  294. data/test/activerecord/active_record_assertions_test.rb +0 -92
  295. data/test/activerecord/pagination_test.rb +0 -165
  296. data/test/controller/deprecated_instance_variables_test.rb +0 -48
  297. data/test/controller/raw_post_test.rb +0 -68
  298. data/test/fixtures/deprecated_instance_variables/_cookies_ivar.rhtml +0 -1
  299. data/test/fixtures/deprecated_instance_variables/_cookies_method.rhtml +0 -1
  300. data/test/fixtures/deprecated_instance_variables/_flash_ivar.rhtml +0 -1
  301. data/test/fixtures/deprecated_instance_variables/_flash_method.rhtml +0 -1
  302. data/test/fixtures/deprecated_instance_variables/_headers_ivar.rhtml +0 -1
  303. data/test/fixtures/deprecated_instance_variables/_headers_method.rhtml +0 -1
  304. data/test/fixtures/deprecated_instance_variables/_params_ivar.rhtml +0 -1
  305. data/test/fixtures/deprecated_instance_variables/_params_method.rhtml +0 -1
  306. data/test/fixtures/deprecated_instance_variables/_request_ivar.rhtml +0 -1
  307. data/test/fixtures/deprecated_instance_variables/_request_method.rhtml +0 -1
  308. data/test/fixtures/deprecated_instance_variables/_response_ivar.rhtml +0 -1
  309. data/test/fixtures/deprecated_instance_variables/_response_method.rhtml +0 -1
  310. data/test/fixtures/deprecated_instance_variables/_session_ivar.rhtml +0 -1
  311. data/test/fixtures/deprecated_instance_variables/_session_method.rhtml +0 -1
  312. data/test/fixtures/respond_to/layouts/standard.rhtml +0 -1
  313. data/test/fixtures/test/_hash_object.rhtml +0 -1
  314. data/test/fixtures/test/list.rhtml +0 -1
  315. data/test/template/deprecated_helper_test.rb +0 -36
  316. data/test/template/deprecated_instance_variables_test.rb +0 -43
  317. data/test/template/java_script_macros_helper_test.rb +0 -109
@@ -1,228 +0,0 @@
1
- require 'rexml/document'
2
-
3
- module ActionController #:nodoc:
4
- module Assertions #:nodoc:
5
- module DeprecatedAssertions #:nodoc:
6
- def assert_success(message=nil) #:nodoc:
7
- assert_response(:success, message)
8
- end
9
- deprecate :assert_success => "use assert_response(:success)"
10
-
11
- def assert_redirect(message=nil) #:nodoc:
12
- assert_response(:redirect, message)
13
- end
14
- deprecate :assert_redirect => "use assert_response(:redirect)"
15
-
16
- def assert_rendered_file(expected=nil, message=nil) #:nodoc:
17
- assert_template(expected, message)
18
- end
19
- deprecate :assert_rendered_file => :assert_template
20
-
21
- # ensure that the session has an object with the specified name
22
- def assert_session_has(key=nil, message=nil) #:nodoc:
23
- msg = build_message(message, "<?> is not in the session <?>", key, @response.session)
24
- assert_block(msg) { @response.has_session_object?(key) }
25
- end
26
- deprecate :assert_session_has => "use assert(@response.has_session_object?(key))"
27
-
28
- # ensure that the session has no object with the specified name
29
- def assert_session_has_no(key=nil, message=nil) #:nodoc:
30
- msg = build_message(message, "<?> is in the session <?>", key, @response.session)
31
- assert_block(msg) { !@response.has_session_object?(key) }
32
- end
33
- deprecate :assert_session_has_no => "use assert(!@response.has_session_object?(key))"
34
-
35
- def assert_session_equal(expected = nil, key = nil, message = nil) #:nodoc:
36
- msg = build_message(message, "<?> expected in session['?'] but was <?>", expected, key, @response.session[key])
37
- assert_block(msg) { expected == @response.session[key] }
38
- end
39
- deprecate :assert_session_equal => "use assert_equal(expected, @response[key])"
40
-
41
- # -- cookie assertions ---------------------------------------------------
42
-
43
- def assert_no_cookie(key = nil, message = nil) #:nodoc:
44
- actual = @response.cookies[key]
45
- msg = build_message(message, "<?> not expected in cookies['?']", actual, key)
46
- assert_block(msg) { actual.nil? or actual.empty? }
47
- end
48
- deprecate :assert_no_cookie => "use assert(!@response.cookies.key?(key))"
49
-
50
- def assert_cookie_equal(expected = nil, key = nil, message = nil) #:nodoc:
51
- actual = @response.cookies[key]
52
- actual = actual.first if actual
53
- msg = build_message(message, "<?> expected in cookies['?'] but was <?>", expected, key, actual)
54
- assert_block(msg) { expected == actual }
55
- end
56
- deprecate :assert_cookie_equal => "use assert(@response.cookies.key?(key))"
57
-
58
- # -- flash assertions ---------------------------------------------------
59
-
60
- # ensure that the flash has an object with the specified name
61
- def assert_flash_has(key=nil, message=nil) #:nodoc:
62
- msg = build_message(message, "<?> is not in the flash <?>", key, @response.flash)
63
- assert_block(msg) { @response.has_flash_object?(key) }
64
- end
65
- deprecate :assert_flash_has => "use assert(@response.has_flash_object?(key))"
66
-
67
- # ensure that the flash has no object with the specified name
68
- def assert_flash_has_no(key=nil, message=nil) #:nodoc:
69
- msg = build_message(message, "<?> is in the flash <?>", key, @response.flash)
70
- assert_block(msg) { !@response.has_flash_object?(key) }
71
- end
72
- deprecate :assert_flash_has_no => "use assert(!@response.has_flash_object?(key))"
73
-
74
- # ensure the flash exists
75
- def assert_flash_exists(message=nil) #:nodoc:
76
- msg = build_message(message, "the flash does not exist <?>", @response.session['flash'] )
77
- assert_block(msg) { @response.has_flash? }
78
- end
79
- deprecate :assert_flash_exists => "use assert(@response.has_flash?)"
80
-
81
- # ensure the flash does not exist
82
- def assert_flash_not_exists(message=nil) #:nodoc:
83
- msg = build_message(message, "the flash exists <?>", @response.flash)
84
- assert_block(msg) { !@response.has_flash? }
85
- end
86
- deprecate :assert_flash_not_exists => "use assert(!@response.has_flash?)"
87
-
88
- # ensure the flash is empty but existent
89
- def assert_flash_empty(message=nil) #:nodoc:
90
- msg = build_message(message, "the flash is not empty <?>", @response.flash)
91
- assert_block(msg) { !@response.has_flash_with_contents? }
92
- end
93
- deprecate :assert_flash_empty => "use assert(!@response.has_flash_with_contents?)"
94
-
95
- # ensure the flash is not empty
96
- def assert_flash_not_empty(message=nil) #:nodoc:
97
- msg = build_message(message, "the flash is empty")
98
- assert_block(msg) { @response.has_flash_with_contents? }
99
- end
100
- deprecate :assert_flash_not_empty => "use assert(@response.has_flash_with_contents?)"
101
-
102
- def assert_flash_equal(expected = nil, key = nil, message = nil) #:nodoc:
103
- msg = build_message(message, "<?> expected in flash['?'] but was <?>", expected, key, @response.flash[key])
104
- assert_block(msg) { expected == @response.flash[key] }
105
- end
106
- deprecate :assert_flash_equal => "use assert_equal(expected, @response.flash[key])"
107
-
108
-
109
- # ensure our redirection url is an exact match
110
- def assert_redirect_url(url=nil, message=nil) #:nodoc:
111
- assert_redirect(message)
112
- msg = build_message(message, "<?> is not the redirected location <?>", url, @response.redirect_url)
113
- assert_block(msg) { @response.redirect_url == url }
114
- end
115
- deprecate :assert_redirect_url => "use assert_equal(url, @response.redirect_url)"
116
-
117
- # ensure our redirection url matches a pattern
118
- def assert_redirect_url_match(pattern=nil, message=nil) #:nodoc:
119
- assert_redirect(message)
120
- msg = build_message(message, "<?> was not found in the location: <?>", pattern, @response.redirect_url)
121
- assert_block(msg) { @response.redirect_url_match?(pattern) }
122
- end
123
- deprecate :assert_redirect_url_match => "use assert(@response.redirect_url_match?(pattern))"
124
-
125
-
126
- # -- template assertions ------------------------------------------------
127
-
128
- # ensure that a template object with the given name exists
129
- def assert_template_has(key=nil, message=nil) #:nodoc:
130
- msg = build_message(message, "<?> is not a template object", key )
131
- assert_block(msg) { @response.has_template_object?(key) }
132
- end
133
- deprecate :assert_template_has => "use assert(@response.has_template_object?(key))"
134
-
135
- # ensure that a template object with the given name does not exist
136
- def assert_template_has_no(key=nil,message=nil) #:nodoc:
137
- msg = build_message(message, "<?> is a template object <?>", key, @response.template_objects[key])
138
- assert_block(msg) { !@response.has_template_object?(key) }
139
- end
140
- deprecate :assert_template_has_no => "use assert(!@response.has_template_object?(key))"
141
-
142
- # ensures that the object assigned to the template on +key+ is equal to +expected+ object.
143
- def assert_template_equal(expected = nil, key = nil, message = nil) #:nodoc:
144
- msg = build_message(message, "<?> expected in assigns['?'] but was <?>", expected, key, @response.template.assigns[key.to_s])
145
- assert_block(msg) { expected == @response.template.assigns[key.to_s] }
146
- end
147
- alias_method :assert_assigned_equal, :assert_template_equal
148
- deprecate :assert_assigned_equal => "use assert_equal(expected, @response.template.assigns[key.to_s])"
149
- deprecate :assert_template_equal => "use assert_equal(expected, @response.template.assigns[key.to_s])"
150
-
151
- # Asserts that the template returns the +expected+ string or array based on the XPath +expression+.
152
- # This will only work if the template rendered a valid XML document.
153
- def assert_template_xpath_match(expression=nil, expected=nil, message=nil) #:nodoc:
154
- xml, matches = REXML::Document.new(@response.body), []
155
- xml.elements.each(expression) { |e| matches << e.text }
156
- if matches.empty? then
157
- msg = build_message(message, "<?> not found in document", expression)
158
- flunk(msg)
159
- return
160
- elsif matches.length < 2 then
161
- matches = matches.first
162
- end
163
-
164
- msg = build_message(message, "<?> found <?>, not <?>", expression, matches, expected)
165
- assert_block(msg) { matches == expected }
166
- end
167
- deprecate :assert_template_xpath_match => "you should use assert_tag, instead"
168
-
169
- # Assert the template object with the given name is an Active Record descendant and is valid.
170
- def assert_valid_record(key = nil, message = nil) #:nodoc:
171
- record = find_record_in_template(key)
172
- msg = build_message(message, "Active Record is invalid <?>)", record.errors.full_messages)
173
- assert_block(msg) { record.valid? }
174
- end
175
- deprecate :assert_valid_record => "use assert(assigns(key).valid?)"
176
-
177
- # Assert the template object with the given name is an Active Record descendant and is invalid.
178
- def assert_invalid_record(key = nil, message = nil) #:nodoc:
179
- record = find_record_in_template(key)
180
- msg = build_message(message, "Active Record is valid)")
181
- assert_block(msg) { !record.valid? }
182
- end
183
- deprecate :assert_invalid_record => "use assert(!assigns(key).valid?)"
184
-
185
- # Assert the template object with the given name is an Active Record descendant and the specified column(s) are valid.
186
- def assert_valid_column_on_record(key = nil, columns = "", message = nil) #:nodoc:
187
- record = find_record_in_template(key)
188
- record.send(:validate)
189
-
190
- cols = glue_columns(columns)
191
- cols.delete_if { |col| !record.errors.invalid?(col) }
192
- msg = build_message(message, "Active Record has invalid columns <?>)", cols.join(",") )
193
- assert_block(msg) { cols.empty? }
194
- end
195
- deprecate :assert_valid_column_on_record => "use assert(!record.errors.invalid?(column)) instead"
196
-
197
- # Assert the template object with the given name is an Active Record descendant and the specified column(s) are invalid.
198
- def assert_invalid_column_on_record(key = nil, columns = "", message = nil) #:nodoc:
199
- record = find_record_in_template(key)
200
- record.send(:validate)
201
-
202
- cols = glue_columns(columns)
203
- cols.delete_if { |col| record.errors.invalid?(col) }
204
- msg = build_message(message, "Active Record has valid columns <?>)", cols.join(",") )
205
- assert_block(msg) { cols.empty? }
206
- end
207
- deprecate :assert_invalid_column_on_record => "use assert(record.errors.invalid?(column)) instead"
208
-
209
- private
210
- def glue_columns(columns)
211
- cols = []
212
- cols << columns if columns.class == String
213
- cols += columns if columns.class == Array
214
- cols
215
- end
216
-
217
- def find_record_in_template(key = nil)
218
- assert_not_nil assigns(key)
219
- record = @response.template_objects[key]
220
-
221
- assert_not_nil(record)
222
- assert_kind_of ActiveRecord::Base, record
223
-
224
- return record
225
- end
226
- end
227
- end
228
- end
@@ -1,36 +0,0 @@
1
- require 'cgi'
2
- require 'cgi/session'
3
- require 'cgi/session/pstore'
4
- require 'action_controller/cgi_ext/cgi_methods'
5
-
6
- # Wrapper around the CGIMethods that have been secluded to allow testing without
7
- # an instantiated CGI object
8
- class CGI #:nodoc:
9
- class << self
10
- alias :escapeHTML_fail_on_nil :escapeHTML
11
-
12
- def escapeHTML(string)
13
- escapeHTML_fail_on_nil(string) unless string.nil?
14
- end
15
- end
16
-
17
- # Returns a parameter hash including values from both the request (POST/GET)
18
- # and the query string with the latter taking precedence.
19
- def parameters
20
- request_parameters.update(query_parameters)
21
- end
22
-
23
- def query_parameters
24
- CGIMethods.parse_query_parameters(query_string)
25
- end
26
-
27
- def request_parameters
28
- CGIMethods.parse_request_parameters(params, env_table)
29
- end
30
-
31
- def session(parameters = nil)
32
- parameters = {} if parameters.nil?
33
- parameters['database_manager'] = CGI::Session::PStore
34
- CGI::Session.new(self, parameters)
35
- end
36
- end
@@ -1,211 +0,0 @@
1
- require 'cgi'
2
- require 'action_controller/vendor/xml_node'
3
- require 'strscan'
4
-
5
- # Static methods for parsing the query and request parameters that can be used in
6
- # a CGI extension class or testing in isolation.
7
- class CGIMethods #:nodoc:
8
- class << self
9
- # DEPRECATED: Use parse_form_encoded_parameters
10
- def parse_query_parameters(query_string)
11
- pairs = query_string.split('&').collect do |chunk|
12
- next if chunk.empty?
13
- key, value = chunk.split('=', 2)
14
- next if key.empty?
15
- value = (value.nil? || value.empty?) ? nil : CGI.unescape(value)
16
- [ CGI.unescape(key), value ]
17
- end.compact
18
-
19
- FormEncodedPairParser.new(pairs).result
20
- end
21
-
22
- # DEPRECATED: Use parse_form_encoded_parameters
23
- def parse_request_parameters(params)
24
- parser = FormEncodedPairParser.new
25
-
26
- params = params.dup
27
- until params.empty?
28
- for key, value in params
29
- if key.blank?
30
- params.delete key
31
- elsif !key.include?('[')
32
- # much faster to test for the most common case first (GET)
33
- # and avoid the call to build_deep_hash
34
- parser.result[key] = get_typed_value(value[0])
35
- params.delete key
36
- elsif value.is_a?(Array)
37
- parser.parse(key, get_typed_value(value.shift))
38
- params.delete key if value.empty?
39
- else
40
- raise TypeError, "Expected array, found #{value.inspect}"
41
- end
42
- end
43
- end
44
-
45
- parser.result
46
- end
47
-
48
- def parse_formatted_request_parameters(mime_type, raw_post_data)
49
- case strategy = ActionController::Base.param_parsers[mime_type]
50
- when Proc
51
- strategy.call(raw_post_data)
52
- when :xml_simple
53
- raw_post_data.blank? ? {} : Hash.from_xml(raw_post_data)
54
- when :yaml
55
- YAML.load(raw_post_data)
56
- when :xml_node
57
- node = XmlNode.from_xml(raw_post_data)
58
- { node.node_name => node }
59
- end
60
- rescue Exception => e # YAML, XML or Ruby code block errors
61
- { "exception" => "#{e.message} (#{e.class})", "backtrace" => e.backtrace,
62
- "raw_post_data" => raw_post_data, "format" => mime_type }
63
- end
64
-
65
- private
66
- def get_typed_value(value)
67
- case value
68
- when String
69
- value
70
- when NilClass
71
- ''
72
- when Array
73
- value.map { |v| get_typed_value(v) }
74
- else
75
- # Uploaded file provides content type and filename.
76
- if value.respond_to?(:content_type) &&
77
- !value.content_type.blank? &&
78
- !value.original_filename.blank?
79
- unless value.respond_to?(:full_original_filename)
80
- class << value
81
- alias_method :full_original_filename, :original_filename
82
-
83
- # Take the basename of the upload's original filename.
84
- # This handles the full Windows paths given by Internet Explorer
85
- # (and perhaps other broken user agents) without affecting
86
- # those which give the lone filename.
87
- # The Windows regexp is adapted from Perl's File::Basename.
88
- def original_filename
89
- if md = /^(?:.*[:\\\/])?(.*)/m.match(full_original_filename)
90
- md.captures.first
91
- else
92
- File.basename full_original_filename
93
- end
94
- end
95
- end
96
- end
97
-
98
- # Return the same value after overriding original_filename.
99
- value
100
-
101
- # Multipart values may have content type, but no filename.
102
- elsif value.respond_to?(:read)
103
- result = value.read
104
- value.rewind
105
- result
106
-
107
- # Unknown value, neither string nor multipart.
108
- else
109
- raise "Unknown form value: #{value.inspect}"
110
- end
111
- end
112
- end
113
- end
114
-
115
- class FormEncodedPairParser < StringScanner #:nodoc:
116
- attr_reader :top, :parent, :result
117
-
118
- def initialize(pairs = [])
119
- super('')
120
- @result = {}
121
- pairs.each { |key, value| parse(key, value) }
122
- end
123
-
124
- KEY_REGEXP = %r{([^\[\]=&]+)}
125
- BRACKETED_KEY_REGEXP = %r{\[([^\[\]=&]+)\]}
126
-
127
- # Parse the query string
128
- def parse(key, value)
129
- self.string = key
130
- @top, @parent = result, nil
131
-
132
- # First scan the bare key
133
- key = scan(KEY_REGEXP) or return
134
- key = post_key_check(key)
135
-
136
- # Then scan as many nestings as present
137
- until eos?
138
- r = scan(BRACKETED_KEY_REGEXP) or return
139
- key = self[1]
140
- key = post_key_check(key)
141
- end
142
-
143
- bind(key, value)
144
- end
145
-
146
- private
147
- # After we see a key, we must look ahead to determine our next action. Cases:
148
- #
149
- # [] follows the key. Then the value must be an array.
150
- # = follows the key. (A value comes next)
151
- # & or the end of string follows the key. Then the key is a flag.
152
- # otherwise, a hash follows the key.
153
- def post_key_check(key)
154
- if scan(/\[\]/) # a[b][] indicates that b is an array
155
- container(key, Array)
156
- nil
157
- elsif check(/\[[^\]]/) # a[b] indicates that a is a hash
158
- container(key, Hash)
159
- nil
160
- else # End of key? We do nothing.
161
- key
162
- end
163
- end
164
-
165
- # Add a container to the stack.
166
- #
167
- def container(key, klass)
168
- type_conflict! klass, top[key] if top.is_a?(Hash) && top.key?(key) && ! top[key].is_a?(klass)
169
- value = bind(key, klass.new)
170
- type_conflict! klass, value unless value.is_a?(klass)
171
- push(value)
172
- end
173
-
174
- # Push a value onto the 'stack', which is actually only the top 2 items.
175
- def push(value)
176
- @parent, @top = @top, value
177
- end
178
-
179
- # Bind a key (which may be nil for items in an array) to the provided value.
180
- def bind(key, value)
181
- if top.is_a? Array
182
- if key
183
- if top[-1].is_a?(Hash) && ! top[-1].key?(key)
184
- top[-1][key] = value
185
- else
186
- top << {key => value}.with_indifferent_access
187
- push top.last
188
- end
189
- else
190
- top << value
191
- end
192
- elsif top.is_a? Hash
193
- key = CGI.unescape(key)
194
- parent << (@top = {}) if top.key?(key) && parent.is_a?(Array)
195
- return top[key] ||= value
196
- else
197
- raise ArgumentError, "Don't know what to do: top is #{top.inspect}"
198
- end
199
-
200
- return value
201
- end
202
-
203
- def type_conflict!(klass, value)
204
- raise TypeError,
205
- "Conflicting types for parameter containers. " +
206
- "Expected an instance of #{klass}, but found an instance of #{value.class}. " +
207
- "This can be caused by passing Array and Hash based paramters qs[]=value&qs[key]=value. "
208
- end
209
-
210
- end
211
- end