actionpack 2.1.2 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (200) hide show
  1. data/CHANGELOG +223 -7
  2. data/README +6 -12
  3. data/Rakefile +11 -11
  4. data/lib/action_controller.rb +9 -9
  5. data/lib/action_controller/assertions/response_assertions.rb +29 -78
  6. data/lib/action_controller/assertions/routing_assertions.rb +33 -33
  7. data/lib/action_controller/assertions/selector_assertions.rb +9 -5
  8. data/lib/action_controller/base.rb +227 -161
  9. data/lib/action_controller/benchmarking.rb +37 -24
  10. data/lib/action_controller/caching/actions.rb +53 -21
  11. data/lib/action_controller/caching/fragments.rb +10 -36
  12. data/lib/action_controller/caching/sweeping.rb +3 -3
  13. data/lib/action_controller/cgi_ext/session.rb +2 -22
  14. data/lib/action_controller/cgi_process.rb +8 -46
  15. data/lib/action_controller/components.rb +4 -1
  16. data/lib/action_controller/cookies.rb +10 -0
  17. data/lib/action_controller/dispatcher.rb +49 -15
  18. data/lib/action_controller/filters.rb +48 -10
  19. data/lib/action_controller/headers.rb +16 -14
  20. data/lib/action_controller/helpers.rb +2 -2
  21. data/lib/action_controller/http_authentication.rb +1 -1
  22. data/lib/action_controller/integration.rb +57 -60
  23. data/lib/action_controller/layout.rb +27 -53
  24. data/lib/action_controller/mime_responds.rb +5 -1
  25. data/lib/action_controller/mime_type.rb +64 -42
  26. data/lib/action_controller/mime_types.rb +2 -1
  27. data/lib/action_controller/performance_test.rb +16 -0
  28. data/lib/action_controller/polymorphic_routes.rb +16 -9
  29. data/lib/action_controller/rack_process.rb +303 -0
  30. data/lib/action_controller/request.rb +205 -97
  31. data/lib/action_controller/request_forgery_protection.rb +2 -2
  32. data/lib/action_controller/request_profiler.rb +0 -0
  33. data/lib/action_controller/rescue.rb +20 -115
  34. data/lib/action_controller/resources.rb +186 -83
  35. data/lib/action_controller/response.rb +140 -26
  36. data/lib/action_controller/routing.rb +28 -30
  37. data/lib/action_controller/routing/builder.rb +45 -54
  38. data/lib/action_controller/routing/optimisations.rb +31 -21
  39. data/lib/action_controller/routing/recognition_optimisation.rb +33 -27
  40. data/lib/action_controller/routing/route.rb +162 -147
  41. data/lib/action_controller/routing/route_set.rb +8 -7
  42. data/lib/action_controller/routing/routing_ext.rb +4 -1
  43. data/lib/action_controller/routing/segments.rb +50 -21
  44. data/lib/action_controller/session/cookie_store.rb +3 -2
  45. data/lib/action_controller/session/drb_server.rb +7 -7
  46. data/lib/action_controller/session_management.rb +6 -2
  47. data/lib/action_controller/streaming.rb +15 -8
  48. data/lib/action_controller/templates/rescues/diagnostics.erb +2 -2
  49. data/lib/action_controller/templates/rescues/template_error.erb +2 -2
  50. data/lib/action_controller/test_case.rb +66 -2
  51. data/lib/action_controller/test_process.rb +71 -66
  52. data/lib/action_controller/translation.rb +13 -0
  53. data/lib/action_controller/url_rewriter.rb +90 -13
  54. data/lib/action_controller/vendor/html-scanner/html/node.rb +9 -2
  55. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +1 -1
  56. data/lib/action_controller/vendor/html-scanner/html/selector.rb +2 -2
  57. data/lib/action_controller/verification.rb +2 -2
  58. data/lib/action_pack/version.rb +1 -1
  59. data/lib/action_view.rb +19 -11
  60. data/lib/action_view/base.rb +184 -150
  61. data/lib/action_view/helpers.rb +38 -0
  62. data/lib/action_view/helpers/active_record_helper.rb +56 -27
  63. data/lib/action_view/helpers/asset_tag_helper.rb +356 -153
  64. data/lib/action_view/helpers/atom_feed_helper.rb +74 -19
  65. data/lib/action_view/helpers/benchmark_helper.rb +3 -3
  66. data/lib/action_view/helpers/cache_helper.rb +1 -2
  67. data/lib/action_view/helpers/capture_helper.rb +19 -44
  68. data/lib/action_view/helpers/date_helper.rb +486 -296
  69. data/lib/action_view/helpers/debug_helper.rb +20 -13
  70. data/lib/action_view/helpers/form_helper.rb +71 -30
  71. data/lib/action_view/helpers/form_options_helper.rb +15 -85
  72. data/lib/action_view/helpers/form_tag_helper.rb +61 -38
  73. data/lib/action_view/helpers/javascript_helper.rb +80 -89
  74. data/lib/action_view/helpers/number_helper.rb +179 -74
  75. data/lib/action_view/helpers/prototype_helper.rb +216 -201
  76. data/lib/action_view/helpers/record_tag_helper.rb +4 -5
  77. data/lib/action_view/helpers/sanitize_helper.rb +65 -33
  78. data/lib/action_view/helpers/scriptaculous_helper.rb +2 -2
  79. data/lib/action_view/helpers/tag_helper.rb +39 -22
  80. data/lib/action_view/helpers/text_helper.rb +212 -118
  81. data/lib/action_view/helpers/translation_helper.rb +21 -0
  82. data/lib/action_view/helpers/url_helper.rb +100 -58
  83. data/lib/action_view/inline_template.rb +13 -14
  84. data/lib/action_view/locale/en.yml +91 -0
  85. data/lib/action_view/partials.rb +100 -55
  86. data/lib/action_view/paths.rb +125 -0
  87. data/lib/action_view/renderable.rb +102 -0
  88. data/lib/action_view/renderable_partial.rb +48 -0
  89. data/lib/action_view/template.rb +90 -101
  90. data/lib/action_view/template_error.rb +11 -21
  91. data/lib/action_view/template_handler.rb +8 -28
  92. data/lib/action_view/template_handlers.rb +45 -0
  93. data/lib/action_view/template_handlers/builder.rb +5 -15
  94. data/lib/action_view/template_handlers/erb.rb +9 -6
  95. data/lib/action_view/template_handlers/rjs.rb +2 -17
  96. data/lib/action_view/test_case.rb +7 -4
  97. data/test/abstract_unit.rb +4 -1
  98. data/test/active_record_unit.rb +28 -30
  99. data/test/activerecord/render_partial_with_record_identification_test.rb +25 -12
  100. data/test/controller/action_pack_assertions_test.rb +8 -37
  101. data/test/controller/addresses_render_test.rb +0 -3
  102. data/test/controller/assert_select_test.rb +51 -24
  103. data/test/controller/base_test.rb +4 -4
  104. data/test/controller/caching_test.rb +136 -66
  105. data/test/controller/capture_test.rb +1 -21
  106. data/test/controller/cgi_test.rb +157 -10
  107. data/test/controller/components_test.rb +41 -25
  108. data/test/controller/content_type_test.rb +49 -17
  109. data/test/controller/cookie_test.rb +1 -1
  110. data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -3
  111. data/test/controller/dispatcher_test.rb +9 -1
  112. data/test/controller/filter_params_test.rb +2 -2
  113. data/test/controller/filters_test.rb +13 -13
  114. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  115. data/test/controller/html-scanner/node_test.rb +21 -0
  116. data/test/controller/html-scanner/sanitizer_test.rb +14 -0
  117. data/test/controller/integration_test.rb +167 -6
  118. data/test/controller/layout_test.rb +11 -68
  119. data/test/controller/logging_test.rb +46 -0
  120. data/test/controller/mime_responds_test.rb +61 -59
  121. data/test/controller/mime_type_test.rb +6 -6
  122. data/test/controller/polymorphic_routes_test.rb +37 -2
  123. data/test/controller/rack_test.rb +323 -0
  124. data/test/controller/redirect_test.rb +72 -71
  125. data/test/controller/render_test.rb +1120 -108
  126. data/test/controller/request_forgery_protection_test.rb +66 -52
  127. data/test/controller/request_test.rb +103 -146
  128. data/test/controller/rescue_test.rb +20 -24
  129. data/test/controller/resources_test.rb +408 -25
  130. data/test/controller/routing_test.rb +1774 -1774
  131. data/test/controller/send_file_test.rb +0 -4
  132. data/test/controller/session/cookie_store_test.rb +53 -1
  133. data/test/controller/test_test.rb +15 -37
  134. data/test/controller/translation_test.rb +26 -0
  135. data/test/controller/url_rewriter_test.rb +27 -28
  136. data/test/controller/view_paths_test.rb +48 -47
  137. data/test/fixtures/_top_level_partial.html.erb +1 -0
  138. data/test/fixtures/_top_level_partial_only.erb +1 -0
  139. data/test/fixtures/developers/_developer.erb +1 -0
  140. data/test/fixtures/fun/games/_game.erb +1 -0
  141. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  142. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  143. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  144. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  145. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  146. data/test/fixtures/layouts/_column.html.erb +2 -0
  147. data/test/fixtures/projects/_project.erb +1 -0
  148. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  149. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  150. data/test/fixtures/replies/_reply.erb +1 -0
  151. data/test/fixtures/test/_counter.html.erb +1 -0
  152. data/test/fixtures/test/_customer.erb +1 -1
  153. data/test/fixtures/test/_customer_with_var.erb +1 -0
  154. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  155. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  156. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  157. data/test/fixtures/test/hello.builder +1 -1
  158. data/test/fixtures/test/hyphen-ated.erb +1 -0
  159. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  160. data/test/fixtures/test/nested_layout.erb +3 -0
  161. data/test/fixtures/test/non_erb_block_content_for.builder +1 -1
  162. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  163. data/test/fixtures/test/template.erb +1 -0
  164. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  165. data/test/template/active_record_helper_i18n_test.rb +46 -0
  166. data/test/template/active_record_helper_test.rb +24 -24
  167. data/test/template/asset_tag_helper_test.rb +161 -29
  168. data/test/template/atom_feed_helper_test.rb +114 -5
  169. data/test/template/compiled_templates_test.rb +59 -0
  170. data/test/template/date_helper_i18n_test.rb +113 -0
  171. data/test/template/date_helper_test.rb +403 -109
  172. data/test/template/form_helper_test.rb +213 -154
  173. data/test/template/form_options_helper_test.rb +249 -897
  174. data/test/template/form_tag_helper_test.rb +80 -32
  175. data/test/template/javascript_helper_test.rb +17 -18
  176. data/test/template/number_helper_i18n_test.rb +54 -0
  177. data/test/template/number_helper_test.rb +43 -13
  178. data/test/template/prototype_helper_test.rb +101 -84
  179. data/test/template/record_tag_helper_test.rb +24 -20
  180. data/test/template/render_test.rb +193 -0
  181. data/test/template/sanitize_helper_test.rb +3 -3
  182. data/test/template/tag_helper_test.rb +34 -14
  183. data/test/template/text_helper_test.rb +83 -9
  184. data/test/template/translation_helper_test.rb +28 -0
  185. data/test/template/url_helper_test.rb +55 -18
  186. metadata +57 -18
  187. data/lib/action_view/helpers/javascripts/controls.js +0 -963
  188. data/lib/action_view/helpers/javascripts/dragdrop.js +0 -972
  189. data/lib/action_view/helpers/javascripts/effects.js +0 -1120
  190. data/lib/action_view/helpers/javascripts/prototype.js +0 -4225
  191. data/lib/action_view/partial_template.rb +0 -70
  192. data/lib/action_view/template_finder.rb +0 -177
  193. data/lib/action_view/template_handlers/compilable.rb +0 -128
  194. data/test/controller/custom_handler_test.rb +0 -45
  195. data/test/controller/new_render_test.rb +0 -945
  196. data/test/fixtures/test/block_content_for.erb +0 -2
  197. data/test/fixtures/test/erb_content_for.erb +0 -2
  198. data/test/template/deprecated_erb_variable_test.rb +0 -9
  199. data/test/template/template_finder_test.rb +0 -73
  200. data/test/template/template_object_test.rb +0 -95
