actionpack 3.2.22.5 → 5.2.4

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.
Files changed (271) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +279 -603
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +13 -297
  5. data/lib/abstract_controller/asset_paths.rb +4 -2
  6. data/lib/abstract_controller/base.rb +82 -52
  7. data/lib/abstract_controller/caching/fragments.rb +166 -0
  8. data/lib/abstract_controller/caching.rb +66 -0
  9. data/lib/abstract_controller/callbacks.rb +117 -103
  10. data/lib/abstract_controller/collector.rb +18 -7
  11. data/lib/abstract_controller/error.rb +6 -0
  12. data/lib/abstract_controller/helpers.rb +65 -38
  13. data/lib/abstract_controller/logger.rb +3 -2
  14. data/lib/abstract_controller/railties/routes_helpers.rb +5 -3
  15. data/lib/abstract_controller/rendering.rb +77 -129
  16. data/lib/abstract_controller/translation.rb +21 -3
  17. data/lib/abstract_controller/url_for.rb +9 -7
  18. data/lib/abstract_controller.rb +12 -13
  19. data/lib/action_controller/api/api_rendering.rb +16 -0
  20. data/lib/action_controller/api.rb +149 -0
  21. data/lib/action_controller/base.rb +81 -40
  22. data/lib/action_controller/caching.rb +22 -62
  23. data/lib/action_controller/form_builder.rb +50 -0
  24. data/lib/action_controller/log_subscriber.rb +30 -18
  25. data/lib/action_controller/metal/basic_implicit_render.rb +13 -0
  26. data/lib/action_controller/metal/conditional_get.rb +190 -47
  27. data/lib/action_controller/metal/content_security_policy.rb +52 -0
  28. data/lib/action_controller/metal/cookies.rb +3 -3
  29. data/lib/action_controller/metal/data_streaming.rb +40 -65
  30. data/lib/action_controller/metal/etag_with_flash.rb +18 -0
  31. data/lib/action_controller/metal/etag_with_template_digest.rb +57 -0
  32. data/lib/action_controller/metal/exceptions.rb +19 -12
  33. data/lib/action_controller/metal/flash.rb +42 -9
  34. data/lib/action_controller/metal/force_ssl.rb +79 -19
  35. data/lib/action_controller/metal/head.rb +35 -10
  36. data/lib/action_controller/metal/helpers.rb +31 -21
  37. data/lib/action_controller/metal/http_authentication.rb +182 -134
  38. data/lib/action_controller/metal/implicit_render.rb +62 -8
  39. data/lib/action_controller/metal/instrumentation.rb +28 -26
  40. data/lib/action_controller/metal/live.rb +312 -0
  41. data/lib/action_controller/metal/mime_responds.rb +159 -163
  42. data/lib/action_controller/metal/parameter_encoding.rb +51 -0
  43. data/lib/action_controller/metal/params_wrapper.rb +146 -93
  44. data/lib/action_controller/metal/redirecting.rb +80 -56
  45. data/lib/action_controller/metal/renderers.rb +119 -47
  46. data/lib/action_controller/metal/rendering.rb +89 -32
  47. data/lib/action_controller/metal/request_forgery_protection.rb +373 -41
  48. data/lib/action_controller/metal/rescue.rb +9 -16
  49. data/lib/action_controller/metal/streaming.rb +39 -45
  50. data/lib/action_controller/metal/strong_parameters.rb +1086 -0
  51. data/lib/action_controller/metal/testing.rb +8 -29
  52. data/lib/action_controller/metal/url_for.rb +43 -32
  53. data/lib/action_controller/metal.rb +112 -106
  54. data/lib/action_controller/railtie.rb +56 -18
  55. data/lib/action_controller/railties/helpers.rb +24 -0
  56. data/lib/action_controller/renderer.rb +117 -0
  57. data/lib/action_controller/template_assertions.rb +11 -0
  58. data/lib/action_controller/test_case.rb +402 -347
  59. data/lib/action_controller.rb +31 -30
  60. data/lib/action_dispatch/http/cache.rb +133 -34
  61. data/lib/action_dispatch/http/content_security_policy.rb +272 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +40 -24
  63. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  64. data/lib/action_dispatch/http/headers.rb +117 -16
  65. data/lib/action_dispatch/http/mime_negotiation.rb +98 -33
  66. data/lib/action_dispatch/http/mime_type.rb +198 -146
  67. data/lib/action_dispatch/http/mime_types.rb +22 -7
  68. data/lib/action_dispatch/http/parameter_filter.rb +61 -49
  69. data/lib/action_dispatch/http/parameters.rb +94 -51
  70. data/lib/action_dispatch/http/rack_cache.rb +4 -3
  71. data/lib/action_dispatch/http/request.rb +262 -117
  72. data/lib/action_dispatch/http/response.rb +400 -86
  73. data/lib/action_dispatch/http/upload.rb +66 -29
  74. data/lib/action_dispatch/http/url.rb +232 -60
  75. data/lib/action_dispatch/journey/formatter.rb +189 -0
  76. data/lib/action_dispatch/journey/gtg/builder.rb +164 -0
  77. data/lib/action_dispatch/journey/gtg/simulator.rb +41 -0
  78. data/lib/action_dispatch/journey/gtg/transition_table.rb +158 -0
  79. data/lib/action_dispatch/journey/nfa/builder.rb +78 -0
  80. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  81. data/lib/action_dispatch/journey/nfa/simulator.rb +49 -0
  82. data/lib/action_dispatch/journey/nfa/transition_table.rb +120 -0
  83. data/lib/action_dispatch/journey/nodes/node.rb +140 -0
  84. data/lib/action_dispatch/journey/parser.rb +199 -0
  85. data/lib/action_dispatch/journey/parser.y +50 -0
  86. data/lib/action_dispatch/journey/parser_extras.rb +31 -0
  87. data/lib/action_dispatch/journey/path/pattern.rb +199 -0
  88. data/lib/action_dispatch/journey/route.rb +203 -0
  89. data/lib/action_dispatch/journey/router/utils.rb +102 -0
  90. data/lib/action_dispatch/journey/router.rb +156 -0
  91. data/lib/action_dispatch/journey/routes.rb +82 -0
  92. data/lib/action_dispatch/journey/scanner.rb +64 -0
  93. data/lib/action_dispatch/journey/visitors.rb +268 -0
  94. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  95. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  96. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  97. data/lib/action_dispatch/journey.rb +7 -0
  98. data/lib/action_dispatch/middleware/callbacks.rb +17 -13
  99. data/lib/action_dispatch/middleware/cookies.rb +494 -162
  100. data/lib/action_dispatch/middleware/debug_exceptions.rb +176 -53
  101. data/lib/action_dispatch/middleware/debug_locks.rb +124 -0
  102. data/lib/action_dispatch/middleware/exception_wrapper.rb +103 -38
  103. data/lib/action_dispatch/middleware/executor.rb +21 -0
  104. data/lib/action_dispatch/middleware/flash.rb +128 -91
  105. data/lib/action_dispatch/middleware/public_exceptions.rb +43 -16
  106. data/lib/action_dispatch/middleware/reloader.rb +6 -83
  107. data/lib/action_dispatch/middleware/remote_ip.rb +151 -49
  108. data/lib/action_dispatch/middleware/request_id.rb +19 -15
  109. data/lib/action_dispatch/middleware/session/abstract_store.rb +38 -34
  110. data/lib/action_dispatch/middleware/session/cache_store.rb +14 -9
  111. data/lib/action_dispatch/middleware/session/cookie_store.rb +94 -44
  112. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +15 -4
  113. data/lib/action_dispatch/middleware/show_exceptions.rb +36 -61
  114. data/lib/action_dispatch/middleware/ssl.rb +150 -0
  115. data/lib/action_dispatch/middleware/stack.rb +33 -41
  116. data/lib/action_dispatch/middleware/static.rb +92 -48
  117. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +22 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +27 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  123. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  125. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +21 -0
  126. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +13 -0
  127. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +134 -5
  128. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  129. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  130. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  131. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  132. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  133. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  134. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  135. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  136. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  137. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  138. data/lib/action_dispatch/railtie.rb +29 -8
  139. data/lib/action_dispatch/request/session.rb +234 -0
  140. data/lib/action_dispatch/request/utils.rb +78 -0
  141. data/lib/action_dispatch/routing/endpoint.rb +17 -0
  142. data/lib/action_dispatch/routing/inspector.rb +225 -0
  143. data/lib/action_dispatch/routing/mapper.rb +1329 -582
  144. data/lib/action_dispatch/routing/polymorphic_routes.rb +237 -94
  145. data/lib/action_dispatch/routing/redirection.rb +120 -50
  146. data/lib/action_dispatch/routing/route_set.rb +545 -322
  147. data/lib/action_dispatch/routing/routes_proxy.rb +37 -7
  148. data/lib/action_dispatch/routing/url_for.rb +103 -34
  149. data/lib/action_dispatch/routing.rb +66 -99
  150. data/lib/action_dispatch/system_test_case.rb +147 -0
  151. data/lib/action_dispatch/system_testing/browser.rb +49 -0
  152. data/lib/action_dispatch/system_testing/driver.rb +59 -0
  153. data/lib/action_dispatch/system_testing/server.rb +31 -0
  154. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +96 -0
  155. data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +31 -0
  156. data/lib/action_dispatch/system_testing/test_helpers/undef_methods.rb +26 -0
  157. data/lib/action_dispatch/testing/assertion_response.rb +47 -0
  158. data/lib/action_dispatch/testing/assertions/response.rb +53 -42
  159. data/lib/action_dispatch/testing/assertions/routing.rb +79 -74
  160. data/lib/action_dispatch/testing/assertions.rb +15 -9
  161. data/lib/action_dispatch/testing/integration.rb +361 -207
  162. data/lib/action_dispatch/testing/request_encoder.rb +55 -0
  163. data/lib/action_dispatch/testing/test_process.rb +28 -19
  164. data/lib/action_dispatch/testing/test_request.rb +30 -33
  165. data/lib/action_dispatch/testing/test_response.rb +35 -11
  166. data/lib/action_dispatch.rb +42 -32
  167. data/lib/action_pack/gem_version.rb +17 -0
  168. data/lib/action_pack/version.rb +7 -7
  169. data/lib/action_pack.rb +4 -2
  170. metadata +116 -175
  171. data/lib/abstract_controller/layouts.rb +0 -423
  172. data/lib/abstract_controller/view_paths.rb +0 -96
  173. data/lib/action_controller/caching/actions.rb +0 -185
  174. data/lib/action_controller/caching/fragments.rb +0 -127
  175. data/lib/action_controller/caching/pages.rb +0 -187
  176. data/lib/action_controller/caching/sweeping.rb +0 -97
  177. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  178. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  179. data/lib/action_controller/deprecated.rb +0 -3
  180. data/lib/action_controller/metal/compatibility.rb +0 -65
  181. data/lib/action_controller/metal/hide_actions.rb +0 -41
  182. data/lib/action_controller/metal/rack_delegation.rb +0 -26
  183. data/lib/action_controller/metal/responder.rb +0 -286
  184. data/lib/action_controller/metal/session_management.rb +0 -14
  185. data/lib/action_controller/middleware.rb +0 -39
  186. data/lib/action_controller/railties/paths.rb +0 -25
  187. data/lib/action_controller/record_identifier.rb +0 -85
  188. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  189. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  190. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  191. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  192. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  193. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  194. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  195. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  196. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  197. data/lib/action_dispatch/middleware/head.rb +0 -18
  198. data/lib/action_dispatch/middleware/params_parser.rb +0 -75
  199. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  200. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  201. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  202. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  203. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  204. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  205. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  206. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  207. data/lib/action_dispatch/testing/assertions/dom.rb +0 -37
  208. data/lib/action_dispatch/testing/assertions/selector.rb +0 -435
  209. data/lib/action_dispatch/testing/assertions/tag.rb +0 -138
  210. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  211. data/lib/action_view/asset_paths.rb +0 -142
  212. data/lib/action_view/base.rb +0 -220
  213. data/lib/action_view/buffers.rb +0 -43
  214. data/lib/action_view/context.rb +0 -36
  215. data/lib/action_view/flows.rb +0 -79
  216. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  217. data/lib/action_view/helpers/asset_paths.rb +0 -7
  218. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  219. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  220. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  221. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  222. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  223. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  224. data/lib/action_view/helpers/cache_helper.rb +0 -64
  225. data/lib/action_view/helpers/capture_helper.rb +0 -203
  226. data/lib/action_view/helpers/controller_helper.rb +0 -25
  227. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  228. data/lib/action_view/helpers/date_helper.rb +0 -1062
  229. data/lib/action_view/helpers/debug_helper.rb +0 -40
  230. data/lib/action_view/helpers/form_helper.rb +0 -1486
  231. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  232. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  233. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  234. data/lib/action_view/helpers/number_helper.rb +0 -622
  235. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  236. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  237. data/lib/action_view/helpers/rendering_helper.rb +0 -92
  238. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  239. data/lib/action_view/helpers/tag_helper.rb +0 -167
  240. data/lib/action_view/helpers/text_helper.rb +0 -426
  241. data/lib/action_view/helpers/translation_helper.rb +0 -91
  242. data/lib/action_view/helpers/url_helper.rb +0 -693
  243. data/lib/action_view/helpers.rb +0 -60
  244. data/lib/action_view/locale/en.yml +0 -160
  245. data/lib/action_view/log_subscriber.rb +0 -28
  246. data/lib/action_view/lookup_context.rb +0 -258
  247. data/lib/action_view/path_set.rb +0 -101
  248. data/lib/action_view/railtie.rb +0 -55
  249. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  250. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  251. data/lib/action_view/renderer/renderer.rb +0 -61
  252. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  253. data/lib/action_view/renderer/template_renderer.rb +0 -95
  254. data/lib/action_view/template/error.rb +0 -128
  255. data/lib/action_view/template/handlers/builder.rb +0 -26
  256. data/lib/action_view/template/handlers/erb.rb +0 -125
  257. data/lib/action_view/template/handlers.rb +0 -50
  258. data/lib/action_view/template/resolver.rb +0 -298
  259. data/lib/action_view/template/text.rb +0 -30
  260. data/lib/action_view/template.rb +0 -337
  261. data/lib/action_view/test_case.rb +0 -246
  262. data/lib/action_view/testing/resolvers.rb +0 -49
  263. data/lib/action_view.rb +0 -84
  264. data/lib/sprockets/assets.rake +0 -99
  265. data/lib/sprockets/bootstrap.rb +0 -37
  266. data/lib/sprockets/compressors.rb +0 -83
  267. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  268. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  269. data/lib/sprockets/helpers.rb +0 -6
  270. data/lib/sprockets/railtie.rb +0 -62
  271. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,7 +1,9 @@
