sinatra 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sinatra might be problematic. Click here for more details.

Files changed (109) hide show
  1. data/ChangeLog +64 -0
  2. data/LICENSE +1 -1
  3. data/README.rdoc +244 -141
  4. data/Rakefile +111 -0
  5. data/lib/sinatra.rb +942 -627
  6. data/{vendor/rack/lib → lib/sinatra}/rack/handler/mongrel.rb +10 -3
  7. data/lib/sinatra/test/methods.rb +56 -36
  8. data/lib/sinatra/test/rspec.rb +10 -0
  9. data/lib/sinatra/test/spec.rb +2 -2
  10. data/lib/sinatra/test/unit.rb +1 -1
  11. data/sinatra.gemspec +71 -43
  12. data/test/app_test.rb +181 -32
  13. data/test/application_test.rb +179 -36
  14. data/test/custom_error_test.rb +17 -22
  15. data/test/erb_test.rb +42 -22
  16. data/test/event_context_test.rb +3 -3
  17. data/test/events_test.rb +8 -11
  18. data/test/filter_test.rb +30 -0
  19. data/test/haml_test.rb +83 -31
  20. data/test/helper.rb +6 -3
  21. data/test/mapped_error_test.rb +32 -21
  22. data/test/pipeline_test.rb +66 -0
  23. data/test/sass_test.rb +7 -7
  24. data/test/sessions_test.rb +8 -9
  25. data/test/streaming_test.rb +10 -4
  26. data/test/sym_params_test.rb +1 -1
  27. data/test/template_test.rb +11 -11
  28. data/test/use_in_file_templates_test.rb +9 -10
  29. metadata +22 -101
  30. data/CHANGELOG +0 -3
  31. data/Manifest +0 -122
  32. data/index.html +0 -9
  33. data/test/diddy_test.rb +0 -41
  34. data/test/rest_test.rb +0 -16
  35. data/vendor/rack/AUTHORS +0 -7
  36. data/vendor/rack/COPYING +0 -18
  37. data/vendor/rack/KNOWN-ISSUES +0 -18
  38. data/vendor/rack/README +0 -242
  39. data/vendor/rack/Rakefile +0 -174
  40. data/vendor/rack/bin/rackup +0 -153
  41. data/vendor/rack/contrib/rack_logo.svg +0 -111
  42. data/vendor/rack/example/lobster.ru +0 -4
  43. data/vendor/rack/example/protectedlobster.rb +0 -14
  44. data/vendor/rack/example/protectedlobster.ru +0 -8
  45. data/vendor/rack/lib/rack.rb +0 -92
  46. data/vendor/rack/lib/rack/adapter/camping.rb +0 -22
  47. data/vendor/rack/lib/rack/auth/abstract/handler.rb +0 -28
  48. data/vendor/rack/lib/rack/auth/abstract/request.rb +0 -37
  49. data/vendor/rack/lib/rack/auth/basic.rb +0 -58
  50. data/vendor/rack/lib/rack/auth/digest/md5.rb +0 -124
  51. data/vendor/rack/lib/rack/auth/digest/nonce.rb +0 -51
  52. data/vendor/rack/lib/rack/auth/digest/params.rb +0 -55
  53. data/vendor/rack/lib/rack/auth/digest/request.rb +0 -40
  54. data/vendor/rack/lib/rack/auth/openid.rb +0 -116
  55. data/vendor/rack/lib/rack/builder.rb +0 -56
  56. data/vendor/rack/lib/rack/cascade.rb +0 -36
  57. data/vendor/rack/lib/rack/commonlogger.rb +0 -56
  58. data/vendor/rack/lib/rack/file.rb +0 -112
  59. data/vendor/rack/lib/rack/handler/cgi.rb +0 -57
  60. data/vendor/rack/lib/rack/handler/fastcgi.rb +0 -83
  61. data/vendor/rack/lib/rack/handler/lsws.rb +0 -52
  62. data/vendor/rack/lib/rack/handler/scgi.rb +0 -57
  63. data/vendor/rack/lib/rack/handler/webrick.rb +0 -57
  64. data/vendor/rack/lib/rack/lint.rb +0 -394
  65. data/vendor/rack/lib/rack/lobster.rb +0 -65
  66. data/vendor/rack/lib/rack/mock.rb +0 -160
  67. data/vendor/rack/lib/rack/recursive.rb +0 -57
  68. data/vendor/rack/lib/rack/reloader.rb +0 -64
  69. data/vendor/rack/lib/rack/request.rb +0 -197
  70. data/vendor/rack/lib/rack/response.rb +0 -166
  71. data/vendor/rack/lib/rack/session/abstract/id.rb +0 -126
  72. data/vendor/rack/lib/rack/session/cookie.rb +0 -71
  73. data/vendor/rack/lib/rack/session/memcache.rb +0 -83
  74. data/vendor/rack/lib/rack/session/pool.rb +0 -67
  75. data/vendor/rack/lib/rack/showexceptions.rb +0 -344
  76. data/vendor/rack/lib/rack/showstatus.rb +0 -103
  77. data/vendor/rack/lib/rack/static.rb +0 -38
  78. data/vendor/rack/lib/rack/urlmap.rb +0 -48
  79. data/vendor/rack/lib/rack/utils.rb +0 -240
  80. data/vendor/rack/test/cgi/lighttpd.conf +0 -20
  81. data/vendor/rack/test/cgi/test +0 -9
  82. data/vendor/rack/test/cgi/test.fcgi +0 -7
  83. data/vendor/rack/test/cgi/test.ru +0 -7
  84. data/vendor/rack/test/spec_rack_auth_basic.rb +0 -69
  85. data/vendor/rack/test/spec_rack_auth_digest.rb +0 -169
  86. data/vendor/rack/test/spec_rack_builder.rb +0 -50
  87. data/vendor/rack/test/spec_rack_camping.rb +0 -47
  88. data/vendor/rack/test/spec_rack_cascade.rb +0 -50
  89. data/vendor/rack/test/spec_rack_cgi.rb +0 -91
  90. data/vendor/rack/test/spec_rack_commonlogger.rb +0 -32
  91. data/vendor/rack/test/spec_rack_fastcgi.rb +0 -91
  92. data/vendor/rack/test/spec_rack_file.rb +0 -40
  93. data/vendor/rack/test/spec_rack_lint.rb +0 -317
  94. data/vendor/rack/test/spec_rack_lobster.rb +0 -45
  95. data/vendor/rack/test/spec_rack_mock.rb +0 -152
  96. data/vendor/rack/test/spec_rack_mongrel.rb +0 -165
  97. data/vendor/rack/test/spec_rack_recursive.rb +0 -77
  98. data/vendor/rack/test/spec_rack_request.rb +0 -384
  99. data/vendor/rack/test/spec_rack_response.rb +0 -167
  100. data/vendor/rack/test/spec_rack_session_cookie.rb +0 -49
  101. data/vendor/rack/test/spec_rack_session_memcache.rb +0 -100
  102. data/vendor/rack/test/spec_rack_session_pool.rb +0 -84
  103. data/vendor/rack/test/spec_rack_showexceptions.rb +0 -21
  104. data/vendor/rack/test/spec_rack_showstatus.rb +0 -71
  105. data/vendor/rack/test/spec_rack_static.rb +0 -37
  106. data/vendor/rack/test/spec_rack_urlmap.rb +0 -175
  107. data/vendor/rack/test/spec_rack_utils.rb +0 -57
  108. data/vendor/rack/test/spec_rack_webrick.rb +0 -106
  109. data/vendor/rack/test/testrequest.rb +0 -43
