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 methods = %w[get put post head delete configure template helpers set] methods.each do |method| object.private_methods.map { |m| m.to_sym }.should.include(method.to_sym) 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 helpers do def foo ; 'blah' ; end end 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 get '/set_body' do stop 'Hello!' stop 'World!' fail 'stop should have halted' end get_it '/set_body' should.be.ok body.should.equal 'Hello!' end # Deprecated. WTF was going on here? What's the 1 in [:foo, 1] do? xspecify "should set status then call helper with a var" do helpers do def foo 'bah!' end end 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' "