1
- require 'uri'
2
- require 'active_support/core_ext/hash/diff'
3
- require 'active_support/core_ext/hash/indifferent_access'
4
- require 'action_controller/metal/exceptions'
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
4
+ require "active_support/core_ext/hash/indifferent_access"
5
+ require "active_support/core_ext/string/access"
6
+ require "action_controller/metal/exceptions"
5
7
 
6
8
  module ActionDispatch
7
9
  module Assertions
@@ -14,40 +16,48 @@ module ActionDispatch
14
16
  # requiring a specific HTTP method. The hash should contain a :path with the incoming request path
15
17
  # and a :method containing the required HTTP verb.
16
18
  #
17
- # # assert that POSTing to /items will call the create action on ItemsController
18
- # assert_recognizes({:controller => 'items', :action => 'create'}, {:path => 'items', :method => :post})
19
+ # # Asserts that POSTing to /items will call the create action on ItemsController
20
+ # assert_recognizes({controller: 'items', action: 'create'}, {path: 'items', method: :post})
19
21
  #
20
22
  # 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
- # 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
- # extras argument, appending the query string on the path directly will not work. For example:
23
+ # to assert that values in the query string will end up in the params hash correctly. To test query strings you must use the extras
24
+ # argument because appending the query string on the path directly will not work. For example:
23
25
  #
