spec/private/rack/dispatch_spec.rb in joshbuddy-usher-0.5.4 vs spec/private/rack/dispatch_spec.rb in joshbuddy-usher-0.5.6
- old
+ new
@@ -53,121 +53,153 @@
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
+ it "shouldn't 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 == ""
+ e['SCRIPT_NAME'].should == ""
+ e['PATH_INFO'].should == "/foo"
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
-
+
+ it "should not modify SCRIPT_NAME in place since thin freezes it" do
+ @app.should_receive(:call).once
+ env = Rack::MockRequest.env_for("/foo/bar/good")
+ env["SCRIPT_NAME"] = "".freeze
+ route_set.call(env)
+ end
end
-
+
describe "dupping" do
- before do
+ before do
@app = mock("app")
@u1 = Usher::Interface.for(:rack)
@u2 = Usher::Interface.for(:rack)
-
+
@u1.add("/one", :default_values => {:one => :one}).to(@app)
@u1.add("/mount").match_partially!.to(@u2)
-
+
@u2.add("/app", :default_values => {:foo => :bar}).to(@app)
-
+
end
-
+
it "should allow me to dup the router" do
@app.should_receive(:call).twice.with{|e| e['usher.params'].should == {:one => :one}}
@u1.call(Rack::MockRequest.env_for("/one"))
u1_dash = @u1.dup
u1_dash.call(Rack::MockRequest.env_for("/one"))
end
-
+
it "should allow me to dup the router and add a new route without polluting the original" do
@app.should_receive(:call).with{|e| e['usher.params'].should == {:foo => :bar}}
u1_dash = @u1.dup
u1_dash.add("/foo", :default_values => {:foo => :bar}).to(@app)
u1_dash.call(Rack::MockRequest.env_for("/foo"))
@app.should_not_receive(:call)
@u1.call(Rack::MockRequest.env_for("/foo"))
end
-
+
it "should allow me to dup the router and nested routers should remain intact" do
@app.should_receive(:call).with{|e| e['usher.params'].should == {:foo => :bar}}
u1_dash = @u1.dup
u1_dash.call(Rack::MockRequest.env_for("/mount/app"))
end
-
+
it "should allow me to dup the router and add more routes" do
@app.should_receive(:call).with{|e| e['usher.params'].should == {:another => :bar}}
-
+
u3 = Usher::Interface.for(:rack)
u1_dash = @u1.dup
-
+
u3.add("/another_bar", :default_values => {:another => :bar}).to(@app)
u1_dash.add("/some/mount").match_partially!.to(u3)
-
+
u1_dash.call(Rack::MockRequest.env_for("/some/mount/another_bar"))
-
+
@app.should_not_receive(:call)
@u1.call(Rack::MockRequest.env_for("/some/mount/another_bar"))
end
+ end
+ end
+
+ describe "use as middlware" do
+ it "should allow me to set a default application to use" do
+ @app.should_receive(:call).with{|e| e['usher.params'].should == {:middle => :ware}}
+
+ u = Usher::Interface::RackInterface.new(@app)
+ u.add("/foo", :default_values => {:middle => :ware}).name(:foo)
+
+ u.call(Rack::MockRequest.env_for("/foo"))
+ end
+
+ it "should use the default application when no routes match" do
+ env = Rack::MockRequest.env_for("/not_a_route")
+ @app.should_receive(:call).with(env)
+ u = Usher::Interface::RackInterface.new(@app)
+ u.call(env)
+ end
+
+ it "should allow me to set the application after initialization" do
+ @app.should_receive(:call).with{|e| e['usher.params'].should == {:after => :stuff}}
+ u = Usher::Interface.for(:rack)
+ u.app = @app
+ u.add("/foo", :default_values => {:after => :stuff})
+ u.call(Rack::MockRequest.env_for("/foo"))
end
end
end