require 'test/spec' require 'sinatra/base' require 'sinatra/test' class Test::Unit::TestCase include Sinatra::Test end describe 'Sinatra::Helpers' do describe '#status' do setup do mock_app { get '/' do status 207 nil end } end it 'sets the response status code' do get '/' response.status.should.equal 207 end end describe '#body' do it 'takes a block for defered body generation' do mock_app { get '/' do body { 'Hello World' } end } get '/' body.should.equal 'Hello World' end it 'takes a String, Array, or other object responding to #each' do mock_app { get '/' do body 'Hello World' end } get '/' body.should.equal 'Hello World' end end describe '#redirect' do it 'uses a 302 when only a path is given' do mock_app { get '/' do redirect '/foo' fail 'redirect should halt' end } get '/' status.should.equal 302 body.should.be.empty response['Location'].should.equal '/foo' end it 'uses the code given when specified' do mock_app { get '/' do redirect '/foo', 301 fail 'redirect should halt' end } get '/' status.should.equal 301 body.should.be.empty response['Location'].should.equal '/foo' end end describe '#error' do it 'sets a status code and halts' do mock_app { get '/' do error 501 fail 'error should halt' end } get '/' status.should.equal 501 body.should.be.empty end it 'takes an optional body' do mock_app { get '/' do error 501, 'FAIL' fail 'error should halt' end } get '/' status.should.equal 501 body.should.equal 'FAIL' end it 'uses a 500 status code when first argument is a body' do mock_app { get '/' do error 'FAIL' fail 'error should halt' end } get '/' status.should.equal 500 body.should.equal 'FAIL' end end describe '#not_found' do it 'halts with a 404 status' do mock_app { get '/' do not_found fail 'not_found should halt' end } get '/' status.should.equal 404 body.should.be.empty end end describe '#session' do it 'uses the existing rack.session' do mock_app { get '/' do session[:foo] end } get '/', :env => { 'rack.session' => { :foo => 'bar' } } body.should.equal 'bar' end it 'creates a new session when none provided' do mock_app { get '/' do session.should.be.empty session[:foo] = 'bar' 'Hi' end } get '/' body.should.equal 'Hi' end end describe '#media_type' do include Sinatra::Helpers it "looks up media types in Rack's MIME registry" do Rack::Mime::MIME_TYPES['.foo'] = 'application/foo' media_type('foo').should.equal 'application/foo' media_type('.foo').should.equal 'application/foo' media_type(:foo).should.equal 'application/foo' end it 'returns nil when given nil' do media_type(nil).should.be.nil end it 'returns nil when media type not registered' do media_type(:bizzle).should.be.nil end it 'returns the argument when given a media type string' do media_type('text/plain').should.equal 'text/plain' end end describe '#content_type' do it 'sets the Content-Type header' do mock_app { get '/' do content_type 'text/plain' 'Hello World' end } get '/' response['Content-Type'].should.equal 'text/plain' body.should.equal 'Hello World' end it 'takes media type parameters (like charset=)' do mock_app { get '/' do content_type 'text/html', :charset => 'utf-8' "