sinatra-sinatra 0.9.1.2 → 0.9.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -1
- data/README.rdoc +42 -0
- data/Rakefile +15 -3
- data/compat/haml_test.rb +7 -4
- data/compat/helper.rb +4 -0
- data/compat/sass_test.rb +10 -0
- data/lib/sinatra/base.rb +136 -121
- data/lib/sinatra/compat.rb +16 -0
- data/lib/sinatra/showexceptions.rb +303 -0
- data/sinatra.gemspec +11 -3
- data/test/base_test.rb +117 -101
- data/test/builder_test.rb +1 -1
- data/test/contest.rb +62 -0
- data/test/erb_test.rb +1 -1
- data/test/extensions_test.rb +1 -1
- data/test/filter_test.rb +1 -1
- data/test/haml_test.rb +25 -3
- data/test/helper.rb +14 -46
- data/test/helpers_test.rb +444 -442
- data/test/mapped_error_test.rb +147 -144
- data/test/middleware_test.rb +2 -2
- data/test/options_test.rb +247 -206
- data/test/render_backtrace_test.rb +145 -0
- data/test/request_test.rb +1 -1
- data/test/response_test.rb +2 -2
- data/test/result_test.rb +1 -1
- data/test/route_added_hook_test.rb +59 -0
- data/test/routing_test.rb +12 -1
- data/test/sass_test.rb +43 -1
- data/test/server_test.rb +5 -3
- data/test/sinatra_test.rb +1 -1
- data/test/static_test.rb +2 -2
- data/test/templates_test.rb +16 -4
- data/test/test_test.rb +5 -5
- data/test/views/error.builder +3 -0
- data/test/views/error.erb +3 -0
- data/test/views/error.haml +3 -0
- data/test/views/error.sass +2 -0
- metadata +12 -5
@@ -0,0 +1,145 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
require 'sass/error'
|
4
|
+
|
5
|
+
class RenderBacktraceTest < Test::Unit::TestCase
|
6
|
+
VIEWS = File.dirname(__FILE__) + '/views'
|
7
|
+
|
8
|
+
def assert_raise_at(filename, line, exception = RuntimeError)
|
9
|
+
f, l = nil
|
10
|
+
assert_raise(exception) do
|
11
|
+
begin
|
12
|
+
get('/')
|
13
|
+
rescue => e
|
14
|
+
f, l = e.backtrace.first.split(':')
|
15
|
+
raise
|
16
|
+
end
|
17
|
+
end
|
18
|
+
assert_equal(filename, f, "expected #{exception.name} in #{filename}, was #{f}")
|
19
|
+
assert_equal(line, l.to_i, "expected #{exception.name} in #{filename} at line #{line}, was at line #{l}")
|
20
|
+
end
|
21
|
+
|
22
|
+
def backtrace_app(&block)
|
23
|
+
mock_app {
|
24
|
+
use_in_file_templates!
|
25
|
+
set :views, RenderBacktraceTest::VIEWS
|
26
|
+
template :builder_template do
|
27
|
+
'raise "error"'
|
28
|
+
end
|
29
|
+
template :erb_template do
|
30
|
+
'<% raise "error" %>'
|
31
|
+
end
|
32
|
+
template :haml_template do
|
33
|
+
'%h1= raise "error"'
|
34
|
+
end
|
35
|
+
template :sass_template do
|
36
|
+
'+syntax-error'
|
37
|
+
end
|
38
|
+
get '/', &block
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
it "provides backtrace for Builder template" do
|
43
|
+
backtrace_app { builder :error }
|
44
|
+
assert_raise_at(File.join(VIEWS,'error.builder'), 2)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "provides backtrace for ERB template" do
|
48
|
+
backtrace_app { erb :error }
|
49
|
+
assert_raise_at(File.join(VIEWS,'error.erb'), 2)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "provides backtrace for HAML template" do
|
53
|
+
backtrace_app { haml :error }
|
54
|
+
assert_raise_at(File.join(VIEWS,'error.haml'), 2)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "provides backtrace for Sass template" do
|
58
|
+
backtrace_app { sass :error }
|
59
|
+
assert_raise_at(File.join(VIEWS,'error.sass'), 2, Sass::SyntaxError)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "provides backtrace for ERB template with locals" do
|
63
|
+
backtrace_app { erb :error, {}, :french => true }
|
64
|
+
assert_raise_at(File.join(VIEWS,'error.erb'), 3)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "provides backtrace for HAML template with locals" do
|
68
|
+
backtrace_app { haml :error, {}, :french => true }
|
69
|
+
assert_raise_at(File.join(VIEWS,'error.haml'), 3)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "provides backtrace for inline Builder string" do
|
73
|
+
backtrace_app { builder "raise 'Ack! Thbbbt!'"}
|
74
|
+
assert_raise_at(__FILE__, (__LINE__-1))
|
75
|
+
end
|
76
|
+
|
77
|
+
it "provides backtrace for inline ERB string" do
|
78
|
+
backtrace_app { erb "<% raise 'bidi-bidi-bidi' %>" }
|
79
|
+
assert_raise_at(__FILE__, (__LINE__-1))
|
80
|
+
end
|
81
|
+
|
82
|
+
it "provides backtrace for inline HAML string" do
|
83
|
+
backtrace_app { haml "%h1= raise 'Lions and tigers and bears! Oh, my!'" }
|
84
|
+
assert_raise_at(__FILE__, (__LINE__-1))
|
85
|
+
end
|
86
|
+
|
87
|
+
# it "provides backtrace for inline Sass string" do
|
88
|
+
# backtrace_app { sass '+buh-bye' }
|
89
|
+
# assert_raise_at(__FILE__, (__LINE__-1), Sass::SyntaxError)
|
90
|
+
# end
|
91
|
+
|
92
|
+
it "provides backtrace for named Builder template" do
|
93
|
+
backtrace_app { builder :builder_template }
|
94
|
+
assert_raise_at(__FILE__, (__LINE__-68))
|
95
|
+
end
|
96
|
+
|
97
|
+
it "provides backtrace for named ERB template" do
|
98
|
+
backtrace_app { erb :erb_template }
|
99
|
+
assert_raise_at(__FILE__, (__LINE__-70))
|
100
|
+
end
|
101
|
+
|
102
|
+
it "provides backtrace for named HAML template" do
|
103
|
+
backtrace_app { haml :haml_template }
|
104
|
+
assert_raise_at(__FILE__, (__LINE__-72))
|
105
|
+
end
|
106
|
+
|
107
|
+
# it "provides backtrace for named Sass template" do
|
108
|
+
# backtrace_app { sass :sass_template }
|
109
|
+
# assert_raise_at(__FILE__, (__LINE__-74), Sass::SyntaxError)
|
110
|
+
# end
|
111
|
+
|
112
|
+
it "provides backtrace for in file Builder template" do
|
113
|
+
backtrace_app { builder :builder_in_file }
|
114
|
+
assert_raise_at(__FILE__, (__LINE__+22))
|
115
|
+
end
|
116
|
+
|
117
|
+
it "provides backtrace for in file ERB template" do
|
118
|
+
backtrace_app { erb :erb_in_file }
|
119
|
+
assert_raise_at(__FILE__, (__LINE__+20))
|
120
|
+
end
|
121
|
+
|
122
|
+
it "provides backtrace for in file HAML template" do
|
123
|
+
backtrace_app { haml :haml_in_file }
|
124
|
+
assert_raise_at(__FILE__, (__LINE__+18))
|
125
|
+
end
|
126
|
+
|
127
|
+
# it "provides backtrace for in file Sass template" do
|
128
|
+
# backtrace_app { sass :sass_in_file }
|
129
|
+
# assert_raise_at(__FILE__, (__LINE__+16), Sass::SyntaxError)
|
130
|
+
# end
|
131
|
+
end
|
132
|
+
|
133
|
+
__END__
|
134
|
+
|
135
|
+
@@ builder_in_file
|
136
|
+
raise "bif"
|
137
|
+
|
138
|
+
@@ erb_in_file
|
139
|
+
<% raise "bam" %>
|
140
|
+
|
141
|
+
@@ haml_in_file
|
142
|
+
%h1= raise "pow"
|
143
|
+
|
144
|
+
@@ sass_in_file
|
145
|
+
+blam
|
data/test/request_test.rb
CHANGED
data/test/response_test.rb
CHANGED
data/test/result_test.rb
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
module RouteAddedTest
|
4
|
+
@routes, @procs = [], []
|
5
|
+
def self.routes ; @routes ; end
|
6
|
+
def self.procs ; @procs ; end
|
7
|
+
def self.route_added(verb, path, proc)
|
8
|
+
@routes << [verb, path]
|
9
|
+
@procs << proc
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class RouteAddedHookTest < Test::Unit::TestCase
|
14
|
+
setup {
|
15
|
+
RouteAddedTest.routes.clear
|
16
|
+
RouteAddedTest.procs.clear
|
17
|
+
}
|
18
|
+
|
19
|
+
it "should be notified of an added route" do
|
20
|
+
mock_app(Class.new(Sinatra::Base)) {
|
21
|
+
register RouteAddedTest
|
22
|
+
get('/') {}
|
23
|
+
}
|
24
|
+
|
25
|
+
assert_equal [["GET", "/"], ["HEAD", "/"]],
|
26
|
+
RouteAddedTest.routes
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should include hooks from superclass" do
|
30
|
+
a = Class.new(Class.new(Sinatra::Base))
|
31
|
+
b = Class.new(a)
|
32
|
+
|
33
|
+
a.register RouteAddedTest
|
34
|
+
b.class_eval { post("/sub_app_route") {} }
|
35
|
+
|
36
|
+
assert_equal [["POST", "/sub_app_route"]],
|
37
|
+
RouteAddedTest.routes
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should only run once per extension" do
|
41
|
+
mock_app(Class.new(Sinatra::Base)) {
|
42
|
+
register RouteAddedTest
|
43
|
+
register RouteAddedTest
|
44
|
+
get('/') {}
|
45
|
+
}
|
46
|
+
|
47
|
+
assert_equal [["GET", "/"], ["HEAD", "/"]],
|
48
|
+
RouteAddedTest.routes
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should pass route blocks as an argument" do
|
52
|
+
mock_app(Class.new(Sinatra::Base)) {
|
53
|
+
register RouteAddedTest
|
54
|
+
get('/') {}
|
55
|
+
}
|
56
|
+
|
57
|
+
assert_kind_of Proc, RouteAddedTest.procs.first
|
58
|
+
end
|
59
|
+
end
|
data/test/routing_test.rb
CHANGED
@@ -5,7 +5,7 @@ def route_def(pattern)
|
|
5
5
|
mock_app { get(pattern) { } }
|
6
6
|
end
|
7
7
|
|
8
|
-
|
8
|
+
class RoutingTest < Test::Unit::TestCase
|
9
9
|
%w[get put post delete].each do |verb|
|
10
10
|
it "defines #{verb.upcase} request handlers with #{verb}" do
|
11
11
|
mock_app {
|
@@ -44,6 +44,17 @@ describe "Routing" do
|
|
44
44
|
assert_equal 404, status
|
45
45
|
end
|
46
46
|
|
47
|
+
it "sets the content-type to text/html in the default 404 handler" do
|
48
|
+
mock_app {
|
49
|
+
before { content_type 'text/plain' }
|
50
|
+
}
|
51
|
+
|
52
|
+
get '/foo'
|
53
|
+
assert_equal 404, status
|
54
|
+
assert_equal 'text/html', response["Content-Type"]
|
55
|
+
assert body.include?("Sinatra doesn't know this ditty")
|
56
|
+
end
|
57
|
+
|
47
58
|
it 'takes multiple definitions of a route' do
|
48
59
|
mock_app {
|
49
60
|
user_agent(/Foo/)
|
data/test/sass_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
|
-
|
3
|
+
class SassTest < Test::Unit::TestCase
|
4
4
|
def sass_app(&block)
|
5
5
|
mock_app {
|
6
6
|
set :views, File.dirname(__FILE__) + '/views'
|
@@ -33,4 +33,46 @@ describe "Sass Templates" do
|
|
33
33
|
}
|
34
34
|
assert_raise(Errno::ENOENT) { get('/') }
|
35
35
|
end
|
36
|
+
|
37
|
+
it "passes SASS options to the Sass engine" do
|
38
|
+
sass_app {
|
39
|
+
sass "#sass\n :background-color #FFF\n :color #000\n", :style => :compact
|
40
|
+
}
|
41
|
+
assert ok?
|
42
|
+
assert_equal "#sass { background-color: #FFF; color: #000; }\n", body
|
43
|
+
end
|
44
|
+
|
45
|
+
it "passes default SASS options to the Sass engine" do
|
46
|
+
mock_app {
|
47
|
+
set :sass, {:style => :compact} # default Sass style is :nested
|
48
|
+
get '/' do
|
49
|
+
sass "#sass\n :background-color #FFF\n :color #000\n"
|
50
|
+
end
|
51
|
+
}
|
52
|
+
get '/'
|
53
|
+
assert ok?
|
54
|
+
assert_equal "#sass { background-color: #FFF; color: #000; }\n", body
|
55
|
+
end
|
56
|
+
|
57
|
+
it "merges the default SASS options with the overrides and passes them to the Sass engine" do
|
58
|
+
mock_app {
|
59
|
+
set :sass, {:style => :compact, :attribute_syntax => :alternate } # default Sass attribute_syntax is :normal (with : in front)
|
60
|
+
get '/' do
|
61
|
+
sass "#sass\n background-color: #FFF\n color: #000\n"
|
62
|
+
end
|
63
|
+
get '/raised' do
|
64
|
+
sass "#sass\n :background-color #FFF\n :color #000\n", :style => :expanded # retains global attribute_syntax settings
|
65
|
+
end
|
66
|
+
get '/expanded_normal' do
|
67
|
+
sass "#sass\n :background-color #FFF\n :color #000\n", :style => :expanded, :attribute_syntax => :normal
|
68
|
+
end
|
69
|
+
}
|
70
|
+
get '/'
|
71
|
+
assert ok?
|
72
|
+
assert_equal "#sass { background-color: #FFF; color: #000; }\n", body
|
73
|
+
assert_raise(Sass::SyntaxError) { get('/raised') }
|
74
|
+
get '/expanded_normal'
|
75
|
+
assert ok?
|
76
|
+
assert_equal "#sass {\n background-color: #FFF;\n color: #000;\n}\n", body
|
77
|
+
end
|
36
78
|
end
|
data/test/server_test.rb
CHANGED
@@ -14,8 +14,8 @@ class Rack::Handler::Mock
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
class ServerTest < Test::Unit::TestCase
|
18
|
+
setup do
|
19
19
|
mock_app {
|
20
20
|
set :server, 'mock'
|
21
21
|
set :host, 'foo.local'
|
@@ -24,7 +24,9 @@ describe 'Sinatra::Base.run!' do
|
|
24
24
|
$stdout = File.open('/dev/null', 'wb')
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
def teardown
|
28
|
+
$stdout = STDOUT
|
29
|
+
end
|
28
30
|
|
29
31
|
it "locates the appropriate Rack handler and calls ::run" do
|
30
32
|
@app.run!
|
data/test/sinatra_test.rb
CHANGED
data/test/static_test.rb
CHANGED
data/test/templates_test.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
|
-
|
3
|
+
class TemplatesTest < Test::Unit::TestCase
|
4
4
|
def render_app(&block)
|
5
5
|
mock_app {
|
6
|
-
def render_test(template, data, options, &block)
|
6
|
+
def render_test(template, data, options, locals, &block)
|
7
7
|
inner = block ? block.call : ''
|
8
8
|
data + inner
|
9
9
|
end
|
@@ -72,11 +72,23 @@ describe 'Templating' do
|
|
72
72
|
mock_app {
|
73
73
|
use_in_file_templates!
|
74
74
|
}
|
75
|
-
assert_equal "this is foo\n\n", @app.templates[:foo]
|
76
|
-
assert_equal "X\n= yield\nX\n", @app.templates[:layout]
|
75
|
+
assert_equal "this is foo\n\n", @app.templates[:foo][:template]
|
76
|
+
assert_equal "X\n= yield\nX\n", @app.templates[:layout][:template]
|
77
|
+
end
|
78
|
+
|
79
|
+
test 'use_in_file_templates simply ignores IO errors' do
|
80
|
+
assert_nothing_raised {
|
81
|
+
mock_app {
|
82
|
+
use_in_file_templates!('/foo/bar')
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
assert @app.templates.empty?
|
77
87
|
end
|
78
88
|
end
|
79
89
|
|
90
|
+
# __END__ : this is not the real end of the script.
|
91
|
+
|
80
92
|
__END__
|
81
93
|
|
82
94
|
@@ foo
|
data/test/test_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require File.dirname(__FILE__) + '/helper'
|
3
3
|
|
4
|
-
|
4
|
+
class TestTest < Test::Unit::TestCase
|
5
5
|
def request
|
6
6
|
YAML.load(body)
|
7
7
|
end
|
@@ -14,7 +14,7 @@ describe 'Sinatra::Test' do
|
|
14
14
|
YAML.load(request['test.params'])
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
setup do
|
18
18
|
mock_app {
|
19
19
|
%w[get head post put delete].each { |verb|
|
20
20
|
send(verb, '/') do
|
@@ -45,8 +45,8 @@ describe 'Sinatra::Test' do
|
|
45
45
|
assert_equal('DELETE', request['REQUEST_METHOD'])
|
46
46
|
|
47
47
|
head '/'
|
48
|
-
assert_equal('596', response.headers['Content-Length'])
|
49
48
|
assert_equal('', response.body)
|
49
|
+
assert response.headers['Content-Length'].to_i > 0
|
50
50
|
end
|
51
51
|
|
52
52
|
it 'allows to specify a body' do
|
@@ -92,8 +92,8 @@ describe 'Sinatra::Test' do
|
|
92
92
|
get '/', :env => { :host => '1.2.3.4' }
|
93
93
|
assert_equal '1.2.3.4', request['HTTP_HOST']
|
94
94
|
|
95
|
-
get '/', :env => { :session => 'foo' }
|
96
|
-
assert_equal
|
95
|
+
get '/', :env => { :session => {'foo' => 'bar'} }
|
96
|
+
assert_equal({'foo' => 'bar'}, request['rack.session'])
|
97
97
|
|
98
98
|
get '/', :env => { :cookies => 'foo' }
|
99
99
|
assert_equal 'foo', request['HTTP_COOKIE']
|