actionpack 3.2.19 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +850 -401
- data/MIT-LICENSE +1 -1
- data/README.rdoc +5 -288
- 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 +25 -13
- data/lib/abstract_controller/layouts.rb +74 -74
- data/lib/abstract_controller/logger.rb +1 -2
- data/lib/abstract_controller/rendering.rb +30 -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/abstract_controller.rb +1 -8
- data/lib/action_controller/base.rb +46 -22
- data/lib/action_controller/caching/fragments.rb +23 -53
- data/lib/action_controller/caching.rb +46 -33
- data/lib/action_controller/deprecated/integration_test.rb +3 -0
- data/lib/action_controller/deprecated.rb +5 -1
- data/lib/action_controller/log_subscriber.rb +16 -8
- 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 +70 -12
- data/lib/action_controller/metal/head.rb +25 -4
- data/lib/action_controller/metal/helpers.rb +5 -9
- data/lib/action_controller/metal/hide_actions.rb +0 -1
- data/lib/action_controller/metal/http_authentication.rb +107 -83
- 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 +175 -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 +9 -1
- 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 +520 -0
- data/lib/action_controller/metal/testing.rb +13 -18
- data/lib/action_controller/metal/url_for.rb +28 -25
- data/lib/action_controller/metal.rb +17 -32
- 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 +251 -131
- data/lib/action_controller/vendor/html-scanner.rb +4 -19
- data/lib/action_controller.rb +15 -6
- 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 +49 -17
- data/lib/action_dispatch/http/mime_negotiation.rb +24 -1
- data/lib/action_dispatch/http/mime_type.rb +154 -100
- 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 +28 -28
- data/lib/action_dispatch/http/rack_cache.rb +2 -3
- data/lib/action_dispatch/http/request.rb +64 -18
- data/lib/action_dispatch/http/response.rb +130 -35
- data/lib/action_dispatch/http/upload.rb +63 -20
- data/lib/action_dispatch/http/url.rb +98 -35
- 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 +124 -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/router.rb +166 -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 +197 -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/journey.rb +5 -0
- data/lib/action_dispatch/middleware/callbacks.rb +9 -4
- data/lib/action_dispatch/middleware/cookies.rb +259 -114
- data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
- data/lib/action_dispatch/middleware/exception_wrapper.rb +29 -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 +30 -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/cookie_store.rb +82 -28
- 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 +2 -1
- 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 +7 -9
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +127 -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/inspector.rb +240 -0
- data/lib/action_dispatch/routing/mapper.rb +540 -291
- 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 +207 -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/routing.rb +48 -83
- 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 +42 -41
- data/lib/action_dispatch/testing/assertions/selector.rb +17 -22
- data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
- data/lib/action_dispatch/testing/integration.rb +65 -51
- data/lib/action_dispatch/testing/test_process.rb +9 -6
- data/lib/action_dispatch/testing/test_request.rb +7 -3
- data/lib/action_dispatch.rb +21 -15
- data/lib/action_pack/version.rb +7 -6
- data/lib/action_pack.rb +1 -1
- data/lib/action_view/base.rb +15 -34
- data/lib/action_view/buffers.rb +7 -1
- data/lib/action_view/context.rb +4 -4
- data/lib/action_view/dependency_tracker.rb +93 -0
- data/lib/action_view/digestor.rb +85 -0
- data/lib/action_view/flows.rb +1 -4
- data/lib/action_view/helpers/active_model_helper.rb +3 -4
- data/lib/action_view/helpers/asset_tag_helper.rb +215 -352
- data/lib/action_view/helpers/asset_url_helper.rb +355 -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 +44 -31
- data/lib/action_view/helpers/csrf_helper.rb +0 -2
- data/lib/action_view/helpers/date_helper.rb +269 -248
- data/lib/action_view/helpers/debug_helper.rb +10 -11
- data/lib/action_view/helpers/form_helper.rb +931 -537
- data/lib/action_view/helpers/form_options_helper.rb +341 -166
- data/lib/action_view/helpers/form_tag_helper.rb +190 -90
- data/lib/action_view/helpers/javascript_helper.rb +23 -16
- data/lib/action_view/helpers/number_helper.rb +148 -329
- 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 -2
- data/lib/action_view/helpers/sanitize_helper.rb +3 -6
- data/lib/action_view/helpers/tag_helper.rb +46 -33
- data/lib/action_view/helpers/tags/base.rb +147 -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 +40 -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/tags.rb +39 -0
- data/lib/action_view/helpers/text_helper.rb +130 -114
- data/lib/action_view/helpers/translation_helper.rb +32 -16
- data/lib/action_view/helpers/url_helper.rb +211 -270
- data/lib/action_view/helpers.rb +2 -4
- 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 -28
- data/lib/action_view/model_naming.rb +12 -0
- data/lib/action_view/path_set.rb +8 -20
- 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 +25 -19
- data/lib/action_view/renderer/partial_renderer.rb +158 -81
- data/lib/action_view/renderer/renderer.rb +8 -12
- data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
- data/lib/action_view/renderer/template_renderer.rb +12 -10
- data/lib/action_view/routing_url_for.rb +107 -0
- data/lib/action_view/template/error.rb +22 -12
- data/lib/action_view/template/handlers/builder.rb +1 -1
- data/lib/action_view/template/handlers/erb.rb +40 -19
- data/lib/action_view/template/handlers/raw.rb +11 -0
- data/lib/action_view/template/handlers.rb +12 -9
- data/lib/action_view/template/resolver.rb +107 -53
- data/lib/action_view/template/text.rb +12 -8
- data/lib/action_view/template/types.rb +57 -0
- data/lib/action_view/template.rb +25 -23
- data/lib/action_view/test_case.rb +67 -42
- 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 +13 -2
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +9 -9
- 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
- data/lib/action_view/vendor/html-scanner.rb +20 -0
- data/lib/action_view.rb +17 -8
- metadata +184 -214
- 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/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/helpers.rb +0 -6
- data/lib/sprockets/railtie.rb +0 -62
- data/lib/sprockets/static_compiler.rb +0 -56
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require 'uri'
|
|
2
|
-
require 'active_support/core_ext/hash/diff'
|
|
3
2
|
require 'active_support/core_ext/hash/indifferent_access'
|
|
3
|
+
require 'active_support/core_ext/string/access'
|
|
4
4
|
require 'action_controller/metal/exceptions'
|
|
5
5
|
|
|
6
6
|
module ActionDispatch
|
|
@@ -15,38 +15,40 @@ module ActionDispatch
|
|
|
15
15
|
# and a :method containing the required HTTP verb.
|
|
16
16
|
#
|
|
17
17
|
# # assert that POSTing to /items will call the create action on ItemsController
|
|
18
|
-
# assert_recognizes({:
|
|
18
|
+
# assert_recognizes({controller: 'items', action: 'create'}, {path: 'items', method: :post})
|
|
19
19
|
#
|
|
20
20
|
# You can also pass in +extras+ with a hash containing URL parameters that would normally be in the query string. This can be used
|
|
21
21
|
# to assert that values in the query string string will end up in the params hash correctly. To test query strings you must use the
|
|
22
22
|
# extras argument, appending the query string on the path directly will not work. For example:
|
|
23
23
|
#
|
|
24
24
|
# # assert that a path of '/items/list/1?view=print' returns the correct options
|
|
25
|
-
# assert_recognizes({:
|
|
25
|
+
# assert_recognizes({controller: 'items', action: 'list', id: '1', view: 'print'}, 'items/list/1', { view: "print" })
|
|
26
26
|
#
|
|
27
27
|
# The +message+ parameter allows you to pass in an error message that is displayed upon failure.
|
|
28
28
|
#
|
|
29
|
-
# ==== Examples
|
|
30
29
|
# # Check the default route (i.e., the index action)
|
|
31
|
-
# assert_recognizes({:
|
|
30
|
+
# assert_recognizes({controller: 'items', action: 'index'}, 'items')
|
|
32
31
|
#
|
|
33
32
|
# # Test a specific action
|
|
34
|
-
# assert_recognizes({:
|
|
33
|
+
# assert_recognizes({controller: 'items', action: 'list'}, 'items/list')
|
|
35
34
|
#
|
|
36
35
|
# # Test an action with a parameter
|
|
37
|
-
# assert_recognizes({:
|
|
36
|
+
# assert_recognizes({controller: 'items', action: 'destroy', id: '1'}, 'items/destroy/1')
|
|
38
37
|
#
|
|
39
38
|
# # Test a custom route
|
|
40
|
-
# assert_recognizes({:
|
|
41
|
-
def assert_recognizes(expected_options, path, extras={},
|
|
39
|
+
# assert_recognizes({controller: 'items', action: 'show', id: '1'}, 'view/item1')
|
|
40
|
+
def assert_recognizes(expected_options, path, extras={}, msg=nil)
|
|
42
41
|
request = recognized_request_for(path, extras)
|
|
43
42
|
|
|
44
43
|
expected_options = expected_options.clone
|
|
45
|
-
extras.each_key { |key| expected_options.delete key } unless extras.nil?
|
|
46
44
|
|
|
47
45
|
expected_options.stringify_keys!
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
|
|
47
|
+
msg = message(msg, "") {
|
|
48
|
+
sprintf("The recognized options <%s> did not match <%s>, difference:",
|
|
49
|
+
request.path_parameters, expected_options)
|
|
50
|
+
}
|
|
51
|
+
|
|
50
52
|
assert_equal(expected_options, request.path_parameters, msg)
|
|
51
53
|
end
|
|
52
54
|
|
|
@@ -56,25 +58,22 @@ module ActionDispatch
|
|
|
56
58
|
#
|
|
57
59
|
# The +defaults+ parameter is unused.
|
|
58
60
|
#
|
|
59
|
-
# ==== Examples
|
|
60
61
|
# # Asserts that the default action is generated for a route with no action
|
|
61
|
-
# assert_generates "/items", :
|
|
62
|
+
# assert_generates "/items", controller: "items", action: "index"
|
|
62
63
|
#
|
|
63
64
|
# # Tests that the list action is properly routed
|
|
64
|
-
# assert_generates "/items/list", :
|
|
65
|
+
# assert_generates "/items/list", controller: "items", action: "list"
|
|
65
66
|
#
|
|
66
67
|
# # Tests the generation of a route with a parameter
|
|
67
|
-
# assert_generates "/items/list/1", { :
|
|
68
|
+
# assert_generates "/items/list/1", { controller: "items", action: "list", id: "1" }
|
|
68
69
|
#
|
|
69
70
|
# # Asserts that the generated route gives us our custom route
|
|
70
|
-
# assert_generates "changesets/12", { :
|
|
71
|
+
# assert_generates "changesets/12", { controller: 'scm', action: 'show_diff', revision: "12" }
|
|
71
72
|
def assert_generates(expected_path, options, defaults={}, extras = {}, message=nil)
|
|
72
73
|
if expected_path =~ %r{://}
|
|
73
|
-
|
|
74
|
+
fail_on(URI::InvalidURIError) do
|
|
74
75
|
uri = URI.parse(expected_path)
|
|
75
76
|
expected_path = uri.path.to_s.empty? ? "/" : uri.path
|
|
76
|
-
rescue URI::InvalidURIError => e
|
|
77
|
-
raise ActionController::RoutingError, e.message
|
|
78
77
|
end
|
|
79
78
|
else
|
|
80
79
|
expected_path = "/#{expected_path}" unless expected_path.first == '/'
|
|
@@ -82,12 +81,12 @@ module ActionDispatch
|
|
|
82
81
|
# Load routes.rb if it hasn't been loaded.
|
|
83
82
|
|
|
84
83
|
generated_path, extra_keys = @routes.generate_extras(options, defaults)
|
|
85
|
-
found_extras = options.reject {|k,
|
|
84
|
+
found_extras = options.reject { |k, _| ! extra_keys.include? k }
|
|
86
85
|
|
|
87
|
-
msg =
|
|
86
|
+
msg = message || sprintf("found extras <%s>, not <%s>", found_extras, extras)
|
|
88
87
|
assert_equal(extras, found_extras, msg)
|
|
89
88
|
|
|
90
|
-
msg =
|
|
89
|
+
msg = message || sprintf("The generated path <%s> did not match <%s>", generated_path,
|
|
91
90
|
expected_path)
|
|
92
91
|
assert_equal(expected_path, generated_path, msg)
|
|
93
92
|
end
|
|
@@ -99,21 +98,20 @@ module ActionDispatch
|
|
|
99
98
|
# The +extras+ hash allows you to specify options that would normally be provided as a query string to the action. The
|
|
100
99
|
# +message+ parameter allows you to specify a custom error message to display upon failure.
|
|
101
100
|
#
|
|
102
|
-
# ==== Examples
|
|
103
101
|
# # Assert a basic route: a controller with the default action (index)
|
|
104
|
-
# assert_routing '/home', :
|
|
102
|
+
# assert_routing '/home', controller: 'home', action: 'index'
|
|
105
103
|
#
|
|
106
104
|
# # Test a route generated with a specific controller, action, and parameter (id)
|
|
107
|
-
# assert_routing '/entries/show/23', :
|
|
105
|
+
# assert_routing '/entries/show/23', controller: 'entries', action: 'show', id: 23
|
|
108
106
|
#
|
|
109
107
|
# # Assert a basic route (controller + default action), with an error message if it fails
|
|
110
|
-
# assert_routing '/store', { :
|
|
108
|
+
# assert_routing '/store', { controller: 'store', action: 'index' }, {}, {}, 'Route for store index not generated properly'
|
|
111
109
|
#
|
|
112
110
|
# # Tests a route, providing a defaults hash
|
|
113
|
-
# assert_routing 'controller/action/9', {:
|
|
111
|
+
# assert_routing 'controller/action/9', {id: "9", item: "square"}, {controller: "controller", action: "action"}, {}, {item: "square"}
|
|
114
112
|
#
|
|
115
113
|
# # Tests a route with a HTTP method
|
|
116
|
-
# assert_routing({ :
|
|
114
|
+
# assert_routing({ method: 'put', path: '/product/321' }, { controller: "product", action: "update", id: "321" })
|
|
117
115
|
def assert_routing(path, options, defaults={}, extras={}, message=nil)
|
|
118
116
|
assert_recognizes(options, path, extras, message)
|
|
119
117
|
|
|
@@ -122,7 +120,7 @@ module ActionDispatch
|
|
|
122
120
|
options[:controller] = "/#{controller}"
|
|
123
121
|
end
|
|
124
122
|
|
|
125
|
-
generate_options = options.dup.delete_if{ |k,
|
|
123
|
+
generate_options = options.dup.delete_if{ |k, _| defaults.key?(k) }
|
|
126
124
|
assert_generates(path.is_a?(Hash) ? path[:path] : path, generate_options, defaults, extras, message)
|
|
127
125
|
end
|
|
128
126
|
|
|
@@ -131,16 +129,13 @@ module ActionDispatch
|
|
|
131
129
|
# with a new RouteSet instance.
|
|
132
130
|
#
|
|
133
131
|
# The new instance is yielded to the passed block. Typically the block
|
|
134
|
-
# will create some routes using <tt>
|
|
132
|
+
# will create some routes using <tt>set.draw { match ... }</tt>:
|
|
135
133
|
#
|
|
136
134
|
# with_routing do |set|
|
|
137
|
-
# set.draw do
|
|
138
|
-
#
|
|
139
|
-
# assert_equal(
|
|
140
|
-
# ['/content/10/show', {}],
|
|
141
|
-
# map.generate(:controller => 'content', :id => 10, :action => 'show')
|
|
142
|
-
# end
|
|
135
|
+
# set.draw do
|
|
136
|
+
# resources :users
|
|
143
137
|
# end
|
|
138
|
+
# assert_equal "/users", users_path
|
|
144
139
|
# end
|
|
145
140
|
#
|
|
146
141
|
def with_routing
|
|
@@ -191,14 +186,12 @@ module ActionDispatch
|
|
|
191
186
|
request = ActionController::TestRequest.new
|
|
192
187
|
|
|
193
188
|
if path =~ %r{://}
|
|
194
|
-
|
|
189
|
+
fail_on(URI::InvalidURIError) do
|
|
195
190
|
uri = URI.parse(path)
|
|
196
191
|
request.env["rack.url_scheme"] = uri.scheme || "http"
|
|
197
192
|
request.host = uri.host if uri.host
|
|
198
193
|
request.port = uri.port if uri.port
|
|
199
194
|
request.path = uri.path.to_s.empty? ? "/" : uri.path
|
|
200
|
-
rescue URI::InvalidURIError => e
|
|
201
|
-
raise ActionController::RoutingError, e.message
|
|
202
195
|
end
|
|
203
196
|
else
|
|
204
197
|
path = "/#{path}" unless path.first == "/"
|
|
@@ -207,11 +200,19 @@ module ActionDispatch
|
|
|
207
200
|
|
|
208
201
|
request.request_method = method if method
|
|
209
202
|
|
|
210
|
-
params =
|
|
203
|
+
params = fail_on(ActionController::RoutingError) do
|
|
204
|
+
@routes.recognize_path(path, { :method => method, :extras => extras })
|
|
205
|
+
end
|
|
211
206
|
request.path_parameters = params.with_indifferent_access
|
|
212
207
|
|
|
213
208
|
request
|
|
214
209
|
end
|
|
210
|
+
|
|
211
|
+
def fail_on(exception_class)
|
|
212
|
+
yield
|
|
213
|
+
rescue exception_class => e
|
|
214
|
+
raise MiniTest::Assertion, e.message
|
|
215
|
+
end
|
|
215
216
|
end
|
|
216
217
|
end
|
|
217
218
|
end
|
|
@@ -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.
|
|
@@ -379,8 +377,8 @@ module ActionDispatch
|
|
|
379
377
|
node.content.gsub(/<!\[CDATA\[(.*)(\]\]>)?/m) { Rack::Utils.escapeHTML($1) }
|
|
380
378
|
end
|
|
381
379
|
|
|
382
|
-
selected = elements.map do |
|
|
383
|
-
text =
|
|
380
|
+
selected = elements.map do |elem|
|
|
381
|
+
text = elem.children.select{ |c| not c.tag? }.map{ |c| fix_content[c] }.join
|
|
384
382
|
root = HTML::Document.new(CGI.unescapeHTML("<encoded>#{text}</encoded>")).root
|
|
385
383
|
css_select(root, "encoded:root", &block)[0]
|
|
386
384
|
end
|
|
@@ -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)
|