darkhelmet-sinatra 0.9.0.5 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +33 -5
- data/compat/app_test.rb +0 -19
- data/compat/application_test.rb +0 -72
- data/compat/pipeline_test.rb +0 -26
- data/compat/sessions_test.rb +3 -0
- data/compat/streaming_test.rb +3 -3
- data/lib/sinatra/base.rb +64 -49
- data/lib/sinatra/test.rb +21 -21
- data/sinatra.gemspec +2 -2
- data/test/base_test.rb +18 -0
- data/test/extensions_test.rb +21 -0
- data/test/middleware_test.rb +8 -0
- data/test/test_test.rb +31 -2
- metadata +2 -2
data/CHANGES
CHANGED
@@ -1,34 +1,62 @@
|
|
1
|
-
= 0.9.1 /
|
1
|
+
= 0.9.1 / 2009-03-01
|
2
2
|
|
3
3
|
* Sinatra now runs under Ruby 1.9.1 [#61]
|
4
|
+
|
4
5
|
* Route patterns (splats, :named, or Regexp captures) are now
|
5
6
|
passed as arguments to the block. [#140]
|
7
|
+
|
6
8
|
* The "helpers" method now takes a variable number of modules
|
7
9
|
along with the normal block syntax. [#133]
|
10
|
+
|
8
11
|
* New request-level #forward method for middleware components: passes
|
9
12
|
the env to the downstream app and merges the response status, headers,
|
10
13
|
and body into the current context.
|
14
|
+
|
11
15
|
* Requests are now automatically forwarded to the downstream app when
|
12
16
|
running as middleware and no matching route is found or all routes
|
13
17
|
pass.
|
18
|
+
|
14
19
|
* New simple API for extensions/plugins to add DSL-level and
|
15
20
|
request-level methods. Use Sinatra.register(mixin) to extend
|
16
21
|
the DSL with all public methods defined in the mixin module;
|
17
22
|
use Sinatra.helpers(mixin) to make all public methods defined
|
18
23
|
in the mixin module available at the request level. [#138]
|
19
|
-
|
24
|
+
See http://www.sinatrarb.com/extensions.html for details.
|
25
|
+
|
26
|
+
* Named parameters in routes now capture the "." character. This makes
|
27
|
+
routes like "/:path/:filename" match against requests like
|
28
|
+
"/foo/bar.txt"; in this case, "params[:filename]" is "bar.txt".
|
29
|
+
Previously, the route would not match at all.
|
30
|
+
|
31
|
+
* Added request-level "redirect back" to redirect to the referring
|
32
|
+
URL.
|
33
|
+
|
20
34
|
* Added a new "clean_trace" option that causes backtraces dumped
|
21
35
|
to rack.errors and displayed on the development error page to
|
22
36
|
omit framework and core library backtrace lines. The option is
|
23
37
|
enabled by default. [#77]
|
24
|
-
|
25
|
-
Accept header [#139]
|
26
|
-
* Fix that ERB templates were evaluated twice per "erb" call.
|
38
|
+
|
27
39
|
* The ERB output buffer is now available to helpers via the @_out_buf
|
28
40
|
instance variable.
|
41
|
+
|
42
|
+
* It's now much easier to test sessions in unit tests by passing a
|
43
|
+
":session" option to any of the mock request methods. e.g.,
|
44
|
+
get '/', {}, :session => { 'foo' => 'bar' }
|
45
|
+
|
29
46
|
* The request-level #send_data method from Sinatra 0.3.3 has been added
|
30
47
|
for compatibility but is deprecated.
|
31
48
|
|
49
|
+
* Fix :provides causing crash on any request when request has no
|
50
|
+
Accept header [#139]
|
51
|
+
|
52
|
+
* Fix that ERB templates were evaluated twice per "erb" call.
|
53
|
+
|
54
|
+
* Fix app-level middleware not being run when the Sinatra application is
|
55
|
+
run as middleware.
|
56
|
+
|
57
|
+
* Fixed some issues with running under Rack's CGI handler caused by
|
58
|
+
writing informational stuff to stdout.
|
59
|
+
|
32
60
|
= 0.9.0.4 / 2009-01-25
|
33
61
|
|
34
62
|
* Using halt with more than 1 args causes ArgumentError [#131]
|
data/compat/app_test.rb
CHANGED
@@ -146,25 +146,6 @@ context "Sinatra" do
|
|
146
146
|
|
147
147
|
end
|
148
148
|
|
149
|
-
# Deprecated. WTF was going on here? What's the 1 in [:foo, 1] do?
|
150
|
-
xspecify "should set status then call helper with a var" do
|
151
|
-
helpers do
|
152
|
-
def foo
|
153
|
-
'bah!'
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
get '/set_body' do
|
158
|
-
stop [404, [:foo, 1]]
|
159
|
-
end
|
160
|
-
|
161
|
-
get_it '/set_body'
|
162
|
-
|
163
|
-
should.be.not_found
|
164
|
-
body.should.equal 'bah!'
|
165
|
-
|
166
|
-
end
|
167
|
-
|
168
149
|
specify "should easily set response Content-Type" do
|
169
150
|
get '/foo.html' do
|
170
151
|
content_type 'text/html', :charset => 'utf-8'
|
data/compat/application_test.rb
CHANGED
@@ -10,47 +10,6 @@ class TesterWithEach
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
context "Looking up a request" do
|
14
|
-
|
15
|
-
setup do
|
16
|
-
Sinatra.application = nil
|
17
|
-
end
|
18
|
-
|
19
|
-
# Deprecated. The lookup method is no longer used.
|
20
|
-
xspecify "returns what's at the end" do
|
21
|
-
block = Proc.new { 'Hello' }
|
22
|
-
get '/', &block
|
23
|
-
|
24
|
-
result = Sinatra.application.lookup(
|
25
|
-
Rack::Request.new(
|
26
|
-
'REQUEST_METHOD' => 'GET',
|
27
|
-
'PATH_INFO' => '/'
|
28
|
-
)
|
29
|
-
)
|
30
|
-
|
31
|
-
result.should.not.be.nil
|
32
|
-
result.block.should.be block
|
33
|
-
end
|
34
|
-
|
35
|
-
# Deprecated. The lookup method is no longer used.
|
36
|
-
xspecify "takes params in path" do
|
37
|
-
block = Proc.new { 'Hello' }
|
38
|
-
get '/:foo', &block
|
39
|
-
|
40
|
-
result = Sinatra.application.lookup(
|
41
|
-
Rack::Request.new(
|
42
|
-
'REQUEST_METHOD' => 'GET',
|
43
|
-
'PATH_INFO' => '/bar'
|
44
|
-
)
|
45
|
-
)
|
46
|
-
|
47
|
-
result.should.not.be.nil
|
48
|
-
result.block.should.be block
|
49
|
-
result.params.should.equal "foo" => 'bar'
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
13
|
context "An app returns" do
|
55
14
|
|
56
15
|
setup do
|
@@ -85,20 +44,6 @@ context "An app returns" do
|
|
85
44
|
|
86
45
|
end
|
87
46
|
|
88
|
-
# Deprecated. The body method no longer halts.
|
89
|
-
xspecify "the body set if set before the last" do
|
90
|
-
|
91
|
-
get '/' do
|
92
|
-
body 'Blake'
|
93
|
-
'Mizerany'
|
94
|
-
end
|
95
|
-
|
96
|
-
get_it '/'
|
97
|
-
should.be.ok
|
98
|
-
body.should.equal 'Blake'
|
99
|
-
|
100
|
-
end
|
101
|
-
|
102
47
|
specify "404 if NotFound is raised" do
|
103
48
|
|
104
49
|
get '/' do
|
@@ -143,23 +88,6 @@ context "Application#configure blocks" do
|
|
143
88
|
|
144
89
|
end
|
145
90
|
|
146
|
-
context "Default Application Configuration" do
|
147
|
-
|
148
|
-
# Sinatra::ServerError is no longer used
|
149
|
-
xspecify "includes 404 and 500 error handlers" do
|
150
|
-
Sinatra.application.errors.should.include(Sinatra::ServerError)
|
151
|
-
Sinatra.application.errors[Sinatra::ServerError].should.not.be.nil
|
152
|
-
Sinatra.application.errors.should.include(Sinatra::NotFound)
|
153
|
-
Sinatra.application.errors[Sinatra::NotFound].should.not.be.nil
|
154
|
-
end
|
155
|
-
|
156
|
-
# Deprecated. No such thing as a Static event anymore.
|
157
|
-
xspecify "includes Static event" do
|
158
|
-
assert Sinatra.application.events[:get].any? { |e| Sinatra::Static === e }
|
159
|
-
end
|
160
|
-
|
161
|
-
end
|
162
|
-
|
163
91
|
context "Events in an app" do
|
164
92
|
|
165
93
|
setup do
|
data/compat/pipeline_test.rb
CHANGED
@@ -23,32 +23,6 @@ context "Middleware Pipelines" do
|
|
23
23
|
Sinatra.application = nil
|
24
24
|
end
|
25
25
|
|
26
|
-
# Sessions and logging are tested elsewhere. This is a bad test because it
|
27
|
-
# asserts things about the implementation and not the effect.
|
28
|
-
xspecify "includes default middleware with options set" do
|
29
|
-
@app.set_options :sessions => true, :logging => true
|
30
|
-
@app.send(:optional_middleware).should.include([Rack::Session::Cookie, [], nil])
|
31
|
-
@app.send(:optional_middleware).should.include([Rack::CommonLogger, [], nil])
|
32
|
-
end
|
33
|
-
|
34
|
-
# Bad test.
|
35
|
-
xspecify "does not include default middleware with options unset" do
|
36
|
-
@app.set_options :sessions => false, :logging => false
|
37
|
-
@app.send(:optional_middleware).should.not.include([Rack::Session::Cookie, [], nil])
|
38
|
-
@app.send(:optional_middleware).should.not.include([Rack::CommonLogger, [], nil])
|
39
|
-
end
|
40
|
-
|
41
|
-
# Bad test.
|
42
|
-
xspecify "includes only optional middleware when no explicit middleware added" do
|
43
|
-
@app.set_options :sessions => true, :logging => true
|
44
|
-
@app.send(:middleware).should.equal @app.send(:optional_middleware)
|
45
|
-
end
|
46
|
-
|
47
|
-
# Bad test.
|
48
|
-
xspecify "should clear middleware before reload" do
|
49
|
-
@app.clearables.should.include(@app.send(:explicit_middleware))
|
50
|
-
end
|
51
|
-
|
52
26
|
specify "should add middleware with use" do
|
53
27
|
block = Proc.new { |env| }
|
54
28
|
@app.use UpcaseMiddleware
|
data/compat/sessions_test.rb
CHANGED
@@ -21,6 +21,7 @@ context "Sessions" do
|
|
21
21
|
|
22
22
|
specify "should be able to store data accross requests" do
|
23
23
|
set_option :sessions, true
|
24
|
+
set_option :environment, :not_test # necessary because sessions are disabled
|
24
25
|
|
25
26
|
get '/foo' do
|
26
27
|
session[:test] = true
|
@@ -34,6 +35,8 @@ context "Sessions" do
|
|
34
35
|
get_it '/foo', :env => { :host => 'foo.sinatrarb.com' }
|
35
36
|
assert ok?
|
36
37
|
assert include?('Set-Cookie')
|
38
|
+
|
39
|
+
set_option :environment, :test
|
37
40
|
end
|
38
41
|
|
39
42
|
end
|
data/compat/streaming_test.rb
CHANGED
@@ -105,9 +105,10 @@ context "SendData" do
|
|
105
105
|
end
|
106
106
|
|
107
107
|
# Deprecated. The Content-Disposition is no longer handled by sendfile.
|
108
|
-
|
108
|
+
specify "should include a Content-Disposition header" do
|
109
109
|
get '/' do
|
110
|
-
send_file File.dirname(__FILE__) + '/public/foo.xml'
|
110
|
+
send_file File.dirname(__FILE__) + '/public/foo.xml',
|
111
|
+
:disposition => 'attachment'
|
111
112
|
end
|
112
113
|
|
113
114
|
get_it '/'
|
@@ -115,7 +116,6 @@ context "SendData" do
|
|
115
116
|
should.be.ok
|
116
117
|
headers['Content-Disposition'].should.not.be.nil
|
117
118
|
headers['Content-Disposition'].should.equal 'attachment; filename="foo.xml"'
|
118
|
-
headers['Content-Transfer-Encoding'].should.equal 'binary'
|
119
119
|
end
|
120
120
|
|
121
121
|
specify "should include a Content-Disposition header when :disposition set to attachment" do
|
data/lib/sinatra/base.rb
CHANGED
@@ -6,7 +6,7 @@ require 'rack/builder'
|
|
6
6
|
require 'colored'
|
7
7
|
|
8
8
|
module Sinatra
|
9
|
-
VERSION = '0.9.
|
9
|
+
VERSION = '0.9.1'
|
10
10
|
|
11
11
|
# The request object. See Rack::Request for more info:
|
12
12
|
# http://rack.rubyforge.org/doc/classes/Rack/Request.html
|
@@ -50,7 +50,7 @@ module Sinatra
|
|
50
50
|
else
|
51
51
|
body = @body || []
|
52
52
|
body = [body] if body.respond_to? :to_str
|
53
|
-
if
|
53
|
+
if body.respond_to?(:to_ary)
|
54
54
|
header["Content-Length"] = body.to_ary.
|
55
55
|
inject(0) { |len, part| len + part.bytesize }.to_s
|
56
56
|
end
|
@@ -345,10 +345,17 @@ module Sinatra
|
|
345
345
|
invoke { dispatch! }
|
346
346
|
invoke { error_block!(response.status) }
|
347
347
|
|
348
|
-
|
349
|
-
@response.body = [] if @env['REQUEST_METHOD'] == 'HEAD'
|
348
|
+
status, header, body = @response.finish
|
350
349
|
|
351
|
-
|
350
|
+
# Never produce a body on HEAD requests. Do retain the Content-Length
|
351
|
+
# unless it's "0", in which case we assume it was calculated erroneously
|
352
|
+
# for a manual HEAD response and remove it entirely.
|
353
|
+
if @env['REQUEST_METHOD'] == 'HEAD'
|
354
|
+
body = []
|
355
|
+
header.delete('Content-Length') if header['Content-Length'] == '0'
|
356
|
+
end
|
357
|
+
|
358
|
+
[status, header, body]
|
352
359
|
end
|
353
360
|
|
354
361
|
# Access options defined with Base.set.
|
@@ -542,8 +549,8 @@ module Sinatra
|
|
542
549
|
@conditions = []
|
543
550
|
@templates = {}
|
544
551
|
@middleware = []
|
545
|
-
@callsite = nil
|
546
552
|
@errors = {}
|
553
|
+
@prototype = nil
|
547
554
|
|
548
555
|
class << self
|
549
556
|
attr_accessor :routes, :filters, :conditions, :templates,
|
@@ -720,13 +727,16 @@ module Sinatra
|
|
720
727
|
|
721
728
|
public
|
722
729
|
def helpers(*extensions, &block)
|
723
|
-
class_eval(&block)
|
724
|
-
include *extensions
|
730
|
+
class_eval(&block) if block_given?
|
731
|
+
include *extensions if extensions.any?
|
725
732
|
end
|
726
733
|
|
727
734
|
def register(*extensions, &block)
|
728
|
-
extensions << Module.new(&block) if
|
729
|
-
|
735
|
+
extensions << Module.new(&block) if block_given?
|
736
|
+
extensions.each do |extension|
|
737
|
+
extend extension
|
738
|
+
extension.registered(self) if extension.respond_to?(:registered)
|
739
|
+
end
|
730
740
|
end
|
731
741
|
|
732
742
|
def development? ; environment == :development ; end
|
@@ -739,7 +749,7 @@ module Sinatra
|
|
739
749
|
end
|
740
750
|
|
741
751
|
def use(middleware, *args, &block)
|
742
|
-
|
752
|
+
@prototype = nil
|
743
753
|
@middleware << [middleware, args, block]
|
744
754
|
end
|
745
755
|
|
@@ -760,22 +770,61 @@ module Sinatra
|
|
760
770
|
puts "== Someone is already performing on port #{port}!"
|
761
771
|
end
|
762
772
|
|
773
|
+
# The prototype instance used to process requests.
|
774
|
+
def prototype
|
775
|
+
@prototype ||= new
|
776
|
+
end
|
777
|
+
|
778
|
+
# Create a new instance of the class fronted by its middleware
|
779
|
+
# pipeline. The object is guaranteed to respond to #call but may not be
|
780
|
+
# an instance of the class new was called on.
|
781
|
+
def new(*args, &bk)
|
782
|
+
builder = Rack::Builder.new
|
783
|
+
builder.use Rack::Session::Cookie if sessions? && !test?
|
784
|
+
builder.use Rack::CommonLogger if logging?
|
785
|
+
builder.use Rack::MethodOverride if methodoverride?
|
786
|
+
@middleware.each { |c, args, bk| builder.use(c, *args, &bk) }
|
787
|
+
builder.run super
|
788
|
+
builder.to_app
|
789
|
+
end
|
790
|
+
|
763
791
|
def call(env)
|
764
792
|
synchronize do
|
765
793
|
reload! if reload?
|
766
|
-
|
767
|
-
@callsite.call(env)
|
794
|
+
prototype.call(env)
|
768
795
|
end
|
769
796
|
end
|
770
797
|
|
798
|
+
def reloading?
|
799
|
+
@reloading
|
800
|
+
end
|
801
|
+
|
771
802
|
def reload!
|
772
803
|
@reloading = true
|
773
|
-
|
804
|
+
reset!
|
774
805
|
$LOADED_FEATURES.delete("sinatra.rb")
|
775
806
|
::Kernel.load app_file
|
776
807
|
@reloading = false
|
777
808
|
end
|
778
809
|
|
810
|
+
def reset!(base=superclass)
|
811
|
+
@routes = base.dupe_routes
|
812
|
+
@templates = base.templates.dup
|
813
|
+
@conditions = []
|
814
|
+
@filters = base.filters.dup
|
815
|
+
@errors = base.errors.dup
|
816
|
+
@middleware = base.middleware.dup
|
817
|
+
@prototype = nil
|
818
|
+
end
|
819
|
+
|
820
|
+
protected
|
821
|
+
def dupe_routes
|
822
|
+
routes.inject({}) do |hash,(request_method,routes)|
|
823
|
+
hash[request_method] = routes.dup
|
824
|
+
hash
|
825
|
+
end
|
826
|
+
end
|
827
|
+
|
779
828
|
private
|
780
829
|
def detect_rack_handler
|
781
830
|
servers = Array(self.server)
|
@@ -789,38 +838,11 @@ module Sinatra
|
|
789
838
|
fail "Server handler (#{servers.join(',')}) not found."
|
790
839
|
end
|
791
840
|
|
792
|
-
def construct_middleware(builder=Rack::Builder.new)
|
793
|
-
builder.use Rack::Session::Cookie if sessions?
|
794
|
-
builder.use Rack::CommonLogger if logging?
|
795
|
-
builder.use Rack::MethodOverride if methodoverride?
|
796
|
-
@middleware.each { |c, args, bk| builder.use(c, *args, &bk) }
|
797
|
-
builder.run new
|
798
|
-
@callsite = builder.to_app
|
799
|
-
end
|
800
|
-
|
801
|
-
def reset_middleware
|
802
|
-
@callsite = nil
|
803
|
-
end
|
804
|
-
|
805
|
-
def reset!(subclass = self)
|
806
|
-
subclass.routes = dupe_routes
|
807
|
-
subclass.templates = templates.dup
|
808
|
-
subclass.conditions = []
|
809
|
-
subclass.filters = filters.dup
|
810
|
-
subclass.errors = errors.dup
|
811
|
-
subclass.middleware = middleware.dup
|
812
|
-
subclass.send :reset_middleware
|
813
|
-
end
|
814
|
-
|
815
841
|
def inherited(subclass)
|
816
|
-
reset!
|
842
|
+
subclass.reset! self
|
817
843
|
super
|
818
844
|
end
|
819
845
|
|
820
|
-
def reloading?
|
821
|
-
@reloading ||= false
|
822
|
-
end
|
823
|
-
|
824
846
|
@@mutex = Mutex.new
|
825
847
|
def synchronize(&block)
|
826
848
|
if lock?
|
@@ -830,13 +852,6 @@ module Sinatra
|
|
830
852
|
end
|
831
853
|
end
|
832
854
|
|
833
|
-
def dupe_routes
|
834
|
-
routes.inject({}) do |hash,(request_method,routes)|
|
835
|
-
hash[request_method] = routes.dup
|
836
|
-
hash
|
837
|
-
end
|
838
|
-
end
|
839
|
-
|
840
855
|
def metadef(message, &block)
|
841
856
|
(class << self; self; end).
|
842
857
|
send :define_method, message, &block
|
data/lib/sinatra/test.rb
CHANGED
@@ -14,27 +14,27 @@ for more information.
|
|
14
14
|
EOF
|
15
15
|
end
|
16
16
|
|
17
|
-
def make_request(verb, path,
|
17
|
+
def make_request(verb, path, body=nil, options={})
|
18
18
|
@app = Sinatra::Application if @app.nil? && defined?(Sinatra::Application)
|
19
19
|
fail "@app not set - cannot make request" if @app.nil?
|
20
20
|
|
21
21
|
@request = Rack::MockRequest.new(@app)
|
22
|
-
options
|
23
|
-
|
24
|
-
case
|
25
|
-
when
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
options
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
22
|
+
options = { :lint => true }.merge(options || {})
|
23
|
+
|
24
|
+
case
|
25
|
+
when body.respond_to?(:to_hash)
|
26
|
+
options.merge! body.delete(:env) if body.key?(:env)
|
27
|
+
options[:input] = param_string(body)
|
28
|
+
when body.respond_to?(:to_str)
|
29
|
+
options[:input] = body
|
30
|
+
when body.nil?
|
31
|
+
options[:input] = ''
|
32
|
+
else
|
33
|
+
raise ArgumentError, "body must be a Hash, String, or nil"
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
@response = @request.request(verb, path, options)
|
36
|
+
yield @request if block_given?
|
37
|
+
@response = @request.request(verb, path, rack_options(options))
|
38
38
|
end
|
39
39
|
|
40
40
|
def get(path, *args, &b) ; make_request('GET', path, *args, &b) ; end
|
@@ -67,12 +67,12 @@ for more information.
|
|
67
67
|
private
|
68
68
|
|
69
69
|
RACK_OPTIONS = {
|
70
|
-
:accept
|
71
|
-
:agent
|
72
|
-
:host
|
73
|
-
:session
|
74
|
-
:cookies
|
75
|
-
:content_type =>
|
70
|
+
:accept => 'HTTP_ACCEPT',
|
71
|
+
:agent => 'HTTP_USER_AGENT',
|
72
|
+
:host => 'HTTP_HOST',
|
73
|
+
:session => 'rack.session',
|
74
|
+
:cookies => 'HTTP_COOKIE',
|
75
|
+
:content_type => 'CONTENT_TYPE'
|
76
76
|
}
|
77
77
|
|
78
78
|
def rack_options(opts)
|
data/sinatra.gemspec
CHANGED
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
4
4
|
|
5
5
|
s.name = 'sinatra'
|
6
|
-
s.version = '0.9.
|
7
|
-
s.date = '2009-
|
6
|
+
s.version = '0.9.1'
|
7
|
+
s.date = '2009-03-01'
|
8
8
|
|
9
9
|
s.description = "Classy web-development dressed in a DSL"
|
10
10
|
s.summary = "Classy web-development dressed in a DSL"
|
data/test/base_test.rb
CHANGED
@@ -108,5 +108,23 @@ describe "Sinatra::Base as Rack middleware" do
|
|
108
108
|
assert_equal 210, response.status
|
109
109
|
assert_equal 'true', response['X-Downstream']
|
110
110
|
assert_equal 'Hello after explicit forward', response.body
|
111
|
+
assert_equal '28', response['Content-Length']
|
112
|
+
end
|
113
|
+
|
114
|
+
app_content_length = lambda {|env|
|
115
|
+
[200, {'Content-Length' => '16'}, 'From downstream!']}
|
116
|
+
class TestMiddlewareContentLength < Sinatra::Base
|
117
|
+
get '/forward' do
|
118
|
+
res = forward
|
119
|
+
'From after explicit forward!'
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
middleware_content_length = TestMiddlewareContentLength.new(app_content_length)
|
124
|
+
request_content_length = Rack::MockRequest.new(middleware_content_length)
|
125
|
+
|
126
|
+
it "sets content length for last response" do
|
127
|
+
response = request_content_length.get('/forward')
|
128
|
+
assert_equal '28', response['Content-Length']
|
111
129
|
end
|
112
130
|
end
|
data/test/extensions_test.rb
CHANGED
@@ -60,4 +60,25 @@ describe 'Registering extensions' do
|
|
60
60
|
assert !Sinatra::Base.respond_to?(:baz)
|
61
61
|
assert Sinatra::Default.respond_to?(:baz)
|
62
62
|
end
|
63
|
+
|
64
|
+
module BizzleExtension
|
65
|
+
def bizzle
|
66
|
+
bizzle_option
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.registered(base)
|
70
|
+
fail "base should be BizzleApp" unless base == BizzleApp
|
71
|
+
fail "base should have already extended BizzleExtension" unless base.respond_to?(:bizzle)
|
72
|
+
base.set :bizzle_option, 'bizzle!'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class BizzleApp < Sinatra::Base
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'sends .registered to the extension module after extending the class' do
|
80
|
+
BizzleApp.register BizzleExtension
|
81
|
+
assert_equal 'bizzle!', BizzleApp.bizzle_option
|
82
|
+
assert_equal 'bizzle!', BizzleApp.bizzle
|
83
|
+
end
|
63
84
|
end
|
data/test/middleware_test.rb
CHANGED
@@ -57,4 +57,12 @@ describe "Middleware" do
|
|
57
57
|
assert_equal '/foo', body
|
58
58
|
assert_equal "UpcaseMiddleware, DowncaseMiddleware", response['X-Tests']
|
59
59
|
end
|
60
|
+
|
61
|
+
it "works when app is used as middleware" do
|
62
|
+
@app.use UpcaseMiddleware
|
63
|
+
@app = @app.new
|
64
|
+
get '/Foo'
|
65
|
+
assert_equal "/FOO", body
|
66
|
+
assert_equal "UpcaseMiddleware", response['X-Tests']
|
67
|
+
end
|
60
68
|
end
|
data/test/test_test.rb
CHANGED
@@ -45,7 +45,8 @@ describe 'Sinatra::Test' do
|
|
45
45
|
assert_equal('DELETE', request['REQUEST_METHOD'])
|
46
46
|
|
47
47
|
head '/'
|
48
|
-
assert_equal('
|
48
|
+
assert_equal('596', response.headers['Content-Length'])
|
49
|
+
assert_equal('', response.body)
|
49
50
|
end
|
50
51
|
|
51
52
|
it 'allows to specify a body' do
|
@@ -92,7 +93,7 @@ describe 'Sinatra::Test' do
|
|
92
93
|
assert_equal '1.2.3.4', request['HTTP_HOST']
|
93
94
|
|
94
95
|
get '/', :env => { :session => 'foo' }
|
95
|
-
assert_equal 'foo', request['
|
96
|
+
assert_equal 'foo', request['rack.session']
|
96
97
|
|
97
98
|
get '/', :env => { :cookies => 'foo' }
|
98
99
|
assert_equal 'foo', request['HTTP_COOKIE']
|
@@ -101,6 +102,34 @@ describe 'Sinatra::Test' do
|
|
101
102
|
assert_equal 'text/plain', request['CONTENT_TYPE']
|
102
103
|
end
|
103
104
|
|
105
|
+
it 'allow to test session easily' do
|
106
|
+
app = mock_app(Sinatra::Default) {
|
107
|
+
get '/' do
|
108
|
+
session['foo'] = 'bar'
|
109
|
+
200
|
110
|
+
end
|
111
|
+
|
112
|
+
post '/' do
|
113
|
+
assert_equal 'bar', session['foo']
|
114
|
+
session['foo'] || "blah"
|
115
|
+
end
|
116
|
+
}
|
117
|
+
|
118
|
+
browser = Sinatra::TestHarness.new(app)
|
119
|
+
browser.get '/'
|
120
|
+
browser.post '/', {}, :session => { 'foo' => 'bar' }
|
121
|
+
assert_equal 'bar', browser.response.body
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'yields the request object to the block before invoking the application' do
|
125
|
+
called = false
|
126
|
+
get '/' do |req|
|
127
|
+
called = true
|
128
|
+
assert req.kind_of?(Rack::MockRequest)
|
129
|
+
end
|
130
|
+
assert called
|
131
|
+
end
|
132
|
+
|
104
133
|
def test_TestHarness
|
105
134
|
session = Sinatra::TestHarness.new(@app)
|
106
135
|
response = session.get('/')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: darkhelmet-sinatra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Mizerany
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-03-01 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|