@@ -1,6 +1,7 @@
1
1
  require 'mongrel'
2
2
  require 'stringio'
3
3
 
4
+
4
5
  module Rack
5
6
  module Handler
6
7
  class Mongrel < ::Mongrel::HttpHandler
@@ -65,9 +66,15 @@ module Rack
65
66
  response.header[k] = v
66
67
  }
67
68
  }
68
- body.each { |part|
69
- response.body << part
70
- }
69
+ # taken from Merb until we have a better solution that conforms
70
+ # to the Rack::Standard
71
+ if Proc === body
72
+ body.call(response)
73
+ else
74
+ body.each { |part|
75
+ response.body << part
76
+ }
77
+ end
71
78
  response.finished
72
79
  ensure
73
80
  body.close if body.respond_to? :close
@@ -1,56 +1,76 @@
1
- class Rack::MockRequest
2
- class << self
3
- alias :env_for_without_env :env_for
4
- def env_for(uri = "", opts = {})
5
- env = { 'HTTP_USER_AGENT' => opts.delete(:agent) }
6
- env_for_without_env(uri, opts).merge(env)
7
- end
8
- end
9
- end
10
-
11
1
  module Sinatra
12
-
2
+
13
3
  module Test
14
-
4
+
15
5
  module Methods
6
+ include Rack::Utils
7
+
8
+ ENV_KEY_NAMES = {
9
+ :accept => "HTTP_ACCEPT",
10
+ :agent => "HTTP_USER_AGENT",
11
+ :host => "HTTP_HOST",
12
+ :session => "HTTP_COOKIE",
13
+ :cookies => "HTTP_COOKIE",
14
+ :content_type => "CONTENT_TYPE"
15
+ }
16
16
 