@@ -30,7 +30,6 @@ class AssetTagHelperTest < ActionView::TestCase
30
30
  end.new
31
31
 
32
32
  @request = Class.new do
33
- def relative_url_root() "" end
34
33
  def protocol() 'http://' end
35
34
  def ssl?() false end
36
35
  def host_with_port() 'localhost' end
@@ -39,8 +38,8 @@ class AssetTagHelperTest < ActionView::TestCase
39
38
  @controller.request = @request
40
39
 
41
40
  ActionView::Helpers::AssetTagHelper::reset_javascript_include_default
42
-
43
- ActionView::Base.computed_public_paths.clear
41
+ AssetTag::Cache.clear
42
+ AssetCollection::Cache.clear
44
43
  end
45
44
 
46
45
  def teardown
@@ -83,6 +82,7 @@ class AssetTagHelperTest < ActionView::TestCase
83
82
  %(javascript_include_tag("common.javascript", "/elsewhere/cools")) => %(<script src="/javascripts/common.javascript" type="text/javascript"></script>\n<script src="/elsewhere/cools.js" type="text/javascript"></script>),
84
83
  %(javascript_include_tag(:defaults)) => %(<script src="/javascripts/prototype.js" type="text/javascript"></script>\n<script src="/javascripts/effects.js" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js" type="text/javascript"></script>\n<script src="/javascripts/controls.js" type="text/javascript"></script>\n<script src="/javascripts/application.js" type="text/javascript"></script>),
85
84
  %(javascript_include_tag(:all)) => %(<script src="/javascripts/prototype.js" type="text/javascript"></script>\n<script src="/javascripts/effects.js" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js" type="text/javascript"></script>\n<script src="/javascripts/controls.js" type="text/javascript"></script>\n<script src="/javascripts/application.js" type="text/javascript"></script>\n<script src="/javascripts/bank.js" type="text/javascript"></script>\n<script src="/javascripts/robber.js" type="text/javascript"></script>\n<script src="/javascripts/version.1.0.js" type="text/javascript"></script>),
85
+ %(javascript_include_tag(:all, :recursive => true)) => %(<script src="/javascripts/prototype.js" type="text/javascript"></script>\n<script src="/javascripts/effects.js" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js" type="text/javascript"></script>\n<script src="/javascripts/controls.js" type="text/javascript"></script>\n<script src="/javascripts/application.js" type="text/javascript"></script>\n<script src="/javascripts/bank.js" type="text/javascript"></script>\n<script src="/javascripts/robber.js" type="text/javascript"></script>\n<script src="/javascripts/subdir/subdir.js" type="text/javascript"></script>\n<script src="/javascripts/version.1.0.js" type="text/javascript"></script>),
86
86
  %(javascript_include_tag(:defaults, "test")) => %(<script src="/javascripts/prototype.js" type="text/javascript"></script>\n<script src="/javascripts/effects.js" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js" type="text/javascript"></script>\n<script src="/javascripts/controls.js" type="text/javascript"></script>\n<script src="/javascripts/test.js" type="text/javascript"></script>\n<script src="/javascripts/application.js" type="text/javascript"></script>),
87
87
  %(javascript_include_tag("test", :defaults)) => %(<script src="/javascripts/test.js" type="text/javascript"></script>\n<script src="/javascripts/prototype.js" type="text/javascript"></script>\n<script src="/javascripts/effects.js" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js" type="text/javascript"></script>\n<script src="/javascripts/controls.js" type="text/javascript"></script>\n<script src="/javascripts/application.js" type="text/javascript"></script>)
88
88
  }
@@ -108,6 +108,7 @@ class AssetTagHelperTest < ActionView::TestCase
108
108
  %(stylesheet_link_tag("dir/file")) => %(<link href="/stylesheets/dir/file.css" media="screen" rel="stylesheet" type="text/css" />),
109
109
  %(stylesheet_link_tag("style", :media => "all")) => %(<link href="/stylesheets/style.css" media="all" rel="stylesheet" type="text/css" />),
110
110
  %(stylesheet_link_tag(:all)) => %(<link href="/stylesheets/bank.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/robber.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/version.1.0.css" media="screen" rel="stylesheet" type="text/css" />),
111
+ %(stylesheet_link_tag(:all, :recursive => true)) => %(<link href="/stylesheets/bank.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/robber.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/subdir/subdir.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/version.1.0.css" media="screen" rel="stylesheet" type="text/css" />),
111
112
  %(stylesheet_link_tag(:all, :media => "all")) => %(<link href="/stylesheets/bank.css" media="all" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/robber.css" media="all" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/version.1.0.css" media="all" rel="stylesheet" type="text/css" />),
112
113
  %(stylesheet_link_tag("random.styles", "/css/stylish")) => %(<link href="/stylesheets/random.styles" media="screen" rel="stylesheet" type="text/css" />\n<link href="/css/stylish.css" media="screen" rel="stylesheet" type="text/css" />),
113
114
  %(stylesheet_link_tag("http://www.example.com/styles/style")) => %(<link href="http://www.example.com/styles/style.css" media="screen" rel="stylesheet" type="text/css" />)
@@ -117,7 +118,7 @@ class AssetTagHelperTest < ActionView::TestCase
117
118
  %(image_path("xml")) => %(/images/xml),
118
119
  %(image_path("xml.png")) => %(/images/xml.png),
119
120
  %(image_path("dir/xml.png")) => %(/images/dir/xml.png),
120
- %(image_path("/dir/xml.png")) => %(/dir/xml.png)
121
+ %(image_path("/dir/xml.png")) => %(/dir/xml.png)
121
122
  }
122
123
 
123
124
  PathToImageToTag = {
@@ -155,12 +156,12 @@ class AssetTagHelperTest < ActionView::TestCase
155
156
  PathToJavascriptToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
156
157
  end
157
158
 
158
- def test_javascript_include_tag
159
+ def test_javascript_include_tag_with_blank_asset_id
159
160
  ENV["RAILS_ASSET_ID"] = ""
160
161
  JavascriptIncludeToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
162
+ end
161
163
 
162
- ActionView::Base.computed_public_paths.clear
163
-
164
+ def test_javascript_include_tag_with_given_asset_id
164
165
  ENV["RAILS_ASSET_ID"] = "1"
165
166
  assert_dom_equal(%(<script src="/javascripts/prototype.js?1" type="text/javascript"></script>\n<script src="/javascripts/effects.js?1" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js?1" type="text/javascript"></script>\n<script src="/javascripts/controls.js?1" type="text/javascript"></script>\n<script src="/javascripts/application.js?1" type="text/javascript"></script>), javascript_include_tag(:defaults))
166
167
  end
@@ -169,10 +170,15 @@ class AssetTagHelperTest < ActionView::TestCase
169
170
  ENV["RAILS_ASSET_ID"] = ""
170
171
  ActionView::Helpers::AssetTagHelper::register_javascript_include_default 'slider'
171
172
  assert_dom_equal %(<script src="/javascripts/prototype.js" type="text/javascript"></script>\n<script src="/javascripts/effects.js" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js" type="text/javascript"></script>\n<script src="/javascripts/controls.js" type="text/javascript"></script>\n<script src="/javascripts/slider.js" type="text/javascript"></script>\n<script src="/javascripts/application.js" type="text/javascript"></script>), javascript_include_tag(:defaults)
173
+ end
174
+
175
+ def test_register_javascript_include_default_mixed_defaults
176
+ ENV["RAILS_ASSET_ID"] = ""
177
+ ActionView::Helpers::AssetTagHelper::register_javascript_include_default 'slider'
172
178
  ActionView::Helpers::AssetTagHelper::register_javascript_include_default 'lib1', '/elsewhere/blub/lib2'
173
179
  assert_dom_equal %(<script src="/javascripts/prototype.js" type="text/javascript"></script>\n<script src="/javascripts/effects.js" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js" type="text/javascript"></script>\n<script src="/javascripts/controls.js" type="text/javascript"></script>\n<script src="/javascripts/slider.js" type="text/javascript"></script>\n<script src="/javascripts/lib1.js" type="text/javascript"></script>\n<script src="/elsewhere/blub/lib2.js" type="text/javascript"></script>\n<script src="/javascripts/application.js" type="text/javascript"></script>), javascript_include_tag(:defaults)
174
180
  end
175
-
181
+
176
182
  def test_custom_javascript_expansions
177
183
  ActionView::Helpers::AssetTagHelper::register_javascript_expansion :monkey => ["head", "body", "tail"]
178
184
  assert_dom_equal %(<script src="/javascripts/first.js" type="text/javascript"></script>\n<script src="/javascripts/head.js" type="text/javascript"></script>\n<script src="/javascripts/body.js" type="text/javascript"></script>\n<script src="/javascripts/tail.js" type="text/javascript"></script>\n<script src="/javascripts/last.js" type="text/javascript"></script>), javascript_include_tag('first', :monkey, 'last')
@@ -215,7 +221,7 @@ class AssetTagHelperTest < ActionView::TestCase
215
221
  def test_image_path
216
222
  ImagePathToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
217
223
  end
218
-
224
+
219
225
  def test_path_to_image_alias_for_image_path
220
226
  PathToImageToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
221
227
  end
@@ -223,16 +229,41 @@ class AssetTagHelperTest < ActionView::TestCase
223
229
  def test_image_tag
224
230
  ImageLinkToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
225
231
  end
226
-
232
+
233
+ uses_mocha 'test image tag with windows behaviour' do
234
+ def test_image_tag_windows_behaviour
235
+ old_asset_id, ENV["RAILS_ASSET_ID"] = ENV["RAILS_ASSET_ID"], "1"
236
+ # This simulates the behaviour of File#exist? on windows when testing a file ending in "."
237
+ # If the file "rails.png" exists, windows will return true when asked if "rails.png." exists (notice trailing ".")
238
+ # OS X, linux etc will return false in this case.
239
+ File.stubs(:exist?).with('template/../fixtures/public/images/rails.png.').returns(true)
240
+ assert_equal '<img alt="Rails" src="/images/rails.png?1" />', image_tag('rails.png')
241
+ ensure
242
+ if old_asset_id
243
+ ENV["RAILS_ASSET_ID"] = old_asset_id
244
+ else
245
+ ENV.delete("RAILS_ASSET_ID")
246
+ end
247
+ end
248
+ end
249
+
227
250
  def test_timebased_asset_id
228
251
  expected_time = File.stat(File.expand_path(File.dirname(__FILE__) + "/../fixtures/public/images/rails.png")).mtime.to_i.to_s
229
252
  assert_equal %(<img alt="Rails" src="/images/rails.png?#{expected_time}" />), image_tag("rails.png")
230
253
  end
231
254
 
255
+ def test_timebased_asset_id_with_relative_url_root
256
+ ActionController::Base.relative_url_root = "/collaboration/hieraki"
257
+ expected_time = File.stat(File.expand_path(File.dirname(__FILE__) + "/../fixtures/public/images/rails.png")).mtime.to_i.to_s
258
+ assert_equal %(<img alt="Rails" src="#{ActionController::Base.relative_url_root}/images/rails.png?#{expected_time}" />), image_tag("rails.png")
259
+ ensure
260
+ ActionController::Base.relative_url_root = ""
261
+ end
262
+
232
263
  def test_should_skip_asset_id_on_complete_url
233
264
  assert_equal %(<img alt="Rails" src="http://www.example.com/rails.png" />), image_tag("http://www.example.com/rails.png")
234
265
  end
235
-
266
+
236
267
  def test_should_use_preset_asset_id
237
268
  ENV["RAILS_ASSET_ID"] = "4500"
238
269
  assert_equal %(<img alt="Rails" src="/images/rails.png?4500" />), image_tag("rails.png")
@@ -254,14 +285,14 @@ class AssetTagHelperTest < ActionView::TestCase
254
285
  ENV["RAILS_ASSET_ID"] = ""
255
286
  ActionController::Base.asset_host = 'http://a0.example.com'
256
287
  ActionController::Base.perform_caching = true
257
-
288
+
258
289
  assert_dom_equal(
259
290
  %(<script src="http://a0.example.com/javascripts/all.js" type="text/javascript"></script>),
260
291
  javascript_include_tag(:all, :cache => true)
261
292
  )
262
293
 
263
294
  assert File.exist?(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'all.js'))
264
-
295
+
265
296
  assert_dom_equal(
266
297
  %(<script src="http://a0.example.com/javascripts/money.js" type="text/javascript"></script>),
267
298
  javascript_include_tag(:all, :cache => "money")
@@ -333,8 +364,9 @@ class AssetTagHelperTest < ActionView::TestCase
333
364
  ActionController::Base.asset_host = 'http://a%d.example.com'
334
365
  ActionController::Base.perform_caching = true
335
366
 
367
+ hash = '/javascripts/cache/money.js'.hash % 4
336
368
  assert_dom_equal(
337
- %(<script src="http://a3.example.com/javascripts/cache/money.js" type="text/javascript"></script>),
369
+ %(<script src="http://a#{hash}.example.com/javascripts/cache/money.js" type="text/javascript"></script>),
338
370
  javascript_include_tag(:all, :cache => "cache/money")
339
371
  )
340
372
 
@@ -342,7 +374,28 @@ class AssetTagHelperTest < ActionView::TestCase
342
374
  ensure
343
375
  FileUtils.rm_f(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'cache', 'money.js'))
344
376
  end
345
-
377
+
378
+ def test_caching_javascript_include_tag_with_all_and_recursive_puts_defaults_at_the_start_of_the_file
379
+ ENV["RAILS_ASSET_ID"] = ""
380
+ ActionController::Base.asset_host = 'http://a0.example.com'
381
+ ActionController::Base.perform_caching = true
382
+
383
+ assert_dom_equal(
384
+ %(<script src="http://a0.example.com/javascripts/combined.js" type="text/javascript"></script>),
385
+ javascript_include_tag(:all, :cache => "combined", :recursive => true)
386
+ )
387
+
388
+ assert File.exist?(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'combined.js'))
389
+
390
+ assert_equal(
391
+ %(// prototype js\n\n// effects js\n\n// dragdrop js\n\n// controls js\n\n// application js\n\n// bank js\n\n// robber js\n\n// subdir js\n\n\n// version.1.0 js),
392
+ IO.read(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'combined.js'))
393
+ )
394
+
395
+ ensure
396
+ FileUtils.rm_f(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'combined.js'))
397
+ end
398
+
346
399
  def test_caching_javascript_include_tag_with_all_puts_defaults_at_the_start_of_the_file
347
400
  ENV["RAILS_ASSET_ID"] = ""
348
401
  ActionController::Base.asset_host = 'http://a0.example.com'
@@ -364,22 +417,57 @@ class AssetTagHelperTest < ActionView::TestCase
364
417
  FileUtils.rm_f(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'combined.js'))
365
418
  end
366
419
 
420
+ def test_caching_javascript_include_tag_with_relative_url_root
421
+ ENV["RAILS_ASSET_ID"] = ""
422
+ ActionController::Base.relative_url_root = "/collaboration/hieraki"
423
+ ActionController::Base.perform_caching = true
424
+
425
+ assert_dom_equal(
426
+ %(<script src="/collaboration/hieraki/javascripts/all.js" type="text/javascript"></script>),
427
+ javascript_include_tag(:all, :cache => true)
428
+ )
429
+
430
+ assert File.exist?(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'all.js'))
431
+
432
+ assert_dom_equal(
433
+ %(<script src="/collaboration/hieraki/javascripts/money.js" type="text/javascript"></script>),
434
+ javascript_include_tag(:all, :cache => "money")
435
+ )
436
+
437
+ assert File.exist?(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'money.js'))
438
+
439
+ ensure
440
+ ActionController::Base.relative_url_root = nil
441
+ FileUtils.rm_f(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'all.js'))
442
+ FileUtils.rm_f(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'money.js'))
443
+ end
444
+
367
445
  def test_caching_javascript_include_tag_when_caching_off
