2013-11-22 17:47:07 +01:00
|
|
|
require File.expand_path(File.dirname(__FILE__) + '/helper')
|
|
|
|
require File.expand_path(File.dirname(__FILE__) + '/fixtures/apps/simple')
|
|
|
|
|
|
|
|
describe "Router" do
|
|
|
|
|
|
|
|
def setup
|
|
|
|
Padrino.clear!
|
|
|
|
end
|
|
|
|
|
|
|
|
should "dispatch paths correctly" do
|
|
|
|
app = lambda { |env|
|
|
|
|
[200, {
|
|
|
|
'X-ScriptName' => env['SCRIPT_NAME'],
|
|
|
|
'X-PathInfo' => env['PATH_INFO'],
|
|
|
|
'Content-Type' => 'text/plain'
|
|
|
|
}, [""]]
|
|
|
|
}
|
|
|
|
map = Padrino::Router.new(
|
|
|
|
{ :path => '/bar', :to => app },
|
2014-02-19 03:30:29 +01:00
|
|
|
{ :path => '/foo/bar', :to => app },
|
|
|
|
{ :path => '/foo', :to => app }
|
2013-11-22 17:47:07 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/")
|
|
|
|
assert res.not_found?
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/qux")
|
|
|
|
assert res.not_found?
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/foo")
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal "/foo", res["X-ScriptName"]
|
|
|
|
assert_equal "/", res["X-PathInfo"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/foo/")
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal "/foo", res["X-ScriptName"]
|
|
|
|
assert_equal "/", res["X-PathInfo"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/foo/bar")
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal "/foo/bar", res["X-ScriptName"]
|
|
|
|
assert_equal "/", res["X-PathInfo"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/foo/bar/")
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal "/foo/bar", res["X-ScriptName"]
|
|
|
|
assert_equal "/", res["X-PathInfo"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/foo///bar//quux")
|
|
|
|
assert_equal 200, res.status
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal "/foo/bar", res["X-ScriptName"]
|
|
|
|
assert_equal "//quux", res["X-PathInfo"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/foo/quux", "SCRIPT_NAME" => "/bleh")
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal "/bleh/foo", res["X-ScriptName"]
|
|
|
|
assert_equal "/quux", res["X-PathInfo"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/bar", 'HTTP_HOST' => 'foo.org')
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal "/bar", res["X-ScriptName"]
|
|
|
|
assert_equal "/", res["X-PathInfo"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/bar/", 'HTTP_HOST' => 'foo.org')
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal "/bar", res["X-ScriptName"]
|
|
|
|
assert_equal "/", res["X-PathInfo"]
|
|
|
|
end
|
|
|
|
|
2014-02-19 03:30:29 +01:00
|
|
|
should "dispatch requests to cascade mounted apps" do
|
|
|
|
app = lambda { |env|
|
|
|
|
scary = !!env['PATH_INFO'].match(/scary/)
|
|
|
|
[scary ? 404 : 200, {
|
|
|
|
'X-ScriptName' => env['SCRIPT_NAME'],
|
|
|
|
'X-PathInfo' => env['PATH_INFO'],
|
|
|
|
'Content-Type' => 'text/plain'
|
|
|
|
}, [""]]
|
|
|
|
}
|
|
|
|
api = lambda { |env|
|
|
|
|
spooky = !!env['QUERY_STRING'].match(/spooky/)
|
|
|
|
[spooky ? 200 : 404, {
|
|
|
|
'X-API' => spooky,
|
|
|
|
'X-ScriptName' => env['SCRIPT_NAME'],
|
|
|
|
'X-PathInfo' => env['PATH_INFO'],
|
|
|
|
'Content-Type' => 'application/json'
|
|
|
|
}, [""]]
|
|
|
|
}
|
|
|
|
map = Padrino::Router.new(
|
|
|
|
{ :path => '/bar', :to => api },
|
|
|
|
{ :path => '/bar', :to => app }
|
|
|
|
)
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/werewolf")
|
|
|
|
assert_equal 404, res.status
|
|
|
|
assert_equal nil, res["X-API"]
|
|
|
|
assert_equal nil, res["X-ScriptName"]
|
|
|
|
assert_equal nil, res["X-PathInfo"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/bar/mitzvah")
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal nil, res["X-API"]
|
|
|
|
assert_equal 'text/plain', res["Content-Type"]
|
|
|
|
assert_equal "/bar", res["X-ScriptName"]
|
|
|
|
assert_equal "/mitzvah", res["X-PathInfo"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/bar?spooky")
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal true, res["X-API"]
|
|
|
|
assert_equal 'application/json', res["Content-Type"]
|
|
|
|
assert_equal "/bar", res["X-ScriptName"]
|
|
|
|
assert_equal "/", res["X-PathInfo"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/bar/scary")
|
|
|
|
assert_equal 404, res.status
|
|
|
|
assert_equal nil, res["X-API"]
|
|
|
|
assert_equal 'text/plain', res["Content-Type"]
|
|
|
|
assert_equal "/bar", res["X-ScriptName"]
|
|
|
|
assert_equal "/scary", res["X-PathInfo"]
|
|
|
|
end
|
|
|
|
|
|
|
|
should "dispatch requests to cascade mounted apps and not cascade ok statuses" do
|
|
|
|
|
|
|
|
api = mock_app do
|
|
|
|
get 'scary' do
|
|
|
|
"1"
|
|
|
|
end
|
|
|
|
set :cascade, true
|
|
|
|
end
|
|
|
|
|
|
|
|
app = mock_app do
|
|
|
|
get 'scary' do
|
|
|
|
"2"
|
|
|
|
end
|
|
|
|
set :cascade, false
|
|
|
|
end
|
|
|
|
|
|
|
|
app2 = mock_app do
|
|
|
|
get 'terrifying' do
|
|
|
|
""
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
map = Padrino::Router.new(
|
|
|
|
{ :path => '/bar', :to => api },
|
|
|
|
{ :path => '/bar', :to => app },
|
|
|
|
{ :path => '/bar', :to => app2 }
|
|
|
|
)
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/bar/scary")
|
|
|
|
assert res.ok?
|
|
|
|
#asserting that on ok we're good to go
|
|
|
|
assert_equal "1", res.body
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/bar/terrifying")
|
|
|
|
assert !res.ok?
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
should "dispatch requests to cascade mounted apps until it sees a cascade == false or []g" do
|
|
|
|
app = mock_app do
|
|
|
|
get 'scary' do
|
|
|
|
""
|
|
|
|
end
|
|
|
|
set :cascade, []
|
|
|
|
end
|
|
|
|
|
|
|
|
app2 = mock_app do
|
|
|
|
get 'terrifying' do
|
|
|
|
""
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
map = Padrino::Router.new(
|
|
|
|
{ :path => '/bar', :to => app },
|
|
|
|
{ :path => '/bar', :to => app2 }
|
|
|
|
)
|
|
|
|
|
|
|
|
request_case = lambda {
|
|
|
|
Rack::MockRequest.new(map).get("/bar/terrifying")
|
|
|
|
}
|
|
|
|
|
|
|
|
app.cascade = false
|
|
|
|
assert !request_case.call.ok?
|
|
|
|
|
|
|
|
app.cascade = true
|
|
|
|
assert request_case.call.ok?
|
|
|
|
end
|
|
|
|
|
2013-11-22 17:47:07 +01:00
|
|
|
should "dispatches hosts correctly" do
|
|
|
|
map = Padrino::Router.new(
|
|
|
|
{ :host => "foo.org", :to => lambda { |env|
|
|
|
|
[200,
|
|
|
|
{ "Content-Type" => "text/plain",
|
|
|
|
"X-Position" => "foo.org",
|
|
|
|
"X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
|
|
|
|
}, [""]]}},
|
|
|
|
{ :host => "subdomain.foo.org", :to => lambda { |env|
|
|
|
|
[200,
|
|
|
|
{ "Content-Type" => "text/plain",
|
|
|
|
"X-Position" => "subdomain.foo.org",
|
|
|
|
"X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
|
|
|
|
}, [""]]}},
|
|
|
|
{ :host => /.*\.bar.org/, :to => lambda { |env|
|
|
|
|
[200,
|
|
|
|
{ "Content-Type" => "text/plain",
|
|
|
|
"X-Position" => "bar.org",
|
|
|
|
"X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
|
|
|
|
}, [""]]}}
|
|
|
|
)
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "bar.org")
|
|
|
|
assert res.not_found?
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "at.bar.org")
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal "bar.org", res["X-Position"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "foo.org")
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal "foo.org", res["X-Position"]
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "subdomain.foo.org", "SERVER_NAME" => "foo.org")
|
|
|
|
assert res.ok?
|
|
|
|
assert_equal "subdomain.foo.org", res["X-Position"]
|
|
|
|
end
|
|
|
|
|
|
|
|
should "works with padrino core applications" do
|
|
|
|
Padrino.mount("simple_demo").host("padrino.org")
|
|
|
|
assert_equal ["simple_demo"], Padrino.mounted_apps.map(&:name)
|
|
|
|
assert_equal ["padrino.org"], Padrino.mounted_apps.map(&:app_host)
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(Padrino.application).get("/")
|
|
|
|
assert res.not_found?
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(Padrino.application).get("/", "HTTP_HOST" => "bar.org")
|
|
|
|
assert res.not_found?
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(Padrino.application).get("/", "HTTP_HOST" => "padrino.org")
|
|
|
|
assert res.ok?
|
|
|
|
end
|
|
|
|
|
|
|
|
should "works with padrino applications" do
|
|
|
|
Padrino.mount("simple_demo").to("/foo").host(/.*\.padrino.org/)
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(Padrino.application).get("/")
|
|
|
|
assert res.not_found?
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(Padrino.application).get("/", "HTTP_HOST" => "bar.org")
|
|
|
|
assert res.not_found?
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(Padrino.application).get("/", "HTTP_HOST" => "padrino.org")
|
|
|
|
assert res.not_found?
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(Padrino.application).get("/none", "HTTP_HOST" => "foo.padrino.org")
|
|
|
|
assert res.not_found?
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(Padrino.application).get("/foo", "HTTP_HOST" => "bar.padrino.org")
|
|
|
|
assert res.ok?
|
|
|
|
|
|
|
|
res = Rack::MockRequest.new(Padrino.application).get("/foo/", "HTTP_HOST" => "bar.padrino.org")
|
|
|
|
assert res.ok?
|
|
|
|
end
|
|
|
|
end
|