require File.dirname(__FILE__) + '/helper' context "Sinatra" do setup do Sinatra.application = nil end specify "should put all DSL methods on (main)" do object = Object.new Sinatra::Application::FORWARD_METHODS.each do |method| object.private_methods.should.include(method) end end specify "should handle result of nil" do get '/' do nil end get_it '/' should.be.ok body.should == '' end specify "handles events" do get '/:name' do 'Hello ' + params["name"] end get_it '/Blake' should.be.ok body.should.equal 'Hello Blake' end specify "handles splats" do get '/hi/*' do params["splat"].kind_of?(Array).should.equal true params["splat"].first end get_it '/hi/Blake' should.be.ok body.should.equal 'Blake' end specify "handles multiple splats" do get '/say/*/to/*' do params["splat"].join(' ') end get_it '/say/hello/to/world' should.be.ok body.should.equal 'hello world' end specify "allow empty splats" do get '/say/*/to*/*' do params["splat"].join(' ') end get_it '/say/hello/to/world' should.be.ok body.should.equal 'hello world' # second splat is empty get_it '/say/hello/tomy/world' should.be.ok body.should.equal 'hello my world' end specify "gives access to underlying response header Hash" do get '/' do header['X-Test'] = 'Is this thing on?' headers 'X-Test2' => 'Foo', 'X-Test3' => 'Bar' '' end get_it '/' should.be.ok headers.should.include 'X-Test' headers['X-Test'].should.equal 'Is this thing on?' headers.should.include 'X-Test3' headers['X-Test3'].should.equal 'Bar' end specify "follows redirects" do get '/' do redirect '/blake' end get '/blake' do 'Mizerany' end get_it '/' should.be.redirection body.should.equal '' follow! should.be.ok body.should.equal 'Mizerany' end specify "renders a body with a redirect" do Sinatra::EventContext.any_instance.expects(:foo).returns('blah') get "/" do redirect 'foo', :foo end get_it '/' should.be.redirection headers['Location'].should.equal 'foo' body.should.equal 'blah' end specify "redirects permanently with 301 status code" do get "/" do redirect 'foo', 301 end get_it '/' should.be.redirection headers['Location'].should.equal 'foo' status.should.equal 301 body.should.be.empty end specify "stop sets content and ends event" do Sinatra::EventContext.any_instance.expects(:foo).never get '/set_body' do stop 'Hello!' stop 'World!' foo end get_it '/set_body' should.be.ok body.should.equal 'Hello!' end specify "should set status then call helper with a var" do Sinatra::EventContext.any_instance.expects(:foo).once.with(1).returns('bah!') get '/set_body' do stop [404, [:foo, 1]] end get_it '/set_body' should.be.not_found body.should.equal 'bah!' end specify "should easily set response Content-Type" do get '/foo.html' do content_type 'text/html', :charset => 'utf-8' "