368
446
  ENV["RAILS_ASSET_ID"] = ""
369
447
  ActionController::Base.perform_caching = false
370
-
448
+
371
449
  assert_dom_equal(
372
450
  %(<script src="/javascripts/prototype.js" type="text/javascript"></script>\n<script src="/javascripts/effects.js" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js" type="text/javascript"></script>\n<script src="/javascripts/controls.js" type="text/javascript"></script>\n<script src="/javascripts/application.js" type="text/javascript"></script>\n<script src="/javascripts/bank.js" type="text/javascript"></script>\n<script src="/javascripts/robber.js" type="text/javascript"></script>\n<script src="/javascripts/version.1.0.js" type="text/javascript"></script>),
373
451
  javascript_include_tag(:all, :cache => true)
374
452
  )
375
453
 
454
+ assert_dom_equal(
455
+ %(<script src="/javascripts/prototype.js" type="text/javascript"></script>\n<script src="/javascripts/effects.js" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js" type="text/javascript"></script>\n<script src="/javascripts/controls.js" type="text/javascript"></script>\n<script src="/javascripts/application.js" type="text/javascript"></script>\n<script src="/javascripts/bank.js" type="text/javascript"></script>\n<script src="/javascripts/robber.js" type="text/javascript"></script>\n<script src="/javascripts/subdir/subdir.js" type="text/javascript"></script>\n<script src="/javascripts/version.1.0.js" type="text/javascript"></script>),
456
+ javascript_include_tag(:all, :cache => true, :recursive => true)
457
+ )
458
+
376
459
  assert !File.exist?(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'all.js'))
377
-
460
+
378
461
  assert_dom_equal(
379
462
  %(<script src="/javascripts/prototype.js" type="text/javascript"></script>\n<script src="/javascripts/effects.js" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js" type="text/javascript"></script>\n<script src="/javascripts/controls.js" type="text/javascript"></script>\n<script src="/javascripts/application.js" type="text/javascript"></script>\n<script src="/javascripts/bank.js" type="text/javascript"></script>\n<script src="/javascripts/robber.js" type="text/javascript"></script>\n<script src="/javascripts/version.1.0.js" type="text/javascript"></script>),
380
463
  javascript_include_tag(:all, :cache => "money")
381
464
  )
382
465
 
466
+ assert_dom_equal(
467
+ %(<script src="/javascripts/prototype.js" type="text/javascript"></script>\n<script src="/javascripts/effects.js" type="text/javascript"></script>\n<script src="/javascripts/dragdrop.js" type="text/javascript"></script>\n<script src="/javascripts/controls.js" type="text/javascript"></script>\n<script src="/javascripts/application.js" type="text/javascript"></script>\n<script src="/javascripts/bank.js" type="text/javascript"></script>\n<script src="/javascripts/robber.js" type="text/javascript"></script>\n<script src="/javascripts/subdir/subdir.js" type="text/javascript"></script>\n<script src="/javascripts/version.1.0.js" type="text/javascript"></script>),
468
+ javascript_include_tag(:all, :cache => "money", :recursive => true)
469
+ )
470
+
383
471
  assert !File.exist?(File.join(ActionView::Helpers::AssetTagHelper::JAVASCRIPTS_DIR, 'money.js'))
384
472
  end
385
473
 
@@ -387,13 +475,14 @@ class AssetTagHelperTest < ActionView::TestCase
387
475
  ENV["RAILS_ASSET_ID"] = ""
388
476
  ActionController::Base.asset_host = 'http://a0.example.com'
389
477
  ActionController::Base.perform_caching = true
390
-
478
+
391
479
  assert_dom_equal(
392
480
  %(<link href="http://a0.example.com/stylesheets/all.css" media="screen" rel="stylesheet" type="text/css" />),
393
481
  stylesheet_link_tag(:all, :cache => true)
394
482
  )
395
483
 
396
- assert File.exist?(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'all.css'))
484
+ expected = Dir["#{ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR}/*.css"].map { |p| File.mtime(p) }.max
485
+ assert_equal expected, File.mtime(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'all.css'))
397
486
 
