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
data/lib/actionpack.rb ADDED
@@ -0,0 +1 @@
1
+ require 'action_pack'
@@ -0,0 +1,36 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+ $:.unshift(File.dirname(__FILE__) + '/../../activesupport/lib/active_support')
3
+ $:.unshift(File.dirname(__FILE__) + '/fixtures/helpers')
4
+
5
+ require 'yaml'
6
+ require 'stringio'
7
+ require 'test/unit'
8
+ require 'action_controller'
9
+ require 'action_controller/cgi_ext'
10
+ require 'action_controller/test_process'
11
+ require 'action_view/test_case'
12
+
13
+ begin
14
+ require 'ruby-debug'
15
+ rescue LoadError
16
+ # Debugging disabled. `gem install ruby-debug` to enable.
17
+ end
18
+
19
+ # Show backtraces for deprecated behavior for quicker cleanup.
20
+ ActiveSupport::Deprecation.debug = true
21
+
22
+ ActionController::Base.logger = nil
23
+ ActionController::Routing::Routes.reload rescue nil
24
+
25
+
26
+ # Wrap tests that use Mocha and skip if unavailable.
27
+ def uses_mocha(test_name)
28
+ unless Object.const_defined?(:Mocha)
29
+ require 'mocha'
30
+ require 'stubba'
31
+ end
32
+ yield
33
+ rescue LoadError => load_error
34
+ raise unless load_error.message =~ /mocha/i
35
+ $stderr.puts "Skipping #{test_name} tests. `gem install mocha` and try again."
36
+ end
@@ -0,0 +1,105 @@
1
+ require 'abstract_unit'
2
+
3
+ # Define the essentials
4
+ class ActiveRecordTestConnector
5
+ cattr_accessor :able_to_connect
6
+ cattr_accessor :connected
7
+
8
+ # Set our defaults
9
+ self.connected = false
10
+ self.able_to_connect = true
11
+ end
12
+
13
+ # Try to grab AR
14
+ if defined?(ActiveRecord) && defined?(Fixtures)
15
+ $stderr.puts 'Active Record is already loaded, running tests'
16
+ else
17
+ $stderr.print 'Attempting to load Active Record... '
18
+ begin
19
+ PATH_TO_AR = "#{File.dirname(__FILE__)}/../../activerecord/lib"
20
+ raise LoadError, "#{PATH_TO_AR} doesn't exist" unless File.directory?(PATH_TO_AR)
21
+ $LOAD_PATH.unshift PATH_TO_AR
22
+ require 'active_record'
23
+ require 'active_record/fixtures'
24
+ $stderr.puts 'success'
25
+ rescue LoadError => e
26
+ $stderr.print "failed. Skipping Active Record assertion tests: #{e}"
27
+ ActiveRecordTestConnector.able_to_connect = false
28
+ end
29
+ end
30
+ $stderr.flush
31
+
32
+
33
+
34
+ # Define the rest of the connector
35
+ class ActiveRecordTestConnector
36
+ class << self
37
+ def setup
38
+ unless self.connected || !self.able_to_connect
39
+ setup_connection
40
+ load_schema
41
+ require_fixture_models
42
+ self.connected = true
43
+ end
44
+ rescue Exception => e # errors from ActiveRecord setup
45
+ $stderr.puts "\nSkipping ActiveRecord assertion tests: #{e}"
46
+ #$stderr.puts " #{e.backtrace.join("\n ")}\n"
47
+ self.able_to_connect = false
48
+ end
49
+
50
+ private
51
+
52
+ def setup_connection
53
+ if Object.const_defined?(:ActiveRecord)
54
+ defaults = { :database => ':memory:' }
55
+ begin
56
+ options = defaults.merge :adapter => 'sqlite3', :timeout => 500
57
+ ActiveRecord::Base.establish_connection(options)
58
+ ActiveRecord::Base.configurations = { 'sqlite3_ar_integration' => options }
59
+ ActiveRecord::Base.connection
60
+ rescue Exception # errors from establishing a connection
61
+ $stderr.puts 'SQLite 3 unavailable; trying SQLite 2.'
62
+ options = defaults.merge :adapter => 'sqlite'
63
+ ActiveRecord::Base.establish_connection(options)
64
+ ActiveRecord::Base.configurations = { 'sqlite2_ar_integration' => options }
65
+ ActiveRecord::Base.connection
66
+ end
67
+
68
+ Object.send(:const_set, :QUOTED_TYPE, ActiveRecord::Base.connection.quote_column_name('type')) unless Object.const_defined?(:QUOTED_TYPE)
69
+ else
70
+ raise "Can't setup connection since ActiveRecord isn't loaded."
71
+ end
72
+ end
73
+
74
+ # Load actionpack sqlite tables
75
+ def load_schema
76
+ File.read(File.dirname(__FILE__) + "/fixtures/db_definitions/sqlite.sql").split(';').each do |sql|
77
+ ActiveRecord::Base.connection.execute(sql) unless sql.blank?
78
+ end
79
+ end
80
+
81
+ def require_fixture_models
82
+ Dir.glob(File.dirname(__FILE__) + "/fixtures/*.rb").each {|f| require f}
83
+ end
84
+ end
85
+ end
86
+
87
+ class ActiveRecordTestCase < ActiveSupport::TestCase
88
+ # Set our fixture path
89
+ if ActiveRecordTestConnector.able_to_connect
90
+ self.fixture_path = "#{File.dirname(__FILE__)}/fixtures/"
91
+ self.use_transactional_fixtures = false
92
+ end
93
+
94
+ def self.fixtures(*args)
95
+ super if ActiveRecordTestConnector.connected
96
+ end
97
+
98
+ def run(*args)
99
+ super if ActiveRecordTestConnector.connected
100
+ end
101
+
102
+ def default_test; end
103
+ end
104
+
105
+ ActiveRecordTestConnector.setup
@@ -0,0 +1,141 @@
1
+ # These tests exercise CGI::Session::ActiveRecordStore, so you're going to
2
+ # need AR in a sibling directory to AP and have SQLite installed.
3
+ require 'active_record_unit'
4
+ require 'action_controller/session/active_record_store'
5
+
6
+ module CommonActiveRecordStoreTests
7
+ def test_basics
8
+ s = session_class.new(:session_id => '1234', :data => { 'foo' => 'bar' })
9
+ assert_equal 'bar', s.data['foo']
10
+ assert s.save
11
+ assert_equal 'bar', s.data['foo']
12
+
13
+ assert_not_nil t = session_class.find_by_session_id('1234')
14
+ assert_not_nil t.data
15
+ assert_equal 'bar', t.data['foo']
16
+ end
17
+
18
+ def test_reload_same_session
19
+ @new_session.update
20
+ reloaded = CGI::Session.new(CGI.new, 'session_id' => @new_session.session_id, 'database_manager' => CGI::Session::ActiveRecordStore)
21
+ assert_equal 'bar', reloaded['foo']
22
+ end
23
+
24
+ def test_tolerates_close_close
25
+ assert_nothing_raised do
26
+ @new_session.close
27
+ @new_session.close
28
+ end
29
+ end
30
+ end
31
+
32
+ class ActiveRecordStoreTest < ActiveRecordTestCase
33
+ include CommonActiveRecordStoreTests
34
+
35
+ def session_class
36
+ CGI::Session::ActiveRecordStore::Session
37
+ end
38
+
39
+ def session_id_column
40
+ "session_id"
41
+ end
42
+
43
+ def setup
44
+ session_class.create_table!
45
+
46
+ ENV['REQUEST_METHOD'] = 'GET'
47
+ ENV['REQUEST_URI'] = '/'
48
+ CGI::Session::ActiveRecordStore.session_class = session_class
49
+
50
+ @cgi = CGI.new
51
+ @new_session = CGI::Session.new(@cgi, 'database_manager' => CGI::Session::ActiveRecordStore, 'new_session' => true)
52
+ @new_session['foo'] = 'bar'
53
+ end
54
+
55
+ # this test only applies for eager session saving
56
+ # def test_another_instance
57
+ # @another = CGI::Session.new(@cgi, 'session_id' => @new_session.session_id, 'database_manager' => CGI::Session::ActiveRecordStore)
58
+ # assert_equal @new_session.session_id, @another.session_id
59
+ # end
60
+
61
+ def test_model_attribute
62
+ assert_kind_of CGI::Session::ActiveRecordStore::Session, @new_session.model
63
+ assert_equal({ 'foo' => 'bar' }, @new_session.model.data)
64
+ end
65
+
66
+ def test_save_unloaded_session
67
+ c = session_class.connection
68
+ bogus_class = c.quote(ActiveSupport::Base64.encode64("\004\010o:\vBlammo\000"))
69
+ c.insert("INSERT INTO #{session_class.table_name} ('#{session_id_column}', 'data') VALUES ('abcdefghijklmnop', #{bogus_class})")
70
+
71
+ sess = session_class.find_by_session_id('abcdefghijklmnop')
72
+ assert_not_nil sess
73
+ assert !sess.loaded?
74
+
75
+ # because the session is not loaded, the save should be a no-op. If it
76
+ # isn't, this'll try and unmarshall the bogus class, and should get an error.
77
+ assert_nothing_raised { sess.save }
78
+ end
79
+
80
+ def teardown
81
+ session_class.drop_table!
82
+ end
83
+ end
84
+
85
+ class ColumnLimitTest < ActiveRecordTestCase
86
+ def setup
87
+ @session_class = CGI::Session::ActiveRecordStore::Session
88
+ @session_class.create_table!
89
+ end
90
+
91
+ def teardown
92
+ @session_class.drop_table!
93
+ end
94
+
95
+ def test_protection_from_data_larger_than_column
96
+ # Can't test this unless there is a limit
97
+ return unless limit = @session_class.data_column_size_limit
98
+ too_big = ':(' * limit
99
+ s = @session_class.new(:session_id => '666', :data => {'foo' => too_big})
100
+ s.data
101
+ assert_raise(ActionController::SessionOverflowError) { s.save }
102
+ end
103
+ end
104
+
105
+ class DeprecatedActiveRecordStoreTest < ActiveRecordStoreTest
106
+ def session_id_column
107
+ "sessid"
108
+ end
109
+
110
+ def setup
111
+ session_class.connection.execute 'create table old_sessions (id integer primary key, sessid text unique, data text)'
112
+ session_class.table_name = 'old_sessions'
113
+ session_class.send :setup_sessid_compatibility!
114
+
115
+ ENV['REQUEST_METHOD'] = 'GET'
116
+ CGI::Session::ActiveRecordStore.session_class = session_class
117
+
118
+ @new_session = CGI::Session.new(CGI.new, 'database_manager' => CGI::Session::ActiveRecordStore, 'new_session' => true)
119
+ @new_session['foo'] = 'bar'
120
+ end
121
+
122
+ def teardown
123
+ session_class.connection.execute 'drop table old_sessions'
124
+ session_class.table_name = 'sessions'
125
+ end
126
+ end
127
+
128
+ class SqlBypassActiveRecordStoreTest < ActiveRecordStoreTest
129
+ def session_class
130
+ unless defined? @session_class
131
+ @session_class = CGI::Session::ActiveRecordStore::SqlBypass
132
+ @session_class.connection = CGI::Session::ActiveRecordStore::Session.connection
133
+ end
134
+ @session_class
135
+ end
136
+
137
+ def test_model_attribute
138
+ assert_kind_of CGI::Session::ActiveRecordStore::SqlBypass, @new_session.model
139
+ assert_equal({ 'foo' => 'bar' }, @new_session.model.data)
140
+ end
141
+ end
@@ -0,0 +1,191 @@
1
+ require 'active_record_unit'
2
+
3
+ class RenderPartialWithRecordIdentificationController < ActionController::Base
4
+ def render_with_has_many_and_belongs_to_association
5
+ @developer = Developer.find(1)
6
+ render :partial => @developer.projects
7
+ end
8
+
9
+ def render_with_has_many_association
10
+ @topic = Topic.find(1)
11
+ render :partial => @topic.replies
12
+ end
13
+
14
+ def render_with_named_scope
15
+ render :partial => Reply.base
16
+ end
17
+
18
+ def render_with_has_many_through_association
19
+ @developer = Developer.find(:first)
20
+ render :partial => @developer.topics
21
+ end
22
+
23
+ def render_with_has_one_association
24
+ @company = Company.find(1)
25
+ render :partial => @company.mascot
26
+ end
27
+
28
+ def render_with_belongs_to_association
29
+ @reply = Reply.find(1)
30
+ render :partial => @reply.topic
31
+ end
32
+
33
+ def render_with_record
34
+ @developer = Developer.find(:first)
35
+ render :partial => @developer
36
+ end
37
+
38
+ def render_with_record_collection
39
+ @developers = Developer.find(:all)
40
+ render :partial => @developers
41
+ end
42
+ end
43
+ RenderPartialWithRecordIdentificationController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
44
+
45
+ class RenderPartialWithRecordIdentificationTest < ActiveRecordTestCase
46
+ fixtures :developers, :projects, :developers_projects, :topics, :replies, :companies, :mascots
47
+
48
+ def setup
49
+ @controller = RenderPartialWithRecordIdentificationController.new
50
+ @request = ActionController::TestRequest.new
51
+ @response = ActionController::TestResponse.new
52
+ super
53
+ end
54
+
55
+ def test_rendering_partial_with_has_many_and_belongs_to_association
56
+ get :render_with_has_many_and_belongs_to_association
57
+ assert_template 'projects/_project'
58
+ end
59
+
60
+ def test_rendering_partial_with_has_many_association
61
+ get :render_with_has_many_association
62
+ assert_template 'replies/_reply'
63
+ end
64
+
65
+ def test_rendering_partial_with_named_scope
66
+ get :render_with_named_scope
67
+ assert_template 'replies/_reply'
68
+ end
69
+
70
+ def test_render_with_record
71
+ get :render_with_record
72
+ assert_template 'developers/_developer'
73
+ end
74
+
75
+ def test_render_with_record_collection
76
+ get :render_with_record_collection
77
+ assert_template 'developers/_developer'
78
+ end
79
+
80
+ def test_rendering_partial_with_has_one_association
81
+ mascot = Company.find(1).mascot
82
+ get :render_with_has_one_association
83
+ assert_template 'mascots/_mascot'
84
+ assert_equal mascot.name, @response.body
85
+ end
86
+ end
87
+
88
+ class RenderPartialWithRecordIdentificationController < ActionController::Base
89
+ def render_with_has_many_and_belongs_to_association
90
+ @developer = Developer.find(1)
91
+ render :partial => @developer.projects
92
+ end
93
+
94
+ def render_with_has_many_association
95
+ @topic = Topic.find(1)
96
+ render :partial => @topic.replies
97
+ end
98
+
99
+ def render_with_has_many_through_association
100
+ @developer = Developer.find(:first)
101
+ render :partial => @developer.topics
102
+ end
103
+
104
+ def render_with_belongs_to_association
105
+ @reply = Reply.find(1)
106
+ render :partial => @reply.topic
107
+ end
108
+
109
+ def render_with_record
110
+ @developer = Developer.find(:first)
111
+ render :partial => @developer
112
+ end
113
+
114
+ def render_with_record_collection
115
+ @developers = Developer.find(:all)
116
+ render :partial => @developers
117
+ end
118
+ end
119
+ RenderPartialWithRecordIdentificationController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
120
+
121
+ class Game < Struct.new(:name, :id)
122
+ def to_param
123
+ id.to_s
124
+ end
125
+ end
126
+
127
+ module Fun
128
+ class NestedController < ActionController::Base
129
+ def render_with_record_in_nested_controller
130
+ render :partial => Game.new("Pong")
131
+ end
132
+
133
+ def render_with_record_collection_in_nested_controller
134
+ render :partial => [ Game.new("Pong"), Game.new("Tank") ]
135
+ end
136
+ end
137
+ NestedController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
138
+
139
+ module Serious
140
+ class NestedDeeperController < ActionController::Base
141
+ def render_with_record_in_deeper_nested_controller
142
+ render :partial => Game.new("Chess")
143
+ end
144
+
145
+ def render_with_record_collection_in_deeper_nested_controller
146
+ render :partial => [ Game.new("Chess"), Game.new("Sudoku"), Game.new("Solitaire") ]
147
+ end
148
+ end
149
+ NestedDeeperController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
150
+ end
151
+ end
152
+
153
+ class RenderPartialWithRecordIdentificationAndNestedControllersTest < ActiveRecordTestCase
154
+ def setup
155
+ @controller = Fun::NestedController.new
156
+ @request = ActionController::TestRequest.new
157
+ @response = ActionController::TestResponse.new
158
+ super
159
+ end
160
+
161
+ def test_render_with_record_in_nested_controller
162
+ get :render_with_record_in_nested_controller
163
+ assert_template 'fun/games/_game'
164
+ end
165
+
166
+ def test_render_with_record_collection_in_nested_controller
167
+ get :render_with_record_collection_in_nested_controller
168
+ assert_template 'fun/games/_game'
169
+ end
170
+
171
+ end
172
+
173
+ class RenderPartialWithRecordIdentificationAndNestedDeeperControllersTest < ActiveRecordTestCase
174
+ def setup
175
+ @controller = Fun::Serious::NestedDeeperController.new
176
+ @request = ActionController::TestRequest.new
177
+ @response = ActionController::TestResponse.new
178
+ super
179
+ end
180
+
181
+ def test_render_with_record_in_deeper_nested_controller
182
+ get :render_with_record_in_deeper_nested_controller
183
+ assert_template 'fun/serious/games/_game'
184
+ end
185
+
186
+ def test_render_with_record_collection_in_deeper_nested_controller
187
+ get :render_with_record_collection_in_deeper_nested_controller
188
+ assert_template 'fun/serious/games/_game'
189
+ end
190
+
191
+ end