eactionpack 2.1.2

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 (338) hide show
  1. data/CHANGELOG +7 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +469 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +146 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller.rb +79 -0
  8. data/lib/action_controller/assertions.rb +69 -0
  9. data/lib/action_controller/assertions/dom_assertions.rb +39 -0
  10. data/lib/action_controller/assertions/model_assertions.rb +20 -0
  11. data/lib/action_controller/assertions/response_assertions.rb +172 -0
  12. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  13. data/lib/action_controller/assertions/selector_assertions.rb +491 -0
  14. data/lib/action_controller/assertions/tag_assertions.rb +130 -0
  15. data/lib/action_controller/base.rb +1288 -0
  16. data/lib/action_controller/benchmarking.rb +94 -0
  17. data/lib/action_controller/caching.rb +72 -0
  18. data/lib/action_controller/caching/actions.rb +144 -0
  19. data/lib/action_controller/caching/fragments.rb +138 -0
  20. data/lib/action_controller/caching/pages.rb +154 -0
  21. data/lib/action_controller/caching/sql_cache.rb +18 -0
  22. data/lib/action_controller/caching/sweeping.rb +97 -0
  23. data/lib/action_controller/cgi_ext.rb +16 -0
  24. data/lib/action_controller/cgi_ext/cookie.rb +110 -0
  25. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  26. data/lib/action_controller/cgi_ext/session.rb +73 -0
  27. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  28. data/lib/action_controller/cgi_process.rb +223 -0
  29. data/lib/action_controller/components.rb +166 -0
  30. data/lib/action_controller/cookies.rb +96 -0
  31. data/lib/action_controller/dispatcher.rb +162 -0
  32. data/lib/action_controller/filters.rb +642 -0
  33. data/lib/action_controller/flash.rb +172 -0
  34. data/lib/action_controller/headers.rb +31 -0
  35. data/lib/action_controller/helpers.rb +221 -0
  36. data/lib/action_controller/http_authentication.rb +124 -0
  37. data/lib/action_controller/integration.rb +634 -0
  38. data/lib/action_controller/layout.rb +309 -0
  39. data/lib/action_controller/mime_responds.rb +173 -0
  40. data/lib/action_controller/mime_type.rb +186 -0
  41. data/lib/action_controller/mime_types.rb +20 -0
  42. data/lib/action_controller/polymorphic_routes.rb +191 -0
  43. data/lib/action_controller/record_identifier.rb +102 -0
  44. data/lib/action_controller/request.rb +764 -0
  45. data/lib/action_controller/request_forgery_protection.rb +140 -0
  46. data/lib/action_controller/request_profiler.rb +169 -0
  47. data/lib/action_controller/rescue.rb +258 -0
  48. data/lib/action_controller/resources.rb +572 -0
  49. data/lib/action_controller/response.rb +76 -0
  50. data/lib/action_controller/routing.rb +387 -0
  51. data/lib/action_controller/routing/builder.rb +203 -0
  52. data/lib/action_controller/routing/optimisations.rb +120 -0
  53. data/lib/action_controller/routing/recognition_optimisation.rb +162 -0
  54. data/lib/action_controller/routing/route.rb +240 -0
  55. data/lib/action_controller/routing/route_set.rb +436 -0
  56. data/lib/action_controller/routing/routing_ext.rb +46 -0
  57. data/lib/action_controller/routing/segments.rb +283 -0
  58. data/lib/action_controller/session/active_record_store.rb +340 -0
  59. data/lib/action_controller/session/cookie_store.rb +166 -0
  60. data/lib/action_controller/session/drb_server.rb +32 -0
  61. data/lib/action_controller/session/drb_store.rb +35 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +98 -0
  63. data/lib/action_controller/session_management.rb +158 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +155 -0
  66. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  67. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  68. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  69. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  70. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  71. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  72. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  73. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  74. data/lib/action_controller/test_case.rb +83 -0
  75. data/lib/action_controller/test_process.rb +526 -0
  76. data/lib/action_controller/url_rewriter.rb +142 -0
  77. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  78. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  79. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  80. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  81. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  82. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  83. data/lib/action_controller/verification.rb +130 -0
  84. data/lib/action_pack.rb +24 -0
  85. data/lib/action_pack/version.rb +9 -0
  86. data/lib/action_view.rb +44 -0
  87. data/lib/action_view/base.rb +335 -0
  88. data/lib/action_view/helpers/active_record_helper.rb +276 -0
  89. data/lib/action_view/helpers/asset_tag_helper.rb +599 -0
  90. data/lib/action_view/helpers/atom_feed_helper.rb +143 -0
  91. data/lib/action_view/helpers/benchmark_helper.rb +33 -0
  92. data/lib/action_view/helpers/cache_helper.rb +40 -0
  93. data/lib/action_view/helpers/capture_helper.rb +161 -0
  94. data/lib/action_view/helpers/date_helper.rb +711 -0
  95. data/lib/action_view/helpers/debug_helper.rb +31 -0
  96. data/lib/action_view/helpers/form_helper.rb +767 -0
  97. data/lib/action_view/helpers/form_options_helper.rb +458 -0
  98. data/lib/action_view/helpers/form_tag_helper.rb +458 -0
  99. data/lib/action_view/helpers/javascript_helper.rb +148 -0
  100. data/lib/action_view/helpers/number_helper.rb +186 -0
  101. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  102. data/lib/action_view/helpers/record_tag_helper.rb +59 -0
  103. data/lib/action_view/helpers/sanitize_helper.rb +229 -0
  104. data/lib/action_view/helpers/tag_helper.rb +134 -0
  105. data/lib/action_view/helpers/text_helper.rb +507 -0
  106. data/lib/action_view/helpers/url_helper.rb +573 -0
  107. data/lib/action_view/inline_template.rb +20 -0
  108. data/lib/action_view/partial_template.rb +70 -0
  109. data/lib/action_view/partials.rb +158 -0
  110. data/lib/action_view/template.rb +125 -0
  111. data/lib/action_view/template_error.rb +110 -0
  112. data/lib/action_view/template_finder.rb +176 -0
  113. data/lib/action_view/template_handler.rb +34 -0
  114. data/lib/action_view/template_handlers/builder.rb +27 -0
  115. data/lib/action_view/template_handlers/compilable.rb +128 -0
  116. data/lib/action_view/template_handlers/erb.rb +56 -0
  117. data/lib/action_view/test_case.rb +58 -0
  118. data/lib/actionpack.rb +1 -0
  119. data/test/abstract_unit.rb +36 -0
  120. data/test/active_record_unit.rb +105 -0
  121. data/test/activerecord/active_record_store_test.rb +141 -0
  122. data/test/activerecord/render_partial_with_record_identification_test.rb +191 -0
  123. data/test/adv_attr_test.rb +20 -0
  124. data/test/controller/action_pack_assertions_test.rb +543 -0
  125. data/test/controller/addresses_render_test.rb +43 -0
  126. data/test/controller/assert_select_test.rb +331 -0
  127. data/test/controller/base_test.rb +219 -0
  128. data/test/controller/benchmark_test.rb +32 -0
  129. data/test/controller/caching_test.rb +581 -0
  130. data/test/controller/capture_test.rb +89 -0
  131. data/test/controller/cgi_test.rb +116 -0
  132. data/test/controller/components_test.rb +140 -0
  133. data/test/controller/content_type_test.rb +139 -0
  134. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  135. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  136. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  137. data/test/controller/cookie_test.rb +146 -0
  138. data/test/controller/custom_handler_test.rb +45 -0
  139. data/test/controller/deprecation/deprecated_base_methods_test.rb +37 -0
  140. data/test/controller/dispatcher_test.rb +105 -0
  141. data/test/controller/fake_controllers.rb +33 -0
  142. data/test/controller/fake_models.rb +11 -0
  143. data/test/controller/filter_params_test.rb +49 -0
  144. data/test/controller/filters_test.rb +881 -0
  145. data/test/controller/flash_test.rb +146 -0
  146. data/test/controller/header_test.rb +14 -0
  147. data/test/controller/helper_test.rb +210 -0
  148. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  149. data/test/controller/html-scanner/document_test.rb +148 -0
  150. data/test/controller/html-scanner/node_test.rb +89 -0
  151. data/test/controller/html-scanner/sanitizer_test.rb +269 -0
  152. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  153. data/test/controller/html-scanner/text_node_test.rb +50 -0
  154. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  155. data/test/controller/http_authentication_test.rb +54 -0
  156. data/test/controller/integration_test.rb +252 -0
  157. data/test/controller/integration_upload_test.rb +43 -0
  158. data/test/controller/layout_test.rb +255 -0
  159. data/test/controller/mime_responds_test.rb +514 -0
  160. data/test/controller/mime_type_test.rb +84 -0
  161. data/test/controller/new_render_test.rb +843 -0
  162. data/test/controller/polymorphic_routes_test.rb +174 -0
  163. data/test/controller/record_identifier_test.rb +139 -0
  164. data/test/controller/redirect_test.rb +289 -0
  165. data/test/controller/render_test.rb +484 -0
  166. data/test/controller/request_forgery_protection_test.rb +305 -0
  167. data/test/controller/request_test.rb +928 -0
  168. data/test/controller/rescue_test.rb +517 -0
  169. data/test/controller/resources_test.rb +873 -0
  170. data/test/controller/routing_test.rb +2464 -0
  171. data/test/controller/selector_test.rb +628 -0
  172. data/test/controller/send_file_test.rb +138 -0
  173. data/test/controller/session/cookie_store_test.rb +258 -0
  174. data/test/controller/session/mem_cache_store_test.rb +181 -0
  175. data/test/controller/session_fixation_test.rb +89 -0
  176. data/test/controller/session_management_test.rb +178 -0
  177. data/test/controller/test_test.rb +695 -0
  178. data/test/controller/url_rewriter_test.rb +310 -0
  179. data/test/controller/verification_test.rb +270 -0
  180. data/test/controller/view_paths_test.rb +140 -0
  181. data/test/controller/webservice_test.rb +229 -0
  182. data/test/fixtures/addresses/list.erb +1 -0
  183. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  184. data/test/fixtures/companies.yml +24 -0
  185. data/test/fixtures/company.rb +10 -0
  186. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  187. data/test/fixtures/content_type/render_default_for_js.js.erb +1 -0
  188. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  189. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  190. data/test/fixtures/customers/_customer.html.erb +1 -0
  191. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  192. data/test/fixtures/developer.rb +9 -0
  193. data/test/fixtures/developers.yml +21 -0
  194. data/test/fixtures/developers_projects.yml +13 -0
  195. data/test/fixtures/fun/games/hello_world.erb +1 -0
  196. data/test/fixtures/functional_caching/_partial.erb +3 -0
  197. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  198. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  199. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  200. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  201. data/test/fixtures/helpers/abc_helper.rb +5 -0
  202. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  203. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  204. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  205. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  206. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  207. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  208. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  209. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  210. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  211. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  212. data/test/fixtures/layouts/builder.builder +3 -0
  213. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  214. data/test/fixtures/layouts/standard.erb +1 -0
  215. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  216. data/test/fixtures/layouts/yield.erb +2 -0
  217. data/test/fixtures/mascot.rb +3 -0
  218. data/test/fixtures/mascots.yml +4 -0
  219. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  220. data/test/fixtures/multipart/binary_file +0 -0
  221. data/test/fixtures/multipart/boundary_problem_file +10 -0
  222. data/test/fixtures/multipart/bracketed_param +5 -0
  223. data/test/fixtures/multipart/large_text_file +10 -0
  224. data/test/fixtures/multipart/mixed_files +0 -0
  225. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  226. data/test/fixtures/multipart/single_parameter +5 -0
  227. data/test/fixtures/multipart/text_file +10 -0
  228. data/test/fixtures/override/test/hello_world.erb +1 -0
  229. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  230. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  231. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  232. data/test/fixtures/post_test/post/index.html.erb +1 -0
  233. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  234. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  235. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  236. data/test/fixtures/project.rb +3 -0
  237. data/test/fixtures/projects.yml +7 -0
  238. data/test/fixtures/public/404.html +1 -0
  239. data/test/fixtures/public/500.html +1 -0
  240. data/test/fixtures/public/images/rails.png +0 -0
  241. data/test/fixtures/public/javascripts/application.js +1 -0
  242. data/test/fixtures/public/javascripts/bank.js +1 -0
  243. data/test/fixtures/public/javascripts/robber.js +1 -0
  244. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  245. data/test/fixtures/public/stylesheets/bank.css +1 -0
  246. data/test/fixtures/public/stylesheets/robber.css +1 -0
  247. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  248. data/test/fixtures/replies.yml +15 -0
  249. data/test/fixtures/reply.rb +7 -0
  250. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  251. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  252. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  253. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  254. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  255. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  256. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  257. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  258. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  259. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  260. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  261. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  262. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  263. data/test/fixtures/scope/test/modgreet.erb +1 -0
  264. data/test/fixtures/shared.html.erb +1 -0
  265. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  266. data/test/fixtures/test/_customer.erb +1 -0
  267. data/test/fixtures/test/_customer_counter.erb +1 -0
  268. data/test/fixtures/test/_customer_greeting.erb +1 -0
  269. data/test/fixtures/test/_form.erb +1 -0
  270. data/test/fixtures/test/_hash_greeting.erb +1 -0
  271. data/test/fixtures/test/_hash_object.erb +2 -0
  272. data/test/fixtures/test/_hello.builder +1 -0
  273. data/test/fixtures/test/_labelling_form.erb +1 -0
  274. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  275. data/test/fixtures/test/_partial.erb +1 -0
  276. data/test/fixtures/test/_partial.html.erb +1 -0
  277. data/test/fixtures/test/_partial.js.erb +1 -0
  278. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  279. data/test/fixtures/test/_partial_only.erb +1 -0
  280. data/test/fixtures/test/_person.erb +2 -0
  281. data/test/fixtures/test/_raise.html.erb +1 -0
  282. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  283. data/test/fixtures/test/block_content_for.erb +2 -0
  284. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  285. data/test/fixtures/test/capturing.erb +4 -0
  286. data/test/fixtures/test/content_for.erb +2 -0
  287. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  288. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  289. data/test/fixtures/test/delete_with_js.rjs +2 -0
  290. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  291. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  292. data/test/fixtures/test/erb_content_for.erb +2 -0
  293. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  294. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  295. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  296. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  297. data/test/fixtures/test/greeting.erb +1 -0
  298. data/test/fixtures/test/greeting.js.rjs +1 -0
  299. data/test/fixtures/test/hello.builder +4 -0
  300. data/test/fixtures/test/hello_world.erb +1 -0
  301. data/test/fixtures/test/hello_world_container.builder +3 -0
  302. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  303. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  304. data/test/fixtures/test/hello_xml_world.builder +11 -0
  305. data/test/fixtures/test/list.erb +1 -0
  306. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  307. data/test/fixtures/test/potential_conflicts.erb +4 -0
  308. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  309. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  310. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  311. data/test/fixtures/test/render_to_string_test.erb +1 -0
  312. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  313. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  314. data/test/fixtures/topic.rb +3 -0
  315. data/test/fixtures/topics.yml +22 -0
  316. data/test/fixtures/topics/_topic.html.erb +1 -0
  317. data/test/template/active_record_helper_test.rb +268 -0
  318. data/test/template/asset_tag_helper_test.rb +514 -0
  319. data/test/template/atom_feed_helper_test.rb +179 -0
  320. data/test/template/benchmark_helper_test.rb +60 -0
  321. data/test/template/date_helper_test.rb +1791 -0
  322. data/test/template/deprecated_erb_variable_test.rb +9 -0
  323. data/test/template/erb_util_test.rb +24 -0
  324. data/test/template/form_helper_test.rb +885 -0
  325. data/test/template/form_options_helper_test.rb +1333 -0
  326. data/test/template/form_tag_helper_test.rb +272 -0
  327. data/test/template/javascript_helper_test.rb +73 -0
  328. data/test/template/number_helper_test.rb +97 -0
  329. data/test/template/record_tag_helper_test.rb +54 -0
  330. data/test/template/sanitize_helper_test.rb +48 -0
  331. data/test/template/tag_helper_test.rb +77 -0
  332. data/test/template/template_finder_test.rb +73 -0
  333. data/test/template/template_object_test.rb +95 -0
  334. data/test/template/test_test.rb +56 -0
  335. data/test/template/text_helper_test.rb +367 -0
  336. data/test/template/url_helper_test.rb +544 -0
  337. data/test/testing_sandbox.rb +15 -0
  338. metadata +469 -0