398
487
  assert_dom_equal(
399
488
  %(<link href="http://a0.example.com/stylesheets/money.css" media="screen" rel="stylesheet" type="text/css" />),
@@ -423,22 +512,57 @@ class AssetTagHelperTest < ActionView::TestCase
423
512
  FileUtils.rm_f(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'styles.css'))
424
513
  end
425
514
 
515
+ def test_caching_stylesheet_link_tag_with_relative_url_root
516
+ ENV["RAILS_ASSET_ID"] = ""
517
+ ActionController::Base.relative_url_root = "/collaboration/hieraki"
518
+ ActionController::Base.perform_caching = true
519
+
520
+ assert_dom_equal(
521
+ %(<link href="/collaboration/hieraki/stylesheets/all.css" media="screen" rel="stylesheet" type="text/css" />),
522
+ stylesheet_link_tag(:all, :cache => true)
523
+ )
524
+
525
+ expected = Dir["#{ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR}/*.css"].map { |p| File.mtime(p) }.max
526
+ assert_equal expected, File.mtime(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'all.css'))
527
+
528
+ assert_dom_equal(
529
+ %(<link href="/collaboration/hieraki/stylesheets/money.css" media="screen" rel="stylesheet" type="text/css" />),
530
+ stylesheet_link_tag(:all, :cache => "money")
531
+ )
532
+
533
+ assert File.exist?(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'money.css'))
534
+ ensure
535
+ ActionController::Base.relative_url_root = nil
536
+ FileUtils.rm_f(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'all.css'))
537
+ FileUtils.rm_f(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'money.css'))
538
+ end
539
+
426
540
  def test_caching_stylesheet_include_tag_when_caching_off
