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.
- data/CHANGELOG +517 -15
- data/MIT-LICENSE +1 -1
- data/README +18 -20
- data/Rakefile +7 -4
- data/examples/address_book_controller.rb +3 -3
- data/examples/blog_controller.cgi +3 -3
- data/examples/debate_controller.cgi +5 -5
- data/lib/action_controller.rb +2 -2
- data/lib/action_controller/assertions.rb +73 -311
- data/lib/action_controller/{deprecated_assertions.rb → assertions/deprecated_assertions.rb} +32 -8
- data/lib/action_controller/assertions/dom_assertions.rb +25 -0
- data/lib/action_controller/assertions/model_assertions.rb +12 -0
- data/lib/action_controller/assertions/response_assertions.rb +140 -0
- data/lib/action_controller/assertions/routing_assertions.rb +82 -0
- data/lib/action_controller/assertions/selector_assertions.rb +571 -0
- data/lib/action_controller/assertions/tag_assertions.rb +117 -0
- data/lib/action_controller/base.rb +334 -163
- data/lib/action_controller/benchmarking.rb +3 -6
- data/lib/action_controller/caching.rb +83 -22
- data/lib/action_controller/cgi_ext/cgi_ext.rb +0 -7
- data/lib/action_controller/cgi_ext/cgi_methods.rb +167 -173
- data/lib/action_controller/cgi_ext/raw_post_data_fix.rb +43 -22
- data/lib/action_controller/cgi_process.rb +50 -27
- data/lib/action_controller/components.rb +21 -25
- data/lib/action_controller/cookies.rb +10 -9
- data/lib/action_controller/{dependencies.rb → deprecated_dependencies.rb} +9 -27
- data/lib/action_controller/filters.rb +448 -225
- data/lib/action_controller/flash.rb +24 -20
- data/lib/action_controller/helpers.rb +2 -5
- data/lib/action_controller/integration.rb +40 -16
- data/lib/action_controller/layout.rb +11 -8
- data/lib/action_controller/macros/auto_complete.rb +3 -2
- data/lib/action_controller/macros/in_place_editing.rb +3 -2
- data/lib/action_controller/mime_responds.rb +41 -29
- data/lib/action_controller/mime_type.rb +68 -10
- data/lib/action_controller/pagination.rb +4 -3
- data/lib/action_controller/request.rb +22 -14
- data/lib/action_controller/rescue.rb +25 -22
- data/lib/action_controller/resources.rb +302 -0
- data/lib/action_controller/response.rb +20 -2
- data/lib/action_controller/response.rb.rej +17 -0
- data/lib/action_controller/routing.rb +1165 -567
- data/lib/action_controller/scaffolding.rb +30 -31
- data/lib/action_controller/session/active_record_store.rb +2 -0
- data/lib/action_controller/session/drb_store.rb +4 -0
- data/lib/action_controller/session/mem_cache_store.rb +4 -0
- data/lib/action_controller/session_management.rb +6 -9
- data/lib/action_controller/status_codes.rb +89 -0
- data/lib/action_controller/streaming.rb +6 -15
- data/lib/action_controller/templates/rescues/_request_and_response.rhtml +5 -5
- data/lib/action_controller/templates/rescues/diagnostics.rhtml +2 -2
- data/lib/action_controller/templates/rescues/routing_error.rhtml +4 -4
- data/lib/action_controller/templates/rescues/template_error.rhtml +1 -1
- data/lib/action_controller/templates/scaffolds/list.rhtml +1 -1
- data/lib/action_controller/test_process.rb +52 -30
- data/lib/action_controller/url_rewriter.rb +63 -29
- data/lib/action_controller/vendor/html-scanner/html/document.rb +1 -0
- data/lib/action_controller/vendor/html-scanner/html/node.rb +3 -4
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +822 -0
- data/lib/action_controller/verification.rb +22 -11
- data/lib/action_pack.rb +1 -1
- data/lib/action_pack/version.rb +2 -2
- data/lib/action_view.rb +1 -1
- data/lib/action_view/base.rb +46 -43
- data/lib/action_view/compiled_templates.rb +1 -1
- data/lib/action_view/helpers/active_record_helper.rb +54 -17
- data/lib/action_view/helpers/asset_tag_helper.rb +97 -46
- data/lib/action_view/helpers/capture_helper.rb +1 -1
- data/lib/action_view/helpers/date_helper.rb +258 -136
- data/lib/action_view/helpers/debug_helper.rb +1 -1
- data/lib/action_view/helpers/deprecated_helper.rb +34 -0
- data/lib/action_view/helpers/form_helper.rb +75 -35
- data/lib/action_view/helpers/form_options_helper.rb +7 -5
- data/lib/action_view/helpers/form_tag_helper.rb +44 -6
- data/lib/action_view/helpers/java_script_macros_helper.rb +59 -46
- data/lib/action_view/helpers/javascript_helper.rb +71 -10
- data/lib/action_view/helpers/javascripts/controls.js +41 -23
- data/lib/action_view/helpers/javascripts/dragdrop.js +105 -76
- data/lib/action_view/helpers/javascripts/effects.js +293 -163
- data/lib/action_view/helpers/javascripts/prototype.js +897 -389
- data/lib/action_view/helpers/javascripts/prototype.js.rej +561 -0
- data/lib/action_view/helpers/number_helper.rb +111 -65
- data/lib/action_view/helpers/prototype_helper.rb +84 -109
- data/lib/action_view/helpers/scriptaculous_helper.rb +5 -0
- data/lib/action_view/helpers/tag_helper.rb +69 -16
- data/lib/action_view/helpers/text_helper.rb +149 -112
- data/lib/action_view/helpers/url_helper.rb +200 -107
- data/lib/action_view/template_error.rb +66 -42
- data/test/abstract_unit.rb +4 -2
- data/test/active_record_unit.rb +84 -56
- data/test/activerecord/active_record_assertions_test.rb +26 -18
- data/test/activerecord/active_record_store_test.rb +4 -36
- data/test/activerecord/pagination_test.rb +1 -6
- data/test/controller/action_pack_assertions_test.rb +230 -113
- data/test/controller/addresses_render_test.rb +2 -6
- data/test/controller/assert_select_test.rb +576 -0
- data/test/controller/base_test.rb +73 -3
- data/test/controller/caching_test.rb +228 -0
- data/test/controller/capture_test.rb +12 -10
- data/test/controller/cgi_test.rb +89 -12
- data/test/controller/components_test.rb +24 -2
- data/test/controller/content_type_test.rb +139 -0
- data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
- data/test/controller/cookie_test.rb +33 -25
- data/test/controller/deprecated_instance_variables_test.rb +48 -0
- data/test/controller/deprecation/deprecated_base_methods_test.rb +60 -0
- data/test/controller/fake_controllers.rb +0 -1
- data/test/controller/filters_test.rb +301 -16
- data/test/controller/flash_test.rb +19 -2
- data/test/controller/helper_test.rb +2 -2
- data/test/controller/integration_test.rb +154 -0
- data/test/controller/layout_test.rb +115 -1
- data/test/controller/mime_responds_test.rb +94 -0
- data/test/controller/mime_type_test.rb +9 -0
- data/test/controller/new_render_test.rb +161 -11
- data/test/controller/raw_post_test.rb +52 -15
- data/test/controller/redirect_test.rb +27 -14
- data/test/controller/render_test.rb +76 -29
- data/test/controller/request_test.rb +55 -4
- data/test/controller/resources_test.rb +274 -0
- data/test/controller/routing_test.rb +1533 -824
- data/test/controller/selector_test.rb +628 -0
- data/test/controller/send_file_test.rb +9 -1
- data/test/controller/session_management_test.rb +51 -0
- data/test/controller/test_test.rb +113 -29
- data/test/controller/url_rewriter_test.rb +86 -17
- data/test/controller/verification_test.rb +19 -17
- data/test/controller/webservice_test.rb +0 -7
- data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
- data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
- data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
- data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
- data/test/fixtures/deprecated_instance_variables/_cookies_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_cookies_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_flash_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_flash_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_headers_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_headers_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_params_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_params_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_request_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_request_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_response_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_response_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_session_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_session_method.rhtml +1 -0
- data/test/fixtures/multipart/binary_file +0 -0
- data/test/fixtures/public/javascripts/application.js +1 -0
- data/test/fixtures/test/_hello.rxml +1 -0
- data/test/fixtures/test/hello_world_container.rxml +3 -0
- data/test/fixtures/topic.rb +2 -2
- data/test/template/active_record_helper_test.rb +83 -12
- data/test/template/asset_tag_helper_test.rb +75 -95
- data/test/template/compiled_templates_test.rb +1 -0
- data/test/template/date_helper_test.rb +873 -181
- data/test/template/deprecated_helper_test.rb +36 -0
- data/test/template/deprecated_instance_variables_test.rb +43 -0
- data/test/template/form_helper_test.rb +77 -1
- data/test/template/form_options_helper_test.rb +4 -0
- data/test/template/form_tag_helper_test.rb +66 -2
- data/test/template/java_script_macros_helper_test.rb +4 -1
- data/test/template/javascript_helper_test.rb +29 -0
- data/test/template/number_helper_test.rb +63 -27
- data/test/template/prototype_helper_test.rb +77 -34
- data/test/template/tag_helper_test.rb +34 -6
- data/test/template/text_helper_test.rb +69 -34
- data/test/template/url_helper_test.rb +168 -16
- data/test/testing_sandbox.rb +7 -22
- metadata +66 -20
- data/filler.txt +0 -50
- data/lib/action_controller/code_generation.rb +0 -235
- data/lib/action_controller/vendor/xml_simple.rb +0 -1019
- data/test/controller/caching_filestore.rb +0 -74
- data/test/fixtures/application_root/app/controllers/a_class_that_contains_a_controller/poorly_placed_controller.rb +0 -7
- data/test/fixtures/application_root/app/controllers/module_that_holds_controllers/nested_controller.rb +0 -3
- data/test/fixtures/application_root/app/models/a_class_that_contains_a_controller.rb +0 -7
- 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
|