actionpack_csi 2.3.5.p6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (429) hide show
  1. data/CHANGELOG +5184 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +160 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller/assertions/dom_assertions.rb +55 -0
  8. data/lib/action_controller/assertions/model_assertions.rb +21 -0
  9. data/lib/action_controller/assertions/response_assertions.rb +160 -0
  10. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  11. data/lib/action_controller/assertions/selector_assertions.rb +638 -0
  12. data/lib/action_controller/assertions/tag_assertions.rb +127 -0
  13. data/lib/action_controller/base.rb +1423 -0
  14. data/lib/action_controller/benchmarking.rb +107 -0
  15. data/lib/action_controller/caching/actions.rb +177 -0
  16. data/lib/action_controller/caching/fragments.rb +120 -0
  17. data/lib/action_controller/caching/pages.rb +152 -0
  18. data/lib/action_controller/caching/sweeper.rb +45 -0
  19. data/lib/action_controller/caching/sweeping.rb +55 -0
  20. data/lib/action_controller/caching.rb +71 -0
  21. data/lib/action_controller/cgi_ext/cookie.rb +112 -0
  22. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  23. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  24. data/lib/action_controller/cgi_ext.rb +15 -0
  25. data/lib/action_controller/cgi_process.rb +77 -0
  26. data/lib/action_controller/cookies.rb +95 -0
  27. data/lib/action_controller/dispatcher.rb +133 -0
  28. data/lib/action_controller/failsafe.rb +86 -0
  29. data/lib/action_controller/filters.rb +680 -0
  30. data/lib/action_controller/flash.rb +171 -0
  31. data/lib/action_controller/headers.rb +33 -0
  32. data/lib/action_controller/helpers.rb +225 -0
  33. data/lib/action_controller/http_authentication.rb +309 -0
  34. data/lib/action_controller/integration.rb +692 -0
  35. data/lib/action_controller/layout.rb +286 -0
  36. data/lib/action_controller/middleware_stack.rb +119 -0
  37. data/lib/action_controller/middlewares.rb +14 -0
  38. data/lib/action_controller/mime_responds.rb +193 -0
  39. data/lib/action_controller/mime_type.rb +212 -0
  40. data/lib/action_controller/mime_types.rb +21 -0
  41. data/lib/action_controller/params_parser.rb +77 -0
  42. data/lib/action_controller/performance_test.rb +15 -0
  43. data/lib/action_controller/polymorphic_routes.rb +189 -0
  44. data/lib/action_controller/rack_lint_patch.rb +36 -0
  45. data/lib/action_controller/record_identifier.rb +104 -0
  46. data/lib/action_controller/reloader.rb +54 -0
  47. data/lib/action_controller/request.rb +493 -0
  48. data/lib/action_controller/request_forgery_protection.rb +113 -0
  49. data/lib/action_controller/rescue.rb +183 -0
  50. data/lib/action_controller/resources.rb +682 -0
  51. data/lib/action_controller/response.rb +239 -0
  52. data/lib/action_controller/routing/builder.rb +197 -0
  53. data/lib/action_controller/routing/optimisations.rb +130 -0
  54. data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  55. data/lib/action_controller/routing/route.rb +265 -0
  56. data/lib/action_controller/routing/route_set.rb +502 -0
  57. data/lib/action_controller/routing/routing_ext.rb +49 -0
  58. data/lib/action_controller/routing/segments.rb +343 -0
  59. data/lib/action_controller/routing.rb +388 -0
  60. data/lib/action_controller/session/abstract_store.rb +181 -0
  61. data/lib/action_controller/session/cookie_store.rb +221 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +51 -0
  63. data/lib/action_controller/session_management.rb +54 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +181 -0
  66. data/lib/action_controller/string_coercion.rb +29 -0
  67. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  68. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  69. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  70. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  71. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  72. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  73. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  74. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  75. data/lib/action_controller/test_case.rb +209 -0
  76. data/lib/action_controller/test_process.rb +580 -0
  77. data/lib/action_controller/translation.rb +13 -0
  78. data/lib/action_controller/uploaded_file.rb +44 -0
  79. data/lib/action_controller/url_rewriter.rb +216 -0
  80. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  81. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  82. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  83. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  84. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  85. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  86. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  87. data/lib/action_controller/verification.rb +130 -0
  88. data/lib/action_controller.rb +113 -0
  89. data/lib/action_pack/version.rb +9 -0
  90. data/lib/action_pack.rb +24 -0
  91. data/lib/action_view/base.rb +362 -0
  92. data/lib/action_view/erb/util.rb +44 -0
  93. data/lib/action_view/helpers/active_record_helper.rb +305 -0
  94. data/lib/action_view/helpers/asset_tag_helper.rb +694 -0
  95. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  96. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  97. data/lib/action_view/helpers/cache_helper.rb +39 -0
  98. data/lib/action_view/helpers/capture_helper.rb +136 -0
  99. data/lib/action_view/helpers/date_helper.rb +988 -0
  100. data/lib/action_view/helpers/debug_helper.rb +38 -0
  101. data/lib/action_view/helpers/form_helper.rb +1074 -0
  102. data/lib/action_view/helpers/form_options_helper.rb +600 -0
  103. data/lib/action_view/helpers/form_tag_helper.rb +487 -0
  104. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  105. data/lib/action_view/helpers/number_helper.rb +308 -0
  106. data/lib/action_view/helpers/prototype_helper.rb +1305 -0
  107. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  108. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  109. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  110. data/lib/action_view/helpers/sanitize_helper.rb +259 -0
  111. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  112. data/lib/action_view/helpers/tag_helper.rb +150 -0
  113. data/lib/action_view/helpers/text_helper.rb +587 -0
  114. data/lib/action_view/helpers/translation_helper.rb +39 -0
  115. data/lib/action_view/helpers/url_helper.rb +639 -0
  116. data/lib/action_view/helpers.rb +59 -0
  117. data/lib/action_view/inline_template.rb +19 -0
  118. data/lib/action_view/locale/en.yml +117 -0
  119. data/lib/action_view/partials.rb +240 -0
  120. data/lib/action_view/paths.rb +69 -0
  121. data/lib/action_view/reloadable_template.rb +117 -0
  122. data/lib/action_view/renderable.rb +95 -0
  123. data/lib/action_view/renderable_partial.rb +47 -0
  124. data/lib/action_view/safe_buffer.rb +28 -0
  125. data/lib/action_view/template.rb +252 -0
  126. data/lib/action_view/template_error.rb +99 -0
  127. data/lib/action_view/template_handler.rb +34 -0
  128. data/lib/action_view/template_handlers/builder.rb +17 -0
  129. data/lib/action_view/template_handlers/erb.rb +22 -0
  130. data/lib/action_view/template_handlers/rjs.rb +13 -0
  131. data/lib/action_view/template_handlers.rb +48 -0
  132. data/lib/action_view/test_case.rb +162 -0
  133. data/lib/action_view.rb +58 -0
  134. data/lib/actionpack.rb +2 -0
  135. data/test/abstract_unit.rb +61 -0
  136. data/test/active_record_unit.rb +104 -0
  137. data/test/activerecord/active_record_store_test.rb +174 -0
  138. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  139. data/test/adv_attr_test.rb +20 -0
  140. data/test/controller/action_pack_assertions_test.rb +543 -0
  141. data/test/controller/addresses_render_test.rb +37 -0
  142. data/test/controller/assert_select_test.rb +734 -0
  143. data/test/controller/base_test.rb +217 -0
  144. data/test/controller/benchmark_test.rb +32 -0
  145. data/test/controller/caching_test.rb +729 -0
  146. data/test/controller/capture_test.rb +66 -0
  147. data/test/controller/content_type_test.rb +168 -0
  148. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  150. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  151. data/test/controller/cookie_test.rb +134 -0
  152. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  153. data/test/controller/dispatcher_test.rb +144 -0
  154. data/test/controller/dom_assertions_test.rb +53 -0
  155. data/test/controller/failsafe_test.rb +60 -0
  156. data/test/controller/fake_controllers.rb +33 -0
  157. data/test/controller/fake_models.rb +19 -0
  158. data/test/controller/filter_params_test.rb +52 -0
  159. data/test/controller/filters_test.rb +885 -0
  160. data/test/controller/flash_test.rb +147 -0
  161. data/test/controller/header_test.rb +14 -0
  162. data/test/controller/helper_test.rb +224 -0
  163. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  164. data/test/controller/html-scanner/document_test.rb +148 -0
  165. data/test/controller/html-scanner/node_test.rb +89 -0
  166. data/test/controller/html-scanner/sanitizer_test.rb +274 -0
  167. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  168. data/test/controller/html-scanner/text_node_test.rb +50 -0
  169. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  170. data/test/controller/http_basic_authentication_test.rb +113 -0
  171. data/test/controller/http_digest_authentication_test.rb +254 -0
  172. data/test/controller/integration_test.rb +483 -0
  173. data/test/controller/layout_test.rb +215 -0
  174. data/test/controller/logging_test.rb +46 -0
  175. data/test/controller/middleware_stack_test.rb +90 -0
  176. data/test/controller/mime_responds_test.rb +536 -0
  177. data/test/controller/mime_type_test.rb +93 -0
  178. data/test/controller/polymorphic_routes_test.rb +297 -0
  179. data/test/controller/rack_test.rb +311 -0
  180. data/test/controller/record_identifier_test.rb +139 -0
  181. data/test/controller/redirect_test.rb +285 -0
  182. data/test/controller/reloader_test.rb +124 -0
  183. data/test/controller/render_test.rb +1762 -0
  184. data/test/controller/request/json_params_parsing_test.rb +65 -0
  185. data/test/controller/request/multipart_params_parsing_test.rb +162 -0
  186. data/test/controller/request/query_string_parsing_test.rb +120 -0
  187. data/test/controller/request/test_request_test.rb +35 -0
  188. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  189. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  190. data/test/controller/request_forgery_protection_test.rb +265 -0
  191. data/test/controller/request_test.rb +395 -0
  192. data/test/controller/rescue_test.rb +536 -0
  193. data/test/controller/resources_test.rb +1393 -0
  194. data/test/controller/routing_test.rb +2591 -0
  195. data/test/controller/selector_test.rb +628 -0
  196. data/test/controller/send_file_test.rb +171 -0
  197. data/test/controller/session/cookie_store_test.rb +216 -0
  198. data/test/controller/session/mem_cache_store_test.rb +127 -0
  199. data/test/controller/session/test_session_test.rb +58 -0
  200. data/test/controller/test_test.rb +700 -0
  201. data/test/controller/translation_test.rb +26 -0
  202. data/test/controller/url_rewriter_test.rb +385 -0
  203. data/test/controller/verification_test.rb +270 -0
  204. data/test/controller/view_paths_test.rb +141 -0
  205. data/test/controller/webservice_test.rb +273 -0
  206. data/test/fixtures/_top_level_partial.html.erb +1 -0
  207. data/test/fixtures/_top_level_partial_only.erb +1 -0
  208. data/test/fixtures/addresses/list.erb +1 -0
  209. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  210. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  211. data/test/fixtures/companies.yml +24 -0
  212. data/test/fixtures/company.rb +10 -0
  213. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  214. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  215. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  216. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  217. data/test/fixtures/customers/_customer.html.erb +1 -0
  218. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  219. data/test/fixtures/developer.rb +9 -0
  220. data/test/fixtures/developers/_developer.erb +1 -0
  221. data/test/fixtures/developers.yml +21 -0
  222. data/test/fixtures/developers_projects.yml +13 -0
  223. data/test/fixtures/failsafe/500.html +1 -0
  224. data/test/fixtures/fun/games/_game.erb +1 -0
  225. data/test/fixtures/fun/games/hello_world.erb +1 -0
  226. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  227. data/test/fixtures/functional_caching/_partial.erb +3 -0
  228. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  229. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  231. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  232. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  233. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  235. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  236. data/test/fixtures/helpers/abc_helper.rb +5 -0
  237. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  238. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  239. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  240. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  241. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  242. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  243. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  244. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  246. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  247. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  248. data/test/fixtures/layouts/_column.html.erb +2 -0
  249. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  250. data/test/fixtures/layouts/builder.builder +3 -0
  251. data/test/fixtures/layouts/default_html.html.erb +1 -0
  252. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  253. data/test/fixtures/layouts/standard.erb +1 -0
  254. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  255. data/test/fixtures/layouts/xhr.html.erb +2 -0
  256. data/test/fixtures/layouts/yield.erb +2 -0
  257. data/test/fixtures/mascot.rb +3 -0
  258. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  259. data/test/fixtures/mascots.yml +4 -0
  260. data/test/fixtures/multipart/binary_file +0 -0
  261. data/test/fixtures/multipart/boundary_problem_file +10 -0
  262. data/test/fixtures/multipart/bracketed_param +5 -0
  263. data/test/fixtures/multipart/empty +10 -0
  264. data/test/fixtures/multipart/hello.txt +1 -0
  265. data/test/fixtures/multipart/large_text_file +10 -0
  266. data/test/fixtures/multipart/mixed_files +0 -0
  267. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  268. data/test/fixtures/multipart/none +9 -0
  269. data/test/fixtures/multipart/single_parameter +5 -0
  270. data/test/fixtures/multipart/text_file +10 -0
  271. data/test/fixtures/override/test/hello_world.erb +1 -0
  272. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  273. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  274. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  275. data/test/fixtures/post_test/post/index.html.erb +1 -0
  276. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  277. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  278. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  279. data/test/fixtures/project.rb +3 -0
  280. data/test/fixtures/projects/_project.erb +1 -0
  281. data/test/fixtures/projects.yml +7 -0
  282. data/test/fixtures/public/404.html +1 -0
  283. data/test/fixtures/public/500.da.html +1 -0
  284. data/test/fixtures/public/500.html +1 -0
  285. data/test/fixtures/public/absolute/test.css +23 -0
  286. data/test/fixtures/public/absolute/test.js +63 -0
  287. data/test/fixtures/public/images/rails.png +0 -0
  288. data/test/fixtures/public/javascripts/application.js +1 -0
  289. data/test/fixtures/public/javascripts/bank.js +1 -0
  290. data/test/fixtures/public/javascripts/controls.js +1 -0
  291. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  292. data/test/fixtures/public/javascripts/effects.js +1 -0
  293. data/test/fixtures/public/javascripts/prototype.js +1 -0
  294. data/test/fixtures/public/javascripts/robber.js +1 -0
  295. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  296. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  297. data/test/fixtures/public/stylesheets/bank.css +1 -0
  298. data/test/fixtures/public/stylesheets/robber.css +1 -0
  299. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  300. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  301. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  302. data/test/fixtures/replies/_reply.erb +1 -0
  303. data/test/fixtures/replies.yml +15 -0
  304. data/test/fixtures/reply.rb +7 -0
  305. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  306. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  307. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  308. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  309. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  310. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  311. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  312. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  313. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  314. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  315. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  316. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  318. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  319. data/test/fixtures/scope/test/modgreet.erb +1 -0
  320. data/test/fixtures/shared.html.erb +1 -0
  321. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  322. data/test/fixtures/test/_counter.html.erb +1 -0
  323. data/test/fixtures/test/_customer.erb +1 -0
  324. data/test/fixtures/test/_customer_counter.erb +1 -0
  325. data/test/fixtures/test/_customer_greeting.erb +1 -0
  326. data/test/fixtures/test/_customer_with_var.erb +1 -0
  327. data/test/fixtures/test/_form.erb +1 -0
  328. data/test/fixtures/test/_from_helper.erb +1 -0
  329. data/test/fixtures/test/_hash_greeting.erb +1 -0
  330. data/test/fixtures/test/_hash_object.erb +2 -0
  331. data/test/fixtures/test/_hello.builder +1 -0
  332. data/test/fixtures/test/_labelling_form.erb +1 -0
  333. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  334. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  335. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  336. data/test/fixtures/test/_one.html.erb +1 -0
  337. data/test/fixtures/test/_partial.erb +1 -0
  338. data/test/fixtures/test/_partial.html.erb +1 -0
  339. data/test/fixtures/test/_partial.js.erb +1 -0
  340. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  341. data/test/fixtures/test/_partial_only.erb +1 -0
  342. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  343. data/test/fixtures/test/_person.erb +2 -0
  344. data/test/fixtures/test/_raise.html.erb +1 -0
  345. data/test/fixtures/test/_two.html.erb +1 -0
  346. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  347. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  348. data/test/fixtures/test/capturing.erb +4 -0
  349. data/test/fixtures/test/content_for.erb +2 -0
  350. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  351. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  352. data/test/fixtures/test/delete_with_js.rjs +2 -0
  353. data/test/fixtures/test/dont_pick_me +1 -0
  354. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  355. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  356. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  357. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  358. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  359. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  360. data/test/fixtures/test/greeting.erb +1 -0
  361. data/test/fixtures/test/greeting.js.rjs +1 -0
  362. data/test/fixtures/test/hello.builder +4 -0
  363. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  364. data/test/fixtures/test/hello_world.erb +1 -0
  365. data/test/fixtures/test/hello_world.erb~ +1 -0
  366. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  367. data/test/fixtures/test/hello_world_container.builder +3 -0
  368. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  369. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  370. data/test/fixtures/test/hello_xml_world.builder +11 -0
  371. data/test/fixtures/test/hyphen-ated.erb +1 -0
  372. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  373. data/test/fixtures/test/list.erb +1 -0
  374. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  375. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  376. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  377. data/test/fixtures/test/nested_layout.erb +3 -0
  378. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  379. data/test/fixtures/test/potential_conflicts.erb +4 -0
  380. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  381. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  382. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  383. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  384. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  385. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  386. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  387. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  388. data/test/fixtures/test/render_to_string_test.erb +1 -0
  389. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  390. data/test/fixtures/test/template.erb +1 -0
  391. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  392. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  393. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  394. data/test/fixtures/test/utf8.html.erb +2 -0
  395. data/test/fixtures/topic.rb +3 -0
  396. data/test/fixtures/topics/_topic.html.erb +1 -0
  397. data/test/fixtures/topics.yml +22 -0
  398. data/test/template/active_record_helper_i18n_test.rb +44 -0
  399. data/test/template/active_record_helper_test.rb +302 -0
  400. data/test/template/asset_tag_helper_test.rb +771 -0
  401. data/test/template/atom_feed_helper_test.rb +315 -0
  402. data/test/template/benchmark_helper_test.rb +86 -0
  403. data/test/template/compiled_templates_test.rb +204 -0
  404. data/test/template/date_helper_i18n_test.rb +121 -0
  405. data/test/template/date_helper_test.rb +2485 -0
  406. data/test/template/erb_util_test.rb +24 -0
  407. data/test/template/form_helper_test.rb +1393 -0
  408. data/test/template/form_options_helper_i18n_test.rb +27 -0
  409. data/test/template/form_options_helper_test.rb +807 -0
  410. data/test/template/form_tag_helper_test.rb +344 -0
  411. data/test/template/javascript_helper_test.rb +106 -0
  412. data/test/template/number_helper_i18n_test.rb +69 -0
  413. data/test/template/number_helper_test.rb +132 -0
  414. data/test/template/prototype_helper_test.rb +639 -0
  415. data/test/template/raw_output_helper_test.rb +21 -0
  416. data/test/template/record_tag_helper_test.rb +58 -0
  417. data/test/template/render_test.rb +290 -0
  418. data/test/template/sanitize_helper_test.rb +57 -0
  419. data/test/template/scriptaculous_helper_test.rb +90 -0
  420. data/test/template/tag_helper_test.rb +98 -0
  421. data/test/template/template_test.rb +32 -0
  422. data/test/template/test_test.rb +54 -0
  423. data/test/template/text_helper_test.rb +543 -0
  424. data/test/template/translation_helper_test.rb +32 -0
  425. data/test/template/url_helper_test.rb +622 -0
  426. data/test/testing_sandbox.rb +15 -0
  427. data/test/view/safe_buffer_test.rb +36 -0
  428. data/test/view/test_case_test.rb +176 -0
  429. metadata +531 -0
