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
@@ -1,38 +1,42 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'test/unit/assertions'
|
3
1
|
require 'rexml/document'
|
4
2
|
|
5
|
-
module
|
6
|
-
module
|
7
|
-
module
|
3
|
+
module ActionController #:nodoc:
|
4
|
+
module Assertions #:nodoc:
|
5
|
+
module DeprecatedAssertions
|
8
6
|
def assert_success(message=nil) #:nodoc:
|
9
7
|
assert_response(:success, message)
|
10
8
|
end
|
9
|
+
deprecate :assert_success => "use assert_response(:success)"
|
11
10
|
|
12
11
|
def assert_redirect(message=nil) #:nodoc:
|
13
12
|
assert_response(:redirect, message)
|
14
13
|
end
|
14
|
+
deprecate :assert_redirect => "use assert_response(:redirect)"
|
15
15
|
|
16
16
|
def assert_rendered_file(expected=nil, message=nil) #:nodoc:
|
17
17
|
assert_template(expected, message)
|
18
18
|
end
|
19
|
+
deprecate :assert_rendered_file => :assert_template
|
19
20
|
|
20
21
|
# ensure that the session has an object with the specified name
|
21
22
|
def assert_session_has(key=nil, message=nil) #:nodoc:
|
22
23
|
msg = build_message(message, "<?> is not in the session <?>", key, @response.session)
|
23
24
|
assert_block(msg) { @response.has_session_object?(key) }
|
24
25
|
end
|
26
|
+
deprecate :assert_session_has => "use assert(@response.has_session_object?(key))"
|
25
27
|
|
26
28
|
# ensure that the session has no object with the specified name
|
27
29
|
def assert_session_has_no(key=nil, message=nil) #:nodoc:
|
28
30
|
msg = build_message(message, "<?> is in the session <?>", key, @response.session)
|
29
31
|
assert_block(msg) { !@response.has_session_object?(key) }
|
30
32
|
end
|
33
|
+
deprecate :assert_session_has_no => "use assert(!@response.has_session_object?(key))"
|
31
34
|
|
32
35
|
def assert_session_equal(expected = nil, key = nil, message = nil) #:nodoc:
|
33
36
|
msg = build_message(message, "<?> expected in session['?'] but was <?>", expected, key, @response.session[key])
|
34
37
|
assert_block(msg) { expected == @response.session[key] }
|
35
38
|
end
|
39
|
+
deprecate :assert_session_equal => "use assert_equal(expected, @response[key])"
|
36
40
|
|
37
41
|
# -- cookie assertions ---------------------------------------------------
|
38
42
|
|
@@ -41,6 +45,7 @@ module Test #:nodoc:
|
|
41
45
|
msg = build_message(message, "<?> not expected in cookies['?']", actual, key)
|
42
46
|
assert_block(msg) { actual.nil? or actual.empty? }
|
43
47
|
end
|
48
|
+
deprecate :assert_no_cookie => "use assert(!@response.cookies.key?(key))"
|
44
49
|
|
45
50
|
def assert_cookie_equal(expected = nil, key = nil, message = nil) #:nodoc:
|
46
51
|
actual = @response.cookies[key]
|
@@ -48,6 +53,7 @@ module Test #:nodoc:
|
|
48
53
|
msg = build_message(message, "<?> expected in cookies['?'] but was <?>", expected, key, actual)
|
49
54
|
assert_block(msg) { expected == actual }
|
50
55
|
end
|
56
|
+
deprecate :assert_cookie_equal => "use assert(@response.cookies.key?(key))"
|
51
57
|
|
52
58
|
# -- flash assertions ---------------------------------------------------
|
53
59
|
|
@@ -56,41 +62,48 @@ module Test #:nodoc:
|
|
56
62
|
msg = build_message(message, "<?> is not in the flash <?>", key, @response.flash)
|
57
63
|
assert_block(msg) { @response.has_flash_object?(key) }
|
58
64
|
end
|
65
|
+
deprecate :assert_flash_has => "use assert(@response.has_flash_object?(key))"
|
59
66
|
|
60
67
|
# ensure that the flash has no object with the specified name
|
61
68
|
def assert_flash_has_no(key=nil, message=nil) #:nodoc:
|
62
69
|
msg = build_message(message, "<?> is in the flash <?>", key, @response.flash)
|
63
70
|
assert_block(msg) { !@response.has_flash_object?(key) }
|
64
71
|
end
|
72
|
+
deprecate :assert_flash_has_no => "use assert(!@response.has_flash_object?(key))"
|
65
73
|
|
66
74
|
# ensure the flash exists
|
67
75
|
def assert_flash_exists(message=nil) #:nodoc:
|
68
76
|
msg = build_message(message, "the flash does not exist <?>", @response.session['flash'] )
|
69
77
|
assert_block(msg) { @response.has_flash? }
|
70
78
|
end
|
79
|
+
deprecate :assert_flash_exists => "use assert(@response.has_flash?)"
|
71
80
|
|
72
81
|
# ensure the flash does not exist
|
73
82
|
def assert_flash_not_exists(message=nil) #:nodoc:
|
74
83
|
msg = build_message(message, "the flash exists <?>", @response.flash)
|
75
84
|
assert_block(msg) { !@response.has_flash? }
|
76
85
|
end
|
86
|
+
deprecate :assert_flash_not_exists => "use assert(!@response.has_flash?)"
|
77
87
|
|
78
88
|
# ensure the flash is empty but existent
|
79
89
|
def assert_flash_empty(message=nil) #:nodoc:
|
80
90
|
msg = build_message(message, "the flash is not empty <?>", @response.flash)
|
81
91
|
assert_block(msg) { !@response.has_flash_with_contents? }
|
82
92
|
end
|
93
|
+
deprecate :assert_flash_empty => "use assert(!@response.has_flash_with_contents?)"
|
83
94
|
|
84
95
|
# ensure the flash is not empty
|
85
96
|
def assert_flash_not_empty(message=nil) #:nodoc:
|
86
97
|
msg = build_message(message, "the flash is empty")
|
87
98
|
assert_block(msg) { @response.has_flash_with_contents? }
|
88
99
|
end
|
100
|
+
deprecate :assert_flash_not_empty => "use assert(@response.has_flash_with_contents?)"
|
89
101
|
|
90
102
|
def assert_flash_equal(expected = nil, key = nil, message = nil) #:nodoc:
|
91
103
|
msg = build_message(message, "<?> expected in flash['?'] but was <?>", expected, key, @response.flash[key])
|
92
104
|
assert_block(msg) { expected == @response.flash[key] }
|
93
105
|
end
|
106
|
+
deprecate :assert_flash_equal => "use assert_equal(expected, @response.flash[key])"
|
94
107
|
|
95
108
|
|
96
109
|
# ensure our redirection url is an exact match
|
@@ -99,6 +112,7 @@ module Test #:nodoc:
|
|
99
112
|
msg = build_message(message, "<?> is not the redirected location <?>", url, @response.redirect_url)
|
100
113
|
assert_block(msg) { @response.redirect_url == url }
|
101
114
|
end
|
115
|
+
deprecate :assert_redirect_url => "use assert_equal(url, @response.redirect_url)"
|
102
116
|
|
103
117
|
# ensure our redirection url matches a pattern
|
104
118
|
def assert_redirect_url_match(pattern=nil, message=nil) #:nodoc:
|
@@ -106,6 +120,7 @@ module Test #:nodoc:
|
|
106
120
|
msg = build_message(message, "<?> was not found in the location: <?>", pattern, @response.redirect_url)
|
107
121
|
assert_block(msg) { @response.redirect_url_match?(pattern) }
|
108
122
|
end
|
123
|
+
deprecate :assert_redirect_url_match => "use assert(@response.redirect_url_match?(pattern))"
|
109
124
|
|
110
125
|
|
111
126
|
# -- template assertions ------------------------------------------------
|
@@ -115,12 +130,14 @@ module Test #:nodoc:
|
|
115
130
|
msg = build_message(message, "<?> is not a template object", key )
|
116
131
|
assert_block(msg) { @response.has_template_object?(key) }
|
117
132
|
end
|
133
|
+
deprecate :assert_template_has => "use assert(@response.has_template_object?(key))"
|
118
134
|
|
119
135
|
# ensure that a template object with the given name does not exist
|
120
136
|
def assert_template_has_no(key=nil,message=nil) #:nodoc:
|
121
137
|
msg = build_message(message, "<?> is a template object <?>", key, @response.template_objects[key])
|
122
138
|
assert_block(msg) { !@response.has_template_object?(key) }
|
123
139
|
end
|
140
|
+
deprecate :assert_template_has_no => "use assert(!@response.has_template_object?(key))"
|
124
141
|
|
125
142
|
# ensures that the object assigned to the template on +key+ is equal to +expected+ object.
|
126
143
|
def assert_template_equal(expected = nil, key = nil, message = nil) #:nodoc:
|
@@ -128,6 +145,8 @@ module Test #:nodoc:
|
|
128
145
|
assert_block(msg) { expected == @response.template.assigns[key.to_s] }
|
129
146
|
end
|
130
147
|
alias_method :assert_assigned_equal, :assert_template_equal
|
148
|
+
deprecate :assert_assigned_equal => "use assert_equal(expected, @response.template.assigns[key.to_s])"
|
149
|
+
deprecate :assert_template_equal => "use assert_equal(expected, @response.template.assigns[key.to_s])"
|
131
150
|
|
132
151
|
# Asserts that the template returns the +expected+ string or array based on the XPath +expression+.
|
133
152
|
# This will only work if the template rendered a valid XML document.
|
@@ -145,6 +164,7 @@ module Test #:nodoc:
|
|
145
164
|
msg = build_message(message, "<?> found <?>, not <?>", expression, matches, expected)
|
146
165
|
assert_block(msg) { matches == expected }
|
147
166
|
end
|
167
|
+
deprecate :assert_template_xpath_match => "you should use assert_tag, instead"
|
148
168
|
|
149
169
|
# Assert the template object with the given name is an Active Record descendant and is valid.
|
150
170
|
def assert_valid_record(key = nil, message = nil) #:nodoc:
|
@@ -152,6 +172,7 @@ module Test #:nodoc:
|
|
152
172
|
msg = build_message(message, "Active Record is invalid <?>)", record.errors.full_messages)
|
153
173
|
assert_block(msg) { record.valid? }
|
154
174
|
end
|
175
|
+
deprecate :assert_valid_record => "use assert(assigns(key).valid?)"
|
155
176
|
|
156
177
|
# Assert the template object with the given name is an Active Record descendant and is invalid.
|
157
178
|
def assert_invalid_record(key = nil, message = nil) #:nodoc:
|
@@ -159,6 +180,7 @@ module Test #:nodoc:
|
|
159
180
|
msg = build_message(message, "Active Record is valid)")
|
160
181
|
assert_block(msg) { !record.valid? }
|
161
182
|
end
|
183
|
+
deprecate :assert_invalid_record => "use assert(!assigns(key).valid?)"
|
162
184
|
|
163
185
|
# Assert the template object with the given name is an Active Record descendant and the specified column(s) are valid.
|
164
186
|
def assert_valid_column_on_record(key = nil, columns = "", message = nil) #:nodoc:
|
@@ -170,6 +192,7 @@ module Test #:nodoc:
|
|
170
192
|
msg = build_message(message, "Active Record has invalid columns <?>)", cols.join(",") )
|
171
193
|
assert_block(msg) { cols.empty? }
|
172
194
|
end
|
195
|
+
deprecate :assert_valid_column_on_record => "use assert(!record.errors.invalid?(column)) instead"
|
173
196
|
|
174
197
|
# Assert the template object with the given name is an Active Record descendant and the specified column(s) are invalid.
|
175
198
|
def assert_invalid_column_on_record(key = nil, columns = "", message = nil) #:nodoc:
|
@@ -181,6 +204,7 @@ module Test #:nodoc:
|
|
181
204
|
msg = build_message(message, "Active Record has valid columns <?>)", cols.join(",") )
|
182
205
|
assert_block(msg) { cols.empty? }
|
183
206
|
end
|
207
|
+
deprecate :assert_invalid_column_on_record => "use assert(record.errors.invalid?(column)) instead"
|
184
208
|
|
185
209
|
private
|
186
210
|
def glue_columns(columns)
|
@@ -191,14 +215,14 @@ module Test #:nodoc:
|
|
191
215
|
end
|
192
216
|
|
193
217
|
def find_record_in_template(key = nil)
|
194
|
-
|
218
|
+
assert_not_nil assigns(key)
|
195
219
|
record = @response.template_objects[key]
|
196
220
|
|
197
221
|
assert_not_nil(record)
|
198
222
|
assert_kind_of ActiveRecord::Base, record
|
199
223
|
|
200
224
|
return record
|
201
|
-
end
|
225
|
+
end
|
202
226
|
end
|
203
227
|
end
|
204
|
-
end
|
228
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module ActionController
|
2
|
+
module Assertions
|
3
|
+
module DomAssertions
|
4
|
+
# test 2 html strings to be equivalent, i.e. identical up to reordering of attributes
|
5
|
+
def assert_dom_equal(expected, actual, message="")
|
6
|
+
clean_backtrace do
|
7
|
+
expected_dom = HTML::Document.new(expected).root
|
8
|
+
actual_dom = HTML::Document.new(actual).root
|
9
|
+
full_message = build_message(message, "<?> expected to be == to\n<?>.", expected_dom.to_s, actual_dom.to_s)
|
10
|
+
assert_block(full_message) { expected_dom == actual_dom }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# negated form of +assert_dom_equivalent+
|
15
|
+
def assert_dom_not_equal(expected, actual, message="")
|
16
|
+
clean_backtrace do
|
17
|
+
expected_dom = HTML::Document.new(expected).root
|
18
|
+
actual_dom = HTML::Document.new(actual).root
|
19
|
+
full_message = build_message(message, "<?> expected to be != to\n<?>.", expected_dom.to_s, actual_dom.to_s)
|
20
|
+
assert_block(full_message) { expected_dom != actual_dom }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module ActionController
|
2
|
+
module Assertions
|
3
|
+
module ModelAssertions
|
4
|
+
# ensures that the passed record is valid by active record standards. returns the error messages if not
|
5
|
+
def assert_valid(record)
|
6
|
+
clean_backtrace do
|
7
|
+
assert record.valid?, record.errors.full_messages.join("\n")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
require File.dirname(__FILE__) + "/../vendor/html-scanner/html/document"
|
3
|
+
|
4
|
+
module ActionController
|
5
|
+
module Assertions
|
6
|
+
module ResponseAssertions
|
7
|
+
# Asserts that the response is one of the following types:
|
8
|
+
#
|
9
|
+
# * <tt>:success</tt>: Status code was 200
|
10
|
+
# * <tt>:redirect</tt>: Status code was in the 300-399 range
|
11
|
+
# * <tt>:missing</tt>: Status code was 404
|
12
|
+
# * <tt>:error</tt>: Status code was in the 500-599 range
|
13
|
+
#
|
14
|
+
# You can also pass an explicit status number like assert_response(501)
|
15
|
+
# or its symbolic equivalent assert_response(:not_implemented).
|
16
|
+
# See ActionController::StatusCodes for a full list.
|
17
|
+
def assert_response(type, message = nil)
|
18
|
+
clean_backtrace do
|
19
|
+
if [ :success, :missing, :redirect, :error ].include?(type) && @response.send("#{type}?")
|
20
|
+
assert_block("") { true } # to count the assertion
|
21
|
+
elsif type.is_a?(Fixnum) && @response.response_code == type
|
22
|
+
assert_block("") { true } # to count the assertion
|
23
|
+
elsif type.is_a?(Symbol) && @response.response_code == ActionController::StatusCodes::SYMBOL_TO_STATUS_CODE[type]
|
24
|
+
assert_block("") { true } # to count the assertion
|
25
|
+
else
|
26
|
+
assert_block(build_message(message, "Expected response to be a <?>, but was <?>", type, @response.response_code)) { false }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Assert that the redirection options passed in match those of the redirect called in the latest action. This match can be partial,
|
32
|
+
# such that assert_redirected_to(:controller => "weblog") will also match the redirection of
|
33
|
+
# redirect_to(:controller => "weblog", :action => "show") and so on.
|
34
|
+
def assert_redirected_to(options = {}, message=nil)
|
35
|
+
clean_backtrace do
|
36
|
+
assert_response(:redirect, message)
|
37
|
+
return true if options == @response.redirected_to
|
38
|
+
ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty?
|
39
|
+
|
40
|
+
begin
|
41
|
+
url = {}
|
42
|
+
original = { :expected => options, :actual => @response.redirected_to.is_a?(Symbol) ? @response.redirected_to : @response.redirected_to.dup }
|
43
|
+
original.each do |key, value|
|
44
|
+
if value.is_a?(Symbol)
|
45
|
+
value = @controller.respond_to?(value, true) ? @controller.send(value) : @controller.send("hash_for_#{value}_url")
|
46
|
+
end
|
47
|
+
|
48
|
+
unless value.is_a?(Hash)
|
49
|
+
request = case value
|
50
|
+
when NilClass then nil
|
51
|
+
when /^\w+:\/\// then recognized_request_for(%r{^(\w+://.*?(/|$|\?))(.*)$} =~ value ? $3 : nil)
|
52
|
+
else recognized_request_for(value)
|
53
|
+
end
|
54
|
+
value = request.path_parameters if request
|
55
|
+
end
|
56
|
+
|
57
|
+
if value.is_a?(Hash) # stringify 2 levels of hash keys
|
58
|
+
if name = value.delete(:use_route)
|
59
|
+
route = ActionController::Routing::Routes.named_routes[name]
|
60
|
+
value.update(route.parameter_shell)
|
61
|
+
end
|
62
|
+
|
63
|
+
value.stringify_keys!
|
64
|
+
value.values.select { |v| v.is_a?(Hash) }.collect { |v| v.stringify_keys! }
|
65
|
+
if key == :expected && value['controller'] == @controller.controller_name && original[:actual].is_a?(Hash)
|
66
|
+
original[:actual].stringify_keys!
|
67
|
+
value.delete('controller') if original[:actual]['controller'].nil? || original[:actual]['controller'] == value['controller']
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
if value.respond_to?(:[]) && value['controller']
|
72
|
+
if key == :actual && value['controller'].first != '/' && !value['controller'].include?('/')
|
73
|
+
new_controller_path = ActionController::Routing.controller_relative_to(value['controller'], @controller.class.controller_path)
|
74
|
+
value['controller'] = new_controller_path if value['controller'] != new_controller_path && ActionController::Routing.possible_controllers.include?(new_controller_path)
|
75
|
+
end
|
76
|
+
value['controller'] = value['controller'][1..-1] if value['controller'].first == '/' # strip leading hash
|
77
|
+
end
|
78
|
+
url[key] = value
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
@response_diff = url[:expected].diff(url[:actual]) if url[:actual]
|
83
|
+
msg = build_message(message, "response is not a redirection to all of the options supplied (redirection is <?>), difference: <?>",
|
84
|
+
url[:actual], @response_diff)
|
85
|
+
|
86
|
+
assert_block(msg) do
|
87
|
+
url[:expected].keys.all? do |k|
|
88
|
+
if k == :controller then url[:expected][k] == ActionController::Routing.controller_relative_to(url[:actual][k], @controller.class.controller_path)
|
89
|
+
else parameterize(url[:expected][k]) == parameterize(url[:actual][k])
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
rescue ActionController::RoutingError # routing failed us, so match the strings only.
|
94
|
+
msg = build_message(message, "expected a redirect to <?>, found one to <?>", options, @response.redirect_url)
|
95
|
+
url_regexp = %r{^(\w+://.*?(/|$|\?))(.*)$}
|
96
|
+
eurl, epath, url, path = [options, @response.redirect_url].collect do |url|
|
97
|
+
u, p = (url_regexp =~ url) ? [$1, $3] : [nil, url]
|
98
|
+
[u, (p.first == '/') ? p : '/' + p]
|
99
|
+
end.flatten
|
100
|
+
|
101
|
+
assert_equal(eurl, url, msg) if eurl && url
|
102
|
+
assert_equal(epath, path, msg) if epath && path
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# Asserts that the request was rendered with the appropriate template file.
|
108
|
+
def assert_template(expected = nil, message=nil)
|
109
|
+
clean_backtrace do
|
110
|
+
rendered = expected ? @response.rendered_file(!expected.include?('/')) : @response.rendered_file
|
111
|
+
msg = build_message(message, "expecting <?> but rendering with <?>", expected, rendered)
|
112
|
+
assert_block(msg) do
|
113
|
+
if expected.nil?
|
114
|
+
!@response.rendered_with_file?
|
115
|
+
else
|
116
|
+
expected == rendered
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
private
|
123
|
+
def recognized_request_for(path, request_method = nil)
|
124
|
+
path = "/#{path}" unless path.first == '/'
|
125
|
+
|
126
|
+
# Assume given controller
|
127
|
+
request = ActionController::TestRequest.new({}, {}, nil)
|
128
|
+
request.env["REQUEST_METHOD"] = request_method.to_s.upcase if request_method
|
129
|
+
request.path = path
|
130
|
+
|
131
|
+
ActionController::Routing::Routes.recognize(request)
|
132
|
+
request
|
133
|
+
end
|
134
|
+
|
135
|
+
def parameterize(value)
|
136
|
+
value.respond_to?(:to_param) ? value.to_param : value
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module ActionController
|
2
|
+
module Assertions
|
3
|
+
module RoutingAssertions
|
4
|
+
# Asserts that the routing of the given path was handled correctly and that the parsed options match.
|
5
|
+
#
|
6
|
+
# assert_recognizes({:controller => 'items', :action => 'index'}, 'items')
|
7
|
+
#
|
8
|
+
# Pass a hash in the second argument to specify the request method. This is useful for routes
|
9
|
+
# requiring a specific method.
|
10
|
+
#
|
11
|
+
# assert_recognizes({:controller => 'items', :action => 'create'}, {:path => 'items', :method => :post})
|
12
|
+
#
|
13
|
+
def assert_recognizes(expected_options, path, extras={}, message=nil)
|
14
|
+
if path.is_a? Hash
|
15
|
+
request_method = path[:method]
|
16
|
+
path = path[:path]
|
17
|
+
else
|
18
|
+
request_method = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
clean_backtrace do
|
22
|
+
ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty?
|
23
|
+
request = recognized_request_for(path, request_method)
|
24
|
+
|
25
|
+
expected_options = expected_options.clone
|
26
|
+
extras.each_key { |key| expected_options.delete key } unless extras.nil?
|
27
|
+
|
28
|
+
expected_options.stringify_keys!
|
29
|
+
routing_diff = expected_options.diff(request.path_parameters)
|
30
|
+
msg = build_message(message, "The recognized options <?> did not match <?>, difference: <?>",
|
31
|
+
request.path_parameters, expected_options, expected_options.diff(request.path_parameters))
|
32
|
+
assert_block(msg) { request.path_parameters == expected_options }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Asserts that the provided options can be used to generate the provided path.
|
37
|
+
def assert_generates(expected_path, options, defaults={}, extras = {}, message=nil)
|
38
|
+
clean_backtrace do
|
39
|
+
expected_path = "/#{expected_path}" unless expected_path[0] == ?/
|
40
|
+
# Load routes.rb if it hasn't been loaded.
|
41
|
+
ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty?
|
42
|
+
|
43
|
+
generated_path, extra_keys = ActionController::Routing::Routes.generate_extras(options, defaults)
|
44
|
+
found_extras = options.reject {|k, v| ! extra_keys.include? k}
|
45
|
+
|
46
|
+
msg = build_message(message, "found extras <?>, not <?>", found_extras, extras)
|
47
|
+
assert_block(msg) { found_extras == extras }
|
48
|
+
|
49
|
+
msg = build_message(message, "The generated path <?> did not match <?>", generated_path,
|
50
|
+
expected_path)
|
51
|
+
assert_block(msg) { expected_path == generated_path }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Asserts that path and options match both ways; in other words, the URL generated from
|
56
|
+
# options is the same as path, and also that the options recognized from path are the same as options
|
57
|
+
def assert_routing(path, options, defaults={}, extras={}, message=nil)
|
58
|
+
assert_recognizes(options, path, extras, message)
|
59
|
+
|
60
|
+
controller, default_controller = options[:controller], defaults[:controller]
|
61
|
+
if controller && controller.include?(?/) && default_controller && default_controller.include?(?/)
|
62
|
+
options[:controller] = "/#{controller}"
|
63
|
+
end
|
64
|
+
|
65
|
+
assert_generates(path, options, defaults, extras, message)
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
def recognized_request_for(path, request_method = nil)
|
70
|
+
path = "/#{path}" unless path.first == '/'
|
71
|
+
|
72
|
+
# Assume given controller
|
73
|
+
request = ActionController::TestRequest.new({}, {}, nil)
|
74
|
+
request.env["REQUEST_METHOD"] = request_method.to_s.upcase if request_method
|
75
|
+
request.path = path
|
76
|
+
|
77
|
+
ActionController::Routing::Routes.recognize(request)
|
78
|
+
request
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|