@@ -0,0 +1,310 @@
1
+ require 'abstract_unit'
2
+
3
+ ActionController::UrlRewriter
4
+
5
+ class UrlRewriterTests < Test::Unit::TestCase
6
+ def setup
7
+ @request = ActionController::TestRequest.new
8
+ @params = {}
9
+ @rewriter = ActionController::UrlRewriter.new(@request, @params)
10
+ end
11
+
12
+ def test_port
13
+ assert_equal('http://test.host:1271/c/a/i',
14
+ @rewriter.rewrite(:controller => 'c', :action => 'a', :id => 'i', :port => 1271)
15
+ )
16
+ end
17
+
18
+ def test_protocol_with_and_without_separator
19
+ assert_equal('https://test.host/c/a/i',
20
+ @rewriter.rewrite(:protocol => 'https', :controller => 'c', :action => 'a', :id => 'i')
21
+ )
22
+
23
+ assert_equal('https://test.host/c/a/i',
24
+ @rewriter.rewrite(:protocol => 'https://', :controller => 'c', :action => 'a', :id => 'i')
25
+ )
26
+ end
27
+
28
+ def test_user_name_and_password
29
+ assert_equal(
30
+ 'http://david:secret@test.host/c/a/i',
31
+ @rewriter.rewrite(:user => "david", :password => "secret", :controller => 'c', :action => 'a', :id => 'i')
32
+ )
33
+ end
34
+
35
+ def test_user_name_and_password_with_escape_codes
36
+ assert_equal(
37
+ 'http://openid.aol.com%2Fnextangler:one+two%3F@test.host/c/a/i',
38
+ @rewriter.rewrite(:user => "openid.aol.com/nextangler", :password => "one two?", :controller => 'c', :action => 'a', :id => 'i')
39
+ )
40
+ end
41
+
42
+ def test_anchor
43
+ assert_equal(
44
+ 'http://test.host/c/a/i#anchor',
45
+ @rewriter.rewrite(:controller => 'c', :action => 'a', :id => 'i', :anchor => 'anchor')
46
+ )
47
+ end
48
+
49
+ def test_overwrite_params
50
+ @params[:controller] = 'hi'
51
+ @params[:action] = 'bye'
52
+ @params[:id] = '2'
53
+
54
+ assert_equal '/hi/hi/2', @rewriter.rewrite(:only_path => true, :overwrite_params => {:action => 'hi'})
55
+ u = @rewriter.rewrite(:only_path => false, :overwrite_params => {:action => 'hi'})
56
+ assert_match %r(/hi/hi/2$), u
57
+ end
58
+
59
+ def test_overwrite_removes_original
60
+ @params[:controller] = 'search'
61
+ @params[:action] = 'list'
62
+ @params[:list_page] = 1
63
+
64
+ assert_equal '/search/list?list_page=2', @rewriter.rewrite(:only_path => true, :overwrite_params => {"list_page" => 2})
65
+ u = @rewriter.rewrite(:only_path => false, :overwrite_params => {:list_page => 2})
66
+ assert_equal 'http://test.host/search/list?list_page=2', u
67
+ end
68
+
69
+ def test_to_str
70
+ @params[:controller] = 'hi'
71
+ @params[:action] = 'bye'
72
+ @request.parameters[:id] = '2'
73
+
74
+ assert_equal 'http://, test.host, /, hi, bye, {"id"=>"2"}', @rewriter.to_str
75
+ end
76
+
77
+ def test_trailing_slash
78
+ options = {:controller => 'foo', :action => 'bar', :id => '3', :only_path => true}
79
+ assert_equal '/foo/bar/3', @rewriter.rewrite(options)
80
+ assert_equal '/foo/bar/3?query=string', @rewriter.rewrite(options.merge({:query => 'string'}))
81
+ options.update({:trailing_slash => true})
82
+ assert_equal '/foo/bar/3/', @rewriter.rewrite(options)
83
+ options.update({:query => 'string'})
84
+ assert_equal '/foo/bar/3/?query=string', @rewriter.rewrite(options)
85
+ end
86
+ end
87
+
88
+ class UrlWriterTests < Test::Unit::TestCase
89
+
90
+ class W
91
+ include ActionController::UrlWriter
92
+ end
93
+
94
+ def teardown
95
+ W.default_url_options.clear
96
+ end
97
+
98
+ def add_host!
99
+ W.default_url_options[:host] = 'www.basecamphq.com'
100
+ end
101
+
102
+ def test_exception_is_thrown_without_host
103
+ assert_raises RuntimeError do
104
+ W.new.url_for :controller => 'c', :action => 'a', :id => 'i'
105
+ end
106
+ end
107
+
108
+ def test_anchor
109
+ assert_equal('/c/a#anchor',
110
+ W.new.url_for(:only_path => true, :controller => 'c', :action => 'a', :anchor => 'anchor')
111
+ )
112
+ end
113
+
114
+ def test_default_host
115
+ add_host!
116
+ assert_equal('http://www.basecamphq.com/c/a/i',
117
+ W.new.url_for(:controller => 'c', :action => 'a', :id => 'i')
118
+ )
119
+ end
120
+
121
+ def test_host_may_be_overridden
122
+ add_host!
123
+ assert_equal('http://37signals.basecamphq.com/c/a/i',
124
+ W.new.url_for(:host => '37signals.basecamphq.com', :controller => 'c', :action => 'a', :id => 'i')
125
+ )
126
+ end
127
+
128
+ def test_port
129
+ add_host!
130
+ assert_equal('http://www.basecamphq.com:3000/c/a/i',
131
+ W.new.url_for(:controller => 'c', :action => 'a', :id => 'i', :port => 3000)
132
+ )
133
+ end
134
+
135
+ def test_protocol
136
+ add_host!
137
+ assert_equal('https://www.basecamphq.com/c/a/i',
138
+ W.new.url_for(:controller => 'c', :action => 'a', :id => 'i', :protocol => 'https')
139
+ )
140
+ end
141
+
142
+ def test_protocol_with_and_without_separator
143
+ add_host!
144
+ assert_equal('https://www.basecamphq.com/c/a/i',
145
+ W.new.url_for(:controller => 'c', :action => 'a', :id => 'i', :protocol => 'https')
146
+ )
147
+ assert_equal('https://www.basecamphq.com/c/a/i',
148
+ W.new.url_for(:controller => 'c', :action => 'a', :id => 'i', :protocol => 'https://')
149
+ )
150
+ end
151
+
152
+ def test_trailing_slash
153
+ add_host!
154
+ options = {:controller => 'foo', :trailing_slash => true, :action => 'bar', :id => '33'}
155
+ assert_equal('http://www.basecamphq.com/foo/bar/33/', W.new.url_for(options) )
156
+ end
157
+
158
+ def test_trailing_slash_with_protocol
159
+ add_host!
160
+ options = { :trailing_slash => true,:protocol => 'https', :controller => 'foo', :action => 'bar', :id => '33'}
161
+ assert_equal('https://www.basecamphq.com/foo/bar/33/', W.new.url_for(options) )
162
+ assert_equal 'https://www.basecamphq.com/foo/bar/33/?query=string', W.new.url_for(options.merge({:query => 'string'}))
163
+ end
164
+
165
+ def test_trailing_slash_with_only_path
166
+ options = {:controller => 'foo', :trailing_slash => true}
167
+ assert_equal '/foo/', W.new.url_for(options.merge({:only_path => true}))
168
+ options.update({:action => 'bar', :id => '33'})
169
+ assert_equal '/foo/bar/33/', W.new.url_for(options.merge({:only_path => true}))
170
+ assert_equal '/foo/bar/33/?query=string', W.new.url_for(options.merge({:query => 'string',:only_path => true}))
171
+ end
172
+
173
+ def test_trailing_slash_with_anchor
174
+ options = {:trailing_slash => true, :controller => 'foo', :action => 'bar', :id => '33', :only_path => true, :anchor=> 'chapter7'}
175
+ assert_equal '/foo/bar/33/#chapter7', W.new.url_for(options)
176
+ assert_equal '/foo/bar/33/?query=string#chapter7', W.new.url_for(options.merge({:query => 'string'}))
177
+ end
178
+
179
+ def test_trailing_slash_with_params
180
+ url = W.new.url_for(:trailing_slash => true, :only_path => true, :controller => 'cont', :action => 'act', :p1 => 'cafe', :p2 => 'link')
181
+ params = extract_params(url)
182
+ assert_equal params[0], { :p1 => 'cafe' }.to_query
183
+ assert_equal params[1], { :p2 => 'link' }.to_query
184
+ end
185
+
186
+ def test_relative_url_root_is_respected
187
+ orig_relative_url_root = ActionController::AbstractRequest.relative_url_root
188
+ ActionController::AbstractRequest.relative_url_root = '/subdir'
189
+
190
+ add_host!
191
+ assert_equal('https://www.basecamphq.com/subdir/c/a/i',
192
+ W.new.url_for(:controller => 'c', :action => 'a', :id => 'i', :protocol => 'https')
193
+ )
194
+ ensure
195
+ ActionController::AbstractRequest.relative_url_root = orig_relative_url_root
196
+ end
197
+
198
+ def test_named_routes
199
+ ActionController::Routing::Routes.draw do |map|
200
+ map.no_args '/this/is/verbose', :controller => 'home', :action => 'index'
201
+ map.home '/home/sweet/home/:user', :controller => 'home', :action => 'index'
202
+ map.connect ':controller/:action/:id'
203
+ end
204
+
205
+ # We need to create a new class in order to install the new named route.
206
+ kls = Class.new { include ActionController::UrlWriter }
207
+ controller = kls.new
208
+ assert controller.respond_to?(:home_url)
209
+ assert_equal 'http://www.basecamphq.com/home/sweet/home/again',
210
+ controller.send(:home_url, :host => 'www.basecamphq.com', :user => 'again')
211
+
212
+ assert_equal("/home/sweet/home/alabama", controller.send(:home_path, :user => 'alabama', :host => 'unused'))
213
+ assert_equal("http://www.basecamphq.com/home/sweet/home/alabama", controller.send(:home_url, :user => 'alabama', :host => 'www.basecamphq.com'))
214
+ assert_equal("http://www.basecamphq.com/this/is/verbose", controller.send(:no_args_url, :host=>'www.basecamphq.com'))
215
+ ensure
216
+ ActionController::Routing::Routes.load!
217
+ end
218
+
219
+ def test_relative_url_root_is_respected_for_named_routes
220
+ orig_relative_url_root = ActionController::AbstractRequest.relative_url_root
221
+ ActionController::AbstractRequest.relative_url_root = '/subdir'
222
+
223
+ ActionController::Routing::Routes.draw do |map|
224
+ map.home '/home/sweet/home/:user', :controller => 'home', :action => 'index'
225
+ end
226
+
227
+ kls = Class.new { include ActionController::UrlWriter }
228
+ controller = kls.new
229
+
230
+ assert_equal 'http://www.basecamphq.com/subdir/home/sweet/home/again',
231
+ controller.send(:home_url, :host => 'www.basecamphq.com', :user => 'again')
232
+ ensure
233
+ ActionController::Routing::Routes.load!
234
+ ActionController::AbstractRequest.relative_url_root = orig_relative_url_root
235
+ end
236
+
237
+ def test_only_path
238
+ ActionController::Routing::Routes.draw do |map|
239
+ map.home '/home/sweet/home/:user', :controller => 'home', :action => 'index'
240
+ map.connect ':controller/:action/:id'
241
+ end
242
+
243
+ # We need to create a new class in order to install the new named route.
244
+ kls = Class.new { include ActionController::UrlWriter }
245
+ controller = kls.new
246
+ assert controller.respond_to?(:home_url)
247
+ assert_equal '/brave/new/world',
248
+ controller.send(:url_for, :controller => 'brave', :action => 'new', :id => 'world', :only_path => true)
249
+
250
+ assert_equal("/home/sweet/home/alabama", controller.send(:home_url, :user => 'alabama', :host => 'unused', :only_path => true))
251
+ assert_equal("/home/sweet/home/alabama", controller.send(:home_path, 'alabama'))
252
+ ensure
253
+ ActionController::Routing::Routes.load!
254
+ end
255
+
256
+ def test_one_parameter
257
+ assert_equal('/c/a?param=val',
258
+ W.new.url_for(:only_path => true, :controller => 'c', :action => 'a', :param => 'val')
259
+ )
260
+ end
261
+
262
+ def test_two_parameters
263
+ url = W.new.url_for(:only_path => true, :controller => 'c', :action => 'a', :p1 => 'X1', :p2 => 'Y2')
264
+ params = extract_params(url)
265
+ assert_equal params[0], { :p1 => 'X1' }.to_query
266
+ assert_equal params[1], { :p2 => 'Y2' }.to_query
267
+ end
268
+
269
+ def test_hash_parameter
270
+ url = W.new.url_for(:only_path => true, :controller => 'c', :action => 'a', :query => {:name => 'Bob', :category => 'prof'})
271
+ params = extract_params(url)
272
+ assert_equal params[0], { 'query[category]' => 'prof' }.to_query
273
+ assert_equal params[1], { 'query[name]' => 'Bob' }.to_query
274
+ end
275
+
276
+ def test_array_parameter
277
+ url = W.new.url_for(:only_path => true, :controller => 'c', :action => 'a', :query => ['Bob', 'prof'])
278
+ params = extract_params(url)
279
+ assert_equal params[0], { 'query[]' => 'Bob' }.to_query
280
+ assert_equal params[1], { 'query[]' => 'prof' }.to_query
281
+ end
282
+
283
+ def test_hash_recursive_parameters
284
+ url = W.new.url_for(:only_path => true, :controller => 'c', :action => 'a', :query => {:person => {:name => 'Bob', :position => 'prof'}, :hobby => 'piercing'})
285
+ params = extract_params(url)
286
+ assert_equal params[0], { 'query[hobby]' => 'piercing' }.to_query
287
+ assert_equal params[1], { 'query[person][name]' => 'Bob' }.to_query
288
+ assert_equal params[2], { 'query[person][position]' => 'prof' }.to_query
289
+ end
290
+
291
+ def test_hash_recursive_and_array_parameters
292
+ url = W.new.url_for(:only_path => true, :controller => 'c', :action => 'a', :id => 101, :query => {:person => {:name => 'Bob', :position => ['prof', 'art director']}, :hobby => 'piercing'})
293
+ assert_match %r(^/c/a/101), url
294
+ params = extract_params(url)
295
+ assert_equal params[0], { 'query[hobby]' => 'piercing' }.to_query
296
+ assert_equal params[1], { 'query[person][name]' => 'Bob' }.to_query
297
+ assert_equal params[2], { 'query[person][position][]' => 'prof' }.to_query
298
+ assert_equal params[3], { 'query[person][position][]' => 'art director' }.to_query
299
+ end
300
+
301
+ def test_path_generation_for_symbol_parameter_keys
302
+ assert_generates("/image", :controller=> :image)
303
+ end
304
+
305
+ private
306
+ def extract_params(url)
307
+ url.split('?', 2).last.split('&')
308
+ end
309
+
310
+ end
@@ -0,0 +1,270 @@
1
+ require 'abstract_unit'
2
+
3
+ class VerificationTest < Test::Unit::TestCase
4
+ class TestController < ActionController::Base
5
+ verify :only => :guarded_one, :params => "one",
6
+ :add_flash => { :error => 'unguarded' },
7
+ :redirect_to => { :action => "unguarded" }
8
+
9
+ verify :only => :guarded_two, :params => %w( one two ),
10
+ :redirect_to => { :action => "unguarded" }
11
+
12
+ verify :only => :guarded_with_flash, :params => "one",
13
+ :add_flash => { :notice => "prereqs failed" },
14
+ :redirect_to => { :action => "unguarded" }
15
+
16
+ verify :only => :guarded_in_session, :session => "one",
17
+ :redirect_to => { :action => "unguarded" }
18
+
19
+ verify :only => [:multi_one, :multi_two], :session => %w( one two ),
20
+ :redirect_to => { :action => "unguarded" }
21
+
22
+ verify :only => :guarded_by_method, :method => :post,
23
+ :redirect_to => { :action => "unguarded" }
24
+
25
+ verify :only => :guarded_by_xhr, :xhr => true,
26
+ :redirect_to => { :action => "unguarded" }
27
+
28
+ verify :only => :guarded_by_not_xhr, :xhr => false,
29
+ :redirect_to => { :action => "unguarded" }
30
+
31
+ before_filter :unconditional_redirect, :only => :two_redirects
32
+ verify :only => :two_redirects, :method => :post,
33
+ :redirect_to => { :action => "unguarded" }
34
+
35
+ verify :only => :must_be_post, :method => :post, :render => { :status => 405, :text => "Must be post" }, :add_headers => { "Allow" => "POST" }
36
+
37
+ verify :only => :guarded_one_for_named_route_test, :params => "one",
38
+ :redirect_to => :foo_url
39
+
40
+ verify :only => :no_default_action, :params => "santa"
41
+
42
+ verify :only => :guarded_with_back, :method => :post,
43
+ :redirect_to => :back
44
+
45
+ def guarded_one
46
+ render :text => "#{params[:one]}"
47
+ end
48
+
49
+ def guarded_one_for_named_route_test
50
+ render :text => "#{params[:one]}"
51
+ end
52
+
53
+ def guarded_with_flash
54
+ render :text => "#{params[:one]}"
55
+ end
56
+
57
+ def guarded_two
58
+ render :text => "#{params[:one]}:#{params[:two]}"
59
+ end
60
+
61
+ def guarded_in_session
62
+ render :text => "#{session["one"]}"
63
+ end
64
+
65
+ def multi_one
66
+ render :text => "#{session["one"]}:#{session["two"]}"
67
+ end
68
+
69
+ def multi_two
70
+ render :text => "#{session["two"]}:#{session["one"]}"
71
+ end
72
+
73
+ def guarded_by_method
74
+ render :text => "#{request.method}"
75
+ end
76
+
77
+ def guarded_by_xhr
78
+ render :text => "#{request.xhr?}"
79
+ end
80
+
81
+ def guarded_by_not_xhr
82
+ render :text => "#{request.xhr?}"
83
+ end
84
+
85
+ def unguarded
86
+ render :text => "#{params[:one]}"
87
+ end
88
+
89
+ def two_redirects
90
+ render :nothing => true
91
+ end
92
+
93
+ def must_be_post
94
+ render :text => "Was a post!"
95
+ end
96
+
97
+ def guarded_with_back
98
+ render :text => "#{params[:one]}"
99
+ end
100
+
101
+ def no_default_action
102
+ # Will never run
103
+ end
104
+
105
+ protected
106
+ def rescue_action(e) raise end
107
+
108
+ def unconditional_redirect
109
+ redirect_to :action => "unguarded"
110
+ end
111
+ end
112
+
113
+ def setup
114
+ @controller = TestController.new
115
+ @request = ActionController::TestRequest.new
116
+ @response = ActionController::TestResponse.new
117
+ ActionController::Routing::Routes.add_named_route :foo, '/foo', :controller => 'test', :action => 'foo'
118
+ end
119
+
120
+ def test_using_symbol_back_with_no_referrer
121
+ assert_raise(ActionController::RedirectBackError) { get :guarded_with_back }
122
+ end
123
+
124
+ def test_using_symbol_back_redirects_to_referrer
125
+ @request.env["HTTP_REFERER"] = "/foo"
126
+ get :guarded_with_back
127
+ assert_redirected_to '/foo'
128
+ end
129
+
130
+ def test_no_deprecation_warning_for_named_route
131
+ assert_not_deprecated do
132
+ get :guarded_one_for_named_route_test, :two => "not one"
133
+ assert_redirected_to '/foo'
134
+ end
135
+ end
136
+
137
+ def test_guarded_one_with_prereqs
138
+ get :guarded_one, :one => "here"
139
+ assert_equal "here", @response.body
140
+ end
141
+
142
+ def test_guarded_one_without_prereqs
143
+ get :guarded_one
144
+ assert_redirected_to :action => "unguarded"
145
+ assert_equal 'unguarded', flash[:error]
146
+ end
147
+
148
+ def test_guarded_with_flash_with_prereqs
149
+ get :guarded_with_flash, :one => "here"
150
+ assert_equal "here", @response.body
151
+ assert flash.empty?
152
+ end
153
+
154
+ def test_guarded_with_flash_without_prereqs
155
+ get :guarded_with_flash
156
+ assert_redirected_to :action => "unguarded"
157
+ assert_equal "prereqs failed", flash[:notice]
158
+ end
159
+
160
+ def test_guarded_two_with_prereqs
161
+ get :guarded_two, :one => "here", :two => "there"
162
+ assert_equal "here:there", @response.body
163
+ end
164
+
165
+ def test_guarded_two_without_prereqs_one
166
+ get :guarded_two, :two => "there"
167
+ assert_redirected_to :action => "unguarded"
168
+ end
169
+
170
+ def test_guarded_two_without_prereqs_two
171
+ get :guarded_two, :one => "here"
172
+ assert_redirected_to :action => "unguarded"
173
+ end
174
+
175
+ def test_guarded_two_without_prereqs_both
176
+ get :guarded_two
177
+ assert_redirected_to :action => "unguarded"
178
+ end
179
+
180
+ def test_unguarded_with_params
181
+ get :unguarded, :one => "here"
182
+ assert_equal "here", @response.body
183
+ end
184
+
185
+ def test_unguarded_without_params
186
+ get :unguarded
187
+ assert_equal "", @response.body
188
+ end
189
+
190
+ def test_guarded_in_session_with_prereqs
191
+ get :guarded_in_session, {}, "one" => "here"
192
+ assert_equal "here", @response.body
193
+ end
194
+
195
+ def test_guarded_in_session_without_prereqs
196
+ get :guarded_in_session
197
+ assert_redirected_to :action => "unguarded"
198
+ end
199
+
200
+ def test_multi_one_with_prereqs
201
+ get :multi_one, {}, "one" => "here", "two" => "there"
202
+ assert_equal "here:there", @response.body
203
+ end
204
+
205
+ def test_multi_one_without_prereqs
206
+ get :multi_one
207
+ assert_redirected_to :action => "unguarded"
208
+ end
209
+
210
+ def test_multi_two_with_prereqs
211
+ get :multi_two, {}, "one" => "here", "two" => "there"
212
+ assert_equal "there:here", @response.body
213
+ end
214
+
215
+ def test_multi_two_without_prereqs
216
+ get :multi_two
217
+ assert_redirected_to :action => "unguarded"
218
+ end
219
+
220
+ def test_guarded_by_method_with_prereqs
221
+ post :guarded_by_method
222
+ assert_equal "post", @response.body
223
+ end
224
+
225
+ def test_guarded_by_method_without_prereqs
226
+ get :guarded_by_method
227
+ assert_redirected_to :action => "unguarded"
228
+ end
229
+
230
+ def test_guarded_by_xhr_with_prereqs
231
+ xhr :post, :guarded_by_xhr
232
+ assert_equal "true", @response.body
233
+ end
234
+
235
+ def test_guarded_by_xhr_without_prereqs
236
+ get :guarded_by_xhr
237
+ assert_redirected_to :action => "unguarded"
238
+ end
239
+
240
+ def test_guarded_by_not_xhr_with_prereqs
241
+ get :guarded_by_not_xhr
242
+ assert_equal "false", @response.body
243
+ end
244
+
245
+ def test_guarded_by_not_xhr_without_prereqs
246
+ xhr :post, :guarded_by_not_xhr
247
+ assert_redirected_to :action => "unguarded"
248
+ end
249
+
250
+ def test_guarded_post_and_calls_render_succeeds
251
+ post :must_be_post
252
+ assert_equal "Was a post!", @response.body
253
+ end
254
+
255
+ def test_default_failure_should_be_a_bad_request
256
+ post :no_default_action
257
+ assert_response :bad_request
258
+ end
259
+
260
+ def test_guarded_post_and_calls_render_fails_and_sets_allow_header
261
+ get :must_be_post
262
+ assert_response 405
263
+ assert_equal "Must be post", @response.body
264
+ assert_equal "POST", @response.headers["Allow"]
265
+ end
266
+
267
+ def test_second_redirect
268
+ assert_nothing_raised { get :two_redirects }
269
+ end
270
+ end