actionpack 3.2.22.5 → 4.0.0.beta1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +641 -418
- data/MIT-LICENSE +1 -1
- data/README.rdoc +5 -288
- data/lib/abstract_controller.rb +1 -8
- data/lib/abstract_controller/asset_paths.rb +2 -2
- data/lib/abstract_controller/base.rb +39 -37
- data/lib/abstract_controller/callbacks.rb +101 -82
- data/lib/abstract_controller/collector.rb +7 -3
- data/lib/abstract_controller/helpers.rb +23 -11
- data/lib/abstract_controller/layouts.rb +68 -73
- data/lib/abstract_controller/logger.rb +1 -2
- data/lib/abstract_controller/rendering.rb +22 -13
- data/lib/abstract_controller/translation.rb +16 -1
- data/lib/abstract_controller/url_for.rb +6 -6
- data/lib/abstract_controller/view_paths.rb +1 -1
- data/lib/action_controller.rb +15 -6
- data/lib/action_controller/base.rb +46 -22
- data/lib/action_controller/caching.rb +46 -33
- data/lib/action_controller/caching/fragments.rb +23 -53
- data/lib/action_controller/deprecated.rb +5 -1
- data/lib/action_controller/deprecated/integration_test.rb +3 -0
- data/lib/action_controller/log_subscriber.rb +11 -8
- data/lib/action_controller/metal.rb +16 -30
- data/lib/action_controller/metal/conditional_get.rb +76 -32
- data/lib/action_controller/metal/data_streaming.rb +20 -26
- data/lib/action_controller/metal/exceptions.rb +19 -6
- data/lib/action_controller/metal/flash.rb +24 -9
- data/lib/action_controller/metal/force_ssl.rb +32 -9
- data/lib/action_controller/metal/head.rb +25 -4
- data/lib/action_controller/metal/helpers.rb +6 -9
- data/lib/action_controller/metal/hide_actions.rb +1 -2
- data/lib/action_controller/metal/http_authentication.rb +105 -87
- data/lib/action_controller/metal/implicit_render.rb +1 -1
- data/lib/action_controller/metal/instrumentation.rb +2 -1
- data/lib/action_controller/metal/live.rb +141 -0
- data/lib/action_controller/metal/mime_responds.rb +161 -47
- data/lib/action_controller/metal/params_wrapper.rb +112 -74
- data/lib/action_controller/metal/rack_delegation.rb +9 -3
- data/lib/action_controller/metal/redirecting.rb +15 -20
- data/lib/action_controller/metal/renderers.rb +11 -9
- data/lib/action_controller/metal/rendering.rb +8 -0
- data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
- data/lib/action_controller/metal/responder.rb +20 -19
- data/lib/action_controller/metal/streaming.rb +12 -18
- data/lib/action_controller/metal/strong_parameters.rb +516 -0
- data/lib/action_controller/metal/testing.rb +13 -18
- data/lib/action_controller/metal/url_for.rb +27 -25
- data/lib/action_controller/model_naming.rb +12 -0
- data/lib/action_controller/railtie.rb +33 -17
- data/lib/action_controller/railties/helpers.rb +22 -0
- data/lib/action_controller/record_identifier.rb +18 -72
- data/lib/action_controller/test_case.rb +215 -123
- data/lib/action_controller/vendor/html-scanner.rb +4 -19
- data/lib/action_dispatch.rb +27 -19
- data/lib/action_dispatch/http/cache.rb +63 -11
- data/lib/action_dispatch/http/filter_parameters.rb +18 -8
- data/lib/action_dispatch/http/filter_redirect.rb +37 -0
- data/lib/action_dispatch/http/headers.rb +27 -19
- data/lib/action_dispatch/http/mime_negotiation.rb +25 -2
- data/lib/action_dispatch/http/mime_type.rb +145 -113
- data/lib/action_dispatch/http/mime_types.rb +1 -1
- data/lib/action_dispatch/http/parameter_filter.rb +44 -46
- data/lib/action_dispatch/http/parameters.rb +12 -5
- data/lib/action_dispatch/http/rack_cache.rb +2 -3
- data/lib/action_dispatch/http/request.rb +49 -18
- data/lib/action_dispatch/http/response.rb +129 -35
- data/lib/action_dispatch/http/upload.rb +60 -17
- data/lib/action_dispatch/http/url.rb +53 -31
- data/lib/action_dispatch/journey.rb +5 -0
- data/lib/action_dispatch/journey/backwards.rb +5 -0
- data/lib/action_dispatch/journey/formatter.rb +146 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
- data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
- data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
- data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
- data/lib/action_dispatch/journey/nodes/node.rb +124 -0
- data/lib/action_dispatch/journey/parser.rb +206 -0
- data/lib/action_dispatch/journey/parser.y +47 -0
- data/lib/action_dispatch/journey/parser_extras.rb +23 -0
- data/lib/action_dispatch/journey/path/pattern.rb +196 -0
- data/lib/action_dispatch/journey/route.rb +116 -0
- data/lib/action_dispatch/journey/router.rb +164 -0
- data/lib/action_dispatch/journey/router/strexp.rb +24 -0
- data/lib/action_dispatch/journey/router/utils.rb +54 -0
- data/lib/action_dispatch/journey/routes.rb +75 -0
- data/lib/action_dispatch/journey/scanner.rb +61 -0
- data/lib/action_dispatch/journey/visitors.rb +189 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/middleware/callbacks.rb +9 -4
- data/lib/action_dispatch/middleware/cookies.rb +168 -57
- data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
- data/lib/action_dispatch/middleware/exception_wrapper.rb +27 -3
- data/lib/action_dispatch/middleware/flash.rb +58 -58
- data/lib/action_dispatch/middleware/params_parser.rb +14 -29
- data/lib/action_dispatch/middleware/public_exceptions.rb +31 -14
- data/lib/action_dispatch/middleware/reloader.rb +6 -6
- data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
- data/lib/action_dispatch/middleware/request_id.rb +2 -6
- data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
- data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
- data/lib/action_dispatch/middleware/session/cookie_store.rb +81 -7
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
- data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
- data/lib/action_dispatch/middleware/ssl.rb +70 -0
- data/lib/action_dispatch/middleware/stack.rb +6 -1
- data/lib/action_dispatch/middleware/static.rb +5 -24
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
- data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +3 -3
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +121 -5
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
- data/lib/action_dispatch/railtie.rb +16 -6
- data/lib/action_dispatch/request/session.rb +181 -0
- data/lib/action_dispatch/routing.rb +41 -40
- data/lib/action_dispatch/routing/inspector.rb +240 -0
- data/lib/action_dispatch/routing/mapper.rb +501 -273
- data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
- data/lib/action_dispatch/routing/redirection.rb +46 -29
- data/lib/action_dispatch/routing/route_set.rb +203 -164
- data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
- data/lib/action_dispatch/routing/url_for.rb +48 -33
- data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
- data/lib/action_dispatch/testing/assertions/response.rb +32 -40
- data/lib/action_dispatch/testing/assertions/routing.rb +40 -39
- data/lib/action_dispatch/testing/assertions/selector.rb +15 -20
- data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
- data/lib/action_dispatch/testing/integration.rb +41 -22
- data/lib/action_dispatch/testing/test_process.rb +9 -6
- data/lib/action_dispatch/testing/test_request.rb +7 -3
- data/lib/action_pack.rb +1 -1
- data/lib/action_pack/version.rb +4 -4
- data/lib/action_view.rb +17 -8
- data/lib/action_view/base.rb +15 -34
- data/lib/action_view/buffers.rb +1 -1
- data/lib/action_view/context.rb +4 -4
- data/lib/action_view/dependency_tracker.rb +91 -0
- data/lib/action_view/digestor.rb +85 -0
- data/lib/action_view/flows.rb +1 -4
- data/lib/action_view/helpers.rb +2 -4
- data/lib/action_view/helpers/active_model_helper.rb +3 -4
- data/lib/action_view/helpers/asset_tag_helper.rb +211 -353
- data/lib/action_view/helpers/asset_url_helper.rb +354 -0
- data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
- data/lib/action_view/helpers/cache_helper.rb +150 -18
- data/lib/action_view/helpers/capture_helper.rb +42 -29
- data/lib/action_view/helpers/csrf_helper.rb +0 -2
- data/lib/action_view/helpers/date_helper.rb +268 -247
- data/lib/action_view/helpers/debug_helper.rb +10 -11
- data/lib/action_view/helpers/form_helper.rb +904 -547
- data/lib/action_view/helpers/form_options_helper.rb +341 -166
- data/lib/action_view/helpers/form_tag_helper.rb +188 -88
- data/lib/action_view/helpers/javascript_helper.rb +23 -16
- data/lib/action_view/helpers/number_helper.rb +148 -354
- data/lib/action_view/helpers/output_safety_helper.rb +3 -3
- data/lib/action_view/helpers/record_tag_helper.rb +17 -22
- data/lib/action_view/helpers/rendering_helper.rb +2 -4
- data/lib/action_view/helpers/sanitize_helper.rb +3 -6
- data/lib/action_view/helpers/tag_helper.rb +43 -37
- data/lib/action_view/helpers/tags.rb +39 -0
- data/lib/action_view/helpers/tags/base.rb +148 -0
- data/lib/action_view/helpers/tags/check_box.rb +64 -0
- data/lib/action_view/helpers/tags/checkable.rb +16 -0
- data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
- data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
- data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
- data/lib/action_view/helpers/tags/collection_select.rb +28 -0
- data/lib/action_view/helpers/tags/color_field.rb +25 -0
- data/lib/action_view/helpers/tags/date_field.rb +13 -0
- data/lib/action_view/helpers/tags/date_select.rb +72 -0
- data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
- data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
- data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
- data/lib/action_view/helpers/tags/email_field.rb +8 -0
- data/lib/action_view/helpers/tags/file_field.rb +8 -0
- data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
- data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
- data/lib/action_view/helpers/tags/label.rb +65 -0
- data/lib/action_view/helpers/tags/month_field.rb +13 -0
- data/lib/action_view/helpers/tags/number_field.rb +18 -0
- data/lib/action_view/helpers/tags/password_field.rb +12 -0
- data/lib/action_view/helpers/tags/radio_button.rb +31 -0
- data/lib/action_view/helpers/tags/range_field.rb +8 -0
- data/lib/action_view/helpers/tags/search_field.rb +24 -0
- data/lib/action_view/helpers/tags/select.rb +41 -0
- data/lib/action_view/helpers/tags/tel_field.rb +8 -0
- data/lib/action_view/helpers/tags/text_area.rb +18 -0
- data/lib/action_view/helpers/tags/text_field.rb +29 -0
- data/lib/action_view/helpers/tags/time_field.rb +13 -0
- data/lib/action_view/helpers/tags/time_select.rb +8 -0
- data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
- data/lib/action_view/helpers/tags/url_field.rb +8 -0
- data/lib/action_view/helpers/tags/week_field.rb +13 -0
- data/lib/action_view/helpers/text_helper.rb +126 -113
- data/lib/action_view/helpers/translation_helper.rb +32 -16
- data/lib/action_view/helpers/url_helper.rb +200 -271
- data/lib/action_view/locale/en.yml +1 -105
- data/lib/action_view/log_subscriber.rb +6 -4
- data/lib/action_view/lookup_context.rb +15 -39
- data/lib/action_view/model_naming.rb +12 -0
- data/lib/action_view/path_set.rb +9 -39
- data/lib/action_view/railtie.rb +6 -22
- data/lib/action_view/record_identifier.rb +84 -0
- data/lib/action_view/renderer/abstract_renderer.rb +10 -19
- data/lib/action_view/renderer/partial_renderer.rb +144 -81
- data/lib/action_view/renderer/renderer.rb +2 -19
- data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
- data/lib/action_view/renderer/template_renderer.rb +14 -13
- data/lib/action_view/routing_url_for.rb +107 -0
- data/lib/action_view/template.rb +22 -21
- data/lib/action_view/template/error.rb +22 -12
- data/lib/action_view/template/handlers.rb +12 -9
- data/lib/action_view/template/handlers/builder.rb +1 -1
- data/lib/action_view/template/handlers/erb.rb +11 -16
- data/lib/action_view/template/handlers/raw.rb +11 -0
- data/lib/action_view/template/resolver.rb +111 -83
- data/lib/action_view/template/text.rb +12 -8
- data/lib/action_view/template/types.rb +57 -0
- data/lib/action_view/test_case.rb +66 -43
- data/lib/action_view/testing/resolvers.rb +3 -2
- data/lib/action_view/vendor/html-scanner.rb +20 -0
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +18 -7
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +1 -1
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
- metadata +135 -125
- data/lib/action_controller/caching/actions.rb +0 -185
- data/lib/action_controller/caching/pages.rb +0 -187
- data/lib/action_controller/caching/sweeping.rb +0 -97
- data/lib/action_controller/deprecated/performance_test.rb +0 -1
- data/lib/action_controller/metal/compatibility.rb +0 -65
- data/lib/action_controller/metal/session_management.rb +0 -14
- data/lib/action_controller/railties/paths.rb +0 -25
- data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
- data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
- data/lib/action_dispatch/middleware/head.rb +0 -18
- data/lib/action_dispatch/middleware/rescue.rb +0 -26
- data/lib/action_dispatch/testing/performance_test.rb +0 -10
- data/lib/action_view/asset_paths.rb +0 -142
- data/lib/action_view/helpers/asset_paths.rb +0 -7
- data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
- data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
- data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
- data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
- data/lib/sprockets/assets.rake +0 -99
- data/lib/sprockets/bootstrap.rb +0 -37
- data/lib/sprockets/compressors.rb +0 -83
- data/lib/sprockets/helpers.rb +0 -6
- data/lib/sprockets/helpers/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/railtie.rb +0 -62
- data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'action_view/vendor/html-scanner'
|
2
2
|
require 'active_support/core_ext/object/inclusion'
|
3
3
|
|
4
4
|
#--
|
@@ -39,7 +39,6 @@ module ActionDispatch
|
|
39
39
|
# The selector may be a CSS selector expression (String), an expression
|
40
40
|
# with substitution values (Array) or an HTML::Selector object.
|
41
41
|
#
|
42
|
-
# ==== Examples
|
43
42
|
# # Selects all div tags
|
44
43
|
# divs = css_select("div")
|
45
44
|
#
|
@@ -58,7 +57,6 @@ module ActionDispatch
|
|
58
57
|
# inputs = css_select(form, "input")
|
59
58
|
# ...
|
60
59
|
# end
|
61
|
-
#
|
62
60
|
def css_select(*args)
|
63
61
|
# See assert_select to understand what's going on here.
|
64
62
|
arg = args.shift
|
@@ -157,8 +155,6 @@ module ActionDispatch
|
|
157
155
|
# If the method is called with a block, once all equality tests are
|
158
156
|
# evaluated the block is called with an array of all matched elements.
|
159
157
|
#
|
160
|
-
# ==== Examples
|
161
|
-
#
|
162
158
|
# # At least one form element
|
163
159
|
# assert_select "form"
|
164
160
|
#
|
@@ -169,7 +165,7 @@ module ActionDispatch
|
|
169
165
|
# assert_select "title", "Welcome"
|
170
166
|
#
|
171
167
|
# # Page title is "Welcome" and there is only one title element
|
172
|
-
# assert_select "title", {:
|
168
|
+
# assert_select "title", {count: 1, text: "Welcome"},
|
173
169
|
# "Wrong title or more than one title element"
|
174
170
|
#
|
175
171
|
# # Page contains no forms
|
@@ -271,7 +267,7 @@ module ActionDispatch
|
|
271
267
|
text.strip! unless NO_STRIP.include?(match.name)
|
272
268
|
text.sub!(/\A\n/, '') if match.name == "textarea"
|
273
269
|
unless match_with.is_a?(Regexp) ? (text =~ match_with) : (text == match_with.to_s)
|
274
|
-
content_mismatch ||=
|
270
|
+
content_mismatch ||= sprintf("<%s> expected but was\n<%s>.", match_with, text)
|
275
271
|
true
|
276
272
|
end
|
277
273
|
end
|
@@ -280,7 +276,7 @@ module ActionDispatch
|
|
280
276
|
html = match.children.map(&:to_s).join
|
281
277
|
html.strip! unless NO_STRIP.include?(match.name)
|
282
278
|
unless match_with.is_a?(Regexp) ? (html =~ match_with) : (html == match_with.to_s)
|
283
|
-
content_mismatch ||=
|
279
|
+
content_mismatch ||= sprintf("<%s> expected but was\n<%s>.", match_with, html)
|
284
280
|
true
|
285
281
|
end
|
286
282
|
end
|
@@ -290,12 +286,15 @@ module ActionDispatch
|
|
290
286
|
message ||= content_mismatch if matches.empty?
|
291
287
|
# Test minimum/maximum occurrence.
|
292
288
|
min, max, count = equals[:minimum], equals[:maximum], equals[:count]
|
289
|
+
|
290
|
+
# FIXME: minitest provides messaging when we use assert_operator,
|
291
|
+
# so is this custom message really needed?
|
293
292
|
message = message || %(Expected #{count_description(min, max, count)} matching "#{selector.to_s}", found #{matches.size}.)
|
294
293
|
if count
|
295
|
-
|
294
|
+
assert_equal matches.size, count, message
|
296
295
|
else
|
297
|
-
|
298
|
-
|
296
|
+
assert_operator matches.size, :>=, min, message if min
|
297
|
+
assert_operator matches.size, :<=, max, message if max
|
299
298
|
end
|
300
299
|
|
301
300
|
# If a block is given call that block. Set @selected to allow
|
@@ -337,9 +336,8 @@ module ActionDispatch
|
|
337
336
|
# The content of each element is un-encoded, and wrapped in the root
|
338
337
|
# element +encoded+. It then calls the block with all un-encoded elements.
|
339
338
|
#
|
340
|
-
#
|
341
|
-
#
|
342
|
-
# assert_select_feed :atom, 1.0 do
|
339
|
+
# # Selects all bold tags from within the title of an Atom feed's entries (perhaps to nab a section name prefix)
|
340
|
+
# assert_select "feed[xmlns='http://www.w3.org/2005/Atom']" do
|
343
341
|
# # Select each entry item and then the title item
|
344
342
|
# assert_select "entry>title" do
|
345
343
|
# # Run assertions on the encoded title elements
|
@@ -351,7 +349,7 @@ module ActionDispatch
|
|
351
349
|
#
|
352
350
|
#
|
353
351
|
# # Selects all paragraph tags from within the description of an RSS feed
|
354
|
-
#
|
352
|
+
# assert_select "rss[version=2.0]" do
|
355
353
|
# # Select description element of each feed item.
|
356
354
|
# assert_select "channel>item>description" do
|
357
355
|
# # Run assertions on the encoded elements.
|
@@ -398,8 +396,6 @@ module ActionDispatch
|
|
398
396
|
# You must enable deliveries for this assertion to work, use:
|
399
397
|
# ActionMailer::Base.perform_deliveries = true
|
400
398
|
#
|
401
|
-
# ==== Examples
|
402
|
-
#
|
403
399
|
# assert_select_email do
|
404
400
|
# assert_select "h1", "Email alert"
|
405
401
|
# end
|
@@ -410,13 +406,12 @@ module ActionDispatch
|
|
410
406
|
# # Work with items here...
|
411
407
|
# end
|
412
408
|
# end
|
413
|
-
#
|
414
409
|
def assert_select_email(&block)
|
415
410
|
deliveries = ActionMailer::Base.deliveries
|
416
411
|
assert !deliveries.empty?, "No e-mail in delivery list"
|
417
412
|
|
418
|
-
|
419
|
-
|
413
|
+
deliveries.each do |delivery|
|
414
|
+
(delivery.parts.empty? ? [delivery] : delivery.parts).each do |part|
|
420
415
|
if part["Content-Type"].to_s =~ /^text\/html\W/
|
421
416
|
root = HTML::Document.new(part.body.to_s).root
|
422
417
|
assert_select root, ":root", &block
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'action_view/vendor/html-scanner'
|
2
2
|
|
3
3
|
module ActionDispatch
|
4
4
|
module Assertions
|
@@ -48,47 +48,45 @@ module ActionDispatch
|
|
48
48
|
# * if the condition is +true+, the value must not be +nil+.
|
49
49
|
# * if the condition is +false+ or +nil+, the value must be +nil+.
|
50
50
|
#
|
51
|
-
# === Examples
|
52
|
-
#
|
53
51
|
# # Assert that there is a "span" tag
|
54
|
-
# assert_tag :
|
52
|
+
# assert_tag tag: "span"
|
55
53
|
#
|
56
54
|
# # Assert that there is a "span" tag with id="x"
|
57
|
-
# assert_tag :
|
55
|
+
# assert_tag tag: "span", attributes: { id: "x" }
|
58
56
|
#
|
59
57
|
# # Assert that there is a "span" tag using the short-hand
|
60
58
|
# assert_tag :span
|
61
59
|
#
|
62
60
|
# # Assert that there is a "span" tag with id="x" using the short-hand
|
63
|
-
# assert_tag :span, :
|
61
|
+
# assert_tag :span, attributes: { id: "x" }
|
64
62
|
#
|
65
63
|
# # Assert that there is a "span" inside of a "div"
|
66
|
-
# assert_tag :
|
64
|
+
# assert_tag tag: "span", parent: { tag: "div" }
|
67
65
|
#
|
68
66
|
# # Assert that there is a "span" somewhere inside a table
|
69
|
-
# assert_tag :
|
67
|
+
# assert_tag tag: "span", ancestor: { tag: "table" }
|
70
68
|
#
|
71
69
|
# # Assert that there is a "span" with at least one "em" child
|
72
|
-
# assert_tag :
|
70
|
+
# assert_tag tag: "span", child: { tag: "em" }
|
73
71
|
#
|
74
72
|
# # Assert that there is a "span" containing a (possibly nested)
|
75
73
|
# # "strong" tag.
|
76
|
-
# assert_tag :
|
74
|
+
# assert_tag tag: "span", descendant: { tag: "strong" }
|
77
75
|
#
|
78
76
|
# # Assert that there is a "span" containing between 2 and 4 "em" tags
|
79
77
|
# # as immediate children
|
80
|
-
# assert_tag :
|
81
|
-
# :
|
78
|
+
# assert_tag tag: "span",
|
79
|
+
# children: { count: 2..4, only: { tag: "em" } }
|
82
80
|
#
|
83
81
|
# # Get funky: assert that there is a "div", with an "ul" ancestor
|
84
82
|
# # and an "li" parent (with "class" = "enum"), and containing a
|
85
83
|
# # "span" descendant that contains text matching /hello world/
|
86
|
-
# assert_tag :
|
87
|
-
# :
|
88
|
-
# :
|
89
|
-
# :
|
90
|
-
# :
|
91
|
-
# :
|
84
|
+
# assert_tag tag: "div",
|
85
|
+
# ancestor: { tag: "ul" },
|
86
|
+
# parent: { tag: "li",
|
87
|
+
# attributes: { class: "enum" } },
|
88
|
+
# descendant: { tag: "span",
|
89
|
+
# child: /hello world/ }
|
92
90
|
#
|
93
91
|
# <b>Please note</b>: +assert_tag+ and +assert_no_tag+ only work
|
94
92
|
# with well-formed XHTML. They recognize a few tags as implicitly self-closing
|
@@ -104,17 +102,16 @@ module ActionDispatch
|
|
104
102
|
# Identical to +assert_tag+, but asserts that a matching tag does _not_
|
105
103
|
# exist. (See +assert_tag+ for a full discussion of the syntax.)
|
106
104
|
#
|
107
|
-
# === Examples
|
108
105
|
# # Assert that there is not a "div" containing a "p"
|
109
|
-
# assert_no_tag :
|
106
|
+
# assert_no_tag tag: "div", descendant: { tag: "p" }
|
110
107
|
#
|
111
108
|
# # Assert that an unordered list is empty
|
112
|
-
# assert_no_tag :
|
109
|
+
# assert_no_tag tag: "ul", descendant: { tag: "li" }
|
113
110
|
#
|
114
111
|
# # Assert that there is not a "p" tag with between 1 to 3 "img" tags
|
115
112
|
# # as immediate children
|
116
|
-
# assert_no_tag :
|
117
|
-
# :
|
113
|
+
# assert_no_tag tag: "p",
|
114
|
+
# children: { count: 1..3, only: { tag: "img" } }
|
118
115
|
def assert_no_tag(*opts)
|
119
116
|
opts = opts.size > 1 ? opts.last.merge({ :tag => opts.first.to_s }) : opts.first
|
120
117
|
tag = find_tag(opts)
|
@@ -1,10 +1,9 @@
|
|
1
1
|
require 'stringio'
|
2
2
|
require 'uri'
|
3
3
|
require 'active_support/core_ext/kernel/singleton_class'
|
4
|
-
require 'active_support/core_ext/object/inclusion'
|
5
4
|
require 'active_support/core_ext/object/try'
|
6
5
|
require 'rack/test'
|
7
|
-
require '
|
6
|
+
require 'minitest/unit'
|
8
7
|
|
9
8
|
module ActionDispatch
|
10
9
|
module Integration #:nodoc:
|
@@ -21,14 +20,14 @@ module ActionDispatch
|
|
21
20
|
# - +headers+: Additional headers to pass, as a Hash. The headers will be
|
22
21
|
# merged into the Rack env hash.
|
23
22
|
#
|
24
|
-
# This method returns
|
23
|
+
# This method returns a Response object, which one can use to
|
25
24
|
# inspect the details of the response. Furthermore, if this method was
|
26
25
|
# called from an ActionDispatch::IntegrationTest object, then that
|
27
26
|
# object's <tt>@response</tt> instance variable will point to the same
|
28
27
|
# response object.
|
29
28
|
#
|
30
|
-
# You can also perform POST, PUT, DELETE, and HEAD requests with
|
31
|
-
# +#put+, +#delete+, and +#head+.
|
29
|
+
# You can also perform POST, PATCH, PUT, DELETE, and HEAD requests with
|
30
|
+
# +#post+, +#patch+, +#put+, +#delete+, and +#head+.
|
32
31
|
def get(path, parameters = nil, headers = nil)
|
33
32
|
process :get, path, parameters, headers
|
34
33
|
end
|
@@ -39,6 +38,12 @@ module ActionDispatch
|
|
39
38
|
process :post, path, parameters, headers
|
40
39
|
end
|
41
40
|
|
41
|
+
# Performs a PATCH request with the given parameters. See +#get+ for more
|
42
|
+
# details.
|
43
|
+
def patch(path, parameters = nil, headers = nil)
|
44
|
+
process :patch, path, parameters, headers
|
45
|
+
end
|
46
|
+
|
42
47
|
# Performs a PUT request with the given parameters. See +#get+ for more
|
43
48
|
# details.
|
44
49
|
def put(path, parameters = nil, headers = nil)
|
@@ -57,12 +62,18 @@ module ActionDispatch
|
|
57
62
|
process :head, path, parameters, headers
|
58
63
|
end
|
59
64
|
|
65
|
+
# Performs a OPTIONS request with the given parameters. See +#get+ for
|
66
|
+
# more details.
|
67
|
+
def options(path, parameters = nil, headers = nil)
|
68
|
+
process :options, path, parameters, headers
|
69
|
+
end
|
70
|
+
|
60
71
|
# Performs an XMLHttpRequest request with the given parameters, mirroring
|
61
72
|
# a request from the Prototype library.
|
62
73
|
#
|
63
|
-
# The request_method is +:get+, +:post+, +:put+, +:delete+ or
|
64
|
-
# parameters are +nil+, a hash, or a url-encoded or multipart
|
65
|
-
# the headers are a hash.
|
74
|
+
# The request_method is +:get+, +:post+, +:patch+, +:put+, +:delete+ or
|
75
|
+
# +:head+; the parameters are +nil+, a hash, or a url-encoded or multipart
|
76
|
+
# string; the headers are a hash.
|
66
77
|
def xml_http_request(request_method, path, parameters = nil, headers = nil)
|
67
78
|
headers ||= {}
|
68
79
|
headers['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
@@ -102,6 +113,12 @@ module ActionDispatch
|
|
102
113
|
request_via_redirect(:post, path, parameters, headers)
|
103
114
|
end
|
104
115
|
|
116
|
+
# Performs a PATCH request, following any subsequent redirect.
|
117
|
+
# See +request_via_redirect+ for more information.
|
118
|
+
def patch_via_redirect(path, parameters = nil, headers = nil)
|
119
|
+
request_via_redirect(:patch, path, parameters, headers)
|
120
|
+
end
|
121
|
+
|
105
122
|
# Performs a PUT request, following any subsequent redirect.
|
106
123
|
# See +request_via_redirect+ for more information.
|
107
124
|
def put_via_redirect(path, parameters = nil, headers = nil)
|
@@ -126,7 +143,7 @@ module ActionDispatch
|
|
126
143
|
class Session
|
127
144
|
DEFAULT_HOST = "www.example.com"
|
128
145
|
|
129
|
-
include
|
146
|
+
include MiniTest::Assertions
|
130
147
|
include TestProcess, RequestHelpers, Assertions
|
131
148
|
|
132
149
|
%w( status status_message headers body redirect? ).each do |method|
|
@@ -256,7 +273,7 @@ module ActionDispatch
|
|
256
273
|
if path =~ %r{://}
|
257
274
|
location = URI.parse(path)
|
258
275
|
https! URI::HTTPS === location if location.scheme
|
259
|
-
host! location.host if location.host
|
276
|
+
host! "#{location.host}:#{location.port}" if location.host
|
260
277
|
path = location.query ? "#{location.path}?#{location.query}" : location.path
|
261
278
|
end
|
262
279
|
|
@@ -324,12 +341,12 @@ module ActionDispatch
|
|
324
341
|
@integration_session = Integration::Session.new(app)
|
325
342
|
end
|
326
343
|
|
327
|
-
%w(get post put head delete cookies assigns
|
344
|
+
%w(get post patch put head delete options cookies assigns
|
328
345
|
xml_http_request xhr get_via_redirect post_via_redirect).each do |method|
|
329
346
|
define_method(method) do |*args|
|
330
347
|
reset! unless integration_session
|
331
348
|
# reset the html_document variable, but only for new get/post calls
|
332
|
-
@html_document = nil unless method
|
349
|
+
@html_document = nil unless method == 'cookies' || method == 'assigns'
|
333
350
|
integration_session.__send__(method, *args).tap do
|
334
351
|
copy_session_variables!
|
335
352
|
end
|
@@ -367,7 +384,7 @@ module ActionDispatch
|
|
367
384
|
end
|
368
385
|
|
369
386
|
def default_url_options=(options)
|
370
|
-
integration_session
|
387
|
+
reset! unless integration_session
|
371
388
|
integration_session.default_url_options = options
|
372
389
|
end
|
373
390
|
|
@@ -413,8 +430,8 @@ module ActionDispatch
|
|
413
430
|
# assert_equal 200, status
|
414
431
|
#
|
415
432
|
# # post the login and follow through to the home page
|
416
|
-
# post "/login", :
|
417
|
-
# :
|
433
|
+
# post "/login", username: people(:jamis).username,
|
434
|
+
# password: people(:jamis).password
|
418
435
|
# follow_redirect!
|
419
436
|
# assert_equal 200, status
|
420
437
|
# assert_equal "/home", path
|
@@ -447,13 +464,13 @@ module ActionDispatch
|
|
447
464
|
# module CustomAssertions
|
448
465
|
# def enter(room)
|
449
466
|
# # reference a named route, for maximum internal consistency!
|
450
|
-
# get(room_url(:
|
467
|
+
# get(room_url(id: room.id))
|
451
468
|
# assert(...)
|
452
469
|
# ...
|
453
470
|
# end
|
454
471
|
#
|
455
472
|
# def speak(room, message)
|
456
|
-
# xml_http_request "/say/#{room.id}", :
|
473
|
+
# xml_http_request "/say/#{room.id}", message: message
|
457
474
|
# assert(...)
|
458
475
|
# ...
|
459
476
|
# end
|
@@ -463,8 +480,8 @@ module ActionDispatch
|
|
463
480
|
# open_session do |sess|
|
464
481
|
# sess.extend(CustomAssertions)
|
465
482
|
# who = people(who)
|
466
|
-
# sess.post "/login", :
|
467
|
-
# :
|
483
|
+
# sess.post "/login", username: who.username,
|
484
|
+
# password: who.password
|
468
485
|
# assert(...)
|
469
486
|
# end
|
470
487
|
# end
|
@@ -477,9 +494,11 @@ module ActionDispatch
|
|
477
494
|
@@app = nil
|
478
495
|
|
479
496
|
def self.app
|
480
|
-
|
481
|
-
|
482
|
-
|
497
|
+
if !@@app && !ActionDispatch.test_app
|
498
|
+
ActiveSupport::Deprecation.warn "Rails application fallback is deprecated and no longer works, please set ActionDispatch.test_app"
|
499
|
+
end
|
500
|
+
|
501
|
+
@@app || ActionDispatch.test_app
|
483
502
|
end
|
484
503
|
|
485
504
|
def self.app=(app)
|
@@ -5,7 +5,8 @@ require 'active_support/core_ext/hash/indifferent_access'
|
|
5
5
|
module ActionDispatch
|
6
6
|
module TestProcess
|
7
7
|
def assigns(key = nil)
|
8
|
-
assigns =
|
8
|
+
assigns = {}.with_indifferent_access
|
9
|
+
@controller.view_assigns.each {|k, v| assigns.regular_writer(k, v)}
|
9
10
|
key.nil? ? assigns : assigns[key]
|
10
11
|
end
|
11
12
|
|
@@ -25,17 +26,19 @@ module ActionDispatch
|
|
25
26
|
@response.redirect_url
|
26
27
|
end
|
27
28
|
|
28
|
-
# Shortcut for <tt>Rack::Test::UploadedFile.new(ActionController::TestCase.fixture_path
|
29
|
+
# Shortcut for <tt>Rack::Test::UploadedFile.new(File.join(ActionController::TestCase.fixture_path, path), type)</tt>:
|
29
30
|
#
|
30
|
-
# post :change_avatar, :
|
31
|
+
# post :change_avatar, avatar: fixture_file_upload('files/spongebob.png', 'image/png')
|
31
32
|
#
|
32
33
|
# To upload binary files on Windows, pass <tt>:binary</tt> as the last parameter.
|
33
34
|
# This will not affect other platforms:
|
34
35
|
#
|
35
|
-
# post :change_avatar, :
|
36
|
+
# post :change_avatar, avatar: fixture_file_upload('files/spongebob.png', 'image/png', :binary)
|
36
37
|
def fixture_file_upload(path, mime_type = nil, binary = false)
|
37
|
-
|
38
|
-
|
38
|
+
if self.class.respond_to?(:fixture_path) && self.class.fixture_path
|
39
|
+
path = File.join(self.class.fixture_path, path)
|
40
|
+
end
|
41
|
+
Rack::Test::UploadedFile.new(path, mime_type, binary)
|
39
42
|
end
|
40
43
|
end
|
41
44
|
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
require 'active_support/core_ext/object/blank'
|
2
1
|
require 'active_support/core_ext/hash/indifferent_access'
|
3
|
-
require 'active_support/core_ext/hash/reverse_merge'
|
4
2
|
require 'rack/utils'
|
5
3
|
|
6
4
|
module ActionDispatch
|
@@ -13,7 +11,7 @@ module ActionDispatch
|
|
13
11
|
|
14
12
|
def initialize(env = {})
|
15
13
|
env = Rails.application.env_config.merge(env) if defined?(Rails.application) && Rails.application
|
16
|
-
super(
|
14
|
+
super(default_env.merge(env))
|
17
15
|
|
18
16
|
self.host = 'test.host'
|
19
17
|
self.remote_addr = '0.0.0.0'
|
@@ -70,5 +68,11 @@ module ActionDispatch
|
|
70
68
|
def cookies
|
71
69
|
@cookies ||= {}.with_indifferent_access
|
72
70
|
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def default_env
|
75
|
+
DEFAULT_ENV
|
76
|
+
end
|
73
77
|
end
|
74
78
|
end
|
data/lib/action_pack.rb
CHANGED