24
- # # assert that a path of '/items/list/1?view=print' returns the correct options
25
- # assert_recognizes({:controller => 'items', :action => 'list', :id => '1', :view => 'print'}, 'items/list/1', { :view => "print" })
26
+ # # Asserts that a path of '/items/list/1?view=print' returns the correct options
27
+ # assert_recognizes({controller: 'items', action: 'list', id: '1', view: 'print'}, 'items/list/1', { view: "print" })
26
28
  #
27
29
  # The +message+ parameter allows you to pass in an error message that is displayed upon failure.
28
30
  #
29
- # ==== Examples
30
31
  # # Check the default route (i.e., the index action)
31
- # assert_recognizes({:controller => 'items', :action => 'index'}, 'items')
32
+ # assert_recognizes({controller: 'items', action: 'index'}, 'items')
32
33
  #
33
34
  # # Test a specific action
34
- # assert_recognizes({:controller => 'items', :action => 'list'}, 'items/list')
35
+ # assert_recognizes({controller: 'items', action: 'list'}, 'items/list')
35
36
  #
36
37
  # # Test an action with a parameter
37
- # assert_recognizes({:controller => 'items', :action => 'destroy', :id => '1'}, 'items/destroy/1')
38
+ # assert_recognizes({controller: 'items', action: 'destroy', id: '1'}, 'items/destroy/1')
38
39
  #
