http_router 0.10.2 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/Rakefile +7 -5
- data/benchmarks/gen2.rb +1 -1
- data/benchmarks/rack_mount.rb +8 -14
- data/examples/rack_mapper.ru +12 -13
- data/examples/variable_with_regex.ru +1 -1
- data/http_router.gemspec +1 -1
- data/lib/http_router.rb +159 -62
- data/lib/http_router/generation_helper.rb +29 -0
- data/lib/http_router/generator.rb +150 -0
- data/lib/http_router/node.rb +27 -17
- data/lib/http_router/node/abstract_request_node.rb +31 -0
- data/lib/http_router/node/host.rb +9 -0
- data/lib/http_router/node/lookup.rb +8 -10
- data/lib/http_router/node/path.rb +23 -38
- data/lib/http_router/node/request_method.rb +16 -0
- data/lib/http_router/node/root.rb +104 -10
- data/lib/http_router/node/scheme.rb +9 -0
- data/lib/http_router/node/user_agent.rb +9 -0
- data/lib/http_router/regex_route_generation.rb +10 -0
- data/lib/http_router/request.rb +7 -17
- data/lib/http_router/response.rb +4 -0
- data/lib/http_router/route.rb +16 -277
- data/lib/http_router/route_helper.rb +126 -0
- data/lib/http_router/util.rb +1 -37
- data/lib/http_router/version.rb +1 -1
- data/test/common/generate.txt +1 -1
- data/test/generation.rb +15 -11
- data/test/generic.rb +2 -3
- data/test/helper.rb +15 -10
- data/test/rack/test_route.rb +0 -5
- data/test/test_misc.rb +50 -40
- data/test/test_mounting.rb +27 -26
- data/test/test_recognition.rb +1 -76
- metadata +104 -161
- data/.rspec +0 -1
- data/lib/http_router/node/arbitrary.rb +0 -30
- data/lib/http_router/node/request.rb +0 -52
- data/lib/http_router/rack.rb +0 -19
- data/lib/http_router/rack/builder.rb +0 -61
- data/lib/http_router/rack/url_map.rb +0 -16
- data/lib/http_router/regex_route.rb +0 -39
data/lib/http_router/util.rb
CHANGED
@@ -1,41 +1,5 @@
|
|
1
1
|
class HttpRouter
|
2
2
|
module Util
|
3
|
-
|
4
|
-
regex_parts = path.split(/([:\*][a-zA-Z0-9_]+)/)
|
5
|
-
regex, code = '', ''
|
6
|
-
dynamic = false
|
7
|
-
regex_parts.each_with_index do |part, index|
|
8
|
-
case part[0]
|
9
|
-
when ?:, ?*
|
10
|
-
if index != 0 && regex_parts[index - 1][-1] == ?\\
|
11
|
-
regex << Regexp.quote(part) unless path_validation_regex
|
12
|
-
code << part
|
13
|
-
dynamic = true
|
14
|
-
else
|
15
|
-
regex << (route.matches_with[part[1, part.size].to_sym] || '.*?').to_s unless path_validation_regex
|
16
|
-
code << "\#{args.shift || (options && options.delete(:#{part[1, part.size]})) || return}"
|
17
|
-
dynamic = true
|
18
|
-
end
|
19
|
-
else
|
20
|
-
regex << Regexp.quote(part) unless path_validation_regex
|
21
|
-
code << part
|
22
|
-
end
|
23
|
-
end
|
24
|
-
path_validation_regex ||= Regexp.new("^#{regex}$") if dynamic
|
25
|
-
if path_validation_regex
|
26
|
-
target.instance_eval <<-EOT, __FILE__, __LINE__ + 1
|
27
|
-
def raw_url(args, options)
|
28
|
-
url = \"#{code}\"
|
29
|
-
#{path_validation_regex.inspect}.match(url) ? url : nil
|
30
|
-
end
|
31
|
-
EOT
|
32
|
-
else
|
33
|
-
target.instance_eval <<-EOT, __FILE__, __LINE__ + 1
|
34
|
-
def raw_url(args, options)
|
35
|
-
\"#{code}\"
|
36
|
-
end
|
37
|
-
EOT
|
38
|
-
end
|
39
|
-
end
|
3
|
+
|
40
4
|
end
|
41
5
|
end
|
data/lib/http_router/version.rb
CHANGED
data/test/common/generate.txt
CHANGED
data/test/generation.rb
CHANGED
@@ -2,18 +2,22 @@ require 'json'
|
|
2
2
|
require "#{File.dirname(__FILE__)}/generic"
|
3
3
|
class GenerationTest < AbstractTest
|
4
4
|
def run_tests
|
5
|
-
@tests.map(&:case).each do |(expected_result, name,
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
@tests.map(&:case).each do |(expected_result, name, oargs)|
|
6
|
+
oargs = [oargs] unless oargs.is_a?(Array)
|
7
|
+
oargs.compact!
|
8
|
+
oargs.map!{|a| a.is_a?(Hash) ? Hash[a.map{|k,v| [k.to_sym, v]}] : a }
|
9
|
+
[[:path, ''], [:url_ns, '://localhost'], [:url, 'http://localhost']].each do |(meth, prefix)|
|
10
|
+
args = oargs.map{|o| o.dup rescue o}
|
11
|
+
result = begin
|
12
|
+
path = @router.send(meth, name.to_sym, *args.dup)
|
13
|
+
path
|
14
|
+
rescue HttpRouter::InvalidRouteException
|
15
|
+
nil
|
16
|
+
rescue HttpRouter::MissingParameterException
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
error("Result #{result.inspect} did not match expectation #{expected_result.inspect}") unless result == (expected_result ? prefix + expected_result : expected_result)
|
15
20
|
end
|
16
|
-
error("Result #{result.inspect} did not match expectation #{expected_result.inspect}") unless result == expected_result
|
17
21
|
end
|
18
22
|
print '.'
|
19
23
|
end
|
data/test/generic.rb
CHANGED
@@ -83,11 +83,11 @@ class AbstractTest
|
|
83
83
|
@routes.case.each do |route_definition|
|
84
84
|
error("Too many keys! #{route_definition.keys.inspect}") unless route_definition.keys.size == 1
|
85
85
|
route_name, route_properties = route_definition.keys.first, route_definition.values.first
|
86
|
+
opts = {:name => route_name.to_sym}
|
86
87
|
route = case route_properties
|
87
88
|
when String
|
88
|
-
@router.add(route_properties)
|
89
|
+
@router.add(route_properties, opts)
|
89
90
|
when Hash
|
90
|
-
opts = {}
|
91
91
|
route_path = interpret_val(route_properties.delete("path"))
|
92
92
|
if route_properties.key?("conditions")
|
93
93
|
opts[:conditions] = Hash[route_properties.delete("conditions").map{|k, v| [k.to_sym, interpret_val(v)]}]
|
@@ -102,7 +102,6 @@ class AbstractTest
|
|
102
102
|
else
|
103
103
|
error("Route isn't a String or hash")
|
104
104
|
end
|
105
|
-
route.name(route_name.to_sym)
|
106
105
|
route.to{|env| [200, {"env-to-test" => env.dup}, [route_name]]}
|
107
106
|
end
|
108
107
|
run_tests
|
data/test/helper.rb
CHANGED
@@ -2,18 +2,20 @@
|
|
2
2
|
require 'minitest/autorun'
|
3
3
|
require 'phocus'
|
4
4
|
|
5
|
-
class HttpRouter
|
6
|
-
|
7
|
-
|
5
|
+
class HttpRouter
|
6
|
+
module RouteHelper
|
7
|
+
def default_destination
|
8
|
+
to proc {|env| ::Rack::Response.new("Routing to #{object_id}").finish}
|
9
|
+
self
|
10
|
+
end
|
8
11
|
end
|
9
12
|
end
|
10
13
|
|
11
14
|
class MiniTest::Unit::TestCase
|
12
|
-
|
13
15
|
def router(opts = nil, &blk)
|
14
16
|
@router ||= HttpRouter.new(opts, &blk)
|
15
17
|
if blk
|
16
|
-
@router.routes.each { |route| route.
|
18
|
+
@router.routes.each { |route| route.dest ||= proc {|env| Rack::Response.new("Routing to #{route.object_id}").finish} }
|
17
19
|
@router.routes.size > 1 ? @router.routes : @router.routes.first
|
18
20
|
else
|
19
21
|
@router
|
@@ -44,15 +46,18 @@ class MiniTest::Unit::TestCase
|
|
44
46
|
end
|
45
47
|
|
46
48
|
def assert_route(route, request, params = nil, &blk)
|
47
|
-
|
49
|
+
route = case route
|
50
|
+
when String
|
48
51
|
router.reset!
|
49
|
-
|
52
|
+
router.add(route)
|
53
|
+
else
|
54
|
+
route
|
50
55
|
end
|
51
|
-
|
52
|
-
route.to{|env| Rack::Response.new(dest).finish} if route && route.dest.nil?
|
56
|
+
route.default_destination if route && route.dest.nil?
|
53
57
|
request = Rack::MockRequest.env_for(request) if request.is_a?(String)
|
54
58
|
response = @router.call(request)
|
55
59
|
if route
|
60
|
+
dest = "Routing to #{route.object_id}"
|
56
61
|
assert_equal [dest], response.last.body
|
57
62
|
if params
|
58
63
|
raise "Params was nil, but you expected params" if request['router.params'].nil?
|
@@ -72,6 +77,6 @@ class MiniTest::Unit::TestCase
|
|
72
77
|
route = router.add(route)
|
73
78
|
end
|
74
79
|
route.to{|env| Rack::Response.new("Routing to #{route.to_s}").finish} if route && route.respond_to?(:to) && !route.dest
|
75
|
-
assert_equal path.gsub('[','%5B').gsub(']','%5D'), router.
|
80
|
+
assert_equal path.gsub('[','%5B').gsub(']','%5D'), router.path(route, *args)
|
76
81
|
end
|
77
82
|
end
|
data/test/rack/test_route.rb
CHANGED
@@ -26,11 +26,6 @@ class TestRouteExtensions < MiniTest::Unit::TestCase
|
|
26
26
|
assert_equal __FILE__, body.path
|
27
27
|
end
|
28
28
|
|
29
|
-
def test_chainable
|
30
|
-
router.get("/index.html").redirect("/").name(:root)
|
31
|
-
assert_equal "/index.html", router.url(:root)
|
32
|
-
end
|
33
|
-
|
34
29
|
def test_custom_status
|
35
30
|
router.get("/index.html").redirect("/", 303)
|
36
31
|
response = router.call(Rack::MockRequest.env_for("/index.html"))
|
data/test/test_misc.rb
CHANGED
@@ -1,36 +1,41 @@
|
|
1
1
|
class TestMisc < MiniTest::Unit::TestCase
|
2
|
+
|
2
3
|
def test_cloning
|
3
|
-
r1 = HttpRouter.new { add('/test'
|
4
|
+
r1 = HttpRouter.new { add('/test', :name => :test_route).to(:test) }
|
4
5
|
r2 = r1.clone
|
5
6
|
|
6
|
-
r2.add('/test2'
|
7
|
+
r2.add('/test2', :name => :test).to(:test2)
|
7
8
|
assert_equal 2, r2.routes.size
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
assert_equal
|
10
|
+
matches, other_methods = r1.recognize(Rack::Request.new(Rack::MockRequest.env_for('/test2')))
|
11
|
+
assert_equal nil, matches
|
12
|
+
assert r2.recognize(Rack::MockRequest.env_for('/test2')).first
|
13
|
+
assert_equal r1.routes.size, 1
|
14
|
+
assert_equal r2.routes.size, 2
|
13
15
|
|
14
|
-
r1.add('/another'
|
16
|
+
r1.add('/another', :name => :test).to(:test2)
|
15
17
|
|
16
18
|
assert_equal r1.routes.size, r2.routes.size
|
17
|
-
assert_equal '/another', r1.
|
18
|
-
assert_equal '/test2', r2.
|
19
|
+
assert_equal '/another', r1.path(:test)
|
20
|
+
assert_equal '/test2', r2.path(:test)
|
19
21
|
assert_equal :test, r1.routes.first.dest
|
20
22
|
assert_equal :test, r2.routes.first.dest
|
21
23
|
end
|
22
24
|
|
23
25
|
def test_reseting
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
router = HttpRouter.new
|
27
|
+
r = router.add('/hi').to(:test)
|
28
|
+
matches, other_methods = router.recognize(Rack::MockRequest.env_for('/hi'))
|
29
|
+
assert_equal r, matches.first.route
|
30
|
+
router.reset!
|
31
|
+
assert_equal nil, router.recognize(Rack::MockRequest.env_for('/hi')).first
|
28
32
|
end
|
29
33
|
|
30
34
|
def test_redirect_trailing_slash
|
31
35
|
r = HttpRouter.new(:redirect_trailing_slash => true) { add('/hi').to(:test) }
|
32
|
-
response = r.
|
33
|
-
assert_equal
|
36
|
+
response = r.call(Rack::MockRequest.env_for('/hi/'))
|
37
|
+
assert_equal 302, response.first
|
38
|
+
assert_equal '/hi', response[1]['Location']
|
34
39
|
end
|
35
40
|
|
36
41
|
def test_multi_recognize
|
@@ -41,41 +46,45 @@ class TestMisc < MiniTest::Unit::TestCase
|
|
41
46
|
add('/:var1/there')
|
42
47
|
}
|
43
48
|
response = router.recognize(Rack::MockRequest.env_for('/hi/there'))
|
44
|
-
assert_equal [r1, r2, r3, r4], response.map{|resp| resp.path.route}
|
49
|
+
assert_equal [r1, r2, r3, r4], response.first.map{|resp| resp.path.route}
|
45
50
|
response = router.recognize(Rack::MockRequest.env_for('/hi/var'))
|
46
|
-
assert_equal [r2, r3], response.map{|resp| resp.path.route}
|
51
|
+
assert_equal [r2, r3], response.first.map{|resp| resp.path.route}
|
47
52
|
response = router.recognize(Rack::MockRequest.env_for('/you/there'))
|
48
|
-
assert_equal [r2, r4], response.map{|resp| resp.path.route}
|
53
|
+
assert_equal [r2, r4], response.first.map{|resp| resp.path.route}
|
49
54
|
end
|
50
55
|
|
51
56
|
def test_multi_name_gen
|
52
|
-
r =
|
53
|
-
r.add('/'
|
54
|
-
r.add('/:name'
|
55
|
-
r.add('/:name/:category'
|
56
|
-
assert_equal '/', r.
|
57
|
-
assert_equal '/name', r.
|
58
|
-
assert_equal '/name/category', r.
|
57
|
+
r = router
|
58
|
+
r.add('/', :name => :index).default_destination
|
59
|
+
r.add('/:name', :name => :index).default_destination
|
60
|
+
r.add('/:name/:category', :name => :index).default_destination
|
61
|
+
assert_equal '/', r.path(:index)
|
62
|
+
assert_equal '/name', r.path(:index, 'name')
|
63
|
+
assert_equal '/name/category', r.path(:index, 'name', 'category')
|
59
64
|
end
|
60
65
|
|
61
|
-
def
|
66
|
+
def test_yielding_from_recognize
|
62
67
|
r = HttpRouter.new
|
63
|
-
r.add(
|
64
|
-
|
68
|
+
r1 = r.add('/:name').default_destination
|
69
|
+
r2 = r.add('/:name').default_destination
|
70
|
+
r3 = r.add('/:name').default_destination
|
71
|
+
matches = []
|
72
|
+
r.recognize(Rack::MockRequest.env_for('/test')) { |r| matches << r.route }
|
73
|
+
assert_equal [r1, r2, r3], matches
|
65
74
|
end
|
66
75
|
|
67
|
-
def
|
68
|
-
r =
|
69
|
-
r.add(%r|/test/.*|, :path_for_generation => '/test/:variable'
|
70
|
-
assert_equal '/test/var', r.
|
71
|
-
assert_equal '/test/var', r.url(:route, :variable => "var")
|
72
|
-
assert_raises(HttpRouter::InvalidRouteException) { r.url(:route) }
|
76
|
+
def test_regex_generation
|
77
|
+
r = router
|
78
|
+
r.add(%r|/test/.*|, :path_for_generation => '/test/:variable', :name => :route).default_destination
|
79
|
+
assert_equal '/test/var', r.path(:route, "var")
|
73
80
|
end
|
74
81
|
|
75
|
-
def
|
76
|
-
r =
|
77
|
-
r.add('/'
|
78
|
-
|
82
|
+
def test_too_many_params
|
83
|
+
r = router
|
84
|
+
r.add(%r|/test/.*|, :path_for_generation => '/test/:variable', :name => :route).default_destination
|
85
|
+
assert_equal '/test/var', r.path(:route, "var")
|
86
|
+
assert_equal '/test/var', r.path(:route, :variable => "var")
|
87
|
+
assert_raises(HttpRouter::InvalidRouteException) { r.path(:route) }
|
79
88
|
end
|
80
89
|
|
81
90
|
def test_public_interface
|
@@ -91,6 +100,7 @@ class TestMisc < MiniTest::Unit::TestCase
|
|
91
100
|
assert methods.include?(:process_destination_path)
|
92
101
|
assert methods.include?(:rewrite_partial_path_info)
|
93
102
|
assert methods.include?(:rewrite_path_info)
|
103
|
+
assert methods.include?(:extend_route)
|
94
104
|
end
|
95
105
|
|
96
106
|
def test_to_s_and_inspect
|
@@ -98,8 +108,8 @@ class TestMisc < MiniTest::Unit::TestCase
|
|
98
108
|
router.add('/').to(:test)
|
99
109
|
router.add('/test').to(:test2)
|
100
110
|
router.post('/test').to(:test3)
|
101
|
-
assert router.to_s.match(/^#<HttpRouter:0x[0-9a-f]+ number of routes \(3\) ignore_trailing_slash\? \(true\) redirect_trailing_slash\? \(false\)
|
102
|
-
assert router.inspect.match(/^#<HttpRouter:0x[0-9a-f]+ number of routes \(3\) ignore_trailing_slash\? \(true\) redirect_trailing_slash\? \(false\)
|
111
|
+
assert router.to_s.match(/^#<HttpRouter:0x[0-9a-f-]+ number of routes \(3\) ignore_trailing_slash\? \(true\) redirect_trailing_slash\? \(false\)>$/)
|
112
|
+
assert router.inspect.match(/^#<HttpRouter:0x[0-9a-f-]+ number of routes \(3\) ignore_trailing_slash\? \(true\) redirect_trailing_slash\? \(false\)>/)
|
103
113
|
assert router.inspect.match(/Path: "\/test" for route unnamed route to :test3/)
|
104
114
|
end
|
105
115
|
end
|
data/test/test_mounting.rb
CHANGED
@@ -2,67 +2,68 @@ class TestMounting < MiniTest::Unit::TestCase
|
|
2
2
|
def setup
|
3
3
|
@r1 = HttpRouter.new
|
4
4
|
@r2 = HttpRouter.new
|
5
|
-
@r2.add("/bar"
|
5
|
+
@r2.add("/bar", :name => :test).to{|env| [200, {}, []]}
|
6
6
|
end
|
7
7
|
|
8
8
|
def test_url_mount_for_child_route
|
9
9
|
route = @r1.add("/foo").to(@r2)
|
10
10
|
assert_equal "/foo", @r2.url_mount.url
|
11
|
-
assert_equal "/foo/bar", @r2.
|
11
|
+
assert_equal "/foo/bar", @r2.path(:test)
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_default_values
|
15
|
-
route = @r1.add("/foo/:bar"
|
16
|
-
assert_equal "/foo/baz/bar", @r2.
|
17
|
-
assert_equal "/foo/haha/bar", @r2.
|
15
|
+
route = @r1.add("/foo/:bar", :default_values => {:bar => "baz"}).to(@r2)
|
16
|
+
assert_equal "/foo/baz/bar", @r2.path(:test)
|
17
|
+
assert_equal "/foo/haha/bar", @r2.path(:test, :bar => "haha")
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_multiple_values
|
21
|
-
@r1.add("/foo/:bar/:baz"
|
22
|
-
assert_equal "/foo/bar/baz/bar", @r2.
|
21
|
+
@r1.add("/foo/:bar/:baz", :default_values => {:bar => "bar"}).to(@r2)
|
22
|
+
assert_equal "/foo/bar/baz/bar", @r2.path(:test, :baz => "baz")
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_bubble_params
|
26
|
-
route = @r1.add("/foo/:bar"
|
27
|
-
|
28
|
-
assert_equal "/foo/
|
26
|
+
route = @r1.add("/foo/:bar", :default_values => {:bar => 'baz'})
|
27
|
+
route.to(@r2)
|
28
|
+
assert_equal "/foo/baz/bar?bang=ers", @r2.path(:test, :bang => "ers")
|
29
|
+
assert_equal "/foo/haha/bar?bang=ers", @r2.path(:test, :bar => "haha", :bang => "ers")
|
29
30
|
end
|
30
31
|
|
31
32
|
def test_path_with_optional
|
32
33
|
@r1.add("/foo(/:bar)").to(@r2)
|
33
|
-
@r2.add("/hey(/:there)"
|
34
|
-
assert_equal "/foo/hey", @r2.
|
35
|
-
assert_equal "/foo/bar/hey", @r2.
|
36
|
-
assert_equal "/foo/bar/hey/there", @r2.
|
34
|
+
@r2.add("/hey(/:there)", :name => :test2).to{|env| [200, {}, []]}
|
35
|
+
assert_equal "/foo/hey", @r2.path(:test2)
|
36
|
+
assert_equal "/foo/bar/hey", @r2.path(:test2, :bar => "bar")
|
37
|
+
assert_equal "/foo/bar/hey/there", @r2.path(:test2, :bar => "bar", :there => "there")
|
37
38
|
end
|
38
39
|
|
39
40
|
def test_nest3
|
40
41
|
@r3 = HttpRouter.new
|
41
|
-
@r1.add("/foo(/:bar)"
|
42
|
-
@r2.add("/hi"
|
42
|
+
@r1.add("/foo(/:bar)", :default_values => {:bar => 'barry'}).to(@r2)
|
43
|
+
@r2.add("/hi", :name => :hi).to{|env| [200, {}, []]}
|
43
44
|
@r2.add("/mounted").to(@r3)
|
44
|
-
@r3.add("/endpoint"
|
45
|
+
@r3.add("/endpoint", :name => :endpoint).to{|env| [200, {}, []]}
|
45
46
|
|
46
|
-
assert_equal "/foo/barry/hi", @r2.
|
47
|
-
assert_equal "/foo/barry/mounted/endpoint", @r3.
|
48
|
-
assert_equal "/foo/flower/mounted/endpoint", @r3.
|
47
|
+
assert_equal "/foo/barry/hi", @r2.path(:hi)
|
48
|
+
assert_equal "/foo/barry/mounted/endpoint", @r3.path(:endpoint)
|
49
|
+
assert_equal "/foo/flower/mounted/endpoint", @r3.path(:endpoint, :bar => "flower")
|
49
50
|
end
|
50
51
|
|
51
52
|
def test_with_default_host
|
52
|
-
@r1.add("/mounted"
|
53
|
-
assert_equal "http://example.com/mounted/bar", @r2.
|
53
|
+
@r1.add("/mounted", :default_values => {:host => "example.com"}).to(@r2)
|
54
|
+
assert_equal "http://example.com/mounted/bar", @r2.path(:test)
|
54
55
|
end
|
55
56
|
|
56
57
|
def test_with_host
|
57
58
|
@r1.add("/mounted").to(@r2)
|
58
|
-
assert_equal "/mounted/bar", @r2.
|
59
|
-
assert_equal "http://example.com/mounted/bar", @r2.
|
59
|
+
assert_equal "/mounted/bar", @r2.path(:test)
|
60
|
+
assert_equal "http://example.com/mounted/bar", @r2.path(:test, :host => "example.com")
|
60
61
|
end
|
61
62
|
|
62
63
|
def test_with_scheme
|
63
64
|
@r1.add("/mounted").to(@r2)
|
64
|
-
assert_equal "/mounted/bar", @r2.
|
65
|
-
assert_equal "https://example.com/mounted/bar", @r2.
|
65
|
+
assert_equal "/mounted/bar", @r2.path(:test)
|
66
|
+
assert_equal "https://example.com/mounted/bar", @r2.path(:test, :scheme => "https", :host => "example.com")
|
66
67
|
end
|
67
68
|
|
68
69
|
def test_clone
|
data/test/test_recognition.rb
CHANGED
@@ -8,71 +8,6 @@ class TestRecognition < MiniTest::Unit::TestCase
|
|
8
8
|
EOT
|
9
9
|
end
|
10
10
|
|
11
|
-
def test_match
|
12
|
-
hello, love80, love8080 = router {
|
13
|
-
add('test').arbitrary(Proc.new{|req, params| req.rack.host == 'hellodooly' })
|
14
|
-
add("test").arbitrary(Proc.new{|req, params| req.rack.host == 'lovelove' }).arbitrary{|req, params| req.rack.port == 80}
|
15
|
-
add("test").arbitrary(Proc.new{|req, params| req.rack.host == 'lovelove' }).arbitrary{|req, params| req.rack.port == 8080}
|
16
|
-
}
|
17
|
-
assert_route love8080, 'http://lovelove:8080/test'
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_less_specific_node
|
21
|
-
hello, love80, love8080, general = router {
|
22
|
-
add("/test").arbitrary(Proc.new{|req, params| req.rack.host == 'hellodooly' })
|
23
|
-
add("/test").arbitrary(Proc.new{|req, params| req.rack.host == 'lovelove' }).arbitrary{|req, params| req.rack.port == 80}
|
24
|
-
add("/test").arbitrary(Proc.new{|req, params| req.rack.host == 'lovelove' }).arbitrary{|req, params| req.rack.port == 8080}
|
25
|
-
add("/test")
|
26
|
-
}
|
27
|
-
assert_route general, 'http://lovelove:8081/test'
|
28
|
-
assert_route hello, 'http://hellodooly:8081/test'
|
29
|
-
assert_route love80, 'http://lovelove:80/test'
|
30
|
-
assert_route love8080, 'http://lovelove:8080/test'
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_match_request
|
34
|
-
love80, love8080 = router {
|
35
|
-
add("/test").get.arbitrary(Proc.new{|req, params| req.rack.host == 'lovelove' }).arbitrary{|req, params| req.rack.port == 80}
|
36
|
-
add("/test").get.arbitrary(Proc.new{|req, params| req.rack.host == 'lovelove' }).arbitrary{|req, params| req.rack.port == 8080}
|
37
|
-
}
|
38
|
-
assert_route love80, 'http://lovelove:80/test'
|
39
|
-
assert_route love8080, 'http://lovelove:8080/test'
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_less_specific_with_request
|
43
|
-
love80, love8080, general = router {
|
44
|
-
add("test").post.arbitrary(Proc.new{|req, params| req.rack.host == 'lovelove' }).arbitrary{|req, params| req.rack.port == 80}
|
45
|
-
add("test").post.arbitrary(Proc.new{|req, params| req.rack.host == 'lovelove' }).arbitrary{|req, params| req.rack.port == 8080}
|
46
|
-
add("test").post
|
47
|
-
}
|
48
|
-
assert_route love8080, Rack::MockRequest.env_for('http://lovelove:8080/test', :method => :post)
|
49
|
-
assert_route love80, Rack::MockRequest.env_for('http://lovelove:80/test', :method => :post)
|
50
|
-
assert_route general, Rack::MockRequest.env_for('/test', :method => :post)
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_pass_params
|
54
|
-
r = router {
|
55
|
-
add(":test").get.arbitrary(Proc.new{|req, params, dest| params[:test] == 'test' })
|
56
|
-
}
|
57
|
-
assert_route r, '/test', {:test => 'test'}
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_continue
|
61
|
-
no, yes = router {
|
62
|
-
add('test').arbitrary_with_continue{|req, p| req.continue[false]}
|
63
|
-
add('test').arbitrary_with_continue{|req, p| req.continue[true]}
|
64
|
-
}
|
65
|
-
assert_route yes, '/test'
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_passing
|
69
|
-
passed, working = router {
|
70
|
-
add('/').to { |env| throw :pass; [200, {}, ['pass']] }
|
71
|
-
add('/').to { |env| [200, {}, ['working']] }
|
72
|
-
}
|
73
|
-
assert_body 'working', router.call(Rack::MockRequest.env_for('/'))
|
74
|
-
end
|
75
|
-
|
76
11
|
def test_non_path_matching
|
77
12
|
passed, working = router {
|
78
13
|
add(:conditions => {:user_agent => /MSIE/}).to { |env| [200, {}, ['IE']] }
|
@@ -90,18 +25,8 @@ class TestRecognition < MiniTest::Unit::TestCase
|
|
90
25
|
assert_body 'working', router.call(Rack::MockRequest.env_for('/'))
|
91
26
|
end
|
92
27
|
|
93
|
-
def test_request_mutation
|
94
|
-
got_this_far = false
|
95
|
-
non_matching, matching = router {
|
96
|
-
add("/test/:var/:var2/*glob").matching(:var2 => /123/, :glob => /[a-z]+/).get.arbitrary{|env, params| got_this_far = true; false}
|
97
|
-
add("/test/:var/:var2/*glob").matching(:var2 => /123/, :glob => /[a-z]+/).get
|
98
|
-
}
|
99
|
-
assert_route matching, '/test/123/123/asd/aasd/zxcqwe/asdzxc', {:var => '123', :var2 => '123', :glob => %w{asd aasd zxcqwe asdzxc}}
|
100
|
-
assert got_this_far, "matching should have gotten this far"
|
101
|
-
end
|
102
|
-
|
103
28
|
def test_compiling_uncompiling
|
104
|
-
@router =
|
29
|
+
@router = router
|
105
30
|
root = @router.add('/').default_destination
|
106
31
|
assert_route root, '/'
|
107
32
|
test = @router.add('/test').default_destination
|