actionpack-2.3.17-rack-upgrade 2.3.17

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