actionpack 1.12.5 → 1.13.0

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 (179) hide show
  1. data/CHANGELOG +517 -15
  2. data/MIT-LICENSE +1 -1
  3. data/README +18 -20
  4. data/Rakefile +7 -4
  5. data/examples/address_book_controller.rb +3 -3
  6. data/examples/blog_controller.cgi +3 -3
  7. data/examples/debate_controller.cgi +5 -5
  8. data/lib/action_controller.rb +2 -2
  9. data/lib/action_controller/assertions.rb +73 -311
  10. data/lib/action_controller/{deprecated_assertions.rb → assertions/deprecated_assertions.rb} +32 -8
  11. data/lib/action_controller/assertions/dom_assertions.rb +25 -0
  12. data/lib/action_controller/assertions/model_assertions.rb +12 -0
  13. data/lib/action_controller/assertions/response_assertions.rb +140 -0
  14. data/lib/action_controller/assertions/routing_assertions.rb +82 -0
  15. data/lib/action_controller/assertions/selector_assertions.rb +571 -0
  16. data/lib/action_controller/assertions/tag_assertions.rb +117 -0
  17. data/lib/action_controller/base.rb +334 -163
  18. data/lib/action_controller/benchmarking.rb +3 -6
  19. data/lib/action_controller/caching.rb +83 -22
  20. data/lib/action_controller/cgi_ext/cgi_ext.rb +0 -7
  21. data/lib/action_controller/cgi_ext/cgi_methods.rb +167 -173
  22. data/lib/action_controller/cgi_ext/raw_post_data_fix.rb +43 -22
  23. data/lib/action_controller/cgi_process.rb +50 -27
  24. data/lib/action_controller/components.rb +21 -25
  25. data/lib/action_controller/cookies.rb +10 -9
  26. data/lib/action_controller/{dependencies.rb → deprecated_dependencies.rb} +9 -27
  27. data/lib/action_controller/filters.rb +448 -225
  28. data/lib/action_controller/flash.rb +24 -20
  29. data/lib/action_controller/helpers.rb +2 -5
  30. data/lib/action_controller/integration.rb +40 -16
  31. data/lib/action_controller/layout.rb +11 -8
  32. data/lib/action_controller/macros/auto_complete.rb +3 -2
  33. data/lib/action_controller/macros/in_place_editing.rb +3 -2
  34. data/lib/action_controller/mime_responds.rb +41 -29
  35. data/lib/action_controller/mime_type.rb +68 -10
  36. data/lib/action_controller/pagination.rb +4 -3
  37. data/lib/action_controller/request.rb +22 -14
  38. data/lib/action_controller/rescue.rb +25 -22
  39. data/lib/action_controller/resources.rb +302 -0
  40. data/lib/action_controller/response.rb +20 -2
  41. data/lib/action_controller/response.rb.rej +17 -0
  42. data/lib/action_controller/routing.rb +1165 -567
  43. data/lib/action_controller/scaffolding.rb +30 -31
  44. data/lib/action_controller/session/active_record_store.rb +2 -0
  45. data/lib/action_controller/session/drb_store.rb +4 -0
  46. data/lib/action_controller/session/mem_cache_store.rb +4 -0
  47. data/lib/action_controller/session_management.rb +6 -9
  48. data/lib/action_controller/status_codes.rb +89 -0
  49. data/lib/action_controller/streaming.rb +6 -15
  50. data/lib/action_controller/templates/rescues/_request_and_response.rhtml +5 -5
  51. data/lib/action_controller/templates/rescues/diagnostics.rhtml +2 -2
  52. data/lib/action_controller/templates/rescues/routing_error.rhtml +4 -4
  53. data/lib/action_controller/templates/rescues/template_error.rhtml +1 -1
  54. data/lib/action_controller/templates/scaffolds/list.rhtml +1 -1
  55. data/lib/action_controller/test_process.rb +52 -30
  56. data/lib/action_controller/url_rewriter.rb +63 -29
  57. data/lib/action_controller/vendor/html-scanner/html/document.rb +1 -0
  58. data/lib/action_controller/vendor/html-scanner/html/node.rb +3 -4
  59. data/lib/action_controller/vendor/html-scanner/html/selector.rb +822 -0
  60. data/lib/action_controller/verification.rb +22 -11
  61. data/lib/action_pack.rb +1 -1
  62. data/lib/action_pack/version.rb +2 -2
  63. data/lib/action_view.rb +1 -1
  64. data/lib/action_view/base.rb +46 -43
  65. data/lib/action_view/compiled_templates.rb +1 -1
  66. data/lib/action_view/helpers/active_record_helper.rb +54 -17
  67. data/lib/action_view/helpers/asset_tag_helper.rb +97 -46
  68. data/lib/action_view/helpers/capture_helper.rb +1 -1
  69. data/lib/action_view/helpers/date_helper.rb +258 -136
  70. data/lib/action_view/helpers/debug_helper.rb +1 -1
  71. data/lib/action_view/helpers/deprecated_helper.rb +34 -0
  72. data/lib/action_view/helpers/form_helper.rb +75 -35
  73. data/lib/action_view/helpers/form_options_helper.rb +7 -5
  74. data/lib/action_view/helpers/form_tag_helper.rb +44 -6
  75. data/lib/action_view/helpers/java_script_macros_helper.rb +59 -46
  76. data/lib/action_view/helpers/javascript_helper.rb +71 -10
  77. data/lib/action_view/helpers/javascripts/controls.js +41 -23
  78. data/lib/action_view/helpers/javascripts/dragdrop.js +105 -76
  79. data/lib/action_view/helpers/javascripts/effects.js +293 -163
  80. data/lib/action_view/helpers/javascripts/prototype.js +897 -389
  81. data/lib/action_view/helpers/javascripts/prototype.js.rej +561 -0
  82. data/lib/action_view/helpers/number_helper.rb +111 -65
  83. data/lib/action_view/helpers/prototype_helper.rb +84 -109
  84. data/lib/action_view/helpers/scriptaculous_helper.rb +5 -0
  85. data/lib/action_view/helpers/tag_helper.rb +69 -16
  86. data/lib/action_view/helpers/text_helper.rb +149 -112
  87. data/lib/action_view/helpers/url_helper.rb +200 -107
  88. data/lib/action_view/template_error.rb +66 -42
  89. data/test/abstract_unit.rb +4 -2
  90. data/test/active_record_unit.rb +84 -56
  91. data/test/activerecord/active_record_assertions_test.rb +26 -18
  92. data/test/activerecord/active_record_store_test.rb +4 -36
  93. data/test/activerecord/pagination_test.rb +1 -6
  94. data/test/controller/action_pack_assertions_test.rb +230 -113
  95. data/test/controller/addresses_render_test.rb +2 -6
  96. data/test/controller/assert_select_test.rb +576 -0
  97. data/test/controller/base_test.rb +73 -3
  98. data/test/controller/caching_test.rb +228 -0
  99. data/test/controller/capture_test.rb +12 -10
  100. data/test/controller/cgi_test.rb +89 -12
  101. data/test/controller/components_test.rb +24 -2
  102. data/test/controller/content_type_test.rb +139 -0
  103. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  104. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  105. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  106. data/test/controller/cookie_test.rb +33 -25
  107. data/test/controller/deprecated_instance_variables_test.rb +48 -0
  108. data/test/controller/deprecation/deprecated_base_methods_test.rb +60 -0
  109. data/test/controller/fake_controllers.rb +0 -1
  110. data/test/controller/filters_test.rb +301 -16
  111. data/test/controller/flash_test.rb +19 -2
  112. data/test/controller/helper_test.rb +2 -2
  113. data/test/controller/integration_test.rb +154 -0
  114. data/test/controller/layout_test.rb +115 -1
  115. data/test/controller/mime_responds_test.rb +94 -0
  116. data/test/controller/mime_type_test.rb +9 -0
  117. data/test/controller/new_render_test.rb +161 -11
  118. data/test/controller/raw_post_test.rb +52 -15
  119. data/test/controller/redirect_test.rb +27 -14
  120. data/test/controller/render_test.rb +76 -29
  121. data/test/controller/request_test.rb +55 -4
  122. data/test/controller/resources_test.rb +274 -0
  123. data/test/controller/routing_test.rb +1533 -824
  124. data/test/controller/selector_test.rb +628 -0
  125. data/test/controller/send_file_test.rb +9 -1
  126. data/test/controller/session_management_test.rb +51 -0
  127. data/test/controller/test_test.rb +113 -29
  128. data/test/controller/url_rewriter_test.rb +86 -17
  129. data/test/controller/verification_test.rb +19 -17
  130. data/test/controller/webservice_test.rb +0 -7
  131. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  132. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  133. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  134. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  135. data/test/fixtures/deprecated_instance_variables/_cookies_ivar.rhtml +1 -0
  136. data/test/fixtures/deprecated_instance_variables/_cookies_method.rhtml +1 -0
  137. data/test/fixtures/deprecated_instance_variables/_flash_ivar.rhtml +1 -0
  138. data/test/fixtures/deprecated_instance_variables/_flash_method.rhtml +1 -0
  139. data/test/fixtures/deprecated_instance_variables/_headers_ivar.rhtml +1 -0
  140. data/test/fixtures/deprecated_instance_variables/_headers_method.rhtml +1 -0
  141. data/test/fixtures/deprecated_instance_variables/_params_ivar.rhtml +1 -0
  142. data/test/fixtures/deprecated_instance_variables/_params_method.rhtml +1 -0
  143. data/test/fixtures/deprecated_instance_variables/_request_ivar.rhtml +1 -0
  144. data/test/fixtures/deprecated_instance_variables/_request_method.rhtml +1 -0
  145. data/test/fixtures/deprecated_instance_variables/_response_ivar.rhtml +1 -0
  146. data/test/fixtures/deprecated_instance_variables/_response_method.rhtml +1 -0
  147. data/test/fixtures/deprecated_instance_variables/_session_ivar.rhtml +1 -0
  148. data/test/fixtures/deprecated_instance_variables/_session_method.rhtml +1 -0
  149. data/test/fixtures/multipart/binary_file +0 -0
  150. data/test/fixtures/public/javascripts/application.js +1 -0
  151. data/test/fixtures/test/_hello.rxml +1 -0
  152. data/test/fixtures/test/hello_world_container.rxml +3 -0
  153. data/test/fixtures/topic.rb +2 -2
  154. data/test/template/active_record_helper_test.rb +83 -12
  155. data/test/template/asset_tag_helper_test.rb +75 -95
  156. data/test/template/compiled_templates_test.rb +1 -0
  157. data/test/template/date_helper_test.rb +873 -181
  158. data/test/template/deprecated_helper_test.rb +36 -0
  159. data/test/template/deprecated_instance_variables_test.rb +43 -0
  160. data/test/template/form_helper_test.rb +77 -1
  161. data/test/template/form_options_helper_test.rb +4 -0
  162. data/test/template/form_tag_helper_test.rb +66 -2
  163. data/test/template/java_script_macros_helper_test.rb +4 -1
  164. data/test/template/javascript_helper_test.rb +29 -0
  165. data/test/template/number_helper_test.rb +63 -27
  166. data/test/template/prototype_helper_test.rb +77 -34
  167. data/test/template/tag_helper_test.rb +34 -6
  168. data/test/template/text_helper_test.rb +69 -34
  169. data/test/template/url_helper_test.rb +168 -16
  170. data/test/testing_sandbox.rb +7 -22
  171. metadata +66 -20
  172. data/filler.txt +0 -50
  173. data/lib/action_controller/code_generation.rb +0 -235
  174. data/lib/action_controller/vendor/xml_simple.rb +0 -1019
  175. data/test/controller/caching_filestore.rb +0 -74
  176. data/test/fixtures/application_root/app/controllers/a_class_that_contains_a_controller/poorly_placed_controller.rb +0 -7
  177. data/test/fixtures/application_root/app/controllers/module_that_holds_controllers/nested_controller.rb +0 -3
  178. data/test/fixtures/application_root/app/models/a_class_that_contains_a_controller.rb +0 -7
  179. data/test/fixtures/dont_load.rb +0 -3
