spec/private/rack/dispatch_spec.rb in joshbuddy-usher-0.5.1 vs spec/private/rack/dispatch_spec.rb in joshbuddy-usher-0.5.2
- old
+ new
@@ -1,29 +1,114 @@
require 'lib/usher'
-
require 'rack'
+require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
route_set = Usher::Interface.for(:rack)
+route_set.extend(CallWithMockRequestMixin)
describe "Usher (for rack) route dispatching" do
-
before(:each) do
route_set.reset!
+ @app = MockApp.new("Hello World!")
+ route_set.add('/sample').to(@app)
end
- it "should dispatch a simple request" do
- app = mock 'app'
- app.should_receive(:call).once.with {|v| v['usher.params'].should == {} }
- route_set.add('/sample').to(app)
- route_set.call(Rack::MockRequest.env_for("/sample", :method => 'GET'))
+ describe "HTTP GET" do
+ it "should dispatch a request" do
+ response = route_set.call_with_mock_request
+ response.body.should eql("Hello World!")
+ end
+
+ it "should write usher.params" do
+ response = route_set.call_with_mock_request
+ @app.env["usher.params"].should == {}
+ end
end
-
- it "should dispatch a POST request" do
- bad_app = mock 'bad_app'
- app = mock 'app'
- app.should_receive(:call).once.with {|v| v['usher.params'].should == {} }
- route_set.add('/sample').to(bad_app)
- route_set.add('/sample', :requirements => {:request_method => 'POST'}).to(app)
- route_set.call(Rack::MockRequest.env_for("/sample", :request_method => 'POST'))
+
+ describe "HTTP POST" do
+ before(:each) do
+ bad_app = MockApp.new("You shouldn't get here if you are using POST")
+ route_set.add('/sample').to(bad_app)
+ route_set.add('/sample', :requirements => {:request_method => 'POST'}).to(@app)
+ end
+
+ it "should dispatch a request" do
+ response = route_set.call_with_mock_request
+ response.body.should eql("Hello World!")
+ end
+
+ it "should write usher.params" do
+ response = route_set.call_with_mock_request("/sample", :request_method => 'POST')
+ @app.env["usher.params"].should == {}
+ end
end
+
+ it "should returns HTTP 404 if route doesn't exist" do
+ response = route_set.call_with_mock_request("/not-existing-url")
+ response.status.should eql(404)
+ end
+ describe "mounted rack instances" do
+ before do
+ @bad_app = mock("bad_app")
+
+ @usher2 = Usher::Interface.for(:rack)
+ @usher2.add("/good" ).to(@app)
+ @usher2.add("/bad" ).match_partially!.to(@bad_app)
+ @usher2.add("/some(/:foo)").to(@app)
+
+ route_set.add("/foo/:bar", :default_values => {:foo => "foo"}).match_partially!.to(@usher2)
+ route_set.add("/foo", :default_values => {:controller => :foo}).to(@app)
+ end
+
+ it "should match the route without nesting" do
+ @app.should_receive(:call).once.with{ |e| e['usher.params'].should == {:controller => :foo}}
+ route_set.call(Rack::MockRequest.env_for("/foo"))
+ end
+
+ it "should route through the first route, and the second to the app" do
+ @app.should_receive(:call).once.with{|e| e['usher.params'].should == {:bar => "bar", :foo => "foo"}}
+ result = route_set.call(Rack::MockRequest.env_for("/foo/bar/good"))
+ end
+
+ it "should go through to the bad app" do
+ @bad_app.should_receive(:call).once.with{|e| e['usher.params'].should == {:bar => "some_bar", :foo => "foo"}}
+ result = route_set.call(Rack::MockRequest.env_for("/foo/some_bar/bad"))
+ end
+
+ it "should match optional routes paramters" do
+ @app.should_receive(:call).once.with{|e| e['usher.params'].should == {:bar => "bar", :foo => "a_different_foo"}}
+ route_set.call(Rack::MockRequest.env_for("/foo/bar/some/a_different_foo"))
+ end
+
+ describe "SCRIPT_NAME & PATH_INFO" do
+ it "should update the script name for a fully consumed route" do
+ @app.should_receive(:call).once.with do |e|
+ e['SCRIPT_NAME'].should == "/foo"
+ e['PATH_INFO'].should == ""
+ end
+ route_set.call(Rack::MockRequest.env_for("/foo"))
+ end
+
+ it "should update the script name and path info for a partially consumed route" do
+ @app.should_receive(:call).once.with do |e|
+ e['SCRIPT_NAME'].should == "/partial"
+ e['PATH_INFO'].should == "/bar/baz"
+ end
+
+ route_set.add("/partial").match_partially!.to(@app)
+ route_set.call(Rack::MockRequest.env_for("/partial/bar/baz"))
+ end
+
+ it "should consume the path through a mounted usher" do
+ @bad_app.should_receive(:call).once.with do |e|
+ e['SCRIPT_NAME'].should == "/foo/bar/bad"
+ e['PATH_INFO'].should == "/leftovers"
+ end
+
+ route_set.call(Rack::MockRequest.env_for("/foo/bar/bad/leftovers"))
+ end
+
+ end
+
+ end
end