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,89 @@
1
+ require 'abstract_unit'
2
+
3
+ class CaptureController < ActionController::Base
4
+ def self.controller_name; "test"; end
5
+ def self.controller_path; "test"; end
6
+
7
+ def content_for
8
+ render :layout => "talk_from_action"
9
+ end
10
+
11
+ def content_for_with_parameter
12
+ render :layout => "talk_from_action"
13
+ end
14
+
15
+ def content_for_concatenated
16
+ render :layout => "talk_from_action"
17
+ end
18
+
19
+ def erb_content_for
20
+ render :layout => "talk_from_action"
21
+ end
22
+
23
+ def block_content_for
24
+ render :layout => "talk_from_action"
25
+ end
26
+
27
+ def non_erb_block_content_for
28
+ render :layout => "talk_from_action"
29
+ end
30
+
31
+ def rescue_action(e) raise end
32
+ end
33
+
34
+ CaptureController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
35
+
36
+ class CaptureTest < Test::Unit::TestCase
37
+ def setup
38
+ @controller = CaptureController.new
39
+
40
+ # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
41
+ # a more accurate simulation of what happens in "real life".
42
+ @controller.logger = Logger.new(nil)
43
+
44
+ @request = ActionController::TestRequest.new
45
+ @response = ActionController::TestResponse.new
46
+
47
+ @request.host = "www.nextangle.com"
48
+ end
49
+
50
+ def test_simple_capture
51
+ get :capturing
52
+ assert_equal "Dreamy days", @response.body.strip
53
+ end
54
+
55
+ def test_content_for
56
+ get :content_for
57
+ assert_equal expected_content_for_output, @response.body
58
+ end
59
+
60
+ def test_should_concatentate_content_for
61
+ get :content_for_concatenated
62
+ assert_equal expected_content_for_output, @response.body
63
+ end
64
+
65
+ def test_erb_content_for
66
+ get :erb_content_for
67
+ assert_equal expected_content_for_output, @response.body
68
+ end
69
+
70
+ def test_should_set_content_for_with_parameter
71
+ get :content_for_with_parameter
72
+ assert_equal expected_content_for_output, @response.body
73
+ end
74
+
75
+ def test_block_content_for
76
+ get :block_content_for
77
+ assert_equal expected_content_for_output, @response.body
78
+ end
79
+
80
+ def test_non_erb_block_content_for
81
+ get :non_erb_block_content_for
82
+ assert_equal expected_content_for_output, @response.body
83
+ end
84
+
85
+ private
86
+ def expected_content_for_output
87
+ "<title>Putting stuff in the title!</title>\n\nGreat stuff!"
88
+ end
89
+ end
@@ -0,0 +1,116 @@
1
+ require 'abstract_unit'
2
+ require 'action_controller/cgi_process'
3
+
4
+ class BaseCgiTest < Test::Unit::TestCase
5
+ def setup
6
+ @request_hash = {"HTTP_MAX_FORWARDS"=>"10", "SERVER_NAME"=>"glu.ttono.us:8007", "FCGI_ROLE"=>"RESPONDER", "HTTP_X_FORWARDED_HOST"=>"glu.ttono.us", "HTTP_ACCEPT_ENCODING"=>"gzip, deflate", "HTTP_USER_AGENT"=>"Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1", "PATH_INFO"=>"", "HTTP_ACCEPT_LANGUAGE"=>"en", "HTTP_HOST"=>"glu.ttono.us:8007", "SERVER_PROTOCOL"=>"HTTP/1.1", "REDIRECT_URI"=>"/dispatch.fcgi", "SCRIPT_NAME"=>"/dispatch.fcgi", "SERVER_ADDR"=>"207.7.108.53", "REMOTE_ADDR"=>"207.7.108.53", "SERVER_SOFTWARE"=>"lighttpd/1.4.5", "HTTP_COOKIE"=>"_session_id=c84ace84796670c052c6ceb2451fb0f2; is_admin=yes", "HTTP_X_FORWARDED_SERVER"=>"glu.ttono.us", "REQUEST_URI"=>"/admin", "DOCUMENT_ROOT"=>"/home/kevinc/sites/typo/public", "SERVER_PORT"=>"8007", "QUERY_STRING"=>"", "REMOTE_PORT"=>"63137", "GATEWAY_INTERFACE"=>"CGI/1.1", "HTTP_X_FORWARDED_FOR"=>"65.88.180.234", "HTTP_ACCEPT"=>"*/*", "SCRIPT_FILENAME"=>"/home/kevinc/sites/typo/public/dispatch.fcgi", "REDIRECT_STATUS"=>"200", "REQUEST_METHOD"=>"GET"}
7
+ # some Nokia phone browsers omit the space after the semicolon separator.
8
+ # some developers have grown accustomed to using comma in cookie values.
9
+ @alt_cookie_fmt_request_hash = {"HTTP_COOKIE"=>"_session_id=c84ace847,96670c052c6ceb2451fb0f2;is_admin=yes"}
10
+ @fake_cgi = Struct.new(:env_table).new(@request_hash)
11
+ @request = ActionController::CgiRequest.new(@fake_cgi)
12
+ end
13
+
14
+ def default_test; end
15
+ end
16
+
17
+
18
+ class CgiRequestTest < BaseCgiTest
19
+ def test_proxy_request
20
+ assert_equal 'glu.ttono.us', @request.host_with_port
21
+ end
22
+
23
+ def test_http_host
24
+ @request_hash.delete "HTTP_X_FORWARDED_HOST"
25
+ @request_hash['HTTP_HOST'] = "rubyonrails.org:8080"
26
+ assert_equal "rubyonrails.org:8080", @request.host_with_port
27
+
28
+ @request_hash['HTTP_X_FORWARDED_HOST'] = "www.firsthost.org, www.secondhost.org"
29
+ assert_equal "www.secondhost.org", @request.host
30
+ end
31
+
32
+ def test_http_host_with_default_port_overrides_server_port
33
+ @request_hash.delete "HTTP_X_FORWARDED_HOST"
34
+ @request_hash['HTTP_HOST'] = "rubyonrails.org"
35
+ assert_equal "rubyonrails.org", @request.host_with_port
36
+ end
37
+
38
+ def test_host_with_port_defaults_to_server_name_if_no_host_headers
39
+ @request_hash.delete "HTTP_X_FORWARDED_HOST"
40
+ @request_hash.delete "HTTP_HOST"
41
+ assert_equal "glu.ttono.us:8007", @request.host_with_port
42
+ end
43
+
44
+ def test_host_with_port_falls_back_to_server_addr_if_necessary
45
+ @request_hash.delete "HTTP_X_FORWARDED_HOST"
46
+ @request_hash.delete "HTTP_HOST"
47
+ @request_hash.delete "SERVER_NAME"
48
+ assert_equal "207.7.108.53:8007", @request.host_with_port
49
+ end
50
+
51
+ def test_host_with_port_if_http_standard_port_is_specified
52
+ @request_hash['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:80"
53
+ assert_equal "glu.ttono.us", @request.host_with_port
54
+ end
55
+
56
+ def test_host_with_port_if_https_standard_port_is_specified
57
+ @request_hash['HTTP_X_FORWARDED_PROTO'] = "https"
58
+ @request_hash['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:443"
59
+ assert_equal "glu.ttono.us", @request.host_with_port
60
+ end
61
+
62
+ def test_host_if_ipv6_reference
63
+ @request_hash.delete "HTTP_X_FORWARDED_HOST"
64
+ @request_hash['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]"
65
+ assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host
66
+ end
67
+
68
+ def test_host_if_ipv6_reference_with_port
69
+ @request_hash.delete "HTTP_X_FORWARDED_HOST"
70
+ @request_hash['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]:8008"
71
+ assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host
72
+ end
73
+
74
+ def test_cookie_syntax_resilience
75
+ cookies = CGI::Cookie::parse(@request_hash["HTTP_COOKIE"]);
76
+ assert_equal ["c84ace84796670c052c6ceb2451fb0f2"], cookies["_session_id"], cookies.inspect
77
+ assert_equal ["yes"], cookies["is_admin"], cookies.inspect
78
+
79
+ alt_cookies = CGI::Cookie::parse(@alt_cookie_fmt_request_hash["HTTP_COOKIE"]);
80
+ assert_equal ["c84ace847,96670c052c6ceb2451fb0f2"], alt_cookies["_session_id"], alt_cookies.inspect
81
+ assert_equal ["yes"], alt_cookies["is_admin"], alt_cookies.inspect
82
+ end
83
+ end
84
+
85
+
86
+ class CgiRequestParamsParsingTest < BaseCgiTest
87
+ def test_doesnt_break_when_content_type_has_charset
88
+ data = 'flamenco=love'
89
+ @request.env['CONTENT_LENGTH'] = data.length
90
+ @request.env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'
91
+ @request.env['RAW_POST_DATA'] = data
92
+ assert_equal({"flamenco"=> "love"}, @request.request_parameters)
93
+ end
94
+
95
+ def test_doesnt_interpret_request_uri_as_query_string_when_missing
96
+ @request.env['REQUEST_URI'] = 'foo'
97
+ assert_equal({}, @request.query_parameters)
98
+ end
99
+ end
100
+
101
+
102
+ class CgiRequestNeedsRewoundTest < BaseCgiTest
103
+ def test_body_should_be_rewound
104
+ data = 'foo'
105
+ fake_cgi = Struct.new(:env_table, :query_string, :stdinput).new(@request_hash, '', StringIO.new(data))
106
+ fake_cgi.env_table['CONTENT_LENGTH'] = data.length
107
+ fake_cgi.env_table['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'
108
+
109
+ # Read the request body by parsing params.
110
+ request = ActionController::CgiRequest.new(fake_cgi)
111
+ request.request_parameters
112
+
113
+ # Should have rewound the body.
114
+ assert_equal 0, request.body.pos
115
+ end
116
+ end
@@ -0,0 +1,140 @@
1
+ require 'abstract_unit'
2
+
3
+ class CallerController < ActionController::Base
4
+ def calling_from_controller
5
+ render_component(:controller => "callee", :action => "being_called")
6
+ end
7
+
8
+ def calling_from_controller_with_params
9
+ render_component(:controller => "callee", :action => "being_called", :params => { "name" => "David" })
10
+ end
11
+
12
+ def calling_from_controller_with_different_status_code
13
+ render_component(:controller => "callee", :action => "blowing_up")
14
+ end
15
+
16
+ def calling_from_template
17
+ render :inline => "Ring, ring: <%= render_component(:controller => 'callee', :action => 'being_called') %>"
18
+ end
19
+
20
+ def internal_caller
21
+ render :inline => "Are you there? <%= render_component(:action => 'internal_callee') %>"
22
+ end
23
+
24
+ def internal_callee
25
+ render :text => "Yes, ma'am"
26
+ end
27
+
28
+ def set_flash
29
+ render_component(:controller => "callee", :action => "set_flash")
30
+ end
31
+
32
+ def use_flash
33
+ render_component(:controller => "callee", :action => "use_flash")
34
+ end
35
+
36
+ def calling_redirected
37
+ render_component(:controller => "callee", :action => "redirected")
38
+ end
39
+
40
+ def calling_redirected_as_string
41
+ render :inline => "<%= render_component(:controller => 'callee', :action => 'redirected') %>"
42
+ end
43
+
44
+ def rescue_action(e) raise end
45
+ end
46
+
47
+ class CalleeController < ActionController::Base
48
+ def being_called
49
+ render :text => "#{params[:name] || "Lady"} of the House, speaking"
50
+ end
51
+
52
+ def blowing_up
53
+ render :text => "It's game over, man, just game over, man!", :status => 500
54
+ end
55
+
56
+ def set_flash
57
+ flash[:notice] = 'My stoney baby'
58
+ render :text => 'flash is set'
59
+ end
60
+
61
+ def use_flash
62
+ render :text => flash[:notice] || 'no flash'
63
+ end
64
+
65
+ def redirected
66
+ redirect_to :controller => "callee", :action => "being_called"
67
+ end
68
+
69
+ def rescue_action(e) raise end
70
+ end
71
+
72
+ class ComponentsTest < Test::Unit::TestCase
73
+ def setup
74
+ @controller = CallerController.new
75
+ @request = ActionController::TestRequest.new
76
+ @response = ActionController::TestResponse.new
77
+ end
78
+
79
+ def test_calling_from_controller
80
+ get :calling_from_controller
81
+ assert_equal "Lady of the House, speaking", @response.body
82
+ end
83
+
84
+ def test_calling_from_controller_with_params
85
+ get :calling_from_controller_with_params
86
+ assert_equal "David of the House, speaking", @response.body
87
+ end
88
+
89
+ def test_calling_from_controller_with_different_status_code
90
+ get :calling_from_controller_with_different_status_code
91
+ assert_equal 500, @response.response_code
92
+ end
93
+
94
+ def test_calling_from_template
95
+ get :calling_from_template
96
+ assert_equal "Ring, ring: Lady of the House, speaking", @response.body
97
+ end
98
+
99
+ def test_etag_is_set_for_parent_template_when_calling_from_template
100
+ get :calling_from_template
101
+ expected_etag = etag_for("Ring, ring: Lady of the House, speaking")
102
+ assert_equal expected_etag, @response.headers['ETag']
103
+ end
104
+
105
+ def test_internal_calling
106
+ get :internal_caller
107
+ assert_equal "Are you there? Yes, ma'am", @response.body
108
+ end
109
+
110
+ def test_flash
111
+ get :set_flash
112
+ assert_equal 'My stoney baby', flash[:notice]
113
+ get :use_flash
114
+ assert_equal 'My stoney baby', @response.body
115
+ get :use_flash
116
+ assert_equal 'no flash', @response.body
117
+ end
118
+
119
+ def test_component_redirect_redirects
120
+ get :calling_redirected
121
+
122
+ assert_redirected_to :action => "being_called"
123
+ end
124
+
125
+ def test_component_multiple_redirect_redirects
126
+ test_component_redirect_redirects
127
+ test_internal_calling
128
+ end
129
+
130
+ def test_component_as_string_redirect_renders_redirected_action
131
+ get :calling_redirected_as_string
132
+
133
+ assert_equal "Lady of the House, speaking", @response.body
134
+ end
135
+
136
+ protected
137
+ def etag_for(text)
138
+ %("#{Digest::MD5.hexdigest(text)}")
139
+ end
140
+ end
@@ -0,0 +1,139 @@
1
+ require 'abstract_unit'
2
+
3
+ class ContentTypeController < ActionController::Base
4
+ def render_content_type_from_body
5
+ response.content_type = Mime::RSS
6
+ render :text => "hello world!"
7
+ end
8
+
9
+ def render_defaults
10
+ render :text => "hello world!"
11
+ end
12
+
13
+ def render_content_type_from_render
14
+ render :text => "hello world!", :content_type => Mime::RSS
15
+ end
16
+
17
+ def render_charset_from_body
18
+ response.charset = "utf-16"
19
+ render :text => "hello world!"
20
+ end
21
+
22
+ def render_default_for_rhtml
23
+ end
24
+
25
+ def render_default_for_rxml
26
+ end
27
+
28
+ def render_default_for_js
29
+ end
30
+
31
+ def render_change_for_rxml
32
+ response.content_type = Mime::HTML
33
+ render :action => "render_default_for_rxml"
34
+ end
35
+
36
+ def render_default_content_types_for_respond_to
37
+ respond_to do |format|
38
+ format.html { render :text => "hello world!" }
39
+ format.xml { render :action => "render_default_content_types_for_respond_to.rhtml" }
40
+ format.js { render :text => "hello world!" }
41
+ format.rss { render :text => "hello world!", :content_type => Mime::XML }
42
+ end
43
+ end
44
+
45
+ def rescue_action(e) raise end
46
+ end
47
+
48
+ ContentTypeController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
49
+
50
+ class ContentTypeTest < Test::Unit::TestCase
51
+ def setup
52
+ @controller = ContentTypeController.new
53
+
54
+ # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
55
+ # a more accurate simulation of what happens in "real life".
56
+ @controller.logger = Logger.new(nil)
57
+
58
+ @request = ActionController::TestRequest.new
59
+ @response = ActionController::TestResponse.new
60
+ end
61
+
62
+ def test_render_defaults
63
+ get :render_defaults
64
+ assert_equal "utf-8", @response.charset
65
+ assert_equal Mime::HTML, @response.content_type
66
+ end
67
+
68
+ def test_render_changed_charset_default
69
+ ContentTypeController.default_charset = "utf-16"
70
+ get :render_defaults
71
+ assert_equal "utf-16", @response.charset
72
+ assert_equal Mime::HTML, @response.content_type
73
+ ContentTypeController.default_charset = "utf-8"
74
+ end
75
+
76
+ def test_content_type_from_body
77
+ get :render_content_type_from_body
78
+ assert_equal "application/rss+xml", @response.content_type
79
+ assert_equal "utf-8", @response.charset
80
+ end
81
+
82
+ def test_content_type_from_render
83
+ get :render_content_type_from_render
84
+ assert_equal "application/rss+xml", @response.content_type
85
+ assert_equal "utf-8", @response.charset
86
+ end
87
+
88
+ def test_charset_from_body
89
+ get :render_charset_from_body
90
+ assert_equal "utf-16", @response.charset
91
+ assert_equal Mime::HTML, @response.content_type
92
+ end
93
+
94
+ def test_default_for_rhtml
95
+ get :render_default_for_rhtml
96
+ assert_equal Mime::HTML, @response.content_type
97
+ assert_equal "utf-8", @response.charset
98
+ end
99
+
100
+ def test_default_for_rxml
101
+ get :render_default_for_rxml
102
+ assert_equal Mime::XML, @response.content_type
103
+ assert_equal "utf-8", @response.charset
104
+ end
105
+
106
+ def test_default_for_js
107
+ xhr :post, :render_default_for_js
108
+ assert_equal Mime::JS, @response.content_type
109
+ assert_equal "utf-8", @response.charset
110
+ end
111
+
112
+ def test_change_for_rxml
113
+ get :render_change_for_rxml
114
+ assert_equal Mime::HTML, @response.content_type
115
+ assert_equal "utf-8", @response.charset
116
+ end
117
+
118
+ def test_render_default_content_types_for_respond_to
119
+ @request.env["HTTP_ACCEPT"] = Mime::HTML.to_s
120
+ get :render_default_content_types_for_respond_to
121
+ assert_equal Mime::HTML, @response.content_type
122
+
123
+ @request.env["HTTP_ACCEPT"] = Mime::JS.to_s
124
+ get :render_default_content_types_for_respond_to
125
+ assert_equal Mime::JS, @response.content_type
126
+ end
127
+
128
+ def test_render_default_content_types_for_respond_to_with_template
129
+ @request.env["HTTP_ACCEPT"] = Mime::XML.to_s
130
+ get :render_default_content_types_for_respond_to
131
+ assert_equal Mime::XML, @response.content_type
132
+ end
133
+
134
+ def test_render_default_content_types_for_respond_to_with_overwrite
135
+ @request.env["HTTP_ACCEPT"] = Mime::RSS.to_s
136
+ get :render_default_content_types_for_respond_to
137
+ assert_equal Mime::XML, @response.content_type
138
+ end
139
+ end