spec/unit/response_spec.rb in restfulness-0.1.0 vs spec/unit/response_spec.rb in restfulness-0.2.0

- old
+ new

@@ -24,22 +24,24 @@ end describe "#initialize" do it "should assign request and headers" do obj.request.should eql(request) - obj.headers.should eql({'Content-Type' => 'application/json; charset=utf-8'}) - obj.code.should be_nil + obj.headers.should eql({}) + obj.status.should be_nil + obj.payload.should be_nil end end describe "#run" do context "without route" do it "should not do anything" do request.stub(:route).and_return(nil) obj.run - obj.code.should eql(404) + obj.status.should eql(404) obj.payload.should be_empty + obj.headers['Content-Type'].should match(/text\/plain/) obj.headers['Content-Length'].should eql(0.to_s) end end context "with route" do let :route do @@ -52,14 +54,78 @@ resource = double(:Resource) resource.should_receive(:check_callbacks) resource.should_receive(:call).and_return({:foo => 'bar'}) route.stub(:build_resource).and_return(resource) obj.run - obj.code.should eql(200) + obj.status.should eql(200) str = "{\"foo\":\"bar\"}" obj.payload.should eql(str) + obj.headers['Content-Type'].should match(/application\/json/) obj.headers['Content-Length'].should eql(str.bytesize.to_s) - end + end + + it "should call resource and set 204 result if no content" do + request.stub(:route).and_return(route) + request.action = :get + resource = double(:Resource) + resource.should_receive(:check_callbacks) + resource.should_receive(:call).and_return(nil) + route.stub(:build_resource).and_return(resource) + obj.run + obj.status.should eql(204) + obj.headers['Content-Type'].should match(/text\/plain/) + end + + it "should set string content type if payload is a string" do + request.stub(:route).and_return(route) + request.action = :get + resource = double(:Resource) + resource.should_receive(:check_callbacks) + resource.should_receive(:call).and_return("This is a text message") + route.stub(:build_resource).and_return(resource) + obj.run + obj.status.should eql(200) + obj.headers['Content-Type'].should match(/text\/plain/) + end end + + context "with exceptions" do + let :route do + app.router.routes.first + end + + it "should update the status and payload" do + request.stub(:route).and_return(route) + request.action = :get + resource = double(:Resource) + txt = "This is a text error" + resource.stub(:check_callbacks) do + raise Restfulness::HTTPException.new(418, txt) + end + route.stub(:build_resource).and_return(resource) + obj.run + obj.status.should eql(418) + obj.headers['Content-Type'].should match(/text\/plain/) + obj.payload.should eql(txt) + end + + it "should update the status and provide JSON payload" do + request.stub(:route).and_return(route) + request.action = :get + resource = double(:Resource) + err = {:error => "This is a text error"} + resource.stub(:check_callbacks) do + raise Restfulness::HTTPException.new(418, err) + end + route.stub(:build_resource).and_return(resource) + obj.run + obj.status.should eql(418) + obj.headers['Content-Type'].should match(/application\/json/) + obj.payload.should eql(err.to_json) + end + + + end + end end