427
541
  ENV["RAILS_ASSET_ID"] = ""
428
542
  ActionController::Base.perform_caching = false
429
-
543
+
430
544
  assert_dom_equal(
431
545
  %(<link href="/stylesheets/bank.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/robber.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/version.1.0.css" media="screen" rel="stylesheet" type="text/css" />),
432
546
  stylesheet_link_tag(:all, :cache => true)
433
547
  )
434
548
 
549
+ assert_dom_equal(
550
+ %(<link href="/stylesheets/bank.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/robber.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/subdir/subdir.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/version.1.0.css" media="screen" rel="stylesheet" type="text/css" />),
551
+ stylesheet_link_tag(:all, :cache => true, :recursive => true)
552
+ )
553
+
435
554
  assert !File.exist?(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'all.css'))
436
-
555
+
437
556
  assert_dom_equal(
438
557
  %(<link href="/stylesheets/bank.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/robber.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/version.1.0.css" media="screen" rel="stylesheet" type="text/css" />),
439
558
  stylesheet_link_tag(:all, :cache => "money")
440
559
  )
441
560
 
561
+ assert_dom_equal(
562
+ %(<link href="/stylesheets/bank.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/robber.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/subdir/subdir.css" media="screen" rel="stylesheet" type="text/css" />\n<link href="/stylesheets/version.1.0.css" media="screen" rel="stylesheet" type="text/css" />),
563
+ stylesheet_link_tag(:all, :cache => "money", :recursive => true)
564
+ )
565
+
442
566
  assert !File.exist?(File.join(ActionView::Helpers::AssetTagHelper::STYLESHEETS_DIR, 'money.css'))
