middleman/middleman-core/lib/vendored-middleman-deps/padrino-core-0.12.0/test/test_router.rb
2014-02-18 18:30:29 -08:00

266 lines
7.8 KiB
Ruby

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 },
{ :path => '/foo/bar', :to => app },
{ :path => '/foo', :to => app }
)
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
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
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