test/helpers_test.rb in sinatra-0.9.1.1 vs test/helpers_test.rb in sinatra-0.9.2
- old
+ new
@@ -1,497 +1,503 @@
require File.dirname(__FILE__) + '/helper'
-describe 'Helpers#status' do
- before do
- mock_app {
- get '/' do
- status 207
- nil
- end
- }
+class HelpersTest < Test::Unit::TestCase
+ def test_default
+ assert true
end
- it 'sets the response status code' do
- get '/'
- assert_equal 207, response.status
+ describe 'status' do
+ setup do
+ mock_app {
+ get '/' do
+ status 207
+ nil
+ end
+ }
+ end
+
+ it 'sets the response status code' do
+ get '/'
+ assert_equal 207, response.status
+ end
end
-end
-describe 'Helpers#body' do
- it 'takes a block for defered body generation' do
- mock_app {
- get '/' do
- body { 'Hello World' }
- end
- }
+ describe 'body' do
+ it 'takes a block for defered body generation' do
+ mock_app {
+ get '/' do
+ body { 'Hello World' }
+ end
+ }
- get '/'
- assert_equal 'Hello World', body
- end
+ get '/'
+ assert_equal 'Hello World', body
+ end
- it 'takes a String, Array, or other object responding to #each' do
- mock_app {
- get '/' do
- body 'Hello World'
- end
- }
+ it 'takes a String, Array, or other object responding to #each' do
+ mock_app {
+ get '/' do
+ body 'Hello World'
+ end
+ }
- get '/'
- assert_equal 'Hello World', body
+ get '/'
+ assert_equal 'Hello World', body
+ end
end
-end
-describe 'Helpers#redirect' do
- it 'uses a 302 when only a path is given' do
- mock_app {
- get '/' do
- redirect '/foo'
- fail 'redirect should halt'
- 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 '/'
- assert_equal 302, status
- assert_equal '', body
- assert_equal '/foo', response['Location']
- end
+ get '/'
+ assert_equal 302, status
+ assert_equal '', body
+ assert_equal '/foo', response['Location']
+ end
- it 'uses the code given when specified' do
- mock_app {
- get '/' do
- redirect '/foo', 301
- fail 'redirect should halt'
- end
- }
+ it 'uses the code given when specified' do
+ mock_app {
+ get '/' do
+ redirect '/foo', 301
+ fail 'redirect should halt'
+ end
+ }
- get '/'
- assert_equal 301, status
- assert_equal '', body
- assert_equal '/foo', response['Location']
- end
+ get '/'
+ assert_equal 301, status
+ assert_equal '', body
+ assert_equal '/foo', response['Location']
+ end
- it 'redirects back to request.referer when passed back' do
- mock_app {
- get '/try_redirect' do
- redirect back
- end
- }
+ it 'redirects back to request.referer when passed back' do
+ mock_app {
+ get '/try_redirect' do
+ redirect back
+ end
+ }
- request = Rack::MockRequest.new(@app)
- response = request.get('/try_redirect', 'HTTP_REFERER' => '/foo')
- assert_equal 302, response.status
- assert_equal '/foo', response['Location']
+ request = Rack::MockRequest.new(@app)
+ response = request.get('/try_redirect', 'HTTP_REFERER' => '/foo')
+ assert_equal 302, response.status
+ assert_equal '/foo', response['Location']
+ end
end
-end
+ describe 'error' do
+ it 'sets a status code and halts' do
+ mock_app {
+ get '/' do
+ error 501
+ fail 'error should halt'
+ end
+ }
-describe 'Helpers#error' do
- it 'sets a status code and halts' do
- mock_app {
- get '/' do
- error 501
- fail 'error should halt'
- end
- }
+ get '/'
+ assert_equal 501, status
+ assert_equal '', body
+ end
- get '/'
- assert_equal 501, status
- assert_equal '', body
- end
+ it 'takes an optional body' do
+ mock_app {
+ get '/' do
+ error 501, 'FAIL'
+ fail 'error should halt'
+ end
+ }
- it 'takes an optional body' do
- mock_app {
- get '/' do
- error 501, 'FAIL'
- fail 'error should halt'
- end
- }
+ get '/'
+ assert_equal 501, status
+ assert_equal 'FAIL', body
+ end
- get '/'
- assert_equal 501, status
- assert_equal 'FAIL', body
+ 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 '/'
+ assert_equal 500, status
+ assert_equal 'FAIL', body
+ end
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
- }
+ describe 'not_found' do
+ it 'halts with a 404 status' do
+ mock_app {
+ get '/' do
+ not_found
+ fail 'not_found should halt'
+ end
+ }
- get '/'
- assert_equal 500, status
- assert_equal 'FAIL', body
+ get '/'
+ assert_equal 404, status
+ assert_equal '', body
+ end
end
-end
-describe 'Helpers#not_found' do
- it 'halts with a 404 status' do
- mock_app {
- get '/' do
- not_found
- fail 'not_found should halt'
- end
- }
+ describe 'headers' do
+ it 'sets headers on the response object when given a Hash' do
+ mock_app {
+ get '/' do
+ headers 'X-Foo' => 'bar', 'X-Baz' => 'bling'
+ 'kthx'
+ end
+ }
- get '/'
- assert_equal 404, status
- assert_equal '', body
- end
-end
+ get '/'
+ assert ok?
+ assert_equal 'bar', response['X-Foo']
+ assert_equal 'bling', response['X-Baz']
+ assert_equal 'kthx', body
+ end
-describe 'Helpers#headers' do
- it 'sets headers on the response object when given a Hash' do
- mock_app {
- get '/' do
- headers 'X-Foo' => 'bar', 'X-Baz' => 'bling'
- 'kthx'
- end
- }
+ it 'returns the response headers hash when no hash provided' do
+ mock_app {
+ get '/' do
+ headers['X-Foo'] = 'bar'
+ 'kthx'
+ end
+ }
- get '/'
- assert ok?
- assert_equal 'bar', response['X-Foo']
- assert_equal 'bling', response['X-Baz']
- assert_equal 'kthx', body
+ get '/'
+ assert ok?
+ assert_equal 'bar', response['X-Foo']
+ end
end
- it 'returns the response headers hash when no hash provided' do
- mock_app {
- get '/' do
- headers['X-Foo'] = 'bar'
- 'kthx'
- end
- }
+ describe 'session' do
+ it 'uses the existing rack.session' do
+ mock_app {
+ get '/' do
+ session[:foo]
+ end
+ }
- get '/'
- assert ok?
- assert_equal 'bar', response['X-Foo']
- end
-end
+ get '/', {}, { 'rack.session' => { :foo => 'bar' } }
+ assert_equal 'bar', body
+ end
-describe 'Helpers#session' do
- it 'uses the existing rack.session' do
- mock_app {
- get '/' do
- session[:foo]
- end
- }
+ it 'creates a new session when none provided' do
+ mock_app {
+ get '/' do
+ assert session.empty?
+ session[:foo] = 'bar'
+ 'Hi'
+ end
+ }
- get '/', :env => { 'rack.session' => { :foo => 'bar' } }
- assert_equal 'bar', body
+ get '/'
+ assert_equal 'Hi', body
+ end
end
- it 'creates a new session when none provided' do
- mock_app {
- get '/' do
- assert session.empty?
- session[:foo] = 'bar'
- 'Hi'
- end
- }
+ describe 'media_type' do
+ include Sinatra::Helpers
- get '/'
- assert_equal 'Hi', body
- end
-end
+ it "looks up media types in Rack's MIME registry" do
+ Rack::Mime::MIME_TYPES['.foo'] = 'application/foo'
+ assert_equal 'application/foo', media_type('foo')
+ assert_equal 'application/foo', media_type('.foo')
+ assert_equal 'application/foo', media_type(:foo)
+ end
-describe 'Helpers#media_type' do
- include Sinatra::Helpers
+ it 'returns nil when given nil' do
+ assert media_type(nil).nil?
+ end
- it "looks up media types in Rack's MIME registry" do
- Rack::Mime::MIME_TYPES['.foo'] = 'application/foo'
- assert_equal 'application/foo', media_type('foo')
- assert_equal 'application/foo', media_type('.foo')
- assert_equal 'application/foo', media_type(:foo)
- end
+ it 'returns nil when media type not registered' do
+ assert media_type(:bizzle).nil?
+ end
- it 'returns nil when given nil' do
- assert media_type(nil).nil?
+ it 'returns the argument when given a media type string' do
+ assert_equal 'text/plain', media_type('text/plain')
+ end
end
- it 'returns nil when media type not registered' do
- assert media_type(:bizzle).nil?
- end
+ describe 'content_type' do
+ it 'sets the Content-Type header' do
+ mock_app {
+ get '/' do
+ content_type 'text/plain'
+ 'Hello World'
+ end
+ }
- it 'returns the argument when given a media type string' do
- assert_equal 'text/plain', media_type('text/plain')
- end
-end
+ get '/'
+ assert_equal 'text/plain', response['Content-Type']
+ assert_equal 'Hello World', body
+ end
-describe 'Helpers#content_type' do
- it 'sets the Content-Type header' do
- mock_app {
- get '/' do
- content_type 'text/plain'
- 'Hello World'
- end
- }
+ it 'takes media type parameters (like charset=)' do
+ mock_app {
+ get '/' do
+ content_type 'text/html', :charset => 'utf-8'
+ "<h1>Hello, World</h1>"
+ end
+ }
- get '/'
- assert_equal 'text/plain', response['Content-Type']
- assert_equal 'Hello World', body
- end
+ get '/'
+ assert ok?
+ assert_equal 'text/html;charset=utf-8', response['Content-Type']
+ assert_equal "<h1>Hello, World</h1>", body
+ end
- it 'takes media type parameters (like charset=)' do
- mock_app {
- get '/' do
- content_type 'text/html', :charset => 'utf-8'
- "<h1>Hello, World</h1>"
- end
- }
+ it "looks up symbols in Rack's mime types dictionary" do
+ Rack::Mime::MIME_TYPES['.foo'] = 'application/foo'
+ mock_app {
+ get '/foo.xml' do
+ content_type :foo
+ "I AM FOO"
+ end
+ }
- get '/'
- assert ok?
- assert_equal 'text/html;charset=utf-8', response['Content-Type']
- assert_equal "<h1>Hello, World</h1>", body
- end
+ get '/foo.xml'
+ assert ok?
+ assert_equal 'application/foo', response['Content-Type']
+ assert_equal 'I AM FOO', body
+ end
- it "looks up symbols in Rack's mime types dictionary" do
- Rack::Mime::MIME_TYPES['.foo'] = 'application/foo'
- mock_app {
- get '/foo.xml' do
- content_type :foo
- "I AM FOO"
- end
- }
+ it 'fails when no mime type is registered for the argument provided' do
+ mock_app {
+ get '/foo.xml' do
+ content_type :bizzle
+ "I AM FOO"
+ end
+ }
- get '/foo.xml'
- assert ok?
- assert_equal 'application/foo', response['Content-Type']
- assert_equal 'I AM FOO', body
+ assert_raise(RuntimeError) { get '/foo.xml' }
+ end
end
- it 'fails when no mime type is registered for the argument provided' do
- mock_app {
- get '/foo.xml' do
- content_type :bizzle
- "I AM FOO"
- end
- }
- assert_raise(RuntimeError) { get '/foo.xml' }
- end
-end
+ describe 'send_file' do
+ setup do
+ @file = File.dirname(__FILE__) + '/file.txt'
+ File.open(@file, 'wb') { |io| io.write('Hello World') }
+ end
-describe 'Helpers#send_file' do
- before do
- @file = File.dirname(__FILE__) + '/file.txt'
- File.open(@file, 'wb') { |io| io.write('Hello World') }
- end
+ def teardown
+ File.unlink @file
+ @file = nil
+ end
- after do
- File.unlink @file
- @file = nil
- end
+ def send_file_app(opts={})
+ path = @file
+ mock_app {
+ get '/file.txt' do
+ send_file path, opts
+ end
+ }
+ end
- def send_file_app(opts={})
- path = @file
- mock_app {
- get '/file.txt' do
- send_file path, opts
- end
- }
- end
+ it "sends the contents of the file" do
+ send_file_app
+ get '/file.txt'
+ assert ok?
+ assert_equal 'Hello World', body
+ end
- it "sends the contents of the file" do
- send_file_app
- get '/file.txt'
- assert ok?
- assert_equal 'Hello World', body
- end
+ it 'sets the Content-Type response header if a mime-type can be located' do
+ send_file_app
+ get '/file.txt'
+ assert_equal 'text/plain', response['Content-Type']
+ end
- it 'sets the Content-Type response header if a mime-type can be located' do
- send_file_app
- get '/file.txt'
- assert_equal 'text/plain', response['Content-Type']
- end
+ it 'sets the Content-Length response header' do
+ send_file_app
+ get '/file.txt'
+ assert_equal 'Hello World'.length.to_s, response['Content-Length']
+ end
- it 'sets the Content-Length response header' do
- send_file_app
- get '/file.txt'
- assert_equal 'Hello World'.length.to_s, response['Content-Length']
- end
+ it 'sets the Last-Modified response header' do
+ send_file_app
+ get '/file.txt'
+ assert_equal File.mtime(@file).httpdate, response['Last-Modified']
+ end
- it 'sets the Last-Modified response header' do
- send_file_app
- get '/file.txt'
- assert_equal File.mtime(@file).httpdate, response['Last-Modified']
- end
+ it "returns a 404 when not found" do
+ mock_app {
+ get '/' do
+ send_file 'this-file-does-not-exist.txt'
+ end
+ }
+ get '/'
+ assert not_found?
+ end
- it "returns a 404 when not found" do
- mock_app {
- get '/' do
- send_file 'this-file-does-not-exist.txt'
- end
- }
- get '/'
- assert not_found?
- end
+ it "does not set the Content-Disposition header by default" do
+ send_file_app
+ get '/file.txt'
+ assert_nil response['Content-Disposition']
+ end
- it "does not set the Content-Disposition header by default" do
- send_file_app
- get '/file.txt'
- assert_nil response['Content-Disposition']
- end
+ it "sets the Content-Disposition header when :disposition set to 'attachment'" do
+ send_file_app :disposition => 'attachment'
+ get '/file.txt'
+ assert_equal 'attachment; filename="file.txt"', response['Content-Disposition']
+ end
- it "sets the Content-Disposition header when :disposition set to 'attachment'" do
- send_file_app :disposition => 'attachment'
- get '/file.txt'
- assert_equal 'attachment; filename="file.txt"', response['Content-Disposition']
+ it "sets the Content-Disposition header when :filename provided" do
+ send_file_app :filename => 'foo.txt'
+ get '/file.txt'
+ assert_equal 'attachment; filename="foo.txt"', response['Content-Disposition']
+ end
end
- it "sets the Content-Disposition header when :filename provided" do
- send_file_app :filename => 'foo.txt'
- get '/file.txt'
- assert_equal 'attachment; filename="foo.txt"', response['Content-Disposition']
- end
-end
+ describe 'last_modified' do
+ setup do
+ now = Time.now
+ mock_app {
+ get '/' do
+ body { 'Hello World' }
+ last_modified now
+ 'Boo!'
+ end
+ }
+ @now = now
+ end
-describe 'Helpers#last_modified' do
- before do
- now = Time.now
- mock_app {
- get '/' do
- body { 'Hello World' }
- last_modified now
- 'Boo!'
- end
- }
- @now = now
- end
+ it 'sets the Last-Modified header to a valid RFC 2616 date value' do
+ get '/'
+ assert_equal @now.httpdate, response['Last-Modified']
+ end
- it 'sets the Last-Modified header to a valid RFC 2616 date value' do
- get '/'
- assert_equal @now.httpdate, response['Last-Modified']
- end
+ it 'returns a body when conditional get misses' do
+ get '/'
+ assert_equal 200, status
+ assert_equal 'Boo!', body
+ end
- it 'returns a body when conditional get misses' do
- get '/'
- assert_equal 200, status
- assert_equal 'Boo!', body
+ it 'halts when a conditional GET matches' do
+ get '/', {}, { 'HTTP_IF_MODIFIED_SINCE' => @now.httpdate }
+ assert_equal 304, status
+ assert_equal '', body
+ end
end
- it 'halts when a conditional GET matches' do
- get '/', :env => { 'HTTP_IF_MODIFIED_SINCE' => @now.httpdate }
- assert_equal 304, status
- assert_equal '', body
- end
-end
+ describe 'etag' do
+ setup do
+ mock_app {
+ get '/' do
+ body { 'Hello World' }
+ etag 'FOO'
+ 'Boo!'
+ end
+ }
+ end
-describe 'Helpers#etag' do
- before do
- mock_app {
- get '/' do
- body { 'Hello World' }
- etag 'FOO'
- 'Boo!'
- end
- }
- end
+ it 'sets the ETag header' do
+ get '/'
+ assert_equal '"FOO"', response['ETag']
+ end
- it 'sets the ETag header' do
- get '/'
- assert_equal '"FOO"', response['ETag']
- end
+ it 'returns a body when conditional get misses' do
+ get '/'
+ assert_equal 200, status
+ assert_equal 'Boo!', body
+ end
- it 'returns a body when conditional get misses' do
- get '/'
- assert_equal 200, status
- assert_equal 'Boo!', body
- end
+ it 'halts when a conditional GET matches' do
+ get '/', {}, { 'HTTP_IF_NONE_MATCH' => '"FOO"' }
+ assert_equal 304, status
+ assert_equal '', body
+ end
- it 'halts when a conditional GET matches' do
- get '/', :env => { 'HTTP_IF_NONE_MATCH' => '"FOO"' }
- assert_equal 304, status
- assert_equal '', body
- end
+ it 'should handle multiple ETag values in If-None-Match header' do
+ get '/', {}, { 'HTTP_IF_NONE_MATCH' => '"BAR", *' }
+ assert_equal 304, status
+ assert_equal '', body
+ end
- it 'should handle multiple ETag values in If-None-Match header' do
- get '/', :env => { 'HTTP_IF_NONE_MATCH' => '"BAR", *' }
- assert_equal 304, status
- assert_equal '', body
+ it 'uses a weak etag with the :weak option' do
+ mock_app {
+ get '/' do
+ etag 'FOO', :weak
+ "that's weak, dude."
+ end
+ }
+ get '/'
+ assert_equal 'W/"FOO"', response['ETag']
+ end
end
- it 'uses a weak etag with the :weak option' do
- mock_app {
- get '/' do
- etag 'FOO', :weak
- "that's weak, dude."
- end
- }
- get '/'
- assert_equal 'W/"FOO"', response['ETag']
- end
-end
+ describe 'back' do
+ it "makes redirecting back pretty" do
+ mock_app {
+ get '/foo' do
+ redirect back
+ end
+ }
-describe 'Helpers#back' do
- it "makes redirecting back pretty" do
- mock_app {
- get '/foo' do
- redirect back
- end
- }
-
- get '/foo', {}, 'HTTP_REFERER' => 'http://github.com'
- assert redirect?
- assert_equal "http://github.com", response.location
+ get '/foo', {}, 'HTTP_REFERER' => 'http://github.com'
+ assert redirect?
+ assert_equal "http://github.com", response.location
+ end
end
-end
-module HelperOne; def one; '1'; end; end
-module HelperTwo; def two; '2'; end; end
+ module ::HelperOne; def one; '1'; end; end
+ module ::HelperTwo; def two; '2'; end; end
-describe 'Adding new helpers' do
- it 'takes a list of modules to mix into the app' do
- mock_app {
- helpers HelperOne, HelperTwo
+ describe 'Adding new helpers' do
+ it 'takes a list of modules to mix into the app' do
+ mock_app {
+ helpers ::HelperOne, ::HelperTwo
- get '/one' do
- one
- end
+ get '/one' do
+ one
+ end
- get '/two' do
- two
- end
- }
+ get '/two' do
+ two
+ end
+ }
- get '/one'
- assert_equal '1', body
+ get '/one'
+ assert_equal '1', body
- get '/two'
- assert_equal '2', body
- end
+ get '/two'
+ assert_equal '2', body
+ end
- it 'takes a block to mix into the app' do
- mock_app {
- helpers do
- def foo
- 'foo'
+ it 'takes a block to mix into the app' do
+ mock_app {
+ helpers do
+ def foo
+ 'foo'
+ end
end
- end
- get '/' do
- foo
- end
- }
+ get '/' do
+ foo
+ end
+ }
- get '/'
- assert_equal 'foo', body
- end
+ get '/'
+ assert_equal 'foo', body
+ end
- it 'evaluates the block in class context so that methods can be aliased' do
- mock_app {
- helpers do
- alias_method :h, :escape_html
- end
+ it 'evaluates the block in class context so that methods can be aliased' do
+ mock_app {
+ helpers do
+ alias_method :h, :escape_html
+ end
- get '/' do
- h('42 < 43')
- end
- }
+ get '/' do
+ h('42 < 43')
+ end
+ }
- get '/'
- assert ok?
- assert_equal '42 < 43', body
+ get '/'
+ assert ok?
+ assert_equal '42 < 43', body
+ end
end
end