443
567
  end
444
568
  end
@@ -447,6 +571,8 @@ class AssetTagHelperNonVhostTest < ActionView::TestCase
447
571
  tests ActionView::Helpers::AssetTagHelper
448
572
 
449
573
  def setup
574
+ ActionController::Base.relative_url_root = "/collaboration/hieraki"
575
+
450
576
  @controller = Class.new do
451
577
  attr_accessor :request
452
578
 
@@ -454,22 +580,22 @@ class AssetTagHelperNonVhostTest < ActionView::TestCase
454
580
  "http://www.example.com/collaboration/hieraki"
455
581
  end
456
582
  end.new
457
-
458
- @request = Class.new do
459
- def relative_url_root
460
- "/collaboration/hieraki"
461
- end
462
583
 
584
+ @request = Class.new do
463
585
  def protocol
464
586
  'gopher://'
465
587
  end
466
588
  end.new
467
-
589
+
468
590
  @controller.request = @request
469
-
591
+
470
592
  ActionView::Helpers::AssetTagHelper::reset_javascript_include_default
471
593
  end
472
594
 
595
+ def teardown
596
+ ActionController::Base.relative_url_root = nil
597
+ end
598
+
473
599
  def test_should_compute_proper_path
474
600
  assert_dom_equal(%(<link href="http://www.example.com/collaboration/hieraki" rel="alternate" title="RSS" type="application/rss+xml" />), auto_discovery_link_tag)