39
40
  # # Test a custom route
40
- # assert_recognizes({:controller => 'items', :action => 'show', :id => '1'}, 'view/item1')
41
- def assert_recognizes(expected_options, path, extras={}, message=nil)
42
- request = recognized_request_for(path, extras)
41
+ # assert_recognizes({controller: 'items', action: 'show', id: '1'}, 'view/item1')
42
+ def assert_recognizes(expected_options, path, extras = {}, msg = nil)
43
+ if path.is_a?(Hash) && path[:method].to_s == "all"
44
+ [:get, :post, :put, :delete].each do |method|
45
+ assert_recognizes(expected_options, path.merge(method: method), extras, msg)
46
+ end
47
+ else
48
+ request = recognized_request_for(path, extras, msg)
43
49
 
44
- expected_options = expected_options.clone
45
- extras.each_key { |key| expected_options.delete key } unless extras.nil?
50
+ expected_options = expected_options.clone
46
51
 
47
- expected_options.stringify_keys!
48
- msg = build_message(message, "The recognized options <?> did not match <?>, difference: <?>",
49
- request.path_parameters, expected_options, expected_options.diff(request.path_parameters))
50
- assert_equal(expected_options, request.path_parameters, msg)
52
+ expected_options.stringify_keys!
53
+
54
+ msg = message(msg, "") {
55
+ sprintf("The recognized options <%s> did not match <%s>, difference:",
56
+ request.path_parameters, expected_options)
57
+ }
58
+
59
+ assert_equal(expected_options, request.path_parameters, msg)
60
+ end
51
61
  end
