Skip to content

Commit 1d21528

Browse files
committed
Merge pull request rails#5219 from mattfawcett/2781-fix-querystring-route-constraint-for-testing
Fix for rails#2781
2 parents 4244a09 + d7bf930 commit 1d21528

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

actionpack/lib/action_dispatch/routing/route_set.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,7 @@ def call(env)
594594
def recognize_path(path, environment = {})
595595
method = (environment[:method] || "GET").to_s.upcase
596596
path = Journey::Router::Utils.normalize_path(path) unless path =~ %r{://}
597+
extras = environment[:extras] || {}
597598

598599
begin
599600
env = Rack::MockRequest.env_for(path, {:method => method})
@@ -603,6 +604,7 @@ def recognize_path(path, environment = {})
603604

604605
req = @request_class.new(env)
605606
@router.recognize(req) do |route, matches, params|
607+
params.merge!(extras)
606608
params.each do |key, value|
607609
if value.is_a?(String)
608610
value = value.dup.force_encoding(Encoding::BINARY)

actionpack/lib/action_dispatch/testing/assertions/routing.rb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,9 @@ module RoutingAssertions
3939
# # Test a custom route
4040
# assert_recognizes({:controller => 'items', :action => 'show', :id => '1'}, 'view/item1')
4141
def assert_recognizes(expected_options, path, extras={}, message=nil)
42-
request = recognized_request_for(path)
42+
request = recognized_request_for(path, extras)
4343

4444
expected_options = expected_options.clone
45-
extras.each_key { |key| expected_options.delete key } unless extras.nil?
4645

4746
expected_options.stringify_keys!
4847

@@ -181,7 +180,7 @@ def method_missing(selector, *args, &block)
181180

182181
private
183182
# Recognizes the route for a given path.
184-
def recognized_request_for(path)
183+
def recognized_request_for(path, extras = {})
185184
if path.is_a?(Hash)
186185
method = path[:method]
187186
path = path[:path]
@@ -209,7 +208,7 @@ def recognized_request_for(path)
209208

210209
request.request_method = method if method
211210

212-
params = @routes.recognize_path(path, { :method => method })
211+
params = @routes.recognize_path(path, { :method => method, :extras => extras })
213212
request.path_parameters = params.with_indifferent_access
214213

215214
request

actionpack/test/dispatch/routing_assertions_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
class SecureArticlesController < ArticlesController; end
55
class BlockArticlesController < ArticlesController; end
6+
class QueryArticlesController < ArticlesController; end
67

78
class RoutingAssertionsTest < ActionController::TestCase
89

@@ -18,6 +19,10 @@ def setup
1819
scope 'block', :constraints => lambda { |r| r.ssl? } do
1920
resources :articles, :controller => 'block_articles'
2021
end
22+
23+
scope 'query', :constraints => lambda { |r| r.params[:use_query] == 'true' } do
24+
resources :articles, :controller => 'query_articles'
25+
end
2126
end
2227
end
2328

@@ -62,6 +67,13 @@ def test_assert_recognizes_with_block_constraint
6267
assert_recognizes({ :controller => 'block_articles', :action => 'index' }, 'https://test.host/block/articles')
6368
end
6469

70+
def test_assert_recognizes_with_query_constraint
71+
assert_raise(ActionController::RoutingError) do
72+
assert_recognizes({ :controller => 'query_articles', :action => 'index', :use_query => 'false' }, '/query/articles', { :use_query => 'false' })
73+
end
74+
assert_recognizes({ :controller => 'query_articles', :action => 'index', :use_query => 'true' }, '/query/articles', { :use_query => 'true' })
75+
end
76+
6577
def test_assert_routing
6678
assert_routing('/articles', :controller => 'articles', :action => 'index')
6779
end

0 commit comments

Comments
 (0)