475
601
  assert_dom_equal(%(/collaboration/hieraki/javascripts/xmlhr.js), javascript_path("xmlhr"))
@@ -478,7 +604,7 @@ class AssetTagHelperNonVhostTest < ActionView::TestCase
478
604
  assert_dom_equal(%(<img alt="Mouse" onmouseover="this.src='/collaboration/hieraki/images/mouse_over.png'" onmouseout="this.src='/collaboration/hieraki/images/mouse.png'" src="/collaboration/hieraki/images/mouse.png" />), image_tag("mouse.png", :mouseover => "/images/mouse_over.png"))
479
605
  assert_dom_equal(%(<img alt="Mouse2" onmouseover="this.src='/collaboration/hieraki/images/mouse_over2.png'" onmouseout="this.src='/collaboration/hieraki/images/mouse2.png'" src="/collaboration/hieraki/images/mouse2.png" />), image_tag("mouse2.png", :mouseover => image_path("mouse_over2.png")))
480
606
  end
481
-
607
+
482
608
  def test_should_ignore_relative_root_path_on_complete_url
483
609
  assert_dom_equal(%(http://www.example.com/images/xml.png), image_path("http://www.example.com/images/xml.png"))
484
610
  end
@@ -522,4 +648,10 @@ class AssetTagHelperNonVhostTest < ActionView::TestCase
522
648
  ensure
523
649
  ActionController::Base.asset_host = nil
524
650
  end
651
+
652
+ def test_assert_css_and_js_of_the_same_name_return_correct_extension
653
+ assert_dom_equal(%(/collaboration/hieraki/javascripts/foo.js), javascript_path("foo"))
654
+ assert_dom_equal(%(/collaboration/hieraki/stylesheets/foo.css), stylesheet_path("foo"))
655
+
656
+ end
525
657
  end
@@ -67,6 +67,82 @@ class ScrollsController < ActionController::Base
67
67
  entry.content(scroll.body, :type => 'html')
68
68
  entry.tag!('app:edited', Time.now)
69
69
 
70
+ entry.author do |author|
71
+ author.name("DHH")
72
+ end
73
+ end
74
+ end
75
+ end
76
+ EOT
77
+ FEEDS["feed_with_overridden_ids"] = <<-EOT
78
+ atom_feed({:id => 'tag:test.rubyonrails.org,2008:test/'}) do |feed|
79
+ feed.title("My great blog!")
80
+ feed.updated((@scrolls.first.created_at))
81
+
82
+ for scroll in @scrolls
83
+ feed.entry(scroll, :id => "tag:test.rubyonrails.org,2008:"+scroll.id.to_s) do |entry|
84
+ entry.title(scroll.title)
85
+ entry.content(scroll.body, :type => 'html')
86
+ entry.tag!('app:edited', Time.now)
87
+
88
+ entry.author do |author|
89
+ author.name("DHH")
90
+ end
91
+ end
92
+ end
93
+ end
94
+ EOT
95
+ FEEDS["feed_with_xml_processing_instructions"] = <<-EOT
96
+ atom_feed(:schema_date => '2008',
97
+ :instruct => {'xml-stylesheet' => { :href=> 't.css', :type => 'text/css' }}) do |feed|
98
+ feed.title("My great blog!")
99
+ feed.updated((@scrolls.first.created_at))
100
+
101
+ for scroll in @scrolls
102
+ feed.entry(scroll) do |entry|
103
+ entry.title(scroll.title)
104
+ entry.content(scroll.body, :type => 'html')
105
+
106
+ entry.author do |author|
107
+ author.name("DHH")
108
+ end
109
+ end
110
+ end
111
+ end
112
+ EOT
113
+ FEEDS["feed_with_xml_processing_instructions_duplicate_targets"] = <<-EOT
114
+ atom_feed(:schema_date => '2008',
115
+ :instruct => {'target1' => [{ :a => '1', :b => '2' }, { :c => '3', :d => '4' }]}) do |feed|
116
+ feed.title("My great blog!")
117
+ feed.updated((@scrolls.first.created_at))
118
+
119
+ for scroll in @scrolls
120
+ feed.entry(scroll) do |entry|
121
+ entry.title(scroll.title)
122
+ entry.content(scroll.body, :type => 'html')
123
+
124
+ entry.author do |author|
125
+ author.name("DHH")
126
+ end
127
+ end
128
+ end
129
+ end
130
+ EOT
131
+ FEEDS["feed_with_xhtml_content"] = <<-'EOT'
132
+ atom_feed do |feed|
133
+ feed.title("My great blog!")
134
+ feed.updated((@scrolls.first.created_at))
135
+
136
+ for scroll in @scrolls
137
+ feed.entry(scroll) do |entry|
138
+ entry.title(scroll.title)
139
+ entry.summary(:type => 'xhtml') do |xhtml|
140
+ xhtml.p "before #{scroll.id}"
141
+ xhtml.p {xhtml << scroll.body}
142
+ xhtml.p "after #{scroll.id}"
143
+ end
144
+ entry.tag!('app:edited', Time.now)
145
+
70
146
  entry.author do |author|
71
147
  author.name("DHH")
72
148
  end
@@ -79,7 +155,7 @@ class ScrollsController < ActionController::Base
79
155
  Scroll.new(1, "1", "Hello One", "Something <i>COOL!</i>", Time.utc(2007, 12, 12, 15), Time.utc(2007, 12, 12, 15)),
80
156
  Scroll.new(2, "2", "Hello Two", "Something Boring", Time.utc(2007, 12, 12, 15)),
81
157
  ]
82
-
158
+
83
159
  render :inline => FEEDS[params[:id]], :type => :builder
84
160
  end
85
161
 
@@ -98,21 +174,21 @@ class AtomFeedTest < Test::Unit::TestCase
98
174
 
99
175
  @request.host = "www.nextangle.com"
100
176
  end
101
-
177
+
102
178
  def test_feed_should_use_default_language_if_none_is_given
103
179
  with_restful_routing(:scrolls) do
104
180
  get :index, :id => "defaults"
105
181
  assert_match %r{xml:lang="en-US"}, @response.body
106
182
  end
107
183
  end
108
-
184
+
109
185
  def test_feed_should_include_two_entries
110
186
  with_restful_routing(:scrolls) do
111
187
  get :index, :id => "defaults"
112
188
  assert_select "entry", 2
113
189
  end
114
190
  end
115
-
191
+
116
192
  def test_entry_should_only_use_published_if_created_at_is_present
117
193
  with_restful_routing(:scrolls) do
118
194
  get :index, :id => "defaults"
@@ -167,7 +243,40 @@ class AtomFeedTest < Test::Unit::TestCase
167
243
  end
168
244
  end
169
245
 
170
- private
246
+ def test_feed_should_allow_overriding_ids
247
+ with_restful_routing(:scrolls) do
248
+ get :index, :id => "feed_with_overridden_ids"
249
+ assert_select "id", :text => "tag:test.rubyonrails.org,2008:test/"
250
+ assert_select "entry id", :text => "tag:test.rubyonrails.org,2008:1"
251
+ assert_select "entry id", :text => "tag:test.rubyonrails.org,2008:2"
252
+ end
253
+ end
254
+
255
+ def test_feed_xml_processing_instructions
256
+ with_restful_routing(:scrolls) do
257
+ get :index, :id => 'feed_with_xml_processing_instructions'
258
+ assert_match %r{<\?xml-stylesheet [^\?]*type="text/css"}, @response.body
259
+ assert_match %r{<\?xml-stylesheet [^\?]*href="t.css"}, @response.body
260
+ end
261
+ end
262
+
263
+ def test_feed_xml_processing_instructions_duplicate_targets
264
+ with_restful_routing(:scrolls) do
265
+ get :index, :id => 'feed_with_xml_processing_instructions_duplicate_targets'
266
+ assert_match %r{<\?target1 (a="1" b="2"|b="2" a="1")\?>}, @response.body
267
+ assert_match %r{<\?target1 (c="3" d="4"|d="4" c="3")\?>}, @response.body
268
+ end
269
+ end
270
+
271
+ def test_feed_xhtml
272
+ with_restful_routing(:scrolls) do
273
+ get :index, :id => "feed_with_xhtml_content"
274
+ assert_match %r{xmlns="http://www.w3.org/1999/xhtml"}, @response.body
275
+ assert_select "summary div p", :text => "Something Boring"
276
+ assert_select "summary div p", :text => "after 2"
277
+ end
278
+ end
279
+ private
171
280
  def with_restful_routing(resources)
172
281
  with_routing do |set|
173
282
  set.draw do |map|