52
62
 
53
63
  # Asserts that the provided options can be used to generate the provided path. This is the inverse of +assert_recognizes+.
@@ -56,38 +66,36 @@ module ActionDispatch
56
66
  #
57
67
  # The +defaults+ parameter is unused.
58
68
  #
59
- # ==== Examples
60
69
  # # Asserts that the default action is generated for a route with no action
61
- # assert_generates "/items", :controller => "items", :action => "index"
70
+ # assert_generates "/items", controller: "items", action: "index"
62
71
  #
63
72
  # # Tests that the list action is properly routed
64
- # assert_generates "/items/list", :controller => "items", :action => "list"
73
+ # assert_generates "/items/list", controller: "items", action: "list"
65
74
  #
66
75
  # # Tests the generation of a route with a parameter
67
- # assert_generates "/items/list/1", { :controller => "items", :action => "list", :id => "1" }
76
+ # assert_generates "/items/list/1", { controller: "items", action: "list", id: "1" }
68
77
  #
69
78
  # # Asserts that the generated route gives us our custom route
70
- # assert_generates "changesets/12", { :controller => 'scm', :action => 'show_diff', :revision => "12" }
71
- def assert_generates(expected_path, options, defaults={}, extras = {}, message=nil)
79
+ # assert_generates "changesets/12", { controller: 'scm', action: 'show_diff', revision: "12" }
80
+ def assert_generates(expected_path, options, defaults = {}, extras = {}, message = nil)
72
81
  if expected_path =~ %r{://}
73
- begin
82
+ fail_on(URI::InvalidURIError, message) do
74
83
  uri = URI.parse(expected_path)
75
84
  expected_path = uri.path.to_s.empty? ? "/" : uri.path
76
- rescue URI::InvalidURIError => e
77
- raise ActionController::RoutingError, e.message
78
85
  end
79
86
  else
80
- expected_path = "/#{expected_path}" unless expected_path.first == '/'
87
+ expected_path = "/#{expected_path}" unless expected_path.first == "/"
81
88
  end
82
89
  # Load routes.rb if it hasn't been loaded.
83
90
 
84
- generated_path, extra_keys = @routes.generate_extras(options, defaults)
85
- found_extras = options.reject {|k, v| ! extra_keys.include? k}
91
+ options = options.clone
92
+ generated_path, query_string_keys = @routes.generate_extras(options, defaults)
93
+ found_extras = options.reject { |k, _| ! query_string_keys.include? k }
86
94
 
87
- msg = build_message(message, "found extras <?>, not <?>", found_extras, extras)
95
+ msg = message || sprintf("found extras <%s>, not <%s>", found_extras, extras)
88
96
  assert_equal(extras, found_extras, msg)
89
97
 
90
- msg = build_message(message, "The generated path <?> did not match <?>", generated_path,
98
+ msg = message || sprintf("The generated path <%s> did not match <%s>", generated_path,
91
99
  expected_path)
92
100
  assert_equal(expected_path, generated_path, msg)
93
101
  end
@@ -99,22 +107,21 @@ module ActionDispatch
99
107
  # The +extras+ hash allows you to specify options that would normally be provided as a query string to the action. The
100
108
  # +message+ parameter allows you to specify a custom error message to display upon failure.
101
109
  #
102
- # ==== Examples
103
- # # Assert a basic route: a controller with the default action (index)
104
- # assert_routing '/home', :controller => 'home', :action => 'index'
110
+ # # Asserts a basic route: a controller with the default action (index)
111
+ # assert_routing '/home', controller: 'home', action: 'index'
105
112
  #
106
113
  # # Test a route generated with a specific controller, action, and parameter (id)
107
- # assert_routing '/entries/show/23', :controller => 'entries', :action => 'show', :id => 23
114
+ # assert_routing '/entries/show/23', controller: 'entries', action: 'show', id: 23
108
115
  #
109
- # # Assert a basic route (controller + default action), with an error message if it fails
110
- # assert_routing '/store', { :controller => 'store', :action => 'index' }, {}, {}, 'Route for store index not generated properly'
116
+ # # Asserts a basic route (controller + default action), with an error message if it fails
117
+ # assert_routing '/store', { controller: 'store', action: 'index' }, {}, {}, 'Route for store index not generated properly'
111
118
  #
112
119
  # # Tests a route, providing a defaults hash
113
- # assert_routing 'controller/action/9', {:id => "9", :item => "square"}, {:controller => "controller", :action => "action"}, {}, {:item => "square"}
120
+ # assert_routing 'controller/action/9', {id: "9", item: "square"}, {controller: "controller", action: "action"}, {}, {item: "square"}
114
121
  #
115
- # # Tests a route with a HTTP method
116
- # assert_routing({ :method => 'put', :path => '/product/321' }, { :controller => "product", :action => "update", :id => "321" })
117
- def assert_routing(path, options, defaults={}, extras={}, message=nil)
122
+ # # Tests a route with an HTTP method
123
+ # assert_routing({ method: 'put', path: '/product/321' }, { controller: "product", action: "update", id: "321" })
124
+ def assert_routing(path, options, defaults = {}, extras = {}, message = nil)
118
125
  assert_recognizes(options, path, extras, message)
119
126
 
120
127
  controller, default_controller = options[:controller], defaults[:controller]
@@ -122,25 +129,21 @@ module ActionDispatch
122
129
  options[:controller] = "/#{controller}"
123
130
  end
124
131
 
125
- generate_options = options.dup.delete_if{ |k,v| defaults.key?(k) }
132
+ generate_options = options.dup.delete_if { |k, _| defaults.key?(k) }
126
133
  assert_generates(path.is_a?(Hash) ? path[:path] : path, generate_options, defaults, extras, message)
127
134
  end
128
135
 
129
136
  # A helper to make it easier to test different route configurations.
130
- # This method temporarily replaces @routes
131
- # with a new RouteSet instance.
137
+ # This method temporarily replaces @routes with a new RouteSet instance.
132
138
  #
133
139
  # The new instance is yielded to the passed block. Typically the block
134
- # will create some routes using <tt>map.draw { map.connect ... }</tt>:
140
+ # will create some routes using <tt>set.draw { match ... }</tt>:
135
141
  #
136
142
  # with_routing do |set|
137
- # set.draw do |map|
138
- # map.connect ':controller/:action/:id'
139
- # assert_equal(
140
- # ['/content/10/show', {}],
141
- # map.generate(:controller => 'content', :id => 10, :action => 'show')
142
- # end
143
+ # set.draw do
144
+ # resources :users
143
145
  # end
146
+ # assert_equal "/users", users_path
144
147
  # end
145
148
  #
146
149
  def with_routing
@@ -149,15 +152,12 @@ module ActionDispatch
149
152
  old_controller, @controller = @controller, @controller.clone
150
153
  _routes = @routes
151
154
 
152
- # Unfortunately, there is currently an abstraction leak between AC::Base
153
- # and AV::Base which requires having the URL helpers in both AC and AV.
154
- # To do this safely at runtime for tests, we need to bump up the helper serial
155
- # to that the old AV subclass isn't cached.
156
- #
157
- # TODO: Make this unnecessary
158
- @controller.singleton_class.send(:include, _routes.url_helpers)
159
- @controller.view_context_class = Class.new(@controller.view_context_class) do
160
- include _routes.url_helpers
155
+ @controller.singleton_class.include(_routes.url_helpers)
156
+
157
+ if @controller.respond_to? :view_context_class
158
+ @controller.view_context_class = Class.new(@controller.view_context_class) do
159
+ include _routes.url_helpers
160
+ end
161
161
  end
162
162
  end
163
163
  yield @routes
@@ -170,7 +170,7 @@ module ActionDispatch
170
170
 
171
171
  # ROUTES TODO: These assertions should really work in an integration context
172
172
  def method_missing(selector, *args, &block)
173
- if defined?(@controller) && @controller && @routes && @routes.named_routes.helpers.include?(selector)
173
+ if defined?(@controller) && @controller && defined?(@routes) && @routes && @routes.named_routes.route_defined?(selector)
174
174
  @controller.send(selector, *args, &block)
175
175
  else
176
176
  super
@@ -179,7 +179,7 @@ module ActionDispatch
179
179
 
180
180
  private
181
181
  # Recognizes the route for a given path.
182
- def recognized_request_for(path, extras = {})
182
+ def recognized_request_for(path, extras = {}, msg)
183
183
  if path.is_a?(Hash)
184
184
  method = path[:method]
185
185
  path = path[:path]
@@ -187,18 +187,15 @@ module ActionDispatch
187
187
  method = :get
188
188
  end
189
189
 
190
- # Assume given controller
191
- request = ActionController::TestRequest.new
190
+ request = ActionController::TestRequest.create @controller.class
192
191
 
193
192
  if path =~ %r{://}
194
- begin
193
+ fail_on(URI::InvalidURIError, msg) do
195
194
  uri = URI.parse(path)
196
195
  request.env["rack.url_scheme"] = uri.scheme || "http"
197
196
  request.host = uri.host if uri.host
198
197
  request.port = uri.port if uri.port
199
198
  request.path = uri.path.to_s.empty? ? "/" : uri.path
200
- rescue URI::InvalidURIError => e
201
- raise ActionController::RoutingError, e.message
202
199
  end
203
200
  else
204
201
  path = "/#{path}" unless path.first == "/"
@@ -207,11 +204,19 @@ module ActionDispatch
207
204
 
208
205
  request.request_method = method if method
209
206
 
210
- params = @routes.recognize_path(path, { :method => method, :extras => extras })
207
+ params = fail_on(ActionController::RoutingError, msg) do
208
+ @routes.recognize_path(path, method: method, extras: extras)
209
+ end
211
210
  request.path_parameters = params.with_indifferent_access
212
211
 
213
212
  request
214
213
  end
214
+
215
+ def fail_on(exception_class, message)
216
+ yield
217
+ rescue exception_class => e
218
+ raise Minitest::Assertion, message || e.message
219
+ end
215
220
  end
216
221
  end
217
222
  end
@@ -1,18 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails-dom-testing"
4
+
1
5
  module ActionDispatch
2
6
  module Assertions
3
- autoload :DomAssertions, 'action_dispatch/testing/assertions/dom'
4
- autoload :ResponseAssertions, 'action_dispatch/testing/assertions/response'
5
- autoload :RoutingAssertions, 'action_dispatch/testing/assertions/routing'
6
- autoload :SelectorAssertions, 'action_dispatch/testing/assertions/selector'
7
- autoload :TagAssertions, 'action_dispatch/testing/assertions/tag'
7
+ autoload :ResponseAssertions, "action_dispatch/testing/assertions/response"
8
+ autoload :RoutingAssertions, "action_dispatch/testing/assertions/routing"
8
9
 
9
10
  extend ActiveSupport::Concern
10
11
 
11
- include DomAssertions
12
12
  include ResponseAssertions
13
13
  include RoutingAssertions
14
- include SelectorAssertions
15
- include TagAssertions
14
+ include Rails::Dom::Testing::Assertions
15
+
16
+ def html_document
17
+ @html_document ||= if @response.content_type.to_s.end_with?("xml")
18
+ Nokogiri::XML::Document.parse(@response.body)
19
+ else
20
+ Nokogiri::HTML::Document.parse(@response.body)
21
+ end
22
+ end
16
23
  end
17
24
  end
18
-