sinatra-sinatra 0.8.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/AUTHORS +40 -0
  2. data/CHANGES +174 -0
  3. data/LICENSE +22 -0
  4. data/README.rdoc +545 -0
  5. data/Rakefile +180 -0
  6. data/compat/app_test.rb +300 -0
  7. data/compat/application_test.rb +334 -0
  8. data/compat/builder_test.rb +101 -0
  9. data/compat/custom_error_test.rb +62 -0
  10. data/compat/erb_test.rb +136 -0
  11. data/compat/events_test.rb +78 -0
  12. data/compat/filter_test.rb +30 -0
  13. data/compat/haml_test.rb +233 -0
  14. data/compat/helper.rb +30 -0
  15. data/compat/mapped_error_test.rb +72 -0
  16. data/compat/pipeline_test.rb +71 -0
  17. data/compat/public/foo.xml +1 -0
  18. data/compat/sass_test.rb +57 -0
  19. data/compat/sessions_test.rb +39 -0
  20. data/compat/streaming_test.rb +121 -0
  21. data/compat/sym_params_test.rb +19 -0
  22. data/compat/template_test.rb +30 -0
  23. data/compat/use_in_file_templates_test.rb +47 -0
  24. data/compat/views/foo.builder +1 -0
  25. data/compat/views/foo.erb +1 -0
  26. data/compat/views/foo.haml +1 -0
  27. data/compat/views/foo.sass +2 -0
  28. data/compat/views/foo_layout.erb +2 -0
  29. data/compat/views/foo_layout.haml +2 -0
  30. data/compat/views/layout_test/foo.builder +1 -0
  31. data/compat/views/layout_test/foo.erb +1 -0
  32. data/compat/views/layout_test/foo.haml +1 -0
  33. data/compat/views/layout_test/foo.sass +2 -0
  34. data/compat/views/layout_test/layout.builder +3 -0
  35. data/compat/views/layout_test/layout.erb +1 -0
  36. data/compat/views/layout_test/layout.haml +1 -0
  37. data/compat/views/layout_test/layout.sass +2 -0
  38. data/compat/views/no_layout/no_layout.builder +1 -0
  39. data/compat/views/no_layout/no_layout.haml +1 -0
  40. data/lib/sinatra/base.rb +818 -0
  41. data/lib/sinatra/compat.rb +239 -0
  42. data/lib/sinatra/images/404.png +0 -0
  43. data/lib/sinatra/images/500.png +0 -0
  44. data/lib/sinatra/main.rb +48 -0
  45. data/lib/sinatra/test/bacon.rb +17 -0
  46. data/lib/sinatra/test/rspec.rb +9 -0
  47. data/lib/sinatra/test/spec.rb +9 -0
  48. data/lib/sinatra/test/unit.rb +11 -0
  49. data/lib/sinatra/test.rb +109 -0
  50. data/lib/sinatra.rb +4 -0
  51. data/sinatra.gemspec +109 -0
  52. data/test/base_test.rb +68 -0
  53. data/test/builder_test.rb +64 -0
  54. data/test/data/reload_app_file.rb +3 -0
  55. data/test/erb_test.rb +50 -0
  56. data/test/filter_test.rb +35 -0
  57. data/test/haml_test.rb +68 -0
  58. data/test/helper.rb +20 -0
  59. data/test/helpers_test.rb +361 -0
  60. data/test/mapped_error_test.rb +160 -0
  61. data/test/middleware_test.rb +58 -0
  62. data/test/options_test.rb +97 -0
  63. data/test/reload_test.rb +61 -0
  64. data/test/request_test.rb +9 -0
  65. data/test/result_test.rb +88 -0
  66. data/test/routing_test.rb +334 -0
  67. data/test/sass_test.rb +36 -0
  68. data/test/sinatra_test.rb +13 -0
  69. data/test/static_test.rb +57 -0
  70. data/test/templates_test.rb +88 -0
  71. data/test/views/hello.builder +1 -0
  72. data/test/views/hello.erb +1 -0
  73. data/test/views/hello.haml +1 -0
  74. data/test/views/hello.sass +2 -0
  75. data/test/views/hello.test +1 -0
  76. data/test/views/layout2.builder +3 -0
  77. data/test/views/layout2.erb +2 -0
  78. data/test/views/layout2.haml +2 -0
  79. data/test/views/layout2.test +1 -0
  80. metadata +161 -0
