strelka 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -3
- data/History.rdoc +19 -0
- data/Rakefile +6 -5
- data/lib/strelka.rb +2 -2
- data/lib/strelka/app.rb +8 -21
- data/lib/strelka/app/auth.rb +1 -1
- data/lib/strelka/app/restresources.rb +72 -20
- data/lib/strelka/app/sessions.rb +6 -4
- data/lib/strelka/authprovider.rb +1 -1
- data/lib/strelka/cookie.rb +2 -1
- data/lib/strelka/httprequest.rb +47 -43
- data/lib/strelka/httprequest/acceptparams.rb +3 -3
- data/lib/strelka/httprequest/negotiation.rb +4 -0
- data/lib/strelka/mixins.rb +27 -28
- data/lib/strelka/multipartparser.rb +1 -3
- data/lib/strelka/plugins.rb +1 -2
- data/lib/strelka/router.rb +2 -2
- data/lib/strelka/session.rb +3 -2
- data/lib/strelka/session/db.rb +1 -0
- data/spec/strelka/app/auth_spec.rb +48 -48
- data/spec/strelka/app/filters_spec.rb +8 -8
- data/spec/strelka/app/parameters_spec.rb +1 -1
- data/spec/strelka/app/restresources_spec.rb +69 -35
- data/spec/strelka/app/routing_spec.rb +1 -1
- data/spec/strelka/app/templating_spec.rb +1 -1
- data/spec/strelka/authprovider/basic_spec.rb +1 -1
- data/spec/strelka/authprovider/hostaccess_spec.rb +3 -3
- data/spec/strelka/cookie_spec.rb +6 -5
- data/spec/strelka/cookieset_spec.rb +1 -1
- data/spec/strelka/discovery_spec.rb +2 -2
- data/spec/strelka/httprequest/acceptparams_spec.rb +16 -16
- data/spec/strelka/httprequest/negotiation_spec.rb +73 -67
- data/spec/strelka/httprequest/session_spec.rb +2 -2
- data/spec/strelka/httprequest_spec.rb +38 -6
- data/spec/strelka/httpresponse/session_spec.rb +3 -3
- data/spec/strelka/mixins_spec.rb +3 -3
- data/spec/strelka/multipartparser_spec.rb +2 -2
- data/spec/strelka/paramvalidator_spec.rb +22 -22
- data/spec/strelka/plugins_spec.rb +1 -1
- data/spec/strelka/session/default_spec.rb +4 -4
- data/spec/strelka/websocketserver/routing_spec.rb +1 -1
- metadata +29 -15
- metadata.gz.sig +0 -0
@@ -74,7 +74,7 @@ describe Strelka::App::RestResources do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
it "keeps track of what resources are mounted where" do
|
77
|
-
expect( @app.resource_verbs ).to
|
77
|
+
expect( @app.resource_verbs.size ).to eq( 1 )
|
78
78
|
expect( @app.resource_verbs ).to include( 'servers' )
|
79
79
|
@app.resource_verbs[ 'servers' ].
|
80
80
|
should include( :OPTIONS, :GET, :HEAD, :POST, :PUT, :DELETE )
|
@@ -87,6 +87,7 @@ describe Strelka::App::RestResources do
|
|
87
87
|
|
88
88
|
# Writer regular routes
|
89
89
|
it { should have_route(:POST, 'servers') }
|
90
|
+
it { should have_route(:POST, 'servers/:id') }
|
90
91
|
it { should have_route(:PUT, 'servers') }
|
91
92
|
it { should have_route(:PUT, 'servers/:id') }
|
92
93
|
it { should have_route(:DELETE, 'servers') }
|
@@ -111,7 +112,7 @@ describe Strelka::App::RestResources do
|
|
111
112
|
end
|
112
113
|
|
113
114
|
it "keeps track of what resources are mounted where" do
|
114
|
-
expect( @app.resource_verbs ).to
|
115
|
+
expect( @app.resource_verbs.size ).to eq( 1 )
|
115
116
|
expect( @app.resource_verbs ).to include( 'servers' )
|
116
117
|
@app.resource_verbs[ 'servers' ].
|
117
118
|
should include( :OPTIONS, :GET, :HEAD )
|
@@ -126,6 +127,7 @@ describe Strelka::App::RestResources do
|
|
126
127
|
|
127
128
|
# Writer regular routes
|
128
129
|
it { should_not have_route(:POST, 'servers') }
|
130
|
+
it { should_not have_route(:POST, 'servers/:id') }
|
129
131
|
it { should_not have_route(:PUT, 'servers') }
|
130
132
|
it { should_not have_route(:PUT, 'servers/:id') }
|
131
133
|
it { should_not have_route(:DELETE, 'servers') }
|
@@ -191,7 +193,7 @@ describe Strelka::App::RestResources do
|
|
191
193
|
expect( res.content_type ).to eq( 'application/json' )
|
192
194
|
body = Yajl.load( res.body )
|
193
195
|
|
194
|
-
expect( body ).to
|
196
|
+
expect( body.size ).to eq( 2 )
|
195
197
|
expect( body.map {|record| record['uuid'] } ).to include( 'test-server', 'step-server' )
|
196
198
|
end
|
197
199
|
|
@@ -204,7 +206,7 @@ describe Strelka::App::RestResources do
|
|
204
206
|
expect( res.content_type ).to eq( 'application/json' )
|
205
207
|
body = Yajl.load( res.body )
|
206
208
|
|
207
|
-
expect( body ).to
|
209
|
+
expect( body.size ).to eq( 1 )
|
208
210
|
expect( body[0]['uuid'] ).to eq( 'test-server' )
|
209
211
|
end
|
210
212
|
|
@@ -217,7 +219,7 @@ describe Strelka::App::RestResources do
|
|
217
219
|
expect( res.content_type ).to eq( 'application/json' )
|
218
220
|
body = Yajl.load( res.body )
|
219
221
|
|
220
|
-
expect( body ).to
|
222
|
+
expect( body.size ).to eq( 1 )
|
221
223
|
expect( body[0]['uuid'] ).to eq( 'step-server' )
|
222
224
|
end
|
223
225
|
|
@@ -230,7 +232,7 @@ describe Strelka::App::RestResources do
|
|
230
232
|
expect( res.content_type ).to eq( 'application/json' )
|
231
233
|
body = Yajl.load( res.body )
|
232
234
|
|
233
|
-
expect( body ).to
|
235
|
+
expect( body.size ).to eq( 2 )
|
234
236
|
expect( body[0]['name'] ).to eq( 'Step' )
|
235
237
|
end
|
236
238
|
|
@@ -243,7 +245,7 @@ describe Strelka::App::RestResources do
|
|
243
245
|
expect( res.content_type ).to eq( 'application/json' )
|
244
246
|
body = Yajl.load( res.body )
|
245
247
|
|
246
|
-
expect( body ).to
|
248
|
+
expect( body.size ).to eq( 2 )
|
247
249
|
expect( body[0]['name'] ).to eq( 'Test' )
|
248
250
|
end
|
249
251
|
|
@@ -285,7 +287,7 @@ describe Strelka::App::RestResources do
|
|
285
287
|
body = Yajl.load( res.body )
|
286
288
|
|
287
289
|
expect( body ).to be_an( Array )
|
288
|
-
expect( body ).to
|
290
|
+
expect( body.size ).to eq( 1 )
|
289
291
|
expect( body.first ).to be_a( Hash )
|
290
292
|
expect( body.first['uuid'] ).to eq( 'test-server' )
|
291
293
|
end
|
@@ -299,7 +301,7 @@ describe Strelka::App::RestResources do
|
|
299
301
|
body = Yajl.load( res.body )
|
300
302
|
|
301
303
|
expect( body ).to be_an( Array )
|
302
|
-
expect( body ).to
|
304
|
+
expect( body.size ).to eq( 1 )
|
303
305
|
expect( body.first ).to be_a( Hash )
|
304
306
|
expect( body.first['port'] ).to be > 1024
|
305
307
|
end
|
@@ -313,7 +315,7 @@ describe Strelka::App::RestResources do
|
|
313
315
|
body = Yajl.load( res.body )
|
314
316
|
|
315
317
|
expect( body ).to be_an( Array )
|
316
|
-
expect( body ).to
|
318
|
+
expect( body.size ).to eq( 1 )
|
317
319
|
expect( body.first ).to be_a( Hash )
|
318
320
|
expect( body.first['name'] ).to eq( 'Step' )
|
319
321
|
end
|
@@ -327,7 +329,7 @@ describe Strelka::App::RestResources do
|
|
327
329
|
body = Yajl.load( res.body )
|
328
330
|
|
329
331
|
expect( body ).to be_an( Array )
|
330
|
-
expect( body ).to
|
332
|
+
expect( body.size ).to eq( 4 )
|
331
333
|
expect( body.first ).to be_a( Hash )
|
332
334
|
expect( body.first['server_id'] ).to eq( 1 )
|
333
335
|
expect( body.first['id'] ).to eq( 1 )
|
@@ -341,7 +343,7 @@ describe Strelka::App::RestResources do
|
|
341
343
|
body = Yajl.load( res.body )
|
342
344
|
|
343
345
|
expect( body ).to be_an( Array )
|
344
|
-
expect( body ).to
|
346
|
+
expect( body.size ).to eq( 2 )
|
345
347
|
expect( body.first ).to be_a( Hash )
|
346
348
|
expect( body.first['server_id'] ).to eq( 1 )
|
347
349
|
expect( body.first['id'] ).to eq( 3 )
|
@@ -350,7 +352,7 @@ describe Strelka::App::RestResources do
|
|
350
352
|
end # GET routes
|
351
353
|
|
352
354
|
|
353
|
-
context "POST
|
355
|
+
context "POST routes" do
|
354
356
|
|
355
357
|
before( :each ) do
|
356
358
|
@server_values = {
|
@@ -395,52 +397,83 @@ describe Strelka::App::RestResources do
|
|
395
397
|
expect( new_server.use_ssl ).to eq( 0 )
|
396
398
|
end
|
397
399
|
|
398
|
-
it "has a POST route to update
|
399
|
-
|
400
|
-
end # POST routes
|
400
|
+
it "has a POST route to update a single resource" do
|
401
|
+
server = Mongrel2::Config::Server.create( @server_values )
|
401
402
|
|
403
|
+
req = @request_factory.post( "/api/v1/servers/#{server.id}" )
|
404
|
+
req.content_type = 'application/json'
|
405
|
+
req.body = Yajl.dump({ 'name' => 'Staging Server' })
|
402
406
|
|
403
|
-
|
407
|
+
res = @app.new.handle( req )
|
408
|
+
server.refresh
|
404
409
|
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
'bind_addr' => '0.0.0.0',
|
409
|
-
}
|
410
|
+
expect( res.status ).to eq( HTTP::NO_CONTENT )
|
411
|
+
expect( server.name ).to eq( 'Staging Server' )
|
412
|
+
expect( server.uuid ).to eq( @server_values['uuid'] )
|
410
413
|
end
|
411
414
|
|
415
|
+
it "ignores attributes that aren't in the allowed columns list"
|
416
|
+
|
417
|
+
end # POST routes
|
418
|
+
|
419
|
+
|
420
|
+
context "PUT routes" do
|
421
|
+
|
412
422
|
it "has a PUT route to replace instances in the resource collection" do
|
413
423
|
req = @request_factory.put( '/api/v1/servers/1' )
|
414
424
|
req.content_type = 'application/json'
|
415
425
|
req.headers.accept = 'application/json'
|
416
|
-
req.body = Yajl.dump(
|
426
|
+
req.body = Yajl.dump({
|
427
|
+
'name' => 'Staging',
|
428
|
+
'uuid' => 'staging',
|
429
|
+
'access_log' => "/logs/staging-access.log",
|
430
|
+
'error_log' => "/logs/staging-error.log",
|
431
|
+
'chroot' => "",
|
432
|
+
'pid_file' => "/var/run/staging.pid",
|
433
|
+
'default_host' => "staging.local",
|
434
|
+
'port' => '6455',
|
435
|
+
})
|
417
436
|
|
418
437
|
res = @app.new.handle( req )
|
419
438
|
|
420
439
|
expect( res.status ).to eq( HTTP::NO_CONTENT )
|
421
440
|
|
422
|
-
|
423
|
-
expect(
|
441
|
+
server = Mongrel2::Config::Server[1]
|
442
|
+
expect( server.name ).to eq( 'Staging' )
|
443
|
+
expect( server.bind_addr ).to eq( '0.0.0.0' )
|
444
|
+
expect( server.uuid ).to eq( 'staging' )
|
424
445
|
end
|
425
446
|
|
426
447
|
it "has a PUT route to replace all resources in a collection" do
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
448
|
+
req = @request_factory.put( '/api/v1/servers' )
|
449
|
+
req.content_type = 'application/json'
|
450
|
+
req.body = Yajl.dump([
|
451
|
+
{
|
452
|
+
'name' => 'Staging Server',
|
453
|
+
'uuid' => 'staging',
|
454
|
+
'access_log' => "/logs/staging-access.log",
|
455
|
+
'error_log' => "/logs/staging-error.log",
|
456
|
+
'chroot' => "",
|
457
|
+
'pid_file' => "/var/run/staging.pid",
|
458
|
+
'default_host' => "staging.local",
|
459
|
+
'port' => '6455',
|
460
|
+
}
|
461
|
+
])
|
431
462
|
|
432
|
-
|
463
|
+
res = @app.new.handle( req )
|
433
464
|
|
434
|
-
|
465
|
+
expect( res.status ).to eq( HTTP::NO_CONTENT )
|
435
466
|
|
436
|
-
|
437
|
-
|
467
|
+
expect( Mongrel2::Config::Server.count ).to eq( 1 )
|
468
|
+
server = Mongrel2::Config::Server.first
|
469
|
+
expect( server.name ).to eq( 'Staging Server' )
|
470
|
+
expect( server.uuid ).to eq( 'staging' )
|
438
471
|
end
|
439
472
|
|
440
473
|
end # PUT routes
|
441
474
|
|
442
475
|
|
443
|
-
context "DELETE
|
476
|
+
context "DELETE routes" do
|
444
477
|
|
445
478
|
it "has a DELETE route to delete single instances in the resource collection" do
|
446
479
|
req = @request_factory.delete( '/api/v1/servers/1' )
|
@@ -449,6 +482,7 @@ describe Strelka::App::RestResources do
|
|
449
482
|
|
450
483
|
expect( res.status ).to eq( HTTP::NO_CONTENT )
|
451
484
|
|
485
|
+
expect( Mongrel2::Config::Server[1] ).to be_nil
|
452
486
|
expect( Mongrel2::Config::Server.count ).to eq( 1 )
|
453
487
|
end
|
454
488
|
|
@@ -481,7 +515,7 @@ describe Strelka::App::RestResources do
|
|
481
515
|
end
|
482
516
|
|
483
517
|
it "has its metadata inherited by subclasses" do
|
484
|
-
expect( subject.resource_verbs ).to
|
518
|
+
expect( subject.resource_verbs.size ).to eq( 1 )
|
485
519
|
expect( subject.resource_verbs ).to include( 'servers' )
|
486
520
|
subject.resource_verbs[ 'servers' ].
|
487
521
|
should include( :OPTIONS, :GET, :HEAD, :POST, :PUT, :DELETE )
|
@@ -214,7 +214,7 @@ describe Strelka::App::Routing do
|
|
214
214
|
get( '/origami' ) {}
|
215
215
|
end
|
216
216
|
|
217
|
-
expect( subclass.routes ).to
|
217
|
+
expect( subclass.routes.size ).to eq( 3 )
|
218
218
|
|
219
219
|
subclass.routes.
|
220
220
|
should include([ :GET, ['info'], {action: @app.instance_method(:GET_info), options: {}} ])
|
@@ -69,7 +69,7 @@ describe Strelka::App::Templating do
|
|
69
69
|
|
70
70
|
template_dirs = described_class.discover_template_dirs
|
71
71
|
|
72
|
-
expect( template_dirs ).to
|
72
|
+
expect( template_dirs.size ).to eq( 3 )
|
73
73
|
expect( template_dirs ).to include(
|
74
74
|
Pathname("data/foom/templates"),
|
75
75
|
Pathname("#{javelin_path}/data/javelin/templates"),
|
@@ -165,7 +165,7 @@ describe Strelka::AuthProvider::Basic do
|
|
165
165
|
req = @request_factory.get( '/admin/console' )
|
166
166
|
req.header.authorization = make_authorization_header( 'lessa', 'ramoth' )
|
167
167
|
|
168
|
-
expect( @provider.authenticate(req) ).to
|
168
|
+
expect( @provider.authenticate(req) ).to be_truthy()
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
@@ -38,7 +38,7 @@ describe Strelka::AuthProvider::HostAccess do
|
|
38
38
|
|
39
39
|
it "allows its netblocks to be set" do
|
40
40
|
@provider.allowed_netblocks = %w[10.5.2.0/22 10.6.2.0/24]
|
41
|
-
expect( @provider.allowed_netblocks ).to
|
41
|
+
expect( @provider.allowed_netblocks.size ).to eq( 2 )
|
42
42
|
expect( @provider.allowed_netblocks ).to include( IPAddr.new('10.5.2.0/22'), IPAddr.new('10.6.2.0/24') )
|
43
43
|
end
|
44
44
|
|
@@ -50,13 +50,13 @@ describe Strelka::AuthProvider::HostAccess do
|
|
50
50
|
|
51
51
|
it "allows a request that originates from one of its allowed netblocks" do
|
52
52
|
req = @request_factory.get( '/admin/console', :x_forwarded_for => '127.0.0.1' )
|
53
|
-
expect( @provider.authorize( nil, req, nil ) ).to
|
53
|
+
expect( @provider.authorize( nil, req, nil ) ).to be_truthy()
|
54
54
|
end
|
55
55
|
|
56
56
|
|
57
57
|
it "doesn't allow a request which is not from one of its allowed netblocks" do
|
58
58
|
req = @request_factory.get( '/admin/console', :x_forwarded_for => '8.8.8.8' )
|
59
|
-
expect( @provider.authorize( nil, req, nil ) ).to
|
59
|
+
expect( @provider.authorize( nil, req, nil ) ).to be_falsey()
|
60
60
|
end
|
61
61
|
|
62
62
|
|
data/spec/strelka/cookie_spec.rb
CHANGED
@@ -35,7 +35,7 @@ describe Strelka::Cookie do
|
|
35
35
|
result = Strelka::Cookie.parse( 'a=b' )
|
36
36
|
|
37
37
|
expect( result ).to be_a( Hash )
|
38
|
-
expect( result ).to
|
38
|
+
expect( result.size ).to eq( 1 )
|
39
39
|
expect( result[:a] ).to be_a( Strelka::Cookie )
|
40
40
|
expect( result[:a].name ).to eq( 'a' )
|
41
41
|
expect( result[:a].value ).to eq( 'b' )
|
@@ -44,15 +44,16 @@ describe Strelka::Cookie do
|
|
44
44
|
it "parses a cookie header field with an empty value as a cookie with a nil value" do
|
45
45
|
result = Strelka::Cookie.parse( 'a=' )
|
46
46
|
|
47
|
-
expect( result ).to
|
47
|
+
expect( result.size ).to eq( 1 )
|
48
48
|
expect( result[:a] ).to be_a( Strelka::Cookie )
|
49
49
|
expect( result[:a].name ).to eq( 'a' )
|
50
50
|
expect( result[:a].value ).to be_nil()
|
51
51
|
end
|
52
52
|
|
53
|
-
it "
|
54
|
-
|
55
|
-
|
53
|
+
it "raises an error if asked to parse an invalid cookie header" do
|
54
|
+
expect {
|
55
|
+
Strelka::Cookie.parse( "{a}=foo" )
|
56
|
+
}.to raise_error( Strelka::ParseError, /malformed/i )
|
56
57
|
end
|
57
58
|
|
58
59
|
it "guards against a nil options hash" do
|
@@ -26,7 +26,7 @@ describe Strelka::CookieSet do
|
|
26
26
|
|
27
27
|
expect( @cookieset ).to be_empty()
|
28
28
|
expect( @cookieset.length ).to eq( 0 )
|
29
|
-
expect( @cookieset.member?( cookie ) ).to
|
29
|
+
expect( @cookieset.member?( cookie ) ).to be_falsey()
|
30
30
|
end
|
31
31
|
|
32
32
|
it "is able to enummerate over each cookie in the set" do
|
@@ -87,7 +87,7 @@ describe Strelka::Discovery do
|
|
87
87
|
|
88
88
|
app_paths = described_class.discover_paths
|
89
89
|
|
90
|
-
expect( app_paths ).to
|
90
|
+
expect( app_paths.size ).to eq( 4 )
|
91
91
|
expect( app_paths ).to include(
|
92
92
|
'donkey' => [Pathname("#{donkey_path}/data/donkey/apps/app.rb")],
|
93
93
|
'rabbit' => [Pathname("#{rabbit_path}/data/rabbit/apps/subdir/app1.rb"),
|
@@ -115,7 +115,7 @@ describe Strelka::Discovery do
|
|
115
115
|
end
|
116
116
|
|
117
117
|
app_classes = described_class.discover
|
118
|
-
expect( app_classes ).to
|
118
|
+
expect( app_classes.size ).to eq( 1 )
|
119
119
|
expect( app_classes.first ).to be_a( Class )
|
120
120
|
expect( app_classes.first ).to be < discoverable_class
|
121
121
|
end
|
@@ -136,12 +136,12 @@ describe Strelka::HTTPRequest, "accept params" do
|
|
136
136
|
specific_param = Strelka::HTTPRequest::MediaType.parse( 'text/html' )
|
137
137
|
subtype_wildcard_param = Strelka::HTTPRequest::MediaType.parse( 'image/*' )
|
138
138
|
|
139
|
-
expect( ( specific_param =~ 'text/html' ) ).to
|
140
|
-
expect( ( specific_param =~ 'image/png' ) ).to
|
139
|
+
expect( ( specific_param =~ 'text/html' ) ).to be_truthy()
|
140
|
+
expect( ( specific_param =~ 'image/png' ) ).to be_falsey()
|
141
141
|
|
142
|
-
expect( ( subtype_wildcard_param =~ 'image/png' ) ).to
|
143
|
-
expect( ( subtype_wildcard_param =~ 'image/jpeg' ) ).to
|
144
|
-
expect( ( subtype_wildcard_param =~ 'text/plain' ) ).to
|
142
|
+
expect( ( subtype_wildcard_param =~ 'image/png' ) ).to be_truthy()
|
143
|
+
expect( ( subtype_wildcard_param =~ 'image/jpeg' ) ).to be_truthy()
|
144
|
+
expect( ( subtype_wildcard_param =~ 'text/plain' ) ).to be_falsey()
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
@@ -217,17 +217,17 @@ describe Strelka::HTTPRequest, "accept params" do
|
|
217
217
|
it "can be compared against strings" do
|
218
218
|
specific_param = Strelka::HTTPRequest::Charset.parse( 'us-ascii' )
|
219
219
|
|
220
|
-
expect( ( specific_param =~ 'us-ascii' ) ).to
|
221
|
-
expect( ( specific_param =~ 'ansi_x3.4-1968' ) ).to
|
222
|
-
expect( ( specific_param =~ 'utf-8' ) ).to
|
220
|
+
expect( ( specific_param =~ 'us-ascii' ) ).to be_truthy()
|
221
|
+
expect( ( specific_param =~ 'ansi_x3.4-1968' ) ).to be_truthy()
|
222
|
+
expect( ( specific_param =~ 'utf-8' ) ).to be_falsey()
|
223
223
|
end
|
224
224
|
|
225
225
|
it "can be compared against Encoding objects" do
|
226
226
|
specific_param = Strelka::HTTPRequest::Charset.parse( 'utf-8' )
|
227
227
|
|
228
|
-
expect( ( specific_param =~ Encoding::UTF_8 ) ).to
|
229
|
-
expect( ( specific_param =~ Encoding::CP65001 ) ).to
|
230
|
-
expect( ( specific_param =~ Encoding::MacThai ) ).to
|
228
|
+
expect( ( specific_param =~ Encoding::UTF_8 ) ).to be_truthy()
|
229
|
+
expect( ( specific_param =~ Encoding::CP65001 ) ).to be_truthy()
|
230
|
+
expect( ( specific_param =~ Encoding::MacThai ) ).to be_falsey()
|
231
231
|
end
|
232
232
|
end
|
233
233
|
|
@@ -260,12 +260,12 @@ describe Strelka::HTTPRequest, "accept params" do
|
|
260
260
|
specific_param = Strelka::HTTPRequest::MediaType.parse( 'text/html' )
|
261
261
|
subtype_wildcard_param = Strelka::HTTPRequest::MediaType.parse( 'image/*' )
|
262
262
|
|
263
|
-
expect( ( specific_param =~ 'text/html' ) ).to
|
264
|
-
expect( ( specific_param =~ 'image/png' ) ).to
|
263
|
+
expect( ( specific_param =~ 'text/html' ) ).to be_truthy()
|
264
|
+
expect( ( specific_param =~ 'image/png' ) ).to be_falsey()
|
265
265
|
|
266
|
-
expect( ( subtype_wildcard_param =~ 'image/png' ) ).to
|
267
|
-
expect( ( subtype_wildcard_param =~ 'image/jpeg' ) ).to
|
268
|
-
expect( ( subtype_wildcard_param =~ 'text/plain' ) ).to
|
266
|
+
expect( ( subtype_wildcard_param =~ 'image/png' ) ).to be_truthy()
|
267
|
+
expect( ( subtype_wildcard_param =~ 'image/jpeg' ) ).to be_truthy()
|
268
|
+
expect( ( subtype_wildcard_param =~ 'text/plain' ) ).to be_falsey()
|
269
269
|
end
|
270
270
|
end
|
271
271
|
|
@@ -38,7 +38,7 @@ describe Strelka::HTTPRequest::Negotiation do
|
|
38
38
|
it "know what content-types are accepted by the client" do
|
39
39
|
@req.headers.accept = 'application/x-yaml, application/json; q=0.2, text/xml; q=0.75'
|
40
40
|
|
41
|
-
expect( @req.accepted_types ).to
|
41
|
+
expect( @req.accepted_types.size ).to eq( 3 )
|
42
42
|
expect( @req.accepted_types[0].mediatype ).to eq( 'application/x-yaml' )
|
43
43
|
expect( @req.accepted_types[0].qvalue ).to eq( 1.0 )
|
44
44
|
expect( @req.accepted_types[1].mediatype ).to eq( 'application/json' )
|
@@ -50,41 +50,47 @@ describe Strelka::HTTPRequest::Negotiation do
|
|
50
50
|
it "knows what mimetypes are acceptable responses" do
|
51
51
|
@req.headers.accept = 'text/html, text/plain; q=0.5, image/*;q=0.1'
|
52
52
|
|
53
|
-
expect( @req.accepts?( 'text/html' ) ).to
|
54
|
-
expect( @req.accepts?( 'text/plain' ) ).to
|
55
|
-
expect( @req.accepts?( 'text/ascii' ) ).to
|
56
|
-
expect( @req.accepts?( 'image/png' ) ).to
|
57
|
-
expect( @req.accepts?( 'application/x-yaml' ) ).to
|
53
|
+
expect( @req.accepts?( 'text/html' ) ).to be_truthy()
|
54
|
+
expect( @req.accepts?( 'text/plain' ) ).to be_truthy()
|
55
|
+
expect( @req.accepts?( 'text/ascii' ) ).to be_falsey()
|
56
|
+
expect( @req.accepts?( 'image/png' ) ).to be_truthy()
|
57
|
+
expect( @req.accepts?( 'application/x-yaml' ) ).to be_falsey()
|
58
58
|
end
|
59
59
|
|
60
60
|
it "knows what mimetypes are explicitly acceptable responses" do
|
61
61
|
@req.headers.accept = 'text/html, text/plain; q=0.5, image/*;q=0.1, */*'
|
62
62
|
|
63
|
-
expect( @req.explicitly_accepts?( 'text/html' ) ).to
|
64
|
-
expect( @req.explicitly_accepts?( 'text/plain' ) ).to
|
65
|
-
expect( @req.explicitly_accepts?( 'text/ascii' ) ).to
|
66
|
-
expect( @req.explicitly_accepts?( 'image/png' ) ).to
|
67
|
-
expect( @req.explicitly_accepts?( 'application/x-yaml' ) ).to
|
63
|
+
expect( @req.explicitly_accepts?( 'text/html' ) ).to be_truthy()
|
64
|
+
expect( @req.explicitly_accepts?( 'text/plain' ) ).to be_truthy()
|
65
|
+
expect( @req.explicitly_accepts?( 'text/ascii' ) ).to be_falsey()
|
66
|
+
expect( @req.explicitly_accepts?( 'image/png' ) ).to be_falsey()
|
67
|
+
expect( @req.explicitly_accepts?( 'application/x-yaml' ) ).to be_falsey()
|
68
68
|
end
|
69
69
|
|
70
70
|
it "accepts anything if the client doesn't provide an Accept header" do
|
71
71
|
@req.headers.delete( :accept )
|
72
72
|
|
73
|
-
expect( @req.accepts?( 'text/html' ) ).to
|
74
|
-
expect( @req.accepts?( 'text/plain' ) ).to
|
75
|
-
expect( @req.accepts?( 'text/ascii' ) ).to
|
76
|
-
expect( @req.accepts?( 'image/png' ) ).to
|
77
|
-
expect( @req.accepts?( 'application/x-yaml' ) ).to
|
73
|
+
expect( @req.accepts?( 'text/html' ) ).to be_truthy()
|
74
|
+
expect( @req.accepts?( 'text/plain' ) ).to be_truthy()
|
75
|
+
expect( @req.accepts?( 'text/ascii' ) ).to be_truthy()
|
76
|
+
expect( @req.accepts?( 'image/png' ) ).to be_truthy()
|
77
|
+
expect( @req.accepts?( 'application/x-yaml' ) ).to be_truthy()
|
78
78
|
end
|
79
79
|
|
80
80
|
it "doesn't explicitly accept anything if the client doesn't provide an Accept header" do
|
81
81
|
@req.headers.delete( :accept )
|
82
82
|
|
83
|
-
expect( @req.explicitly_accepts?( 'text/html' ) ).to
|
84
|
-
expect( @req.explicitly_accepts?( 'text/plain' ) ).to
|
85
|
-
expect( @req.explicitly_accepts?( 'text/ascii' ) ).to
|
86
|
-
expect( @req.explicitly_accepts?( 'image/png' ) ).to
|
87
|
-
expect( @req.explicitly_accepts?( 'application/x-yaml' ) ).to
|
83
|
+
expect( @req.explicitly_accepts?( 'text/html' ) ).to be_falsey()
|
84
|
+
expect( @req.explicitly_accepts?( 'text/plain' ) ).to be_falsey()
|
85
|
+
expect( @req.explicitly_accepts?( 'text/ascii' ) ).to be_falsey()
|
86
|
+
expect( @req.explicitly_accepts?( 'image/png' ) ).to be_falsey()
|
87
|
+
expect( @req.explicitly_accepts?( 'application/x-yaml' ) ).to be_falsey()
|
88
|
+
end
|
89
|
+
|
90
|
+
it "finishes with a BAD REQUEST response if the Accept header is malformed" do
|
91
|
+
@req.headers.accept = 'text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2'
|
92
|
+
|
93
|
+
expect { @req.accepted_types }.to finish_with( HTTP::BAD_REQUEST, /malformed/i )
|
88
94
|
end
|
89
95
|
|
90
96
|
end
|
@@ -95,7 +101,7 @@ describe Strelka::HTTPRequest::Negotiation do
|
|
95
101
|
it "knows what character sets are accepted by the client" do
|
96
102
|
@req.headers.accept_charset = 'iso-8859-5, utf-8;q=0.8'
|
97
103
|
|
98
|
-
expect( @req.accepted_charsets ).to
|
104
|
+
expect( @req.accepted_charsets.size ).to eq( 2 )
|
99
105
|
expect( @req.accepted_charsets[0].name ).to eq( 'iso-8859-5' )
|
100
106
|
expect( @req.accepted_charsets[0].qvalue ).to eq( 1.0 )
|
101
107
|
expect( @req.accepted_charsets[1].name ).to eq( 'utf-8' )
|
@@ -105,23 +111,23 @@ describe Strelka::HTTPRequest::Negotiation do
|
|
105
111
|
it "knows what charsets are acceptable responses" do
|
106
112
|
@req.headers.accept_charset = 'iso-8859-5, utf-8;q=0.8'
|
107
113
|
|
108
|
-
expect( @req.accepts_charset?( 'iso8859-5' ) ).to
|
109
|
-
expect( @req.accepts_charset?( 'iso-8859-5' ) ).to
|
110
|
-
expect( @req.accepts_charset?( 'utf-8' ) ).to
|
111
|
-
expect( @req.accepts_charset?( Encoding::CP65001 ) ).to
|
112
|
-
expect( @req.accepts_charset?( 'mac' ) ).to
|
113
|
-
expect( @req.accepts_charset?( Encoding::SJIS ) ).to
|
114
|
+
expect( @req.accepts_charset?( 'iso8859-5' ) ).to be_truthy()
|
115
|
+
expect( @req.accepts_charset?( 'iso-8859-5' ) ).to be_truthy()
|
116
|
+
expect( @req.accepts_charset?( 'utf-8' ) ).to be_truthy()
|
117
|
+
expect( @req.accepts_charset?( Encoding::CP65001 ) ).to be_truthy()
|
118
|
+
expect( @req.accepts_charset?( 'mac' ) ).to be_falsey()
|
119
|
+
expect( @req.accepts_charset?( Encoding::SJIS ) ).to be_falsey()
|
114
120
|
end
|
115
121
|
|
116
122
|
it "accepts any charset if the client doesn't provide an Accept-Charset header" do
|
117
123
|
@req.headers.delete( :accept_charset )
|
118
124
|
|
119
|
-
expect( @req.accepts_charset?( 'iso8859-5' ) ).to
|
120
|
-
expect( @req.accepts_charset?( 'iso-8859-5' ) ).to
|
121
|
-
expect( @req.accepts_charset?( 'utf-8' ) ).to
|
122
|
-
expect( @req.accepts_charset?( Encoding::CP65001 ) ).to
|
123
|
-
expect( @req.accepts_charset?( 'mac' ) ).to
|
124
|
-
expect( @req.accepts_charset?( Encoding::SJIS ) ).to
|
125
|
+
expect( @req.accepts_charset?( 'iso8859-5' ) ).to be_truthy()
|
126
|
+
expect( @req.accepts_charset?( 'iso-8859-5' ) ).to be_truthy()
|
127
|
+
expect( @req.accepts_charset?( 'utf-8' ) ).to be_truthy()
|
128
|
+
expect( @req.accepts_charset?( Encoding::CP65001 ) ).to be_truthy()
|
129
|
+
expect( @req.accepts_charset?( 'mac' ) ).to be_truthy()
|
130
|
+
expect( @req.accepts_charset?( Encoding::SJIS ) ).to be_truthy()
|
125
131
|
end
|
126
132
|
|
127
133
|
end
|
@@ -132,7 +138,7 @@ describe Strelka::HTTPRequest::Negotiation do
|
|
132
138
|
it "knows what encodings are accepted by the client" do
|
133
139
|
@req.headers.accept_encoding = 'gzip;q=1.0, identity; q=0.5, *;q=0'
|
134
140
|
|
135
|
-
expect( @req.accepted_encodings ).to
|
141
|
+
expect( @req.accepted_encodings.size ).to eq( 3 )
|
136
142
|
expect( @req.accepted_encodings[0].content_coding ).to eq( 'gzip' )
|
137
143
|
expect( @req.accepted_encodings[0].qvalue ).to eq( 1.0 )
|
138
144
|
expect( @req.accepted_encodings[1].content_coding ).to eq( 'identity' )
|
@@ -144,51 +150,51 @@ describe Strelka::HTTPRequest::Negotiation do
|
|
144
150
|
it "knows what encodings are acceptable" do
|
145
151
|
@req.headers.accept_encoding = 'gzip;q=1.0, identity; q=0.5, *;q=0'
|
146
152
|
|
147
|
-
expect( @req.accepts_encoding?( 'gzip' ) ).to
|
148
|
-
expect( @req.accepts_encoding?( 'identity' ) ).to
|
149
|
-
expect( @req.accepts_encoding?( 'compress' ) ).to
|
153
|
+
expect( @req.accepts_encoding?( 'gzip' ) ).to be_truthy()
|
154
|
+
expect( @req.accepts_encoding?( 'identity' ) ).to be_truthy()
|
155
|
+
expect( @req.accepts_encoding?( 'compress' ) ).to be_falsey()
|
150
156
|
end
|
151
157
|
|
152
158
|
it "knows that the identity encoding is acceptable if it isn't disabled" do
|
153
159
|
@req.headers.accept_encoding = 'gzip;q=1.0, compress; q=0.5'
|
154
160
|
|
155
|
-
expect( @req.accepts_encoding?( 'gzip' ) ).to
|
156
|
-
expect( @req.accepts_encoding?( 'identity' ) ).to
|
157
|
-
expect( @req.accepts_encoding?( 'compress' ) ).to
|
158
|
-
expect( @req.accepts_encoding?( 'clowns' ) ).to
|
161
|
+
expect( @req.accepts_encoding?( 'gzip' ) ).to be_truthy()
|
162
|
+
expect( @req.accepts_encoding?( 'identity' ) ).to be_truthy()
|
163
|
+
expect( @req.accepts_encoding?( 'compress' ) ).to be_truthy()
|
164
|
+
expect( @req.accepts_encoding?( 'clowns' ) ).to be_falsey()
|
159
165
|
end
|
160
166
|
|
161
167
|
it "accepts only the 'identity' encoding if the Accept-Encoding field is empty" do
|
162
168
|
@req.headers.accept_encoding = ''
|
163
169
|
|
164
|
-
expect( @req.accepts_encoding?( 'identity' ) ).to
|
165
|
-
expect( @req.accepts_encoding?( 'gzip' ) ).to
|
166
|
-
expect( @req.accepts_encoding?( 'compress' ) ).to
|
170
|
+
expect( @req.accepts_encoding?( 'identity' ) ).to be_truthy()
|
171
|
+
expect( @req.accepts_encoding?( 'gzip' ) ).to be_falsey()
|
172
|
+
expect( @req.accepts_encoding?( 'compress' ) ).to be_falsey()
|
167
173
|
end
|
168
174
|
|
169
175
|
it "doesn't accept the 'identity' encoding if the Accept-Encoding field explicitly disables it" do
|
170
176
|
@req.headers.accept_encoding = 'gzip;q=0.5, identity;q=0'
|
171
177
|
|
172
|
-
expect( @req.accepts_encoding?( 'identity' ) ).to
|
173
|
-
expect( @req.accepts_encoding?( 'gzip' ) ).to
|
174
|
-
expect( @req.accepts_encoding?( 'compress' ) ).to
|
178
|
+
expect( @req.accepts_encoding?( 'identity' ) ).to be_falsey()
|
179
|
+
expect( @req.accepts_encoding?( 'gzip' ) ).to be_truthy()
|
180
|
+
expect( @req.accepts_encoding?( 'compress' ) ).to be_falsey()
|
175
181
|
end
|
176
182
|
|
177
183
|
it "doesn't accept the 'identity' encoding if the Accept-Encoding field has a wildcard " +
|
178
184
|
"with q-value of 0 and doesn't explicitly include 'identity'" do
|
179
185
|
@req.headers.accept_encoding = 'gzip;q=0.5, *;q=0'
|
180
186
|
|
181
|
-
expect( @req.accepts_encoding?( 'identity' ) ).to
|
182
|
-
expect( @req.accepts_encoding?( 'gzip' ) ).to
|
183
|
-
expect( @req.accepts_encoding?( 'compress' ) ).to
|
187
|
+
expect( @req.accepts_encoding?( 'identity' ) ).to be_falsey()
|
188
|
+
expect( @req.accepts_encoding?( 'gzip' ) ).to be_truthy()
|
189
|
+
expect( @req.accepts_encoding?( 'compress' ) ).to be_falsey()
|
184
190
|
end
|
185
191
|
|
186
192
|
it "accepts every encoding if the request doesn't have an Accept-Encoding header" do
|
187
193
|
@req.headers.delete( :accept_encoding )
|
188
194
|
|
189
|
-
expect( @req.accepts_encoding?( 'identity' ) ).to
|
190
|
-
expect( @req.accepts_encoding?( 'gzip' ) ).to
|
191
|
-
expect( @req.accepts_encoding?( 'compress' ) ).to
|
195
|
+
expect( @req.accepts_encoding?( 'identity' ) ).to be_truthy()
|
196
|
+
expect( @req.accepts_encoding?( 'gzip' ) ).to be_truthy()
|
197
|
+
expect( @req.accepts_encoding?( 'compress' ) ).to be_truthy()
|
192
198
|
end
|
193
199
|
|
194
200
|
end
|
@@ -199,7 +205,7 @@ describe Strelka::HTTPRequest::Negotiation do
|
|
199
205
|
it "knows what languages are accepted by the client" do
|
200
206
|
@req.headers.accept_language = 'da, en-gb;q=0.8, en;q=0.7'
|
201
207
|
|
202
|
-
expect( @req.accepted_languages ).to
|
208
|
+
expect( @req.accepted_languages.size ).to eq( 3 )
|
203
209
|
expect( @req.accepted_languages[0].primary_tag ).to eq( 'da' )
|
204
210
|
expect( @req.accepted_languages[0].subtag ).to eq( nil )
|
205
211
|
expect( @req.accepted_languages[0].qvalue ).to eq( 1.0 )
|
@@ -214,23 +220,23 @@ describe Strelka::HTTPRequest::Negotiation do
|
|
214
220
|
it "knows what languages may be used in acceptable responses" do
|
215
221
|
@req.headers.accept_language = 'da, en-gb;q=0.8, en;q=0.7'
|
216
222
|
|
217
|
-
expect( @req.accepts_language?( 'da' ) ).to
|
218
|
-
expect( @req.accepts_language?( 'en' ) ).to
|
219
|
-
expect( @req.accepts_language?( 'en-gb' ) ).to
|
220
|
-
expect( @req.accepts_language?( 'en-cockney' ) ).to
|
221
|
-
expect( @req.accepts_language?( 'de' ) ).to
|
222
|
-
expect( @req.accepts_language?( 'tlh' ) ).to
|
223
|
+
expect( @req.accepts_language?( 'da' ) ).to be_truthy()
|
224
|
+
expect( @req.accepts_language?( 'en' ) ).to be_truthy()
|
225
|
+
expect( @req.accepts_language?( 'en-gb' ) ).to be_truthy()
|
226
|
+
expect( @req.accepts_language?( 'en-cockney' ) ).to be_truthy()
|
227
|
+
expect( @req.accepts_language?( 'de' ) ).to be_falsey()
|
228
|
+
expect( @req.accepts_language?( 'tlh' ) ).to be_falsey()
|
223
229
|
end
|
224
230
|
|
225
231
|
it "accepts any language if the client doesn't provide an Accept-Language header" do
|
226
232
|
@req.headers.delete( :accept_language )
|
227
233
|
|
228
|
-
expect( @req.accepts_language?( 'da' ) ).to
|
229
|
-
expect( @req.accepts_language?( 'en' ) ).to
|
230
|
-
expect( @req.accepts_language?( 'en-gb' ) ).to
|
231
|
-
expect( @req.accepts_language?( 'en-cockney' ) ).to
|
232
|
-
expect( @req.accepts_language?( 'de' ) ).to
|
233
|
-
expect( @req.accepts_language?( 'tlh' ) ).to
|
234
|
+
expect( @req.accepts_language?( 'da' ) ).to be_truthy()
|
235
|
+
expect( @req.accepts_language?( 'en' ) ).to be_truthy()
|
236
|
+
expect( @req.accepts_language?( 'en-gb' ) ).to be_truthy()
|
237
|
+
expect( @req.accepts_language?( 'en-cockney' ) ).to be_truthy()
|
238
|
+
expect( @req.accepts_language?( 'de' ) ).to be_truthy()
|
239
|
+
expect( @req.accepts_language?( 'tlh' ) ).to be_truthy()
|
234
240
|
end
|
235
241
|
|
236
242
|
end
|