17
- def easy_env_map
18
- {
19
- :accept => 'HTTP_ACCEPT',
20
- :agent => 'HTTP_AGENT',
21
- :host => 'HTTP_POST'
22
- }
17
+ def session(data, key = 'rack.session')
18
+ data = data.from_params if data.respond_to?(:from_params)
19
+ "#{escape(key)}=#{[Marshal.dump(data)].pack("m*")}"
23
20
  end
24
-
25
- def map_easys(params)
26
- easy_env_map.inject(params.dup) do |m, (from, to)|
27
- m[to] = m.delete(from) if m.has_key?(from); m
21
+
22
+ def normalize_rack_environment(env)
23
+ env.inject({}) do |hash,(k,v)|
24
+ hash[ENV_KEY_NAMES[k] || k] = v
25
+ hash
28
26
  end
29
27
  end
30
28
 
31
- %w(get head post put delete).each do |m|
32
- define_method("#{m}_it") do |path, *args|
33
- request = Rack::MockRequest.new(Sinatra.build_application)
34
- env, input = if args.size == 2
35
- [args.last, args.first]
36
- elsif args.size == 1
37
- data = args.first
38
- data.is_a?(Hash) ? [data.delete(:env), data.to_params] : [nil, data]
39
- end
40
- @response = request.request(m.upcase, path, {:input => input}.merge(env || {}))
29
+ def hash_to_param_string(hash)
30
+ hash.map { |pair| pair.map{|v|escape(v)}.join('=') }.join('&')
31
+ end
32
+
33
+ %w(get head post put delete).each do |verb|
34
+ http_method = verb.upcase
35
+ define_method("#{verb}_it") do |path, *args|
36
+ @request = Rack::MockRequest.new(Sinatra.build_application)
37
+ opts, input =
38
+ case args.size
39
+ when 2 # input, env
40
+ input, env = args
41
+ [env, input]
42
+ when 1 # params
43
+ if (data = args.first).kind_of?(Hash)
44
+ env = (data.delete(:env) || {})
45
+ [env, hash_to_param_string(data)]
46
+ else
47
+ [{}, data]
48
+ end
49
+ when 0
50
+ [{}, '']
51
+ else
52
+ raise ArgumentError, "zero, one, or two arguments expected"
53
+ end
54
+ opts = normalize_rack_environment(opts)
55
+ opts[:input] ||= input
56
+ @response = @request.request(http_method, path, opts)
41
57
  end
42
58
  end
43
-
59
+
44
60
  def follow!
45
61
  get_it(@response.location)
46
62
  end
47
63
 
48
64
  def method_missing(name, *args)
49
- @response.send(name, *args)
65
+ if @response.respond_to?(name)
66
+ @response.send(name, *args)
67
+ else
68
+ super
69
+ end
50
70
  end
51
-
71
+
52
72
  end
53
73
 
54
74
  end
55
-
75
+
56
76
  end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/unit'
2
+ require 'spec/interop/test'
3
+
4
+ class Test::Unit::TestCase
5
+
6
+ def should
7
+ @response.should
8
+ end
9
+
10
+ end
@@ -2,9 +2,9 @@ require File.dirname(__FILE__) + '/unit'
2
2
  require 'test/spec'
3
3
 
4
4
  class Test::Unit::TestCase
5
-
5
+
6
6
  def should
7
7
  @response.should
8
8
  end
9
-
9
+
10
10
  end