@@ -0,0 +1,58 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe "Middleware" do
4
+ before do
5
+ @app = mock_app(Sinatra::Default) {
6
+ get '/*' do
7
+ response.headers['X-Tests'] = env['test.ran'].join(', ')
8
+ env['PATH_INFO']
9
+ end
10
+ }
11
+ end
12
+
13
+ class MockMiddleware < Struct.new(:app)
14
+ def call(env)
15
+ (env['test.ran'] ||= []) << self.class.to_s
16
+ app.call(env)
17
+ end
18
+ end
19
+
20
+ class UpcaseMiddleware < MockMiddleware
21
+ def call(env)
22
+ env['PATH_INFO'] = env['PATH_INFO'].upcase
23
+ super
24
+ end
25
+ end
26
+
27
+ it "is added with Sinatra::Application.use" do
28
+ @app.use UpcaseMiddleware
29
+ get '/hello-world'
30
+ assert ok?
31
+ assert_equal '/HELLO-WORLD', body
32
+ end
33
+
34
+ class DowncaseMiddleware < MockMiddleware
35
+ def call(env)
36
+ env['PATH_INFO'] = env['PATH_INFO'].downcase
37
+ super
38
+ end
39
+ end
40
+
41
+ specify "runs in the order defined" do
42
+ @app.use UpcaseMiddleware
43
+ @app.use DowncaseMiddleware
44
+ get '/Foo'
45
+ assert_equal "/foo", body
46
+ assert_equal "UpcaseMiddleware, DowncaseMiddleware", response['X-Tests']
47
+ end
48
+
49
+ specify "resets the prebuilt pipeline when new middleware is added" do
50
+ @app.use UpcaseMiddleware
51
+ get '/Foo'
52
+ assert_equal "/FOO", body
53
+ @app.use DowncaseMiddleware
54
+ get '/Foo'
55
+ assert_equal '/foo', body
56
+ assert_equal "UpcaseMiddleware, DowncaseMiddleware", response['X-Tests']
57
+ end
58
+ end
@@ -0,0 +1,97 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe 'Options' do
4
+ before { @app = Class.new(Sinatra::Base) }
5
+
6
+ it 'sets options to literal values' do
7
+ @app.set(:foo, 'bar')
8
+ assert @app.respond_to?(:foo)
9
+ assert_equal 'bar', @app.foo
10
+ end
11
+
12
+ it 'sets options to Procs' do
13
+ @app.set(:foo, Proc.new { 'baz' })
14
+ assert @app.respond_to?(:foo)
15
+ assert_equal 'baz', @app.foo
16
+ end
17
+
18
+ it "sets multiple options with a Hash" do
19
+ @app.set :foo => 1234,
20
+ :bar => 'Hello World',
21
+ :baz => Proc.new { 'bizzle' }
22
+ assert_equal 1234, @app.foo
23
+ assert_equal 'Hello World', @app.bar
24
+ assert_equal 'bizzle', @app.baz
25
+ end
26
+
27
+ it 'inherits option methods when subclassed' do
28
+ @app.set :foo, 'bar'
29
+ @app.set :biz, Proc.new { 'baz' }
30
+
31
+ sub = Class.new(@app)
32
+ assert sub.respond_to?(:foo)
33
+ assert_equal 'bar', sub.foo
34
+ assert sub.respond_to?(:biz)
35
+ assert_equal 'baz', sub.biz
36
+ end
37
+
38
+ it 'overrides options in subclass' do
39
+ @app.set :foo, 'bar'
40
+ @app.set :biz, Proc.new { 'baz' }
41
+ sub = Class.new(@app)
42
+ sub.set :foo, 'bling'
43
+ assert_equal 'bling', sub.foo
44
+ assert_equal 'bar', @app.foo
45
+ end
46
+
47
+ it 'creates setter methods when first defined' do
48
+ @app.set :foo, 'bar'
49
+ assert @app.respond_to?('foo=')
50
+ @app.foo = 'biz'
51
+ assert_equal 'biz', @app.foo
52
+ end
53
+
54
+ it 'creates predicate methods when first defined' do
55
+ @app.set :foo, 'hello world'
56
+ assert @app.respond_to?(:foo?)
57
+ assert @app.foo?
58
+ @app.set :foo, nil
59
+ assert !@app.foo?
60
+ end
61
+
62
+ it 'uses existing setter methods if detected' do
63
+ class << @app
64
+ def foo
65
+ @foo
66
+ end
67
+ def foo=(value)
68
+ @foo = 'oops'
69
+ end
70
+ end
71
+
72
+ @app.set :foo, 'bam'
73
+ assert_equal 'oops', @app.foo
74
+ end
75
+
76
+ it "sets multiple options to true with #enable" do
77
+ @app.enable :sessions, :foo, :bar
78
+ assert @app.sessions
79
+ assert @app.foo
80
+ assert @app.bar
81
+ end
82
+
83
+ it "sets multiple options to false with #disable" do
84
+ @app.disable :sessions, :foo, :bar
85
+ assert !@app.sessions
86
+ assert !@app.foo
87
+ assert !@app.bar
88
+ end
89
+
90
+ it 'enables MethodOverride middleware when :methodoverride is enabled' do
91
+ @app.set :methodoverride, true
92
+ @app.put('/') { 'okay' }
93
+ post '/', {'_method'=>'PUT'}, {}
94
+ assert_equal 200, status
95
+ assert_equal 'okay', body
96
+ end
97
+ end
@@ -0,0 +1,61 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ $reload_count = 0
4
+ $reload_app = nil
5
+
6
+ describe "Reloading" do
7
+ before {
8
+ @app = mock_app(Sinatra::Default)
9
+ $reload_app = @app
10
+ }
11
+
12
+ after {
13
+ $reload_app = nil
14
+ }
15
+
16
+ it 'is enabled by default when in development and the app_file is set' do
17
+ @app.set :app_file, __FILE__
18
+ @app.set :environment, :development
19
+ assert_same true, @app.reload
20
+ assert_same true, @app.reload?
21
+ end
22
+
23
+ it 'is disabled by default when running in non-development environment' do
24
+ @app.set :app_file, __FILE__
25
+ @app.set :environment, :test
26
+ assert !@app.reload
27
+ assert_same false, @app.reload?
28
+ end
29
+
30
+ it 'is disabled by default when no app_file is available' do
31
+ @app.set :app_file, nil
32
+ @app.set :environment, :development
33
+ assert !@app.reload
34
+ assert_same false, @app.reload?
35
+ end
36
+
37
+ it 'can be turned off explicitly' do
38
+ @app.set :app_file, __FILE__
39
+ @app.set :environment, :development
40
+ assert_same true, @app.reload
41
+ @app.set :reload, false
42
+ assert_same false, @app.reload
43
+ assert_same false, @app.reload?
44
+ end
45
+
46
+ it 'reloads the app_file each time a request is made' do
47
+ @app.set :app_file, File.dirname(__FILE__) + '/data/reload_app_file.rb'
48
+ @app.set :reload, true
49
+ @app.get('/') { 'Hello World' }
50
+
51
+ get '/'
52
+ assert_equal 200, status
53
+ assert_equal 'Hello from reload file', body
54
+ assert_equal 1, $reload_count
55
+
56
+ get '/'
57
+ assert_equal 200, status
58
+ assert_equal 'Hello from reload file', body
59
+ assert_equal 2, $reload_count
60
+ end
61
+ end
@@ -0,0 +1,9 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe 'Sinatra::Request' do
4
+ it 'responds to #user_agent' do
5
+ request = Sinatra::Request.new({'HTTP_USER_AGENT' => 'Test'})
6
+ assert request.respond_to?(:user_agent)
7
+ assert_equal 'Test', request.user_agent
8
+ end
9
+ end
@@ -0,0 +1,88 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe 'Result Handling' do
4
+ it "sets response.body when result is a String" do
5
+ mock_app {
6
+ get '/' do
7
+ 'Hello World'
8
+ end
9
+ }
10
+
11
+ get '/'
12
+ assert ok?
13
+ assert_equal 'Hello World', body
14
+ end
15
+
16
+ it "sets response.body when result is an Array of Strings" do
17
+ mock_app {
18
+ get '/' do
19
+ ['Hello', 'World']
20
+ end
21
+ }
22
+
23
+ get '/'
24
+ assert ok?
25
+ assert_equal 'HelloWorld', body
26
+ end
27
+
28
+ it "sets response.body when result responds to #each" do
29
+ mock_app {
30
+ get '/' do
31
+ res = lambda { 'Hello World' }
32
+ def res.each ; yield call ; end
33
+ res
34
+ end
35
+ }
36
+
37
+ get '/'
38
+ assert ok?
39
+ assert_equal 'Hello World', body
40
+ end
41
+
42
+ it "sets response.body to [] when result is nil" do
43
+ mock_app {
44
+ get '/' do
45
+ nil
46
+ end
47
+ }
48
+
49
+ get '/'
50
+ assert ok?
51
+ assert_equal '', body
52
+ end
53
+
54
+ it "sets status, headers, and body when result is a Rack response tuple" do
55
+ mock_app {
56
+ get '/' do
57
+ [205, {'Content-Type' => 'foo/bar'}, 'Hello World']
58
+ end
59
+ }
60
+
61
+ get '/'
62
+ assert_equal 205, status
63
+ assert_equal 'foo/bar', response['Content-Type']
64
+ assert_equal 'Hello World', body
65
+ end
66
+
67
+ it "sets status and body when result is a two-tuple" do
68
+ mock_app {
69
+ get '/' do
70
+ [409, 'formula of']
71
+ end
72
+ }
73
+
74
+ get '/'
75
+ assert_equal 409, status
76
+ assert_equal 'formula of', body
77
+ end
78
+
79
+ it "sets status when result is a Fixnum status code" do
80
+ mock_app {
81
+ get('/') { 205 }
82
+ }
83
+
84
+ get '/'
85
+ assert_equal 205, status
86
+ assert_equal '', body
87
+ end
88
+ end
@@ -0,0 +1,334 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe "Routing" do
4
+ %w[get put post delete head].each do |verb|
5
+ it "defines #{verb.upcase} request handlers with #{verb}" do
6
+ mock_app {
7
+ send verb, '/hello' do
8
+ 'Hello World'
9
+ end
10
+ }
11
+
12
+ request = Rack::MockRequest.new(@app)
13
+ response = request.request(verb.upcase, '/hello', {})
14
+ assert response.ok?
15
+ assert_equal 'Hello World', response.body
16
+ end
17
+ end
18
+
19
+ it "404s when no route satisfies the request" do
20
+ mock_app {
21
+ get('/foo') { }
22
+ }
23
+ get '/bar'
24
+ assert_equal 404, status
25
+ end
26
+
27
+ it "exposes params with indifferent hash" do
28
+ mock_app {
29
+ get '/:foo' do
30
+ fail unless params['foo'] == 'bar'
31
+ fail unless params[:foo] == 'bar'
32
+ 'well, alright'
33
+ end
34
+ }
35
+ get '/bar'
36
+ assert_equal 'well, alright', body
37
+ end
38
+
39
+ it "merges named params and query string params in params" do
40
+ mock_app {
41
+ get '/:foo' do
42
+ fail unless params['foo'] == 'bar'
43
+ fail unless params['baz'] == 'biz'
44
+ end
45
+ }
46
+ get '/bar?baz=biz'
47
+ assert ok?
48
+ end
49
+
50
+ it "supports named params like /hello/:person" do
51
+ mock_app {
52
+ get '/hello/:person' do
53
+ "Hello #{params['person']}"
54
+ end
55
+ }
56
+ get '/hello/Frank'
57
+ assert_equal 'Hello Frank', body
58
+ end
59
+
60
+ it "supports optional named params like /?:foo?/?:bar?" do
61
+ mock_app {
62
+ get '/?:foo?/?:bar?' do
63
+ "foo=#{params[:foo]};bar=#{params[:bar]}"
64
+ end
65
+ }
66
+
67
+ get '/hello/world'
68
+ assert ok?
69
+ assert_equal "foo=hello;bar=world", body
70
+
71
+ get '/hello'
72
+ assert ok?
73
+ assert_equal "foo=hello;bar=", body
74
+
75
+ get '/'
76
+ assert ok?
77
+ assert_equal "foo=;bar=", body
78
+ end
79
+
80
+ it "supports single splat params like /*" do
81
+ mock_app {
82
+ get '/*' do
83
+ fail unless params['splat'].kind_of?(Array)
84
+ params['splat'].join "\n"
85
+ end
86
+ }
87
+
88
+ get '/foo'
89
+ assert_equal "foo", body
90
+
91
+ get '/foo/bar/baz'
92
+ assert_equal "foo/bar/baz", body
93
+ end
94
+
95
+ it "supports mixing multiple splat params like /*/foo/*/*" do
96
+ mock_app {
97
+ get '/*/foo/*/*' do
98
+ fail unless params['splat'].kind_of?(Array)
99
+ params['splat'].join "\n"
100
+ end
101
+ }
102
+
103
+ get '/bar/foo/bling/baz/boom'
104
+ assert_equal "bar\nbling\nbaz/boom", body
105
+
106
+ get '/bar/foo/baz'
107
+ assert not_found?
108
+ end
109
+
110
+ it "supports mixing named and splat params like /:foo/*" do
111
+ mock_app {
112
+ get '/:foo/*' do
113
+ fail unless params['foo'] == 'foo'
114
+ fail unless params['splat'] == ['bar/baz']
115
+ end
116
+ }
117
+
118
+ get '/foo/bar/baz'
119
+ assert ok?
120
+ end
121
+
122
+ it "supports paths that include spaces" do
123
+ mock_app {
124
+ get '/path with spaces' do
125
+ 'looks good'
126
+ end
127
+ }
128
+
129
+ get '/path%20with%20spaces'
130
+ assert ok?
131
+ assert_equal 'looks good', body
132
+ end
133
+
134
+ it "URL decodes named parameters and splats" do
135
+ mock_app {
136
+ get '/:foo/*' do
137
+ fail unless params['foo'] == 'hello world'
138
+ fail unless params['splat'] == ['how are you']
139
+ nil
140
+ end
141
+ }
142
+
143
+ get '/hello%20world/how%20are%20you'
144
+ assert ok?
145
+ end
146
+
147
+ it 'supports regular expressions' do
148
+ mock_app {
149
+ get(/^\/foo...\/bar$/) do
150
+ 'Hello World'
151
+ end
152
+ }
153
+
154
+ get '/foooom/bar'
155
+ assert ok?
156
+ assert_equal 'Hello World', body
157
+ end
158
+
159
+ it 'makes regular expression captures available in params[:captures]' do
160
+ mock_app {
161
+ get(/^\/fo(.*)\/ba(.*)/) do
162
+ fail unless params[:captures] == ['orooomma', 'f']
163
+ 'right on'
164
+ end
165
+ }
166
+
167
+ get '/foorooomma/baf'
168
+ assert ok?
169
+ assert_equal 'right on', body
170
+ end
171
+
172
+ it "returns response immediately on halt" do
173
+ mock_app {
174
+ get '/' do
175
+ halt 'Hello World'
176
+ 'Boo-hoo World'
177
+ end
178
+ }
179
+
180
+ get '/'
181
+ assert ok?
182
+ assert_equal 'Hello World', body
183
+ end
184
+
185
+ it "transitions to the next matching route on pass" do
186
+ mock_app {
187
+ get '/:foo' do
188
+ pass
189
+ 'Hello Foo'
190
+ end
191
+
192
+ get '/*' do
193
+ fail if params.include?('foo')
194
+ 'Hello World'
195
+ end
196
+ }
197
+
198
+ get '/bar'
199
+ assert ok?
200
+ assert_equal 'Hello World', body
201
+ end
202
+
203
+ it "transitions to 404 when passed and no subsequent route matches" do
204
+ mock_app {
205
+ get '/:foo' do
206
+ pass
207
+ 'Hello Foo'
208
+ end
209
+ }
210
+
211
+ get '/bar'
212
+ assert not_found?
213
+ end
214
+
215
+ it "passes when matching condition returns false" do
216
+ mock_app {
217
+ condition { params[:foo] == 'bar' }
218
+ get '/:foo' do
219
+ 'Hello World'
220
+ end
221
+ }
222
+
223
+ get '/bar'
224
+ assert ok?
225
+ assert_equal 'Hello World', body
226
+
227
+ get '/foo'
228
+ assert not_found?
229
+ end
230
+
231
+ it "does not pass when matching condition returns nil" do
232
+ mock_app {
233
+ condition { nil }
234
+ get '/:foo' do
235
+ 'Hello World'
236
+ end
237
+ }
238
+
239
+ get '/bar'
240
+ assert ok?
241
+ assert_equal 'Hello World', body
242
+ end
243
+
244
+ it "passes to next route when condition calls pass explicitly" do
245
+ mock_app {
246
+ condition { pass unless params[:foo] == 'bar' }
247
+ get '/:foo' do
248
+ 'Hello World'
249
+ end
250
+ }
251
+
252
+ get '/bar'
253
+ assert ok?
254
+ assert_equal 'Hello World', body
255
+
256
+ get '/foo'
257
+ assert not_found?
258
+ end
259
+
260
+ it "passes to the next route when host_name does not match" do
261
+ mock_app {
262
+ host_name 'example.com'
263
+ get '/foo' do
264
+ 'Hello World'
265
+ end
266
+ }
267
+ get '/foo'
268
+ assert not_found?
269
+
270
+ get '/foo', :env => { 'HTTP_HOST' => 'example.com' }
271
+ assert_equal 200, status
272
+ assert_equal 'Hello World', body
273
+ end
274
+
275
+ it "passes to the next route when user_agent does not match" do
276
+ mock_app {
277
+ user_agent(/Foo/)
278
+ get '/foo' do
279
+ 'Hello World'
280
+ end
281
+ }
282
+ get '/foo'
283
+ assert not_found?
284
+
285
+ get '/foo', :env => { 'HTTP_USER_AGENT' => 'Foo Bar' }
286
+ assert_equal 200, status
287
+ assert_equal 'Hello World', body
288
+ end
289
+
290
+ it "makes captures in user agent pattern available in params[:agent]" do
291
+ mock_app {
292
+ user_agent(/Foo (.*)/)
293
+ get '/foo' do
294
+ 'Hello ' + params[:agent].first
295
+ end
296
+ }
297
+ get '/foo', :env => { 'HTTP_USER_AGENT' => 'Foo Bar' }
298
+ assert_equal 200, status
299
+ assert_equal 'Hello Bar', body
300
+ end
301
+
302
+ it "filters by accept header" do
303
+ mock_app {
304
+ get '/', :provides => :xml do
305
+ request.env['HTTP_ACCEPT']
306
+ end
307
+ }
308
+
309
+ get '/', :env => { :accept => 'application/xml' }
310
+ assert ok?
311
+ assert_equal 'application/xml', body
312
+ assert_equal 'application/xml', response.headers['Content-Type']
313
+
314
+ get '/', :env => { :accept => 'text/html' }
315
+ assert !ok?
316
+ end
317
+
318
+ it "allows multiple mime types for accept header" do
319
+ types = ['image/jpeg', 'image/pjpeg']
320
+
321
+ mock_app {
322
+ get '/', :provides => types do
323
+ request.env['HTTP_ACCEPT']
324
+ end
325
+ }
326
+
327
+ types.each do |type|
328
+ get '/', :env => { :accept => type }
329
+ assert ok?
330
+ assert_equal type, body
331
+ assert_equal type, response.headers['Content-Type']
332
+ end
333
+ end
334
+ end
data/test/sass_test.rb ADDED
@@ -0,0 +1,36 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe "Sass Templates" do
4
+ def sass_app(&block)
5
+ mock_app {
6
+ set :views, File.dirname(__FILE__) + '/views'
7
+ get '/', &block
8
+ }
9
+ get '/'
10
+ end
11
+
12
+ it 'renders inline Sass strings' do
13
+ sass_app { sass "#sass\n :background-color #FFF\n" }
14
+ assert ok?
15
+ assert_equal "#sass {\n background-color: #FFF; }\n", body
16
+ end
17
+
18
+ it 'renders .sass files in views path' do
19
+ sass_app { sass :hello }
20
+ assert ok?
21
+ assert_equal "#sass {\n background-color: #FFF; }\n", body
22
+ end
23
+
24
+ it 'ignores the layout option' do
25
+ sass_app { sass :hello, :layout => :layout2 }
26
+ assert ok?
27
+ assert_equal "#sass {\n background-color: #FFF; }\n", body
28
+ end
29
+
30
+ it "raises error if template not found" do
31
+ mock_app {
32
+ get('/') { sass :no_such_template }
33
+ }
34
+ assert_raise(Errno::ENOENT) { get('/') }
35
+ end
36
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe 'Sinatra' do
4
+ it 'creates a new Sinatra::Base subclass on new' do
5
+ app =
6
+ Sinatra.new do
7
+ get '/' do
8
+ 'Hello World'
9
+ end
10
+ end
11
+ assert_same Sinatra::Base, app.superclass
12
+ end
13
+ end