@@ -5,23 +5,21 @@ class Address
5
5
  def Address.count(conditions = nil, join = nil)
6
6
  nil
7
7
  end
8
-
8
+
9
9
  def Address.find_all(arg1, arg2, arg3, arg4)
10
10
  []
11
11
  end
12
-
12
+
13
13
  def self.find(*args)
14
14
  []
15
15
  end
16
16
  end
17
17
 
18
18
  class AddressesTestController < ActionController::Base
19
-
20
19
  scaffold :address
21
20
 
22
21
  def self.controller_name; "addresses"; end
23
22
  def self.controller_path; "addresses"; end
24
-
25
23
  end
26
24
 
27
25
  AddressesTestController.template_root = File.dirname(__FILE__) + "/../fixtures/"
@@ -44,6 +42,4 @@ class AddressesTest < Test::Unit::TestCase
44
42
  get :list
45
43
  assert_equal "We only need to get this far!", @response.body.chomp
46
44
  end
47
-
48
-
49
45
  end
@@ -0,0 +1,576 @@
1
+ #--
2
+ # Copyright (c) 2006 Assaf Arkin (http://labnotes.org)
3
+ # Under MIT and/or CC By license.
4
+ #++
5
+
6
+ require File.dirname(__FILE__) + '/../abstract_unit'
7
+ require File.dirname(__FILE__) + '/fake_controllers'
8
+
9
+
10
+ unless defined?(ActionMailer)
11
+ begin
12
+ $:.unshift(File.dirname(__FILE__) + "/../../../actionmailer/lib")
13
+ require 'action_mailer'
14
+ rescue LoadError
15
+ require 'rubygems'
16
+ require_gem 'actionmailer'
17
+ end
18
+ end
19
+
20
+ class AssertSelectTest < Test::Unit::TestCase
21
+ class AssertSelectController < ActionController::Base
22
+ def response_with=(content)
23
+ @content = content
24
+ end
25
+
26
+ def response_with(&block)
27
+ @update = block
28
+ end
29
+
30
+ def html()
31
+ render :text=>@content, :layout=>false, :content_type=>Mime::HTML
32
+ @content = nil
33
+ end
34
+
35
+ def rjs()
36
+ render :update do |page|
37
+ @update.call page
38
+ end
39
+ @update = nil
40
+ end
41
+
42
+ def xml()
43
+ render :text=>@content, :layout=>false, :content_type=>Mime::XML
44
+ @content = nil
45
+ end
46
+
47
+ def rescue_action(e)
48
+ raise e
49
+ end
50
+ end
51
+
52
+ class AssertSelectMailer < ActionMailer::Base
53
+ def test(html)
54
+ recipients "test <test@test.host>"
55
+ from "test@test.host"
56
+ subject "Test e-mail"
57
+ part :content_type=>"text/html", :body=>html
58
+ end
59
+ end
60
+
61
+ AssertionFailedError = Test::Unit::AssertionFailedError
62
+
63
+ def setup
64
+ @controller = AssertSelectController.new
65
+ @request = ActionController::TestRequest.new
66
+ @response = ActionController::TestResponse.new
67
+ ActionMailer::Base.delivery_method = :test
68
+ ActionMailer::Base.perform_deliveries = true
69
+ ActionMailer::Base.deliveries = []
70
+ end
71
+
72
+
73
+ def teardown
74
+ ActionMailer::Base.deliveries.clear
75
+ end
76
+
77
+
78
+ #
79
+ # Test assert select.
80
+ #
81
+
82
+ def test_assert_select
83
+ render_html %Q{<div id="1"></div><div id="2"></div>}
84
+ assert_select "div", 2
85
+ assert_raises(AssertionFailedError) { assert_select "div", 3 }
86
+ assert_raises(AssertionFailedError){ assert_select "p" }
87
+ end
88
+
89
+
90
+ def test_equality_true_false
91
+ render_html %Q{<div id="1"></div><div id="2"></div>}
92
+ assert_nothing_raised { assert_select "div" }
93
+ assert_raises(AssertionFailedError) { assert_select "p" }
94
+ assert_nothing_raised { assert_select "div", true }
95
+ assert_raises(AssertionFailedError) { assert_select "p", true }
96
+ assert_raises(AssertionFailedError) { assert_select "div", false }
97
+ assert_nothing_raised { assert_select "p", false }
98
+ end
99
+
100
+
101
+ def test_equality_string_and_regexp
102
+ render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
103
+ assert_nothing_raised { assert_select "div", "foo" }
104
+ assert_raises(AssertionFailedError) { assert_select "div", "bar" }
105
+ assert_nothing_raised { assert_select "div", :text=>"foo" }
106
+ assert_raises(AssertionFailedError) { assert_select "div", :text=>"bar" }
107
+ assert_nothing_raised { assert_select "div", /(foo|bar)/ }
108
+ assert_raises(AssertionFailedError) { assert_select "div", /foobar/ }
109
+ assert_nothing_raised { assert_select "div", :text=>/(foo|bar)/ }
110
+ assert_raises(AssertionFailedError) { assert_select "div", :text=>/foobar/ }
111
+ assert_raises(AssertionFailedError) { assert_select "p", :text=>/foobar/ }
112
+ end
113
+
114
+
115
+ def test_equality_of_html
116
+ render_html %Q{<p>\n<em>"This is <strong>not</strong> a big problem,"</em> he said.\n</p>}
117
+ text = "\"This is not a big problem,\" he said."
118
+ html = "<em>\"This is <strong>not</strong> a big problem,\"</em> he said."
119
+ assert_nothing_raised { assert_select "p", text }
120
+ assert_raises(AssertionFailedError) { assert_select "p", html }
121
+ assert_nothing_raised { assert_select "p", :html=>html }
122
+ assert_raises(AssertionFailedError) { assert_select "p", :html=>text }
123
+ # No stripping for pre.
124
+ render_html %Q{<pre>\n<em>"This is <strong>not</strong> a big problem,"</em> he said.\n</pre>}
125
+ text = "\n\"This is not a big problem,\" he said.\n"
126
+ html = "\n<em>\"This is <strong>not</strong> a big problem,\"</em> he said.\n"
127
+ assert_nothing_raised { assert_select "pre", text }
128
+ assert_raises(AssertionFailedError) { assert_select "pre", html }
129
+ assert_nothing_raised { assert_select "pre", :html=>html }
130
+ assert_raises(AssertionFailedError) { assert_select "pre", :html=>text }
131
+ end
132
+
133
+
134
+ def test_equality_of_instances
135
+ render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
136
+ assert_nothing_raised { assert_select "div", 2 }
137
+ assert_raises(AssertionFailedError) { assert_select "div", 3 }
138
+ assert_nothing_raised { assert_select "div", 1..2 }
139
+ assert_raises(AssertionFailedError) { assert_select "div", 3..4 }
140
+ assert_nothing_raised { assert_select "div", :count=>2 }
141
+ assert_raises(AssertionFailedError) { assert_select "div", :count=>3 }
142
+ assert_nothing_raised { assert_select "div", :minimum=>1 }
143
+ assert_nothing_raised { assert_select "div", :minimum=>2 }
144
+ assert_raises(AssertionFailedError) { assert_select "div", :minimum=>3 }
145
+ assert_nothing_raised { assert_select "div", :maximum=>2 }
146
+ assert_nothing_raised { assert_select "div", :maximum=>3 }
147
+ assert_raises(AssertionFailedError) { assert_select "div", :maximum=>1 }
148
+ assert_nothing_raised { assert_select "div", :minimum=>1, :maximum=>2 }
149
+ assert_raises(AssertionFailedError) { assert_select "div", :minimum=>3, :maximum=>4 }
150
+ end
151
+
152
+
153
+ def test_substitution_values
154
+ render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
155
+ assert_select "div#?", /\d+/ do |elements|
156
+ assert_equal 2, elements.size
157
+ end
158
+ assert_select "div" do
159
+ assert_select "div#?", /\d+/ do |elements|
160
+ assert_equal 2, elements.size
161
+ assert_select "#1"
162
+ assert_select "#2"
163
+ end
164
+ end
165
+ end
166
+
167
+
168
+ def test_nested_assert_select
169
+ render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
170
+ assert_select "div" do |elements|
171
+ assert_equal 2, elements.size
172
+ assert_select elements[0], "#1"
173
+ assert_select elements[1], "#2"
174
+ end
175
+ assert_select "div" do
176
+ assert_select "div" do |elements|
177
+ assert_equal 2, elements.size
178
+ # Testing in a group is one thing
179
+ assert_select "#1,#2"
180
+ # Testing individually is another.
181
+ assert_select "#1"
182
+ assert_select "#2"
183
+ assert_select "#3", false
184
+ end
185
+ end
186
+ end
187
+
188
+
189
+ def test_assert_select_text_match
190
+ render_html %Q{<div id="1"><span>foo</span></div><div id="2"><span>bar</span></div>}
191
+ assert_select "div" do
192
+ assert_nothing_raised { assert_select "div", "foo" }
193
+ assert_nothing_raised { assert_select "div", "bar" }
194
+ assert_nothing_raised { assert_select "div", /\w*/ }
195
+ assert_nothing_raised { assert_select "div", /\w*/, :count=>2 }
196
+ assert_raises(AssertionFailedError) { assert_select "div", :text=>"foo", :count=>2 }
197
+ assert_nothing_raised { assert_select "div", :html=>"<span>bar</span>" }
198
+ assert_nothing_raised { assert_select "div", :html=>"<span>bar</span>" }
199
+ assert_nothing_raised { assert_select "div", :html=>/\w*/ }
200
+ assert_nothing_raised { assert_select "div", :html=>/\w*/, :count=>2 }
201
+ assert_raises(AssertionFailedError) { assert_select "div", :html=>"<span>foo</span>", :count=>2 }
202
+ end
203
+ end
204
+
205
+
206
+ # With single result.
207
+ def test_assert_select_from_rjs_with_single_result
208
+ render_rjs do |page|
209
+ page.replace_html "test", "<div id=\"1\">foo</div>\n<div id=\"2\">foo</div>"
210
+ end
211
+ assert_select "div" do |elements|
212
+ assert elements.size == 2
213
+ assert_select "#1"
214
+ assert_select "#2"
215
+ end
216
+ assert_select "div#?", /\d+/ do |elements|
217
+ assert_select "#1"
218
+ assert_select "#2"
219
+ end
220
+ end
221
+
222
+ # With multiple results.
223
+ def test_assert_select_from_rjs_with_multiple_results
224
+ render_rjs do |page|
225
+ page.replace_html "test", "<div id=\"1\">foo</div>"
226
+ page.replace_html "test2", "<div id=\"2\">foo</div>"
227
+ end
228
+ assert_select "div" do |elements|
229
+ assert elements.size == 2
230
+ assert_select "#1"
231
+ assert_select "#2"
232
+ end
233
+ end
234
+
235
+
236
+ #
237
+ # Test css_select.
238
+ #
239
+
240
+
241
+ def test_css_select
242
+ render_html %Q{<div id="1"></div><div id="2"></div>}
243
+ assert 2, css_select("div").size
244
+ assert 0, css_select("p").size
245
+ end
246
+
247
+
248
+ def test_nested_css_select
249
+ render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
250
+ assert_select "div#?", /\d+/ do |elements|
251
+ assert_equal 1, css_select(elements[0], "div").size
252
+ assert_equal 1, css_select(elements[1], "div").size
253
+ end
254
+ assert_select "div" do
255
+ assert_equal 2, css_select("div").size
256
+ css_select("div").each do |element|
257
+ # Testing as a group is one thing
258
+ assert !css_select("#1,#2").empty?
259
+ # Testing individually is another
260
+ assert !css_select("#1").empty?
261
+ assert !css_select("#2").empty?
262
+ end
263
+ end
264
+ end
265
+
266
+
267
+ # With one result.
268
+ def test_css_select_from_rjs_with_single_result
269
+ render_rjs do |page|
270
+ page.replace_html "test", "<div id=\"1\">foo</div>\n<div id=\"2\">foo</div>"
271
+ end
272
+ assert_equal 2, css_select("div").size
273
+ assert_equal 1, css_select("#1").size
274
+ assert_equal 1, css_select("#2").size
275
+ end
276
+
277
+ # With multiple results.
278
+ def test_css_select_from_rjs_with_multiple_results
279
+ render_rjs do |page|
280
+ page.replace_html "test", "<div id=\"1\">foo</div>"
281
+ page.replace_html "test2", "<div id=\"2\">foo</div>"
282
+ end
283
+
284
+ assert_equal 2, css_select("div").size
285
+ assert_equal 1, css_select("#1").size
286
+ assert_equal 1, css_select("#2").size
287
+ end
288
+
289
+
290
+ #
291
+ # Test assert_select_rjs.
292
+ #
293
+
294
+
295
+ # Test that we can pick up all statements in the result.
296
+ def test_assert_select_rjs_picks_up_all_statements
297
+ render_rjs do |page|
298
+ page.replace "test", "<div id=\"1\">foo</div>"
299
+ page.replace_html "test2", "<div id=\"2\">foo</div>"
300
+ page.insert_html :top, "test3", "<div id=\"3\">foo</div>"
301
+ end
302
+
303
+ found = false
304
+ assert_select_rjs do
305
+ assert_select "#1"
306
+ assert_select "#2"
307
+ assert_select "#3"
308
+ found = true
309
+ end
310
+ assert found
311
+ end
312
+
313
+ # Test that we fail if there is nothing to pick.
314
+ def test_assert_select_rjs_fails_if_nothing_to_pick
315
+ render_rjs { }
316
+ assert_raises(AssertionFailedError) { assert_select_rjs }
317
+ end
318
+
319
+ def test_assert_select_rjs_with_unicode
320
+ # Test that non-ascii characters (which are converted into \uXXXX in RJS) are decoded correctly.
321
+ render_rjs do |page|
322
+ page.replace "test", "<div id=\"1\">\343\203\201\343\202\261\343\203\203\343\203\210</div>"
323
+ end
324
+ assert_select_rjs do
325
+ assert_select "#1", :text => "\343\203\201\343\202\261\343\203\203\343\203\210"
326
+ assert_select "#1", "\343\203\201\343\202\261\343\203\203\343\203\210"
327
+ assert_select "#1", Regexp.new("\343\203\201..\343\203\210",0,'U')
328
+ assert_raises(AssertionFailedError) { assert_select "#1", Regexp.new("\343\203\201.\343\203\210",0,'U') }
329
+ end
330
+ end
331
+
332
+ def test_assert_select_rjs_with_id
333
+ # Test that we can pick up all statements in the result.
334
+ render_rjs do |page|
335
+ page.replace "test1", "<div id=\"1\">foo</div>"
336
+ page.replace_html "test2", "<div id=\"2\">foo</div>"
337
+ page.insert_html :top, "test3", "<div id=\"3\">foo</div>"
338
+ end
339
+ assert_select_rjs "test1" do
340
+ assert_select "div", 1
341
+ assert_select "#1"
342
+ end
343
+ assert_select_rjs "test2" do
344
+ assert_select "div", 1
345
+ assert_select "#2"
346
+ end
347
+ assert_select_rjs "test3" do
348
+ assert_select "div", 1
349
+ assert_select "#3"
350
+ end
351
+ assert_raises(AssertionFailedError) { assert_select_rjs "test4" }
352
+ end
353
+
354
+
355
+ def test_assert_select_rjs_for_replace
356
+ render_rjs do |page|
357
+ page.replace "test1", "<div id=\"1\">foo</div>"
358
+ page.replace_html "test2", "<div id=\"2\">foo</div>"
359
+ page.insert_html :top, "test3", "<div id=\"3\">foo</div>"
360
+ end
361
+ # Replace.
362
+ assert_select_rjs :replace do
363
+ assert_select "div", 1
364
+ assert_select "#1"
365
+ end
366
+ assert_select_rjs :replace, "test1" do
367
+ assert_select "div", 1
368
+ assert_select "#1"
369
+ end
370
+ assert_raises(AssertionFailedError) { assert_select_rjs :replace, "test2" }
371
+ # Replace HTML.
372
+ assert_select_rjs :replace_html do
373
+ assert_select "div", 1
374
+ assert_select "#2"
375
+ end
376
+ assert_select_rjs :replace_html, "test2" do
377
+ assert_select "div", 1
378
+ assert_select "#2"
379
+ end
380
+ assert_raises(AssertionFailedError) { assert_select_rjs :replace_html, "test1" }
381
+ end
382
+
383
+ def test_assert_select_rjs_for_chained_replace
384
+ render_rjs do |page|
385
+ page['test1'].replace "<div id=\"1\">foo</div>"
386
+ page['test2'].replace_html "<div id=\"2\">foo</div>"
387
+ page.insert_html :top, "test3", "<div id=\"3\">foo</div>"
388
+ end
389
+ # Replace.
390
+ assert_select_rjs :chained_replace do
391
+ assert_select "div", 1
392
+ assert_select "#1"
393
+ end
394
+ assert_select_rjs :chained_replace, "test1" do
395
+ assert_select "div", 1
396
+ assert_select "#1"
397
+ end
398
+ assert_raises(AssertionFailedError) { assert_select_rjs :chained_replace, "test2" }
399
+ # Replace HTML.
400
+ assert_select_rjs :chained_replace_html do
401
+ assert_select "div", 1
402
+ assert_select "#2"
403
+ end
404
+ assert_select_rjs :chained_replace_html, "test2" do
405
+ assert_select "div", 1
406
+ assert_select "#2"
407
+ end
408
+ assert_raises(AssertionFailedError) { assert_select_rjs :replace_html, "test1" }
409
+ end
410
+
411
+ # Non-positioned insert.
412
+ def test_assert_select_rjs_for_nonpositioned_insert
413
+ render_rjs do |page|
414
+ page.replace "test1", "<div id=\"1\">foo</div>"
415
+ page.replace_html "test2", "<div id=\"2\">foo</div>"
416
+ page.insert_html :top, "test3", "<div id=\"3\">foo</div>"
417
+ end
418
+ assert_select_rjs :insert_html do
419
+ assert_select "div", 1
420
+ assert_select "#3"
421
+ end
422
+ assert_select_rjs :insert_html, "test3" do
423
+ assert_select "div", 1
424
+ assert_select "#3"
425
+ end
426
+ assert_raises(AssertionFailedError) { assert_select_rjs :insert_html, "test1" }
427
+ end
428
+
429
+ # Positioned insert.
430
+ def test_assert_select_rjs_for_positioned_insert
431
+ render_rjs do |page|
432
+ page.insert_html :top, "test1", "<div id=\"1\">foo</div>"
433
+ page.insert_html :bottom, "test2", "<div id=\"2\">foo</div>"
434
+ page.insert_html :before, "test3", "<div id=\"3\">foo</div>"
435
+ page.insert_html :after, "test4", "<div id=\"4\">foo</div>"
436
+ end
437
+ assert_select_rjs :insert, :top do
438
+ assert_select "div", 1
439
+ assert_select "#1"
440
+ end
441
+ assert_select_rjs :insert, :bottom do
442
+ assert_select "div", 1
443
+ assert_select "#2"
444
+ end
445
+ assert_select_rjs :insert, :before do
446
+ assert_select "div", 1
447
+ assert_select "#3"
448
+ end
449
+ assert_select_rjs :insert, :after do
450
+ assert_select "div", 1
451
+ assert_select "#4"
452
+ end
453
+ assert_select_rjs :insert_html do
454
+ assert_select "div", 4
455
+ end
456
+ end
457
+
458
+
459
+ # Simple selection from a single result.
460
+ def test_nested_assert_select_rjs_with_single_result
461
+ render_rjs do |page|
462
+ page.replace_html "test", "<div id=\"1\">foo</div>\n<div id=\"2\">foo</div>"
463
+ end
464
+
465
+ assert_select_rjs "test" do |elements|
466
+ assert_equal 2, elements.size
467
+ assert_select "#1"
468
+ assert_select "#2"
469
+ end
470
+ end
471
+
472
+ # Deal with two results.
473
+ def test_nested_assert_select_rjs_with_two_results
474
+ render_rjs do |page|
475
+ page.replace_html "test", "<div id=\"1\">foo</div>"
476
+ page.replace_html "test2", "<div id=\"2\">foo</div>"
477
+ end
478
+
479
+ assert_select_rjs "test" do |elements|
480
+ assert_equal 1, elements.size
481
+ assert_select "#1"
482
+ end
483
+
484
+ assert_select_rjs "test2" do |elements|
485
+ assert_equal 1, elements.size
486
+ assert_select "#2"
487
+ end
488
+ end
489
+
490
+
491
+ def test_feed_item_encoded
492
+ render_xml <<-EOF
493
+ <rss version="2.0">
494
+ <channel>
495
+ <item>
496
+ <description>
497
+ <![CDATA[
498
+ <p>Test 1</p>
499
+ ]]>
500
+ </description>
501
+ </item>
502
+ <item>
503
+ <description>
504
+ <![CDATA[
505
+ <p>Test 2</p>
506
+ ]]>
507
+ </description>
508
+ </item>
509
+ </channel>
510
+ </rss>
511
+ EOF
512
+ assert_select "channel item description" do
513
+ # Test element regardless of wrapper.
514
+ assert_select_encoded do
515
+ assert_select "p", :count=>2, :text=>/Test/
516
+ end
517
+ # Test through encoded wrapper.
518
+ assert_select_encoded do
519
+ assert_select "encoded p", :count=>2, :text=>/Test/
520
+ end
521
+ # Use :root instead (recommended)
522
+ assert_select_encoded do
523
+ assert_select ":root p", :count=>2, :text=>/Test/
524
+ end
525
+ # Test individually.
526
+ assert_select "description" do |elements|
527
+ assert_select_encoded elements[0] do
528
+ assert_select "p", "Test 1"
529
+ end
530
+ assert_select_encoded elements[1] do
531
+ assert_select "p", "Test 2"
532
+ end
533
+ end
534
+ end
535
+
536
+ # Test that we only un-encode element itself.
537
+ assert_select "channel item" do
538
+ assert_select_encoded do
539
+ assert_select "p", 0
540
+ end
541
+ end
542
+ end
543
+
544
+
545
+ #
546
+ # Test assert_select_email
547
+ #
548
+
549
+ def test_assert_select_email
550
+ assert_raises(AssertionFailedError) { assert_select_email {} }
551
+ AssertSelectMailer.deliver_test "<div><p>foo</p><p>bar</p></div>"
552
+ assert_select_email do
553
+ assert_select "div:root" do
554
+ assert_select "p:first-child", "foo"
555
+ assert_select "p:last-child", "bar"
556
+ end
557
+ end
558
+ end
559
+
560
+
561
+ protected
562
+ def render_html(html)
563
+ @controller.response_with = html
564
+ get :html
565
+ end
566
+
567
+ def render_rjs(&block)
568
+ @controller.response_with &block
569
+ get :rjs
570
+ end
571
+
572
+ def render_xml(xml)
573
+ @controller.response_with = xml
574
+ get :xml
575
+ end
576
+ end