@@ -10,4 +10,4 @@ Sinatra::Application.default_options.merge!(
10
10
  :logging => false
11
11
  )
12
12
 
13
- Sinatra.application.options = nil
13
+ Sinatra.application = nil
@@ -1,50 +1,78 @@
1
-
2
- # Gem::Specification for Sinatra-0.2.2
3
- # Originally generated by Echoe
4
-
5
1
  Gem::Specification.new do |s|
6
- s.name = %q{sinatra}
7
- s.version = "0.2.2"
8
-
9
2
  s.specification_version = 2 if s.respond_to? :specification_version=
10
-
11
3
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
4
+
5
+ s.name = 'sinatra'
6
+ s.version = '0.3.0'
7
+ s.date = "2008-08-31"
8
+
9
+ s.description = "Classy web-development dressed in a DSL"
10
+ s.summary = "Classy web-development dressed in a DSL"
11
+
12
12
  s.authors = ["Blake Mizerany"]
13
- s.date = %q{2008-04-15}
14
- s.description = %q{Classy web-development dressed in a DSL}
15
- s.email = %q{}
16
- s.extra_rdoc_files = ["CHANGELOG", "lib/sinatra/test/methods.rb", "lib/sinatra/test/spec.rb", "lib/sinatra/test/unit.rb", "lib/sinatra.rb", "LICENSE", "README.rdoc"]
17
- s.files = ["CHANGELOG", "images/404.png", "images/500.png", "index.html", "lib/sinatra/test/methods.rb", "lib/sinatra/test/spec.rb", "lib/sinatra/test/unit.rb", "lib/sinatra.rb", "LICENSE", "Manifest", "README.rdoc", "test/app_test.rb", "test/application_test.rb", "test/builder_test.rb", "test/custom_error_test.rb", "test/diddy_test.rb", "test/erb_test.rb", "test/event_context_test.rb", "test/events_test.rb", "test/haml_test.rb", "test/helper.rb", "test/mapped_error_test.rb", "test/public/foo.xml", "test/rest_test.rb", "test/sass_test.rb", "test/sessions_test.rb", "test/streaming_test.rb", "test/sym_params_test.rb", "test/template_test.rb", "test/use_in_file_templates_test.rb", "test/views/foo.builder", "test/views/foo.erb", "test/views/foo.haml", "test/views/foo.sass", "test/views/foo_layout.erb", "test/views/foo_layout.haml", "test/views/layout_test/foo.builder", "test/views/layout_test/foo.erb", "test/views/layout_test/foo.haml", "test/views/layout_test/foo.sass", "test/views/layout_test/layout.builder", "test/views/layout_test/layout.erb", "test/views/layout_test/layout.haml", "test/views/layout_test/layout.sass", "test/views/no_layout/no_layout.builder", "test/views/no_layout/no_layout.haml", "vendor/rack/AUTHORS", "vendor/rack/bin/rackup", "vendor/rack/contrib/rack_logo.svg", "vendor/rack/COPYING", "vendor/rack/example/lobster.ru", "vendor/rack/example/protectedlobster.rb", "vendor/rack/example/protectedlobster.ru", "vendor/rack/KNOWN-ISSUES", "vendor/rack/lib/rack/adapter/camping.rb", "vendor/rack/lib/rack/auth/abstract/handler.rb", "vendor/rack/lib/rack/auth/abstract/request.rb", "vendor/rack/lib/rack/auth/basic.rb", "vendor/rack/lib/rack/auth/digest/md5.rb", "vendor/rack/lib/rack/auth/digest/nonce.rb", "vendor/rack/lib/rack/auth/digest/params.rb", "vendor/rack/lib/rack/auth/digest/request.rb", "vendor/rack/lib/rack/auth/openid.rb", "vendor/rack/lib/rack/builder.rb", "vendor/rack/lib/rack/cascade.rb", "vendor/rack/lib/rack/commonlogger.rb", "vendor/rack/lib/rack/file.rb", "vendor/rack/lib/rack/handler/cgi.rb", "vendor/rack/lib/rack/handler/fastcgi.rb", "vendor/rack/lib/rack/handler/lsws.rb", "vendor/rack/lib/rack/handler/mongrel.rb", "vendor/rack/lib/rack/handler/scgi.rb", "vendor/rack/lib/rack/handler/webrick.rb", "vendor/rack/lib/rack/lint.rb", "vendor/rack/lib/rack/lobster.rb", "vendor/rack/lib/rack/mock.rb", "vendor/rack/lib/rack/recursive.rb", "vendor/rack/lib/rack/reloader.rb", "vendor/rack/lib/rack/request.rb", "vendor/rack/lib/rack/response.rb", "vendor/rack/lib/rack/session/abstract/id.rb", "vendor/rack/lib/rack/session/cookie.rb", "vendor/rack/lib/rack/session/memcache.rb", "vendor/rack/lib/rack/session/pool.rb", "vendor/rack/lib/rack/showexceptions.rb", "vendor/rack/lib/rack/showstatus.rb", "vendor/rack/lib/rack/static.rb", "vendor/rack/lib/rack/urlmap.rb", "vendor/rack/lib/rack/utils.rb", "vendor/rack/lib/rack.rb", "vendor/rack/Rakefile", "vendor/rack/README", "vendor/rack/test/cgi/lighttpd.conf", "vendor/rack/test/cgi/test", "vendor/rack/test/cgi/test.fcgi", "vendor/rack/test/cgi/test.ru", "vendor/rack/test/spec_rack_auth_basic.rb", "vendor/rack/test/spec_rack_auth_digest.rb", "vendor/rack/test/spec_rack_builder.rb", "vendor/rack/test/spec_rack_camping.rb", "vendor/rack/test/spec_rack_cascade.rb", "vendor/rack/test/spec_rack_cgi.rb", "vendor/rack/test/spec_rack_commonlogger.rb", "vendor/rack/test/spec_rack_fastcgi.rb", "vendor/rack/test/spec_rack_file.rb", "vendor/rack/test/spec_rack_lint.rb", "vendor/rack/test/spec_rack_lobster.rb", "vendor/rack/test/spec_rack_mock.rb", "vendor/rack/test/spec_rack_mongrel.rb", "vendor/rack/test/spec_rack_recursive.rb", "vendor/rack/test/spec_rack_request.rb", "vendor/rack/test/spec_rack_response.rb", "vendor/rack/test/spec_rack_session_cookie.rb", "vendor/rack/test/spec_rack_session_memcache.rb", "vendor/rack/test/spec_rack_session_pool.rb", "vendor/rack/test/spec_rack_showexceptions.rb", "vendor/rack/test/spec_rack_showstatus.rb", "vendor/rack/test/spec_rack_static.rb", "vendor/rack/test/spec_rack_urlmap.rb", "vendor/rack/test/spec_rack_utils.rb", "vendor/rack/test/spec_rack_webrick.rb", "vendor/rack/test/testrequest.rb", "sinatra.gemspec"]
18
- s.has_rdoc = true
19
- s.homepage = %q{http://www.sinatrarb.com}
20
- s.post_install_message = %q{*** Be sure to checkout http://sinatrarb.com for helpful tips!***}
21
- s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Sinatra", "--main", "README.rdoc"]
22
- s.require_paths = ["lib"]
23
- s.rubyforge_project = %q{sinatra}
24
- s.rubygems_version = %q{1.0.1}
25
- s.summary = %q{Classy web-development dressed in a DSL}
26
- s.test_files = ["test/app_test.rb", "test/application_test.rb", "test/builder_test.rb", "test/custom_error_test.rb", "test/diddy_test.rb", "test/erb_test.rb", "test/event_context_test.rb", "test/events_test.rb", "test/haml_test.rb", "test/mapped_error_test.rb", "test/rest_test.rb", "test/sass_test.rb", "test/sessions_test.rb", "test/streaming_test.rb", "test/sym_params_test.rb", "test/template_test.rb", "test/use_in_file_templates_test.rb"]
27
13
 
28
- s.add_dependency(%q<mongrel>, [">= 1.0.1"])
29
- end
14
+ # = MANIFEST =
15
+ s.files = %w[
16
+ ChangeLog
17
+ LICENSE
18
+ README.rdoc
19
+ Rakefile
20
+ images/404.png
21
+ images/500.png
22
+ lib/sinatra.rb
23
+ lib/sinatra/rack/handler/mongrel.rb
24
+ lib/sinatra/test/methods.rb
25
+ lib/sinatra/test/rspec.rb
26
+ lib/sinatra/test/spec.rb
27
+ lib/sinatra/test/unit.rb
28
+ sinatra.gemspec
29
+ test/app_test.rb
30
+ test/application_test.rb
31
+ test/builder_test.rb
32
+ test/custom_error_test.rb
33
+ test/erb_test.rb
34
+ test/event_context_test.rb
35
+ test/events_test.rb
36
+ test/filter_test.rb
37
+ test/haml_test.rb
38
+ test/helper.rb
39
+ test/mapped_error_test.rb
40
+ test/pipeline_test.rb
41
+ test/public/foo.xml
42
+ test/sass_test.rb
43
+ test/sessions_test.rb
44
+ test/streaming_test.rb
45
+ test/sym_params_test.rb
46
+ test/template_test.rb
47
+ test/use_in_file_templates_test.rb
48
+ test/views/foo.builder
49
+ test/views/foo.erb
50
+ test/views/foo.haml
51
+ test/views/foo.sass
52
+ test/views/foo_layout.erb
53
+ test/views/foo_layout.haml
54
+ test/views/layout_test/foo.builder
55
+ test/views/layout_test/foo.erb
56
+ test/views/layout_test/foo.haml
57
+ test/views/layout_test/foo.sass
58
+ test/views/layout_test/layout.builder
59
+ test/views/layout_test/layout.erb
60
+ test/views/layout_test/layout.haml
61
+ test/views/layout_test/layout.sass
62
+ test/views/no_layout/no_layout.builder
63
+ test/views/no_layout/no_layout.haml
64
+ ]
65
+ # = MANIFEST =
66
+
67
+ s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/}
30
68
 
69
+ s.extra_rdoc_files = %w[README.rdoc LICENSE]
70
+ s.add_dependency 'rack', '>= 0.4.0'
31
71
 
32
- # # Original Rakefile source (requires the Echoe gem):
33
- #
34
- # require 'rubygems'
35
- # require 'rake/testtask'
36
- # require 'rake/rdoctask'
37
- # require 'echoe'
38
- #
39
- # task :default => :test
40
- #
41
- # Echoe.new("sinatra") do |p|
42
- # p.files = Dir[File.dirname(__FILE__) + "/{lib,vendor}/**/*"]
43
- # p.author = "Blake Mizerany"
44
- # p.summary = "Classy web-development dressed in a DSL"
45
- # p.url = "http://www.sinatrarb.com"
46
- # p.docs_host = "sinatrarb.com:/var/www/blakemizerany.com/public/docs/"
47
- # p.dependencies = ["mongrel >=1.0.1"]
48
- # p.install_message = "*** Be sure to checkout http://sinatrarb.com for helpful tips!***"
49
- # end
50
- #
72
+ s.has_rdoc = true
73
+ s.homepage = "http://sinatrarb.com"
74
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Sinatra", "--main", "README.rdoc"]
75
+ s.require_paths = %w[lib]
76
+ s.rubyforge_project = 'sinatra'
77
+ s.rubygems_version = '1.1.1'
78
+ end
@@ -1,50 +1,112 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
2
 
3
3
  context "Sinatra" do
4
-
4
+
5
5
  setup do
6
6
  Sinatra.application = nil
7
7
  end
8
-
8
+
9
+ specify "should put all DSL methods on (main)" do
10
+ object = Object.new
11
+ Sinatra::Application::FORWARD_METHODS.each do |method|
12
+ object.private_methods.should.include(method)
13
+ end
14
+ end
15
+
9
16
  specify "should handle result of nil" do
10
17
  get '/' do
11
18
  nil
12
19
  end
13
-
20
+
14
21
  get_it '/'
15
22
  should.be.ok
16
23
  body.should == ''
17
24
  end
18
-
25
+
19
26
  specify "handles events" do
20
27
  get '/:name' do
21
28
  'Hello ' + params["name"]
22
29
  end
23
-
30
+
24
31
  get_it '/Blake'
25
-
32
+
26
33
  should.be.ok
27
34
  body.should.equal 'Hello Blake'
28
35
  end
29
-
36
+
37
+
38
+ specify "handles splats" do
39
+ get '/hi/*' do
40
+ params["splat"].kind_of?(Array).should.equal true
41
+ params["splat"].first
42
+ end
43
+
44
+ get_it '/hi/Blake'
45
+
46
+ should.be.ok
47
+ body.should.equal 'Blake'
48
+ end
49
+
50
+ specify "handles multiple splats" do
51
+ get '/say/*/to/*' do
52
+ params["splat"].join(' ')
53
+ end
54
+
55
+ get_it '/say/hello/to/world'
56
+
57
+ should.be.ok
58
+ body.should.equal 'hello world'
59
+ end
60
+
61
+ specify "allow empty splats" do
62
+ get '/say/*/to*/*' do
63
+ params["splat"].join(' ')
64
+ end
65
+
66
+ get_it '/say/hello/to/world'
67
+
68
+ should.be.ok
69
+ body.should.equal 'hello world' # second splat is empty
70
+
71
+ get_it '/say/hello/tomy/world'
72
+
73
+ should.be.ok
74
+ body.should.equal 'hello my world'
75
+ end
76
+
77
+ specify "gives access to underlying response header Hash" do
78
+ get '/' do
79
+ header['X-Test'] = 'Is this thing on?'
80
+ headers 'X-Test2' => 'Foo', 'X-Test3' => 'Bar'
81
+ ''
82
+ end
83
+
84
+ get_it '/'
85
+ should.be.ok
86
+ headers.should.include 'X-Test'
87
+ headers['X-Test'].should.equal 'Is this thing on?'
88
+ headers.should.include 'X-Test3'
89
+ headers['X-Test3'].should.equal 'Bar'
90
+ end
91
+
30
92
  specify "follows redirects" do
31
93
  get '/' do
32
94
  redirect '/blake'
33
95
  end
34
-
96
+
35
97
  get '/blake' do
36
98
  'Mizerany'
37
99
  end
38
-
100
+
39
101
  get_it '/'
40
102
  should.be.redirection
41
103
  body.should.equal ''
42
-
104
+
43
105
  follow!
44
106
  should.be.ok
45
107
  body.should.equal 'Mizerany'
46
108
  end
47
-
109
+
48
110
  specify "renders a body with a redirect" do
49
111
  Sinatra::EventContext.any_instance.expects(:foo).returns('blah')
50
112
  get "/" do
@@ -55,36 +117,111 @@ context "Sinatra" do
55
117
  headers['Location'].should.equal 'foo'
56
118
  body.should.equal 'blah'
57
119
  end
58
-
59
- specify "body sets content and ends event" do
60
-
120
+
121
+ specify "redirects permanently with 301 status code" do
122
+ get "/" do
123
+ redirect 'foo', 301
124
+ end
125
+ get_it '/'
126
+ should.be.redirection
127
+ headers['Location'].should.equal 'foo'
128
+ status.should.equal 301
129
+ body.should.be.empty
130
+ end
131
+
132
+ specify "stop sets content and ends event" do
133
+
61
134
  Sinatra::EventContext.any_instance.expects(:foo).never
62
-
135
+
63
136
  get '/set_body' do
64
137
  stop 'Hello!'
65
138
  stop 'World!'
66
139
  foo
67
140
  end
68
-
141
+
69
142
  get_it '/set_body'
70
-
143
+
71
144
  should.be.ok
72
145
  body.should.equal 'Hello!'
73
-
146
+
74
147
  end
75
-
148
+
76
149
  specify "should set status then call helper with a var" do
77
150
  Sinatra::EventContext.any_instance.expects(:foo).once.with(1).returns('bah!')
78
-
151
+
79
152
  get '/set_body' do
80
153
  stop [404, [:foo, 1]]
81
154
  end
82
-
155
+
83
156
  get_it '/set_body'
84
-
157
+
85
158
  should.be.not_found
86
159
  body.should.equal 'bah!'
87
-
160
+
161
+ end
162
+
163
+ specify "should easily set response Content-Type" do
164
+ get '/foo.html' do
165
+ content_type 'text/html', :charset => 'utf-8'
166
+ "<h1>Hello, World</h1>"
167
+ end
168
+
169
+ get_it '/foo.html'
170
+ should.be.ok
171
+ headers['Content-Type'].should.equal 'text/html;charset=utf-8'
172
+ body.should.equal '<h1>Hello, World</h1>'
173
+
174
+ get '/foo_test.xml' do
175
+ content_type :xml
176
+ "<feed></feed>"
177
+ end
178
+
179
+ get_it '/foo_test.xml'
180
+ should.be.ok
181
+ headers['Content-Type'].should.equal 'application/xml'
182
+ body.should.equal '<feed></feed>'
183
+ end
184
+
185
+ specify "supports conditional GETs with last_modified" do
186
+ modified_at = Time.now
187
+ get '/maybe' do
188
+ last_modified modified_at
189
+ 'response body, maybe'
190
+ end
191
+
192
+ get_it '/maybe'
193
+ should.be.ok
194
+ body.should.equal 'response body, maybe'
195
+
196
+ get_it '/maybe', :env => { 'HTTP_IF_MODIFIED_SINCE' => modified_at.httpdate }
197
+ status.should.equal 304
198
+ body.should.equal ''
199
+ end
200
+
201
+ specify "supports conditional GETs with entity_tag" do
202
+ get '/strong' do
203
+ entity_tag 'FOO'
204
+ 'foo response'
205
+ end
206
+
207
+ get_it '/strong'
208
+ should.be.ok
209
+ body.should.equal 'foo response'
210
+
211
+ get_it '/strong', {},
212
+ 'HTTP_IF_NONE_MATCH' => '"BAR"'
213
+ should.be.ok
214
+ body.should.equal 'foo response'
215
+
216
+ get_it '/strong', {},
217
+ 'HTTP_IF_NONE_MATCH' => '"FOO"'
218
+ status.should.equal 304
219
+ body.should.equal ''
220
+
221
+ get_it '/strong', {},
222
+ 'HTTP_IF_NONE_MATCH' => '"BAR", *'
223
+ status.should.equal 304
224
+ body.should.equal ''
88
225
  end
89
226
 
90
227
  specify "delegates HEAD requests to GET handlers" do
@@ -98,26 +235,26 @@ context "Sinatra" do
98
235
  body.should.equal ''
99
236
  end
100
237
 
101
-
102
- specify "put'n with POST" do
238
+
239
+ specify "supports PUT" do
103
240
  put '/' do
104
241
  'puted'
105
242
  end
106
- post_it '/', :_method => 'PUT'
243
+ put_it '/'
107
244
  assert_equal 'puted', body
108
245
  end
109
246
 
110
- specify "put'n wth PUT" do
247
+ specify "rewrites POSTs with _method param to PUT" do
111
248
  put '/' do
112
249
  'puted'
113
250
  end
114
- put_it '/'
251
+ post_it '/', :_method => 'PUT'
115
252
  assert_equal 'puted', body
116
253
  end
117
254
 
118
- # Some Ajax libraries downcase the _method parameter value. Make
255
+ # Some Ajax libraries downcase the _method parameter value. Make
119
256
  # sure we can handle that.
120
- specify "put'n with POST and lowercase _method param" do
257
+ specify "rewrites POSTs with lowercase _method param to PUT" do
121
258
  put '/' do
122
259
  'puted'
123
260
  end
@@ -126,7 +263,7 @@ context "Sinatra" do
126
263
  end
127
264
 
128
265
  # Ignore any _method parameters specified in GET requests or on the query string in POST requests.
129
- specify "not put'n with GET" do
266
+ specify "does not rewrite GETs with _method param to PUT" do
130
267
  get '/' do
131
268
  'getted'
132
269
  end
@@ -135,7 +272,7 @@ context "Sinatra" do
135
272
  body.should.equal 'getted'
136
273
  end
137
274
 
138
- specify "_method query string parameter ignored on POST" do
275
+ specify "ignores _method query string parameter on non-POST requests" do
139
276
  post '/' do
140
277
  'posted'
141
278
  end
@@ -147,4 +284,16 @@ context "Sinatra" do
147
284
  body.should.equal 'posted'
148
285
  end
149
286
 
287
+ specify "does not read body if content type is not url encoded" do
288
+ post '/foo.xml' do
289
+ request.env['CONTENT_TYPE'].should.be == 'application/xml'
290
+ request.content_type.should.be == 'application/xml'
291
+ request.body.read
292
+ end
293
+
294
+ post_it '/foo.xml', '<foo></foo>', :content_type => 'application/xml'
295
+ @response.should.be.ok
296
+ @response.body.should.be == '<foo></foo>'
297
+ end
298
+
150
299
  end