@@ -0,0 +1,1762 @@
1
+ require 'abstract_unit'
2
+ require 'controller/fake_models'
3
+
4
+ module Fun
5
+ class GamesController < ActionController::Base
6
+ def hello_world
7
+ end
8
+ end
9
+ end
10
+
11
+ class MockLogger
12
+ attr_reader :logged
13
+
14
+ def initialize
15
+ @logged = []
16
+ end
17
+
18
+ def method_missing(method, *args)
19
+ @logged << args.first
20
+ end
21
+ end
22
+
23
+ class TestController < ActionController::Base
24
+ protect_from_forgery
25
+
26
+ class LabellingFormBuilder < ActionView::Helpers::FormBuilder
27
+ end
28
+
29
+ layout :determine_layout
30
+
31
+ def hello_world
32
+ end
33
+
34
+ def conditional_hello
35
+ if stale?(:last_modified => Time.now.utc.beginning_of_day, :etag => [:foo, 123])
36
+ render :action => 'hello_world'
37
+ end
38
+ end
39
+
40
+ def conditional_hello_with_public_header
41
+ if stale?(:last_modified => Time.now.utc.beginning_of_day, :etag => [:foo, 123], :public => true)
42
+ render :action => 'hello_world'
43
+ end
44
+ end
45
+
46
+ def conditional_hello_with_public_header_and_expires_at
47
+ expires_in 1.minute
48
+ if stale?(:last_modified => Time.now.utc.beginning_of_day, :etag => [:foo, 123], :public => true)
49
+ render :action => 'hello_world'
50
+ end
51
+ end
52
+
53
+ def conditional_hello_with_expires_in
54
+ expires_in 1.minute
55
+ render :action => 'hello_world'
56
+ end
57
+
58
+ def conditional_hello_with_expires_in_with_public
59
+ expires_in 1.minute, :public => true
60
+ render :action => 'hello_world'
61
+ end
62
+
63
+ def conditional_hello_with_expires_in_with_public_with_more_keys
64
+ expires_in 1.minute, :public => true, 'max-stale' => 5.hours
65
+ render :action => 'hello_world'
66
+ end
67
+
68
+ def conditional_hello_with_expires_in_with_public_with_more_keys_old_syntax
69
+ expires_in 1.minute, :public => true, :private => nil, 'max-stale' => 5.hours
70
+ render :action => 'hello_world'
71
+ end
72
+
73
+ def conditional_hello_with_bangs
74
+ render :action => 'hello_world'
75
+ end
76
+ before_filter :handle_last_modified_and_etags, :only=>:conditional_hello_with_bangs
77
+
78
+ def handle_last_modified_and_etags
79
+ fresh_when(:last_modified => Time.now.utc.beginning_of_day, :etag => [ :foo, 123 ])
80
+ end
81
+
82
+ def render_hello_world
83
+ render :template => "test/hello_world"
84
+ end
85
+
86
+ def render_hello_world_with_last_modified_set
87
+ response.last_modified = Date.new(2008, 10, 10).to_time
88
+ render :template => "test/hello_world"
89
+ end
90
+
91
+ def render_hello_world_with_etag_set
92
+ response.etag = "hello_world"
93
+ render :template => "test/hello_world"
94
+ end
95
+
96
+ def render_hello_world_with_forward_slash
97
+ render :template => "/test/hello_world"
98
+ end
99
+
100
+ def render_template_in_top_directory
101
+ render :template => 'shared'
102
+ end
103
+
104
+ def render_template_in_top_directory_with_slash
105
+ render :template => '/shared'
106
+ end
107
+
108
+ def render_hello_world_from_variable
109
+ @person = "david"
110
+ render :text => "hello #{@person}"
111
+ end
112
+
113
+ def render_action_hello_world
114
+ render :action => "hello_world"
115
+ end
116
+
117
+ def render_action_hello_world_as_string
118
+ render "hello_world"
119
+ end
120
+
121
+ def render_action_hello_world_with_symbol
122
+ render :action => :hello_world
123
+ end
124
+
125
+ def render_text_hello_world
126
+ render :text => "hello world"
127
+ end
128
+
129
+ def render_text_hello_world_with_layout
130
+ @variable_for_layout = ", I'm here!"
131
+ render :text => "hello world", :layout => true
132
+ end
133
+
134
+ def hello_world_with_layout_false
135
+ render :layout => false
136
+ end
137
+
138
+ def render_file_with_instance_variables
139
+ @secret = 'in the sauce'
140
+ path = File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_ivar.erb')
141
+ render :file => path
142
+ end
143
+
144
+ def render_file_as_string_with_instance_variables
145
+ @secret = 'in the sauce'
146
+ path = File.expand_path(File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_ivar.erb'))
147
+ render path
148
+ end
149
+
150
+ def render_file_not_using_full_path
151
+ @secret = 'in the sauce'
152
+ render :file => 'test/render_file_with_ivar'
153
+ end
154
+
155
+ def render_file_not_using_full_path_with_dot_in_path
156
+ @secret = 'in the sauce'
157
+ render :file => 'test/dot.directory/render_file_with_ivar'
158
+ end
159
+
160
+ def render_file_using_pathname
161
+ @secret = 'in the sauce'
162
+ render :file => Pathname.new(File.dirname(__FILE__)).join('..', 'fixtures', 'test', 'dot.directory', 'render_file_with_ivar.erb')
163
+ end
164
+
165
+ def render_file_from_template
166
+ @secret = 'in the sauce'
167
+ @path = File.expand_path(File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_ivar.erb'))
168
+ end
169
+
170
+ def render_file_with_locals
171
+ path = File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_locals.erb')
172
+ render :file => path, :locals => {:secret => 'in the sauce'}
173
+ end
174
+
175
+ def render_file_as_string_with_locals
176
+ path = File.expand_path(File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_locals.erb'))
177
+ render path, :locals => {:secret => 'in the sauce'}
178
+ end
179
+
180
+ def accessing_request_in_template
181
+ render :inline => "Hello: <%= request.host %>"
182
+ end
183
+
184
+ def accessing_logger_in_template
185
+ render :inline => "<%= logger.class %>"
186
+ end
187
+
188
+ def accessing_action_name_in_template
189
+ render :inline => "<%= action_name %>"
190
+ end
191
+
192
+ def accessing_controller_name_in_template
193
+ render :inline => "<%= controller_name %>"
194
+ end
195
+
196
+ def render_json_nil
197
+ render :json => nil
198
+ end
199
+
200
+ def render_json_hello_world
201
+ render :json => ActiveSupport::JSON.encode(:hello => 'world')
202
+ end
203
+
204
+ def render_json_hello_world_with_callback
205
+ render :json => ActiveSupport::JSON.encode(:hello => 'world'), :callback => 'alert'
206
+ end
207
+
208
+ def render_json_with_custom_content_type
209
+ render :json => ActiveSupport::JSON.encode(:hello => 'world'), :content_type => 'text/javascript'
210
+ end
211
+
212
+ def render_symbol_json
213
+ render :json => ActiveSupport::JSON.encode(:hello => 'world')
214
+ end
215
+
216
+ def render_json_with_render_to_string
217
+ render :json => {:hello => render_to_string(:partial => 'partial')}
218
+ end
219
+
220
+ def render_custom_code
221
+ render :text => "hello world", :status => 404
222
+ end
223
+
224
+ def render_custom_code_rjs
225
+ render :update, :status => 404 do |page|
226
+ page.replace :foo, :partial => 'partial'
227
+ end
228
+ end
229
+
230
+ def render_text_with_nil
231
+ render :text => nil
232
+ end
233
+
234
+ def render_text_with_false
235
+ render :text => false
236
+ end
237
+
238
+ def render_nothing_with_appendix
239
+ render :text => "appended"
240
+ end
241
+
242
+ def render_vanilla_js_hello
243
+ render :js => "alert('hello')"
244
+ end
245
+
246
+ def render_xml_hello
247
+ @name = "David"
248
+ render :template => "test/hello"
249
+ end
250
+
251
+ def render_xml_hello_as_string_template
252
+ @name = "David"
253
+ render "test/hello"
254
+ end
255
+
256
+ def render_xml_with_custom_content_type
257
+ render :xml => "<blah/>", :content_type => "application/atomsvc+xml"
258
+ end
259
+
260
+ def render_line_offset
261
+ render :inline => '<% raise %>', :locals => {:foo => 'bar'}
262
+ end
263
+
264
+ def heading
265
+ head :ok
266
+ end
267
+
268
+ def greeting
269
+ # let's just rely on the template
270
+ end
271
+
272
+ def blank_response
273
+ render :text => ' '
274
+ end
275
+
276
+ def layout_test
277
+ render :action => "hello_world"
278
+ end
279
+
280
+ def builder_layout_test
281
+ render :action => "hello", :layout => "layouts/builder"
282
+ end
283
+
284
+ def builder_partial_test
285
+ render :action => "hello_world_container"
286
+ end
287
+
288
+ def partials_list
289
+ @test_unchanged = 'hello'
290
+ @customers = [ Customer.new("david"), Customer.new("mary") ]
291
+ render :action => "list"
292
+ end
293
+
294
+ def partial_only
295
+ render :partial => true
296
+ end
297
+
298
+ def hello_in_a_string
299
+ @customers = [ Customer.new("david"), Customer.new("mary") ]
300
+ render :text => "How's there? " + render_to_string(:template => "test/list")
301
+ end
302
+
303
+ def accessing_params_in_template
304
+ render :inline => "Hello: <%= params[:name] %>"
305
+ end
306
+
307
+ def accessing_local_assigns_in_inline_template
308
+ name = params[:local_name]
309
+ render :inline => "<%= 'Goodbye, ' + local_name %>",
310
+ :locals => { :local_name => name }
311
+ end
312
+
313
+ def render_implicit_html_template
314
+ end
315
+
316
+ def render_explicit_html_template
317
+ end
318
+
319
+ def render_implicit_html_template_from_xhr_request
320
+ end
321
+
322
+ def render_implicit_js_template_without_layout
323
+ end
324
+
325
+ def render_html_explicit_template_and_layout
326
+ render :template => 'test/render_implicit_html_template_from_xhr_request', :layout => 'layouts/default_html'
327
+ end
328
+
329
+ def formatted_html_erb
330
+ end
331
+
332
+ def formatted_xml_erb
333
+ end
334
+
335
+ def render_to_string_test
336
+ @foo = render_to_string :inline => "this is a test"
337
+ end
338
+
339
+ def default_render
340
+ if @alternate_default_render
341
+ @alternate_default_render.call
342
+ else
343
+ super
344
+ end
345
+ end
346
+
347
+ def render_action_hello_world_as_symbol
348
+ render :action => :hello_world
349
+ end
350
+
351
+ def layout_test_with_different_layout
352
+ render :action => "hello_world", :layout => "standard"
353
+ end
354
+
355
+ def layout_test_with_different_layout_and_string_action
356
+ render "hello_world", :layout => "standard"
357
+ end
358
+
359
+ def layout_test_with_different_layout_and_symbol_action
360
+ render :hello_world, :layout => "standard"
361
+ end
362
+
363
+ def rendering_without_layout
364
+ render :action => "hello_world", :layout => false
365
+ end
366
+
367
+ def layout_overriding_layout
368
+ render :action => "hello_world", :layout => "standard"
369
+ end
370
+
371
+ def rendering_nothing_on_layout
372
+ render :nothing => true
373
+ end
374
+
375
+ def render_to_string_with_assigns
376
+ @before = "i'm before the render"
377
+ render_to_string :text => "foo"
378
+ @after = "i'm after the render"
379
+ render :action => "test/hello_world"
380
+ end
381
+
382
+ def render_to_string_with_exception
383
+ render_to_string :file => "exception that will not be caught - this will certainly not work"
384
+ end
385
+
386
+ def render_to_string_with_caught_exception
387
+ @before = "i'm before the render"
388
+ begin
389
+ render_to_string :file => "exception that will be caught- hope my future instance vars still work!"
390
+ rescue
391
+ end
392
+ @after = "i'm after the render"
393
+ render :action => "test/hello_world"
394
+ end
395
+
396
+ def accessing_params_in_template_with_layout
397
+ render :layout => nil, :inline => "Hello: <%= params[:name] %>"
398
+ end
399
+
400
+ def render_with_explicit_template
401
+ render :template => "test/hello_world"
402
+ end
403
+
404
+ def render_with_explicit_string_template
405
+ render "test/hello_world"
406
+ end
407
+
408
+ def render_with_explicit_template_with_locals
409
+ render :template => "test/render_file_with_locals", :locals => { :secret => 'area51' }
410
+ end
411
+
412
+ def double_render
413
+ render :text => "hello"
414
+ render :text => "world"
415
+ end
416
+
417
+ def double_redirect
418
+ redirect_to :action => "double_render"
419
+ redirect_to :action => "double_render"
420
+ end
421
+
422
+ def render_and_redirect
423
+ render :text => "hello"
424
+ redirect_to :action => "double_render"
425
+ end
426
+
427
+ def render_to_string_and_render
428
+ @stuff = render_to_string :text => "here is some cached stuff"
429
+ render :text => "Hi web users! #{@stuff}"
430
+ end
431
+
432
+ def render_to_string_with_inline_and_render
433
+ render_to_string :inline => "<%= 'dlrow olleh'.reverse %>"
434
+ render :template => "test/hello_world"
435
+ end
436
+
437
+ def rendering_with_conflicting_local_vars
438
+ @name = "David"
439
+ def @template.name() nil end
440
+ render :action => "potential_conflicts"
441
+ end
442
+
443
+ def hello_world_from_rxml_using_action
444
+ render :action => "hello_world_from_rxml.builder"
445
+ end
446
+
447
+ def hello_world_from_rxml_using_template
448
+ render :template => "test/hello_world_from_rxml.builder"
449
+ end
450
+
451
+ module RenderTestHelper
452
+ def rjs_helper_method_from_module
453
+ page.visual_effect :highlight
454
+ end
455
+ end
456
+
457
+ helper RenderTestHelper
458
+ helper do
459
+ def rjs_helper_method(value)
460
+ page.visual_effect :highlight, value
461
+ end
462
+ end
463
+
464
+ def enum_rjs_test
465
+ render :update do |page|
466
+ page.select('.product').each do |value|
467
+ page.rjs_helper_method_from_module
468
+ page.rjs_helper_method(value)
469
+ page.sortable(value, :url => { :action => "order" })
470
+ page.draggable(value)
471
+ end
472
+ end
473
+ end
474
+
475
+ def delete_with_js
476
+ @project_id = 4
477
+ end
478
+
479
+ def render_js_with_explicit_template
480
+ @project_id = 4
481
+ render :template => 'test/delete_with_js'
482
+ end
483
+
484
+ def render_js_with_explicit_action_template
485
+ @project_id = 4
486
+ render :action => 'delete_with_js'
487
+ end
488
+
489
+ def update_page
490
+ render :update do |page|
491
+ page.replace_html 'balance', '$37,000,000.00'
492
+ page.visual_effect :highlight, 'balance'
493
+ end
494
+ end
495
+
496
+ def update_page_with_instance_variables
497
+ @money = '$37,000,000.00'
498
+ @div_id = 'balance'
499
+ render :update do |page|
500
+ page.replace_html @div_id, @money
501
+ page.visual_effect :highlight, @div_id
502
+ end
503
+ end
504
+
505
+ def update_page_with_view_method
506
+ render :update do |page|
507
+ page.replace_html 'person', pluralize(2, 'person')
508
+ end
509
+ end
510
+
511
+ def action_talk_to_layout
512
+ # Action template sets variable that's picked up by layout
513
+ end
514
+
515
+ def render_text_with_assigns
516
+ @hello = "world"
517
+ render :text => "foo"
518
+ end
519
+
520
+ def yield_content_for
521
+ render :action => "content_for", :layout => "yield"
522
+ end
523
+
524
+ def render_content_type_from_body
525
+ response.content_type = Mime::RSS
526
+ render :text => "hello world!"
527
+ end
528
+
529
+ def head_with_location_header
530
+ head :location => "/foo"
531
+ end
532
+
533
+ def head_with_symbolic_status
534
+ head :status => params[:status].intern
535
+ end
536
+
537
+ def head_with_integer_status
538
+ head :status => params[:status].to_i
539
+ end
540
+
541
+ def head_with_string_status
542
+ head :status => params[:status]
543
+ end
544
+
545
+ def head_with_custom_header
546
+ head :x_custom_header => "something"
547
+ end
548
+
549
+ def head_with_status_code_first
550
+ head :forbidden, :x_custom_header => "something"
551
+ end
552
+
553
+ def render_with_location
554
+ render :xml => "<hello/>", :location => "http://example.com", :status => 201
555
+ end
556
+
557
+ def render_with_object_location
558
+ customer = Customer.new("Some guy", 1)
559
+ render :xml => "<customer/>", :location => customer_url(customer), :status => :created
560
+ end
561
+
562
+ def render_with_to_xml
563
+ to_xmlable = Class.new do
564
+ def to_xml
565
+ "<i-am-xml/>"
566
+ end
567
+ end.new
568
+
569
+ render :xml => to_xmlable
570
+ end
571
+
572
+ def render_using_layout_around_block
573
+ render :action => "using_layout_around_block"
574
+ end
575
+
576
+ def render_using_layout_around_block_with_args
577
+ render :action => "using_layout_around_block_with_args"
578
+ end
579
+
580
+ def render_using_layout_around_block_in_main_layout_and_within_content_for_layout
581
+ render :action => "using_layout_around_block", :layout => "layouts/block_with_layout"
582
+ end
583
+
584
+ def partial_dot_html
585
+ render :partial => 'partial.html.erb'
586
+ end
587
+
588
+ def partial_as_rjs
589
+ render :update do |page|
590
+ page.replace :foo, :partial => 'partial'
591
+ end
592
+ end
593
+
594
+ def respond_to_partial_as_rjs
595
+ respond_to do |format|
596
+ format.js do
597
+ render :update do |page|
598
+ page.replace :foo, :partial => 'partial'
599
+ end
600
+ end
601
+ end
602
+ end
603
+
604
+ def partial
605
+ render :partial => 'partial'
606
+ end
607
+
608
+ def render_alternate_default
609
+ # For this test, the method "default_render" is overridden:
610
+ @alternate_default_render = lambda do
611
+ render :update do |page|
612
+ page.replace :foo, :partial => 'partial'
613
+ end
614
+ end
615
+ end
616
+
617
+ def partial_only_with_layout
618
+ render :partial => "partial_only", :layout => true
619
+ end
620
+
621
+ def render_to_string_with_partial
622
+ @partial_only = render_to_string :partial => "partial_only"
623
+ @partial_with_locals = render_to_string :partial => "customer", :locals => { :customer => Customer.new("david") }
624
+ render :action => "test/hello_world"
625
+ end
626
+
627
+ def partial_with_counter
628
+ render :partial => "counter", :locals => { :counter_counter => 5 }
629
+ end
630
+
631
+ def partial_with_locals
632
+ render :partial => "customer", :locals => { :customer => Customer.new("david") }
633
+ end
634
+
635
+ def partial_with_form_builder
636
+ render :partial => ActionView::Helpers::FormBuilder.new(:post, nil, @template, {}, Proc.new {})
637
+ end
638
+
639
+ def partial_with_form_builder_subclass
640
+ render :partial => LabellingFormBuilder.new(:post, nil, @template, {}, Proc.new {})
641
+ end
642
+
643
+ def partial_collection
644
+ render :partial => "customer", :collection => [ Customer.new("david"), Customer.new("mary") ]
645
+ end
646
+
647
+ def partial_collection_with_as
648
+ render :partial => "customer_with_var", :collection => [ Customer.new("david"), Customer.new("mary") ], :as => :customer
649
+ end
650
+
651
+ def partial_collection_with_counter
652
+ render :partial => "customer_counter", :collection => [ Customer.new("david"), Customer.new("mary") ]
653
+ end
654
+
655
+ def partial_collection_with_locals
656
+ render :partial => "customer_greeting", :collection => [ Customer.new("david"), Customer.new("mary") ], :locals => { :greeting => "Bonjour" }
657
+ end
658
+
659
+ def partial_collection_with_spacer
660
+ render :partial => "customer", :spacer_template => "partial_only", :collection => [ Customer.new("david"), Customer.new("mary") ]
661
+ end
662
+
663
+ def partial_collection_shorthand_with_locals
664
+ render :partial => [ Customer.new("david"), Customer.new("mary") ], :locals => { :greeting => "Bonjour" }
665
+ end
666
+
667
+ def partial_collection_shorthand_with_different_types_of_records
668
+ render :partial => [
669
+ BadCustomer.new("mark"),
670
+ GoodCustomer.new("craig"),
671
+ BadCustomer.new("john"),
672
+ GoodCustomer.new("zach"),
673
+ GoodCustomer.new("brandon"),
674
+ BadCustomer.new("dan") ],
675
+ :locals => { :greeting => "Bonjour" }
676
+ end
677
+
678
+ def empty_partial_collection
679
+ render :partial => "customer", :collection => []
680
+ end
681
+
682
+ def partial_collection_shorthand_with_different_types_of_records_with_counter
683
+ partial_collection_shorthand_with_different_types_of_records
684
+ end
685
+
686
+ def missing_partial
687
+ render :partial => 'thisFileIsntHere'
688
+ end
689
+
690
+ def partial_with_hash_object
691
+ render :partial => "hash_object", :object => {:first_name => "Sam"}
692
+ end
693
+
694
+ def partial_with_nested_object
695
+ render :partial => "quiz/questions/question", :object => Quiz::Question.new("first")
696
+ end
697
+
698
+ def partial_with_nested_object_shorthand
699
+ render Quiz::Question.new("first")
700
+ end
701
+
702
+ def partial_hash_collection
703
+ render :partial => "hash_object", :collection => [ {:first_name => "Pratik"}, {:first_name => "Amy"} ]
704
+ end
705
+
706
+ def partial_hash_collection_with_locals
707
+ render :partial => "hash_greeting", :collection => [ {:first_name => "Pratik"}, {:first_name => "Amy"} ], :locals => { :greeting => "Hola" }
708
+ end
709
+
710
+ def partial_with_implicit_local_assignment
711
+ @customer = Customer.new("Marcel")
712
+ render :partial => "customer"
713
+ end
714
+
715
+ def render_call_to_partial_with_layout
716
+ render :action => "calling_partial_with_layout"
717
+ end
718
+
719
+ def render_call_to_partial_with_layout_in_main_layout_and_within_content_for_layout
720
+ render :action => "calling_partial_with_layout", :layout => "layouts/partial_with_layout"
721
+ end
722
+
723
+ def rescue_action(e)
724
+ raise
725
+ end
726
+
727
+ private
728
+ def determine_layout
729
+ case action_name
730
+ when "hello_world", "layout_test", "rendering_without_layout",
731
+ "rendering_nothing_on_layout", "render_text_hello_world",
732
+ "render_text_hello_world_with_layout",
733
+ "hello_world_with_layout_false",
734
+ "partial_only", "partial_only_with_layout",
735
+ "accessing_params_in_template",
736
+ "accessing_params_in_template_with_layout",
737
+ "render_with_explicit_template",
738
+ "render_with_explicit_string_template",
739
+ "render_js_with_explicit_template",
740
+ "render_js_with_explicit_action_template",
741
+ "delete_with_js", "update_page", "update_page_with_instance_variables"
742
+
743
+ "layouts/standard"
744
+ when "render_implicit_js_template_without_layout"
745
+ "layouts/default_html"
746
+ when "action_talk_to_layout", "layout_overriding_layout"
747
+ "layouts/talk_from_action"
748
+ when "render_implicit_html_template_from_xhr_request"
749
+ (request.xhr? ? 'layouts/xhr' : 'layouts/standard')
750
+ end
751
+ end
752
+ end
753
+
754
+ class RenderTest < ActionController::TestCase
755
+ tests TestController
756
+
757
+ def setup
758
+ # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
759
+ # a more accurate simulation of what happens in "real life".
760
+ @controller.logger = Logger.new(nil)
761
+
762
+ @request.host = "www.nextangle.com"
763
+ end
764
+
765
+ def test_simple_show
766
+ get :hello_world
767
+ assert_response 200
768
+ assert_response :success
769
+ assert_template "test/hello_world"
770
+ assert_equal "<html>Hello world!</html>", @response.body
771
+ end
772
+
773
+ def test_renders_default_template_for_missing_action
774
+ get :'hyphen-ated'
775
+ assert_template 'test/hyphen-ated'
776
+ end
777
+
778
+ def test_render
779
+ get :render_hello_world
780
+ assert_template "test/hello_world"
781
+ end
782
+
783
+ def test_line_offset
784
+ begin
785
+ get :render_line_offset
786
+ flunk "the action should have raised an exception"
787
+ rescue RuntimeError => exc
788
+ line = exc.backtrace.first
789
+ assert(line =~ %r{:(\d+):})
790
+ assert_equal "1", $1,
791
+ "The line offset is wrong, perhaps the wrong exception has been raised, exception was: #{exc.inspect}"
792
+ end
793
+ end
794
+
795
+ def test_render_with_forward_slash
796
+ get :render_hello_world_with_forward_slash
797
+ assert_template "test/hello_world"
798
+ end
799
+
800
+ def test_render_in_top_directory
801
+ get :render_template_in_top_directory
802
+ assert_template "shared"
803
+ assert_equal "Elastica", @response.body
804
+ end
805
+
806
+ def test_render_in_top_directory_with_slash
807
+ get :render_template_in_top_directory_with_slash
808
+ assert_template "shared"
809
+ assert_equal "Elastica", @response.body
810
+ end
811
+
812
+ def test_render_from_variable
813
+ get :render_hello_world_from_variable
814
+ assert_equal "hello david", @response.body
815
+ end
816
+
817
+ def test_render_action
818
+ get :render_action_hello_world
819
+ assert_template "test/hello_world"
820
+ end
821
+
822
+ def test_render_action_hello_world_as_string
823
+ get :render_action_hello_world_as_string
824
+ assert_equal "Hello world!", @response.body
825
+ assert_template "test/hello_world"
826
+ end
827
+
828
+ def test_render_action_with_symbol
829
+ get :render_action_hello_world_with_symbol
830
+ assert_template "test/hello_world"
831
+ end
832
+
833
+ def test_render_text
834
+ get :render_text_hello_world
835
+ assert_equal "hello world", @response.body
836
+ end
837
+
838
+ def test_do_with_render_text_and_layout
839
+ get :render_text_hello_world_with_layout
840
+ assert_equal "<html>hello world, I'm here!</html>", @response.body
841
+ end
842
+
843
+ def test_xhr_with_render_text_and_layout
844
+ xhr :get, :render_text_hello_world_with_layout
845
+ assert_equal "<html>hello world, I'm here!</html>", @response.body
846
+ end
847
+
848
+ def test_do_with_render_action_and_layout_false
849
+ get :hello_world_with_layout_false
850
+ assert_equal 'Hello world!', @response.body
851
+ end
852
+
853
+ def test_render_file_with_instance_variables
854
+ get :render_file_with_instance_variables
855
+ assert_equal "The secret is in the sauce\n", @response.body
856
+ end
857
+
858
+ def test_render_file_as_string_with_instance_variables
859
+ get :render_file_as_string_with_instance_variables
860
+ assert_equal "The secret is in the sauce\n", @response.body
861
+ end
862
+
863
+ def test_render_file_not_using_full_path
864
+ get :render_file_not_using_full_path
865
+ assert_equal "The secret is in the sauce\n", @response.body
866
+ end
867
+
868
+ def test_render_file_not_using_full_path_with_dot_in_path
869
+ get :render_file_not_using_full_path_with_dot_in_path
870
+ assert_equal "The secret is in the sauce\n", @response.body
871
+ end
872
+
873
+ def test_render_file_using_pathname
874
+ get :render_file_using_pathname
875
+ assert_equal "The secret is in the sauce\n", @response.body
876
+ end
877
+
878
+ def test_render_file_with_locals
879
+ get :render_file_with_locals
880
+ assert_equal "The secret is in the sauce\n", @response.body
881
+ end
882
+
883
+ def test_render_file_as_string_with_locals
884
+ get :render_file_as_string_with_locals
885
+ assert_equal "The secret is in the sauce\n", @response.body
886
+ end
887
+
888
+ def test_render_file_from_template
889
+ get :render_file_from_template
890
+ assert_equal "The secret is in the sauce\n", @response.body
891
+ end
892
+
893
+ def test_render_json_nil
894
+ get :render_json_nil
895
+ assert_equal 'null', @response.body
896
+ assert_equal 'application/json', @response.content_type
897
+ end
898
+
899
+ def test_render_json
900
+ get :render_json_hello_world
901
+ assert_equal '{"hello":"world"}', @response.body
902
+ assert_equal 'application/json', @response.content_type
903
+ end
904
+
905
+ def test_render_json_with_callback
906
+ get :render_json_hello_world_with_callback
907
+ assert_equal 'alert({"hello":"world"})', @response.body
908
+ assert_equal 'application/json', @response.content_type
909
+ end
910
+
911
+ def test_render_json_with_custom_content_type
912
+ get :render_json_with_custom_content_type
913
+ assert_equal '{"hello":"world"}', @response.body
914
+ assert_equal 'text/javascript', @response.content_type
915
+ end
916
+
917
+ def test_render_symbol_json
918
+ get :render_symbol_json
919
+ assert_equal '{"hello":"world"}', @response.body
920
+ assert_equal 'application/json', @response.content_type
921
+ end
922
+
923
+ def test_render_json_with_render_to_string
924
+ get :render_json_with_render_to_string
925
+ assert_equal '{"hello":"partial html"}', @response.body
926
+ assert_equal 'application/json', @response.content_type
927
+ end
928
+
929
+ def test_render_custom_code
930
+ get :render_custom_code
931
+ assert_response 404
932
+ assert_response :missing
933
+ assert_equal 'hello world', @response.body
934
+ end
935
+
936
+ def test_render_custom_code_rjs
937
+ get :render_custom_code_rjs
938
+ assert_response 404
939
+ assert_equal %(Element.replace("foo", "partial html");), @response.body
940
+ end
941
+
942
+ def test_render_text_with_nil
943
+ get :render_text_with_nil
944
+ assert_response 200
945
+ assert_equal ' ', @response.body
946
+ end
947
+
948
+ def test_render_text_with_false
949
+ get :render_text_with_false
950
+ assert_equal 'false', @response.body
951
+ end
952
+
953
+ def test_render_nothing_with_appendix
954
+ get :render_nothing_with_appendix
955
+ assert_response 200
956
+ assert_equal 'appended', @response.body
957
+ end
958
+
959
+ def test_attempt_to_access_object_method
960
+ assert_raise(ActionController::UnknownAction, "No action responded to [clone]") { get :clone }
961
+ end
962
+
963
+ def test_private_methods
964
+ assert_raise(ActionController::UnknownAction, "No action responded to [determine_layout]") { get :determine_layout }
965
+ end
966
+
967
+ def test_access_to_request_in_view
968
+ get :accessing_request_in_template
969
+ assert_equal "Hello: www.nextangle.com", @response.body
970
+ end
971
+
972
+ def test_access_to_logger_in_view
973
+ get :accessing_logger_in_template
974
+ assert_equal "Logger", @response.body
975
+ end
976
+
977
+ def test_access_to_action_name_in_view
978
+ get :accessing_action_name_in_template
979
+ assert_equal "accessing_action_name_in_template", @response.body
980
+ end
981
+
982
+ def test_access_to_controller_name_in_view
983
+ get :accessing_controller_name_in_template
984
+ assert_equal "test", @response.body # name is explicitly set to 'test' inside the controller.
985
+ end
986
+
987
+ def test_render_vanilla_js
988
+ get :render_vanilla_js_hello
989
+ assert_equal "alert('hello')", @response.body
990
+ assert_equal "text/javascript", @response.content_type
991
+ end
992
+
993
+ def test_render_xml
994
+ get :render_xml_hello
995
+ assert_equal "<html>\n <p>Hello David</p>\n<p>This is grand!</p>\n</html>\n", @response.body
996
+ assert_equal "application/xml", @response.content_type
997
+ end
998
+
999
+ def test_render_xml_as_string_template
1000
+ get :render_xml_hello_as_string_template
1001
+ assert_equal "<html>\n <p>Hello David</p>\n<p>This is grand!</p>\n</html>\n", @response.body
1002
+ assert_equal "application/xml", @response.content_type
1003
+ end
1004
+
1005
+ def test_render_xml_with_default
1006
+ get :greeting
1007
+ assert_equal "<p>This is grand!</p>\n", @response.body
1008
+ end
1009
+
1010
+ def test_render_xml_with_partial
1011
+ get :builder_partial_test
1012
+ assert_equal "<test>\n <hello/>\n</test>\n", @response.body
1013
+ end
1014
+
1015
+ def test_enum_rjs_test
1016
+ ActiveSupport::SecureRandom.stubs(:base64).returns("asdf")
1017
+ get :enum_rjs_test
1018
+ body = %{
1019
+ $$(".product").each(function(value, index) {
1020
+ new Effect.Highlight(element,{});
1021
+ new Effect.Highlight(value,{});
1022
+ Sortable.create(value, {onUpdate:function(){new Ajax.Request('/test/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(value) + '&authenticity_token=' + encodeURIComponent('asdf')})}});
1023
+ new Draggable(value, {});
1024
+ });
1025
+ }.gsub(/^ /, '').strip
1026
+ assert_equal body, @response.body
1027
+ end
1028
+
1029
+ def test_layout_rendering
1030
+ get :layout_test
1031
+ assert_equal "<html>Hello world!</html>", @response.body
1032
+ end
1033
+
1034
+ def test_render_xml_with_layouts
1035
+ get :builder_layout_test
1036
+ assert_equal "<wrapper>\n<html>\n <p>Hello </p>\n<p>This is grand!</p>\n</html>\n</wrapper>\n", @response.body
1037
+ end
1038
+
1039
+ def test_partials_list
1040
+ get :partials_list
1041
+ assert_equal "goodbyeHello: davidHello: marygoodbye\n", @response.body
1042
+ end
1043
+
1044
+ def test_render_to_string
1045
+ get :hello_in_a_string
1046
+ assert_equal "How's there? goodbyeHello: davidHello: marygoodbye\n", @response.body
1047
+ end
1048
+
1049
+ def test_render_to_string_resets_assigns
1050
+ get :render_to_string_test
1051
+ assert_equal "The value of foo is: ::this is a test::\n", @response.body
1052
+ end
1053
+
1054
+ def test_render_to_string_inline
1055
+ get :render_to_string_with_inline_and_render
1056
+ assert_template "test/hello_world"
1057
+ end
1058
+
1059
+ def test_nested_rendering
1060
+ @controller = Fun::GamesController.new
1061
+ get :hello_world
1062
+ assert_equal "Living in a nested world", @response.body
1063
+ end
1064
+
1065
+ def test_accessing_params_in_template
1066
+ get :accessing_params_in_template, :name => "David"
1067
+ assert_equal "Hello: David", @response.body
1068
+ end
1069
+
1070
+ def test_accessing_local_assigns_in_inline_template
1071
+ get :accessing_local_assigns_in_inline_template, :local_name => "Local David"
1072
+ assert_equal "Goodbye, Local David", @response.body
1073
+ end
1074
+
1075
+ def test_render_in_an_rjs_template_should_pick_html_templates_when_available
1076
+ [:js, "js"].each do |format|
1077
+ assert_nothing_raised do
1078
+ get :render_implicit_html_template, :format => format
1079
+ assert_equal %(document.write("Hello world\\n");), @response.body
1080
+ end
1081
+ end
1082
+ end
1083
+
1084
+ def test_explicitly_rendering_an_html_template_with_implicit_html_template_renders_should_be_possible_from_an_rjs_template
1085
+ [:js, "js"].each do |format|
1086
+ assert_nothing_raised do
1087
+ get :render_explicit_html_template, :format => format
1088
+ assert_equal %(document.write("Hello world\\n");), @response.body
1089
+ end
1090
+ end
1091
+ end
1092
+
1093
+ def test_should_implicitly_render_html_template_from_xhr_request
1094
+ xhr :get, :render_implicit_html_template_from_xhr_request
1095
+ assert_equal "XHR!\nHello HTML!", @response.body
1096
+ end
1097
+
1098
+ def test_should_render_explicit_html_template_with_html_layout
1099
+ xhr :get, :render_html_explicit_template_and_layout
1100
+ assert_equal "<html>Hello HTML!</html>\n", @response.body
1101
+ end
1102
+
1103
+ def test_should_implicitly_render_js_template_without_layout
1104
+ get :render_implicit_js_template_without_layout, :format => :js
1105
+ assert_no_match /<html>/, @response.body
1106
+ end
1107
+
1108
+ def test_should_render_formatted_template
1109
+ get :formatted_html_erb
1110
+ assert_equal 'formatted html erb', @response.body
1111
+ end
1112
+
1113
+ def test_should_render_formatted_xml_erb_template
1114
+ get :formatted_xml_erb, :format => :xml
1115
+ assert_equal '<test>passed formatted xml erb</test>', @response.body
1116
+ end
1117
+
1118
+ def test_should_render_formatted_html_erb_template
1119
+ get :formatted_xml_erb
1120
+ assert_equal '<test>passed formatted html erb</test>', @response.body
1121
+ end
1122
+
1123
+ def test_should_render_formatted_html_erb_template_with_faulty_accepts_header
1124
+ @request.accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, appliction/x-shockwave-flash, */*"
1125
+ get :formatted_xml_erb
1126
+ assert_equal '<test>passed formatted html erb</test>', @response.body
1127
+ end
1128
+
1129
+ def test_should_render_xml_but_keep_custom_content_type
1130
+ get :render_xml_with_custom_content_type
1131
+ assert_equal "application/atomsvc+xml", @response.content_type
1132
+ end
1133
+
1134
+ def test_render_with_default_from_accept_header
1135
+ xhr :get, :greeting
1136
+ assert_equal "$(\"body\").visualEffect(\"highlight\");", @response.body
1137
+ end
1138
+
1139
+ def test_render_rjs_with_default
1140
+ get :delete_with_js
1141
+ assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body
1142
+ end
1143
+
1144
+ def test_render_rjs_template_explicitly
1145
+ get :render_js_with_explicit_template
1146
+ assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body
1147
+ end
1148
+
1149
+ def test_rendering_rjs_action_explicitly
1150
+ get :render_js_with_explicit_action_template
1151
+ assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body
1152
+ end
1153
+
1154
+ def test_layout_test_with_different_layout
1155
+ get :layout_test_with_different_layout
1156
+ assert_equal "<html>Hello world!</html>", @response.body
1157
+ end
1158
+
1159
+ def test_layout_test_with_different_layout_and_string_action
1160
+ get :layout_test_with_different_layout_and_string_action
1161
+ assert_equal "<html>Hello world!</html>", @response.body
1162
+ end
1163
+
1164
+ def test_layout_test_with_different_layout_and_symbol_action
1165
+ get :layout_test_with_different_layout_and_symbol_action
1166
+ assert_equal "<html>Hello world!</html>", @response.body
1167
+ end
1168
+
1169
+ def test_rendering_without_layout
1170
+ get :rendering_without_layout
1171
+ assert_equal "Hello world!", @response.body
1172
+ end
1173
+
1174
+ def test_layout_overriding_layout
1175
+ get :layout_overriding_layout
1176
+ assert_no_match %r{<title>}, @response.body
1177
+ end
1178
+
1179
+ def test_rendering_nothing_on_layout
1180
+ get :rendering_nothing_on_layout
1181
+ assert_equal " ", @response.body
1182
+ end
1183
+
1184
+ def test_render_to_string
1185
+ assert_not_deprecated { get :hello_in_a_string }
1186
+ assert_equal "How's there? goodbyeHello: davidHello: marygoodbye\n", @response.body
1187
+ end
1188
+
1189
+ def test_render_to_string_doesnt_break_assigns
1190
+ get :render_to_string_with_assigns
1191
+ assert_equal "i'm before the render", assigns(:before)
1192
+ assert_equal "i'm after the render", assigns(:after)
1193
+ end
1194
+
1195
+ def test_bad_render_to_string_still_throws_exception
1196
+ assert_raise(ActionView::MissingTemplate) { get :render_to_string_with_exception }
1197
+ end
1198
+
1199
+ def test_render_to_string_that_throws_caught_exception_doesnt_break_assigns
1200
+ assert_nothing_raised { get :render_to_string_with_caught_exception }
1201
+ assert_equal "i'm before the render", assigns(:before)
1202
+ assert_equal "i'm after the render", assigns(:after)
1203
+ end
1204
+
1205
+ def test_accessing_params_in_template_with_layout
1206
+ get :accessing_params_in_template_with_layout, :name => "David"
1207
+ assert_equal "<html>Hello: David</html>", @response.body
1208
+ end
1209
+
1210
+ def test_render_with_explicit_template
1211
+ get :render_with_explicit_template
1212
+ assert_response :success
1213
+ end
1214
+
1215
+ def test_render_with_explicit_string_template
1216
+ get :render_with_explicit_string_template
1217
+ assert_equal "<html>Hello world!</html>", @response.body
1218
+ end
1219
+
1220
+ def test_double_render
1221
+ assert_raise(ActionController::DoubleRenderError) { get :double_render }
1222
+ end
1223
+
1224
+ def test_double_redirect
1225
+ assert_raise(ActionController::DoubleRenderError) { get :double_redirect }
1226
+ end
1227
+
1228
+ def test_render_and_redirect
1229
+ assert_raise(ActionController::DoubleRenderError) { get :render_and_redirect }
1230
+ end
1231
+
1232
+ # specify the one exception to double render rule - render_to_string followed by render
1233
+ def test_render_to_string_and_render
1234
+ get :render_to_string_and_render
1235
+ assert_equal("Hi web users! here is some cached stuff", @response.body)
1236
+ end
1237
+
1238
+ def test_rendering_with_conflicting_local_vars
1239
+ get :rendering_with_conflicting_local_vars
1240
+ assert_equal("First: David\nSecond: Stephan\nThird: David\nFourth: David\nFifth: ", @response.body)
1241
+ end
1242
+
1243
+ def test_action_talk_to_layout
1244
+ get :action_talk_to_layout
1245
+ assert_equal "<title>Talking to the layout</title>\nAction was here!", @response.body
1246
+ end
1247
+
1248
+ def test_render_text_with_assigns
1249
+ get :render_text_with_assigns
1250
+ assert_equal "world", assigns["hello"]
1251
+ end
1252
+
1253
+ def test_template_with_locals
1254
+ get :render_with_explicit_template_with_locals
1255
+ assert_equal "The secret is area51\n", @response.body
1256
+ end
1257
+
1258
+ def test_update_page
1259
+ get :update_page
1260
+ assert_template nil
1261
+ assert_equal 'text/javascript; charset=utf-8', @response.headers['Content-Type']
1262
+ assert_equal 2, @response.body.split($/).length
1263
+ end
1264
+
1265
+ def test_update_page_with_instance_variables
1266
+ get :update_page_with_instance_variables
1267
+ assert_template nil
1268
+ assert_equal 'text/javascript; charset=utf-8', @response.headers["Content-Type"]
1269
+ assert_match /balance/, @response.body
1270
+ assert_match /\$37/, @response.body
1271
+ end
1272
+
1273
+ def test_update_page_with_view_method
1274
+ get :update_page_with_view_method
1275
+ assert_template nil
1276
+ assert_equal 'text/javascript; charset=utf-8', @response.headers["Content-Type"]
1277
+ assert_match /2 people/, @response.body
1278
+ end
1279
+
1280
+ def test_yield_content_for
1281
+ assert_not_deprecated { get :yield_content_for }
1282
+ assert_equal "<title>Putting stuff in the title!</title>\n\nGreat stuff!\n", @response.body
1283
+ end
1284
+
1285
+ def test_overwritting_rendering_relative_file_with_extension
1286
+ get :hello_world_from_rxml_using_template
1287
+ assert_equal "<html>\n <p>Hello</p>\n</html>\n", @response.body
1288
+
1289
+ get :hello_world_from_rxml_using_action
1290
+ assert_equal "<html>\n <p>Hello</p>\n</html>\n", @response.body
1291
+ end
1292
+
1293
+ def test_head_with_location_header
1294
+ get :head_with_location_header
1295
+ assert @response.body.blank?
1296
+ assert_equal "/foo", @response.headers["Location"]
1297
+ assert_response :ok
1298
+ end
1299
+
1300
+ def test_head_with_custom_header
1301
+ get :head_with_custom_header
1302
+ assert @response.body.blank?
1303
+ assert_equal "something", @response.headers["X-Custom-Header"]
1304
+ assert_response :ok
1305
+ end
1306
+
1307
+ def test_head_with_symbolic_status
1308
+ get :head_with_symbolic_status, :status => "ok"
1309
+ assert_equal "200 OK", @response.status
1310
+ assert_response :ok
1311
+
1312
+ get :head_with_symbolic_status, :status => "not_found"
1313
+ assert_equal "404 Not Found", @response.status
1314
+ assert_response :not_found
1315
+
1316
+ get :head_with_symbolic_status, :status => "no_content"
1317
+ assert_equal "204 No Content", @response.status
1318
+ assert !@response.headers.include?('Content-Length')
1319
+ assert_response :no_content
1320
+
1321
+ ActionController::StatusCodes::SYMBOL_TO_STATUS_CODE.each do |status, code|
1322
+ get :head_with_symbolic_status, :status => status.to_s
1323
+ assert_equal code, @response.response_code
1324
+ assert_response status
1325
+ end
1326
+ end
1327
+
1328
+ def test_head_with_integer_status
1329
+ ActionController::StatusCodes::STATUS_CODES.each do |code, message|
1330
+ get :head_with_integer_status, :status => code.to_s
1331
+ assert_equal message, @response.message
1332
+ end
1333
+ end
1334
+
1335
+ def test_head_with_string_status
1336
+ get :head_with_string_status, :status => "404 Eat Dirt"
1337
+ assert_equal 404, @response.response_code
1338
+ assert_equal "Eat Dirt", @response.message
1339
+ assert_response :not_found
1340
+ end
1341
+
1342
+ def test_head_with_status_code_first
1343
+ get :head_with_status_code_first
1344
+ assert_equal 403, @response.response_code
1345
+ assert_equal "Forbidden", @response.message
1346
+ assert_equal "something", @response.headers["X-Custom-Header"]
1347
+ assert_response :forbidden
1348
+ end
1349
+
1350
+ def test_rendering_with_location_should_set_header
1351
+ get :render_with_location
1352
+ assert_equal "http://example.com", @response.headers["Location"]
1353
+ end
1354
+
1355
+ def test_rendering_xml_should_call_to_xml_if_possible
1356
+ get :render_with_to_xml
1357
+ assert_equal "<i-am-xml/>", @response.body
1358
+ end
1359
+
1360
+ def test_rendering_with_object_location_should_set_header_with_url_for
1361
+ ActionController::Routing::Routes.draw do |map|
1362
+ map.resources :customers
1363
+ map.connect ':controller/:action/:id'
1364
+ end
1365
+
1366
+ get :render_with_object_location
1367
+ assert_equal "http://www.nextangle.com/customers/1", @response.headers["Location"]
1368
+ end
1369
+
1370
+ def test_should_use_implicit_content_type
1371
+ get :implicit_content_type, :format => 'atom'
1372
+ assert_equal Mime::ATOM, @response.content_type
1373
+ end
1374
+
1375
+ def test_using_layout_around_block
1376
+ get :render_using_layout_around_block
1377
+ assert_equal "Before (David)\nInside from block\nAfter", @response.body
1378
+ end
1379
+
1380
+ def test_using_layout_around_block_in_main_layout_and_within_content_for_layout
1381
+ get :render_using_layout_around_block_in_main_layout_and_within_content_for_layout
1382
+ assert_equal "Before (Anthony)\nInside from first block in layout\nAfter\nBefore (David)\nInside from block\nAfter\nBefore (Ramm)\nInside from second block in layout\nAfter\n", @response.body
1383
+ end
1384
+
1385
+ def test_using_layout_around_block_with_args
1386
+ get :render_using_layout_around_block_with_args
1387
+ assert_equal "Before\narg1arg2\nAfter", @response.body
1388
+ end
1389
+
1390
+ def test_partial_only
1391
+ get :partial_only
1392
+ assert_equal "only partial", @response.body
1393
+ end
1394
+
1395
+ def test_should_render_html_formatted_partial
1396
+ get :partial
1397
+ assert_equal 'partial html', @response.body
1398
+ end
1399
+
1400
+ def test_should_render_html_partial_with_dot
1401
+ get :partial_dot_html
1402
+ assert_equal 'partial html', @response.body
1403
+ end
1404
+
1405
+ def test_should_render_html_formatted_partial_with_rjs
1406
+ xhr :get, :partial_as_rjs
1407
+ assert_equal %(Element.replace("foo", "partial html");), @response.body
1408
+ end
1409
+
1410
+ def test_should_render_html_formatted_partial_with_rjs_and_js_format
1411
+ xhr :get, :respond_to_partial_as_rjs
1412
+ assert_equal %(Element.replace("foo", "partial html");), @response.body
1413
+ end
1414
+
1415
+ def test_should_render_js_partial
1416
+ xhr :get, :partial, :format => 'js'
1417
+ assert_equal 'partial js', @response.body
1418
+ end
1419
+
1420
+ def test_should_render_with_alternate_default_render
1421
+ xhr :get, :render_alternate_default
1422
+ assert_equal %(Element.replace("foo", "partial html");), @response.body
1423
+ end
1424
+
1425
+ def test_partial_only_with_layout
1426
+ get :partial_only_with_layout
1427
+ assert_equal "<html>only partial</html>", @response.body
1428
+ end
1429
+
1430
+ def test_render_to_string_partial
1431
+ get :render_to_string_with_partial
1432
+ assert_equal "only partial", assigns(:partial_only)
1433
+ assert_equal "Hello: david", assigns(:partial_with_locals)
1434
+ end
1435
+
1436
+ def test_partial_with_counter
1437
+ get :partial_with_counter
1438
+ assert_equal "5", @response.body
1439
+ end
1440
+
1441
+ def test_partial_with_locals
1442
+ get :partial_with_locals
1443
+ assert_equal "Hello: david", @response.body
1444
+ end
1445
+
1446
+ def test_partial_with_form_builder
1447
+ get :partial_with_form_builder
1448
+ assert_match(/<label/, @response.body)
1449
+ assert_template('test/_form')
1450
+ end
1451
+
1452
+ def test_partial_with_form_builder_subclass
1453
+ get :partial_with_form_builder_subclass
1454
+ assert_match(/<label/, @response.body)
1455
+ assert_template('test/_labelling_form')
1456
+ end
1457
+
1458
+ def test_partial_collection
1459
+ get :partial_collection
1460
+ assert_equal "Hello: davidHello: mary", @response.body
1461
+ end
1462
+
1463
+ def test_partial_collection_with_as
1464
+ get :partial_collection_with_as
1465
+ assert_equal "david david davidmary mary mary", @response.body
1466
+ end
1467
+
1468
+ def test_partial_collection_with_counter
1469
+ get :partial_collection_with_counter
1470
+ assert_equal "david0mary1", @response.body
1471
+ end
1472
+
1473
+ def test_partial_collection_with_locals
1474
+ get :partial_collection_with_locals
1475
+ assert_equal "Bonjour: davidBonjour: mary", @response.body
1476
+ end
1477
+
1478
+ def test_partial_collection_with_spacer
1479
+ get :partial_collection_with_spacer
1480
+ assert_equal "Hello: davidonly partialHello: mary", @response.body
1481
+ assert_template :partial => 'test/_partial_only'
1482
+ assert_template :partial => '_customer'
1483
+ end
1484
+
1485
+ def test_partial_collection_shorthand_with_locals
1486
+ get :partial_collection_shorthand_with_locals
1487
+ assert_equal "Bonjour: davidBonjour: mary", @response.body
1488
+ assert_template :partial => 'customers/_customer', :count => 2
1489
+ assert_template :partial => '_completely_fake_and_made_up_template_that_cannot_possibly_be_rendered', :count => 0
1490
+ end
1491
+
1492
+ def test_partial_collection_shorthand_with_different_types_of_records
1493
+ get :partial_collection_shorthand_with_different_types_of_records
1494
+ assert_equal "Bonjour bad customer: mark0Bonjour good customer: craig1Bonjour bad customer: john2Bonjour good customer: zach3Bonjour good customer: brandon4Bonjour bad customer: dan5", @response.body
1495
+ assert_template :partial => 'good_customers/_good_customer', :count => 3
1496
+ assert_template :partial => 'bad_customers/_bad_customer', :count => 3
1497
+ end
1498
+
1499
+ def test_empty_partial_collection
1500
+ get :empty_partial_collection
1501
+ assert_equal " ", @response.body
1502
+ assert_template :partial => false
1503
+ end
1504
+
1505
+ def test_partial_with_hash_object
1506
+ get :partial_with_hash_object
1507
+ assert_equal "Sam\nmaS\n", @response.body
1508
+ end
1509
+
1510
+ def test_partial_with_nested_object
1511
+ get :partial_with_nested_object
1512
+ assert_equal "first", @response.body
1513
+ end
1514
+
1515
+ def test_partial_with_nested_object_shorthand
1516
+ get :partial_with_nested_object_shorthand
1517
+ assert_equal "first", @response.body
1518
+ end
1519
+
1520
+ def test_hash_partial_collection
1521
+ get :partial_hash_collection
1522
+ assert_equal "Pratik\nkitarP\nAmy\nymA\n", @response.body
1523
+ end
1524
+
1525
+ def test_partial_hash_collection_with_locals
1526
+ get :partial_hash_collection_with_locals
1527
+ assert_equal "Hola: PratikHola: Amy", @response.body
1528
+ end
1529
+
1530
+ def test_partial_with_implicit_local_assignment
1531
+ assert_deprecated do
1532
+ get :partial_with_implicit_local_assignment
1533
+ assert_equal "Hello: Marcel", @response.body
1534
+ end
1535
+ end
1536
+
1537
+ def test_render_missing_partial_template
1538
+ assert_raise(ActionView::MissingTemplate) do
1539
+ get :missing_partial
1540
+ end
1541
+ end
1542
+
1543
+ def test_render_call_to_partial_with_layout
1544
+ get :render_call_to_partial_with_layout
1545
+ assert_equal "Before (David)\nInside from partial (David)\nAfter", @response.body
1546
+ end
1547
+
1548
+ def test_render_call_to_partial_with_layout_in_main_layout_and_within_content_for_layout
1549
+ get :render_call_to_partial_with_layout_in_main_layout_and_within_content_for_layout
1550
+ assert_equal "Before (Anthony)\nInside from partial (Anthony)\nAfter\nBefore (David)\nInside from partial (David)\nAfter\nBefore (Ramm)\nInside from partial (Ramm)\nAfter", @response.body
1551
+ end
1552
+ end
1553
+
1554
+ class ExpiresInRenderTest < ActionController::TestCase
1555
+ tests TestController
1556
+
1557
+ def setup
1558
+ @request.host = "www.nextangle.com"
1559
+ end
1560
+
1561
+ def test_expires_in_header
1562
+ get :conditional_hello_with_expires_in
1563
+ assert_equal "max-age=60, private", @response.headers["Cache-Control"]
1564
+ end
1565
+
1566
+ def test_expires_in_header_with_public
1567
+ get :conditional_hello_with_expires_in_with_public
1568
+ assert_equal "max-age=60, public", @response.headers["Cache-Control"]
1569
+ end
1570
+
1571
+ def test_expires_in_header_with_additional_headers
1572
+ get :conditional_hello_with_expires_in_with_public_with_more_keys
1573
+ assert_equal "max-age=60, public, max-stale=18000", @response.headers["Cache-Control"]
1574
+ end
1575
+
1576
+ def test_expires_in_old_syntax
1577
+ get :conditional_hello_with_expires_in_with_public_with_more_keys_old_syntax
1578
+ assert_equal "max-age=60, public, max-stale=18000", @response.headers["Cache-Control"]
1579
+ end
1580
+ end
1581
+
1582
+
1583
+ class EtagRenderTest < ActionController::TestCase
1584
+ tests TestController
1585
+
1586
+ def setup
1587
+ @request.host = "www.nextangle.com"
1588
+ @expected_bang_etag = etag_for(expand_key([:foo, 123]))
1589
+ end
1590
+
1591
+ def test_render_blank_body_shouldnt_set_etag
1592
+ get :blank_response
1593
+ assert !@response.etag?
1594
+ end
1595
+
1596
+ def test_render_200_should_set_etag
1597
+ get :render_hello_world_from_variable
1598
+ assert_equal etag_for("hello david"), @response.headers['ETag']
1599
+ assert_equal "private, max-age=0, must-revalidate", @response.headers['Cache-Control']
1600
+ end
1601
+
1602
+ def test_render_against_etag_request_should_304_when_match
1603
+ @request.if_none_match = etag_for("hello david")
1604
+ get :render_hello_world_from_variable
1605
+ assert_equal "304 Not Modified", @response.status
1606
+ assert @response.body.empty?
1607
+ end
1608
+
1609
+ def test_render_against_etag_request_should_have_no_content_length_when_match
1610
+ @request.if_none_match = etag_for("hello david")
1611
+ get :render_hello_world_from_variable
1612
+ assert !@response.headers.has_key?("Content-Length"), @response.headers['Content-Length']
1613
+ end
1614
+
1615
+ def test_render_against_etag_request_should_200_when_no_match
1616
+ @request.if_none_match = etag_for("hello somewhere else")
1617
+ get :render_hello_world_from_variable
1618
+ assert_equal "200 OK", @response.status
1619
+ assert !@response.body.empty?
1620
+ end
1621
+
1622
+ def test_render_should_not_set_etag_when_last_modified_has_been_specified
1623
+ get :render_hello_world_with_last_modified_set
1624
+ assert_equal "200 OK", @response.status
1625
+ assert_not_nil @response.last_modified
1626
+ assert_nil @response.etag
1627
+ assert @response.body.present?
1628
+ end
1629
+
1630
+ def test_render_with_etag
1631
+ get :render_hello_world_from_variable
1632
+ expected_etag = etag_for('hello david')
1633
+ assert_equal expected_etag, @response.headers['ETag']
1634
+ @response = ActionController::TestResponse.new
1635
+
1636
+ @request.if_none_match = expected_etag
1637
+ get :render_hello_world_from_variable
1638
+ assert_equal "304 Not Modified", @response.status
1639
+
1640
+ @request.if_none_match = "\"diftag\""
1641
+ get :render_hello_world_from_variable
1642
+ assert_equal "200 OK", @response.status
1643
+ end
1644
+
1645
+ def render_with_404_shouldnt_have_etag
1646
+ get :render_custom_code
1647
+ assert_nil @response.headers['ETag']
1648
+ end
1649
+
1650
+ def test_etag_should_not_be_changed_when_already_set
1651
+ get :render_hello_world_with_etag_set
1652
+ assert_equal etag_for("hello_world"), @response.headers['ETag']
1653
+ end
1654
+
1655
+ def test_etag_should_govern_renders_with_layouts_too
1656
+ get :builder_layout_test
1657
+ assert_equal "<wrapper>\n<html>\n <p>Hello </p>\n<p>This is grand!</p>\n</html>\n</wrapper>\n", @response.body
1658
+ assert_equal etag_for("<wrapper>\n<html>\n <p>Hello </p>\n<p>This is grand!</p>\n</html>\n</wrapper>\n"), @response.headers['ETag']
1659
+ end
1660
+
1661
+ def test_etag_with_bang_should_set_etag
1662
+ get :conditional_hello_with_bangs
1663
+ assert_equal @expected_bang_etag, @response.headers["ETag"]
1664
+ assert_response :success
1665
+ end
1666
+
1667
+ def test_etag_with_bang_should_obey_if_none_match
1668
+ @request.if_none_match = @expected_bang_etag
1669
+ get :conditional_hello_with_bangs
1670
+ assert_response :not_modified
1671
+ end
1672
+
1673
+ def test_etag_with_public_true_should_set_header
1674
+ get :conditional_hello_with_public_header
1675
+ assert_equal "public", @response.headers['Cache-Control']
1676
+ end
1677
+
1678
+ def test_etag_with_public_true_should_set_header_and_retain_other_headers
1679
+ get :conditional_hello_with_public_header_and_expires_at
1680
+ assert_equal "max-age=60, public", @response.headers['Cache-Control']
1681
+ end
1682
+
1683
+ protected
1684
+ def etag_for(text)
1685
+ %("#{Digest::MD5.hexdigest(text)}")
1686
+ end
1687
+
1688
+ def expand_key(args)
1689
+ ActiveSupport::Cache.expand_cache_key(args)
1690
+ end
1691
+ end
1692
+
1693
+ class LastModifiedRenderTest < ActionController::TestCase
1694
+ tests TestController
1695
+
1696
+ def setup
1697
+ @request.host = "www.nextangle.com"
1698
+ @last_modified = Time.now.utc.beginning_of_day.httpdate
1699
+ end
1700
+
1701
+ def test_responds_with_last_modified
1702
+ get :conditional_hello
1703
+ assert_equal @last_modified, @response.headers['Last-Modified']
1704
+ end
1705
+
1706
+ def test_request_not_modified
1707
+ @request.if_modified_since = @last_modified
1708
+ get :conditional_hello
1709
+ assert_equal "304 Not Modified", @response.status
1710
+ assert @response.body.blank?, @response.body
1711
+ assert_equal @last_modified, @response.headers['Last-Modified']
1712
+ end
1713
+
1714
+ def test_request_not_modified_but_etag_differs
1715
+ @request.if_modified_since = @last_modified
1716
+ @request.if_none_match = "234"
1717
+ get :conditional_hello
1718
+ assert_response :success
1719
+ end
1720
+
1721
+ def test_request_modified
1722
+ @request.if_modified_since = 'Thu, 16 Jul 2008 00:00:00 GMT'
1723
+ get :conditional_hello
1724
+ assert_equal "200 OK", @response.status
1725
+ assert !@response.body.blank?
1726
+ assert_equal @last_modified, @response.headers['Last-Modified']
1727
+ end
1728
+
1729
+ def test_request_with_bang_gets_last_modified
1730
+ get :conditional_hello_with_bangs
1731
+ assert_equal @last_modified, @response.headers['Last-Modified']
1732
+ assert_response :success
1733
+ end
1734
+
1735
+ def test_request_with_bang_obeys_last_modified
1736
+ @request.if_modified_since = @last_modified
1737
+ get :conditional_hello_with_bangs
1738
+ assert_response :not_modified
1739
+ end
1740
+
1741
+ def test_last_modified_works_with_less_than_too
1742
+ @request.if_modified_since = 5.years.ago.httpdate
1743
+ get :conditional_hello_with_bangs
1744
+ assert_response :success
1745
+ end
1746
+ end
1747
+
1748
+ class RenderingLoggingTest < ActionController::TestCase
1749
+ tests TestController
1750
+
1751
+ def setup
1752
+ @request.host = "www.nextangle.com"
1753
+ end
1754
+
1755
+ def test_logger_prints_layout_and_template_rendering_info
1756
+ @controller.logger = MockLogger.new
1757
+ get :layout_test
1758
+ logged = @controller.logger.logged.find_all {|l| l =~ /render/i }
1759
+ assert_equal "Rendering template within layouts/standard", logged[0]
1760
+ assert_equal "Rendering test/hello_world", logged[1]
1761
+ end
1762
+ end