addressabler 0.0.7 → 0.1.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 +7 -0
- data/CHANGELOG.md +4 -0
- data/README.md +26 -12
- data/lib/addressabler/uri.rb +62 -0
- data/lib/addressabler/uri_deprecation.rb +23 -0
- data/lib/addressabler.rb +83 -71
- data/spec/addressable/idna_spec.rb +238 -0
- data/spec/addressable/net_http_compat_spec.rb +28 -0
- data/spec/addressable/template_spec.rb +1152 -0
- data/spec/{uri_spec.rb → addressable/uri_spec.rb} +694 -19
- data/spec/addressabler/uri_deprecation_spec.rb +39 -0
- data/spec/addressabler/uri_spec.rb +116 -0
- data/spec/addressabler_spec.rb +11 -108
- metadata +37 -36
@@ -1,5 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
# Copyright (C) 2006-
|
2
|
+
# Copyright (C) 2006-2013 Bob Aman
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
# you may not use this file except in compliance with the License.
|
@@ -14,6 +14,8 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
16
|
|
17
|
+
require "spec_helper"
|
18
|
+
|
17
19
|
require "addressable/uri"
|
18
20
|
|
19
21
|
if !"".respond_to?("force_encoding")
|
@@ -41,14 +43,18 @@ if !"".respond_to?("force_encoding")
|
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
44
|
-
module
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
module Fake
|
47
|
+
module URI
|
48
|
+
class HTTP
|
49
|
+
def initialize(uri)
|
50
|
+
@uri = uri
|
51
|
+
end
|
49
52
|
|
50
|
-
|
51
|
-
|
53
|
+
def to_s
|
54
|
+
return @uri.to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
alias :to_str :to_s
|
52
58
|
end
|
53
59
|
end
|
54
60
|
end
|
@@ -179,6 +185,10 @@ describe Addressable::URI, "when created from nil components" do
|
|
179
185
|
@uri.default_port.should == nil
|
180
186
|
end
|
181
187
|
|
188
|
+
it "should be empty" do
|
189
|
+
@uri.should be_empty
|
190
|
+
end
|
191
|
+
|
182
192
|
it "should raise an error if the scheme is set to whitespace" do
|
183
193
|
(lambda do
|
184
194
|
@uri.scheme = "\t \n"
|
@@ -218,6 +228,384 @@ describe Addressable::URI, "when created from nil components" do
|
|
218
228
|
end
|
219
229
|
end
|
220
230
|
|
231
|
+
describe Addressable::URI, "when initialized from individual components" do
|
232
|
+
before do
|
233
|
+
@uri = Addressable::URI.new(
|
234
|
+
:scheme => "http",
|
235
|
+
:user => "user",
|
236
|
+
:password => "password",
|
237
|
+
:host => "example.com",
|
238
|
+
:port => 8080,
|
239
|
+
:path => "/path",
|
240
|
+
:query => "query=value",
|
241
|
+
:fragment => "fragment"
|
242
|
+
)
|
243
|
+
end
|
244
|
+
|
245
|
+
it "returns 'http' for #scheme" do
|
246
|
+
@uri.scheme.should == "http"
|
247
|
+
end
|
248
|
+
|
249
|
+
it "returns 'http' for #normalized_scheme" do
|
250
|
+
@uri.normalized_scheme.should == "http"
|
251
|
+
end
|
252
|
+
|
253
|
+
it "returns 'user' for #user" do
|
254
|
+
@uri.user.should == "user"
|
255
|
+
end
|
256
|
+
|
257
|
+
it "returns 'user' for #normalized_user" do
|
258
|
+
@uri.normalized_user.should == "user"
|
259
|
+
end
|
260
|
+
|
261
|
+
it "returns 'password' for #password" do
|
262
|
+
@uri.password.should == "password"
|
263
|
+
end
|
264
|
+
|
265
|
+
it "returns 'password' for #normalized_password" do
|
266
|
+
@uri.normalized_password.should == "password"
|
267
|
+
end
|
268
|
+
|
269
|
+
it "returns 'user:password' for #userinfo" do
|
270
|
+
@uri.userinfo.should == "user:password"
|
271
|
+
end
|
272
|
+
|
273
|
+
it "returns 'user:password' for #normalized_userinfo" do
|
274
|
+
@uri.normalized_userinfo.should == "user:password"
|
275
|
+
end
|
276
|
+
|
277
|
+
it "returns 'example.com' for #host" do
|
278
|
+
@uri.host.should == "example.com"
|
279
|
+
end
|
280
|
+
|
281
|
+
it "returns 'example.com' for #normalized_host" do
|
282
|
+
@uri.normalized_host.should == "example.com"
|
283
|
+
end
|
284
|
+
|
285
|
+
it "returns 'user:password@example.com:8080' for #authority" do
|
286
|
+
@uri.authority.should == "user:password@example.com:8080"
|
287
|
+
end
|
288
|
+
|
289
|
+
it "returns 'user:password@example.com:8080' for #normalized_authority" do
|
290
|
+
@uri.normalized_authority.should == "user:password@example.com:8080"
|
291
|
+
end
|
292
|
+
|
293
|
+
it "returns 8080 for #port" do
|
294
|
+
@uri.port.should == 8080
|
295
|
+
end
|
296
|
+
|
297
|
+
it "returns 8080 for #normalized_port" do
|
298
|
+
@uri.normalized_port.should == 8080
|
299
|
+
end
|
300
|
+
|
301
|
+
it "returns 80 for #default_port" do
|
302
|
+
@uri.default_port.should == 80
|
303
|
+
end
|
304
|
+
|
305
|
+
it "returns 'http://user:password@example.com:8080' for #site" do
|
306
|
+
@uri.site.should == "http://user:password@example.com:8080"
|
307
|
+
end
|
308
|
+
|
309
|
+
it "returns 'http://user:password@example.com:8080' for #normalized_site" do
|
310
|
+
@uri.normalized_site.should == "http://user:password@example.com:8080"
|
311
|
+
end
|
312
|
+
|
313
|
+
it "returns '/path' for #path" do
|
314
|
+
@uri.path.should == "/path"
|
315
|
+
end
|
316
|
+
|
317
|
+
it "returns '/path' for #normalized_path" do
|
318
|
+
@uri.normalized_path.should == "/path"
|
319
|
+
end
|
320
|
+
|
321
|
+
it "returns 'query=value' for #query" do
|
322
|
+
@uri.query.should == "query=value"
|
323
|
+
end
|
324
|
+
|
325
|
+
it "returns 'query=value' for #normalized_query" do
|
326
|
+
@uri.normalized_query.should == "query=value"
|
327
|
+
end
|
328
|
+
|
329
|
+
it "returns 'fragment' for #fragment" do
|
330
|
+
@uri.fragment.should == "fragment"
|
331
|
+
end
|
332
|
+
|
333
|
+
it "returns 'fragment' for #normalized_fragment" do
|
334
|
+
@uri.normalized_fragment.should == "fragment"
|
335
|
+
end
|
336
|
+
|
337
|
+
it "returns #hash" do
|
338
|
+
@uri.hash.should_not be nil
|
339
|
+
end
|
340
|
+
|
341
|
+
it "returns #to_s" do
|
342
|
+
@uri.to_s.should ==
|
343
|
+
"http://user:password@example.com:8080/path?query=value#fragment"
|
344
|
+
end
|
345
|
+
|
346
|
+
it "should not be empty" do
|
347
|
+
@uri.should_not be_empty
|
348
|
+
end
|
349
|
+
|
350
|
+
it "should not be frozen" do
|
351
|
+
@uri.should_not be_frozen
|
352
|
+
end
|
353
|
+
|
354
|
+
it "should allow destructive operations" do
|
355
|
+
expect { @uri.normalize! }.not_to raise_error
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
describe Addressable::URI, "when initialized from " +
|
360
|
+
"frozen individual components" do
|
361
|
+
before do
|
362
|
+
@uri = Addressable::URI.new(
|
363
|
+
:scheme => "http".freeze,
|
364
|
+
:user => "user".freeze,
|
365
|
+
:password => "password".freeze,
|
366
|
+
:host => "example.com".freeze,
|
367
|
+
:port => "8080".freeze,
|
368
|
+
:path => "/path".freeze,
|
369
|
+
:query => "query=value".freeze,
|
370
|
+
:fragment => "fragment".freeze
|
371
|
+
)
|
372
|
+
end
|
373
|
+
|
374
|
+
it "returns 'http' for #scheme" do
|
375
|
+
@uri.scheme.should == "http"
|
376
|
+
end
|
377
|
+
|
378
|
+
it "returns 'http' for #normalized_scheme" do
|
379
|
+
@uri.normalized_scheme.should == "http"
|
380
|
+
end
|
381
|
+
|
382
|
+
it "returns 'user' for #user" do
|
383
|
+
@uri.user.should == "user"
|
384
|
+
end
|
385
|
+
|
386
|
+
it "returns 'user' for #normalized_user" do
|
387
|
+
@uri.normalized_user.should == "user"
|
388
|
+
end
|
389
|
+
|
390
|
+
it "returns 'password' for #password" do
|
391
|
+
@uri.password.should == "password"
|
392
|
+
end
|
393
|
+
|
394
|
+
it "returns 'password' for #normalized_password" do
|
395
|
+
@uri.normalized_password.should == "password"
|
396
|
+
end
|
397
|
+
|
398
|
+
it "returns 'user:password' for #userinfo" do
|
399
|
+
@uri.userinfo.should == "user:password"
|
400
|
+
end
|
401
|
+
|
402
|
+
it "returns 'user:password' for #normalized_userinfo" do
|
403
|
+
@uri.normalized_userinfo.should == "user:password"
|
404
|
+
end
|
405
|
+
|
406
|
+
it "returns 'example.com' for #host" do
|
407
|
+
@uri.host.should == "example.com"
|
408
|
+
end
|
409
|
+
|
410
|
+
it "returns 'example.com' for #normalized_host" do
|
411
|
+
@uri.normalized_host.should == "example.com"
|
412
|
+
end
|
413
|
+
|
414
|
+
it "returns 'user:password@example.com:8080' for #authority" do
|
415
|
+
@uri.authority.should == "user:password@example.com:8080"
|
416
|
+
end
|
417
|
+
|
418
|
+
it "returns 'user:password@example.com:8080' for #normalized_authority" do
|
419
|
+
@uri.normalized_authority.should == "user:password@example.com:8080"
|
420
|
+
end
|
421
|
+
|
422
|
+
it "returns 8080 for #port" do
|
423
|
+
@uri.port.should == 8080
|
424
|
+
end
|
425
|
+
|
426
|
+
it "returns 8080 for #normalized_port" do
|
427
|
+
@uri.normalized_port.should == 8080
|
428
|
+
end
|
429
|
+
|
430
|
+
it "returns 80 for #default_port" do
|
431
|
+
@uri.default_port.should == 80
|
432
|
+
end
|
433
|
+
|
434
|
+
it "returns 'http://user:password@example.com:8080' for #site" do
|
435
|
+
@uri.site.should == "http://user:password@example.com:8080"
|
436
|
+
end
|
437
|
+
|
438
|
+
it "returns 'http://user:password@example.com:8080' for #normalized_site" do
|
439
|
+
@uri.normalized_site.should == "http://user:password@example.com:8080"
|
440
|
+
end
|
441
|
+
|
442
|
+
it "returns '/path' for #path" do
|
443
|
+
@uri.path.should == "/path"
|
444
|
+
end
|
445
|
+
|
446
|
+
it "returns '/path' for #normalized_path" do
|
447
|
+
@uri.normalized_path.should == "/path"
|
448
|
+
end
|
449
|
+
|
450
|
+
it "returns 'query=value' for #query" do
|
451
|
+
@uri.query.should == "query=value"
|
452
|
+
end
|
453
|
+
|
454
|
+
it "returns 'query=value' for #normalized_query" do
|
455
|
+
@uri.normalized_query.should == "query=value"
|
456
|
+
end
|
457
|
+
|
458
|
+
it "returns 'fragment' for #fragment" do
|
459
|
+
@uri.fragment.should == "fragment"
|
460
|
+
end
|
461
|
+
|
462
|
+
it "returns 'fragment' for #normalized_fragment" do
|
463
|
+
@uri.normalized_fragment.should == "fragment"
|
464
|
+
end
|
465
|
+
|
466
|
+
it "returns #hash" do
|
467
|
+
@uri.hash.should_not be nil
|
468
|
+
end
|
469
|
+
|
470
|
+
it "returns #to_s" do
|
471
|
+
@uri.to_s.should ==
|
472
|
+
"http://user:password@example.com:8080/path?query=value#fragment"
|
473
|
+
end
|
474
|
+
|
475
|
+
it "should not be empty" do
|
476
|
+
@uri.should_not be_empty
|
477
|
+
end
|
478
|
+
|
479
|
+
it "should not be frozen" do
|
480
|
+
@uri.should_not be_frozen
|
481
|
+
end
|
482
|
+
|
483
|
+
it "should allow destructive operations" do
|
484
|
+
expect { @uri.normalize! }.not_to raise_error
|
485
|
+
end
|
486
|
+
end
|
487
|
+
|
488
|
+
describe Addressable::URI, "when parsed from a frozen string" do
|
489
|
+
before do
|
490
|
+
@uri = Addressable::URI.parse(
|
491
|
+
"http://user:password@example.com:8080/path?query=value#fragment".freeze
|
492
|
+
)
|
493
|
+
end
|
494
|
+
|
495
|
+
it "returns 'http' for #scheme" do
|
496
|
+
@uri.scheme.should == "http"
|
497
|
+
end
|
498
|
+
|
499
|
+
it "returns 'http' for #normalized_scheme" do
|
500
|
+
@uri.normalized_scheme.should == "http"
|
501
|
+
end
|
502
|
+
|
503
|
+
it "returns 'user' for #user" do
|
504
|
+
@uri.user.should == "user"
|
505
|
+
end
|
506
|
+
|
507
|
+
it "returns 'user' for #normalized_user" do
|
508
|
+
@uri.normalized_user.should == "user"
|
509
|
+
end
|
510
|
+
|
511
|
+
it "returns 'password' for #password" do
|
512
|
+
@uri.password.should == "password"
|
513
|
+
end
|
514
|
+
|
515
|
+
it "returns 'password' for #normalized_password" do
|
516
|
+
@uri.normalized_password.should == "password"
|
517
|
+
end
|
518
|
+
|
519
|
+
it "returns 'user:password' for #userinfo" do
|
520
|
+
@uri.userinfo.should == "user:password"
|
521
|
+
end
|
522
|
+
|
523
|
+
it "returns 'user:password' for #normalized_userinfo" do
|
524
|
+
@uri.normalized_userinfo.should == "user:password"
|
525
|
+
end
|
526
|
+
|
527
|
+
it "returns 'example.com' for #host" do
|
528
|
+
@uri.host.should == "example.com"
|
529
|
+
end
|
530
|
+
|
531
|
+
it "returns 'example.com' for #normalized_host" do
|
532
|
+
@uri.normalized_host.should == "example.com"
|
533
|
+
end
|
534
|
+
|
535
|
+
it "returns 'user:password@example.com:8080' for #authority" do
|
536
|
+
@uri.authority.should == "user:password@example.com:8080"
|
537
|
+
end
|
538
|
+
|
539
|
+
it "returns 'user:password@example.com:8080' for #normalized_authority" do
|
540
|
+
@uri.normalized_authority.should == "user:password@example.com:8080"
|
541
|
+
end
|
542
|
+
|
543
|
+
it "returns 8080 for #port" do
|
544
|
+
@uri.port.should == 8080
|
545
|
+
end
|
546
|
+
|
547
|
+
it "returns 8080 for #normalized_port" do
|
548
|
+
@uri.normalized_port.should == 8080
|
549
|
+
end
|
550
|
+
|
551
|
+
it "returns 80 for #default_port" do
|
552
|
+
@uri.default_port.should == 80
|
553
|
+
end
|
554
|
+
|
555
|
+
it "returns 'http://user:password@example.com:8080' for #site" do
|
556
|
+
@uri.site.should == "http://user:password@example.com:8080"
|
557
|
+
end
|
558
|
+
|
559
|
+
it "returns 'http://user:password@example.com:8080' for #normalized_site" do
|
560
|
+
@uri.normalized_site.should == "http://user:password@example.com:8080"
|
561
|
+
end
|
562
|
+
|
563
|
+
it "returns '/path' for #path" do
|
564
|
+
@uri.path.should == "/path"
|
565
|
+
end
|
566
|
+
|
567
|
+
it "returns '/path' for #normalized_path" do
|
568
|
+
@uri.normalized_path.should == "/path"
|
569
|
+
end
|
570
|
+
|
571
|
+
it "returns 'query=value' for #query" do
|
572
|
+
@uri.query.should == "query=value"
|
573
|
+
end
|
574
|
+
|
575
|
+
it "returns 'query=value' for #normalized_query" do
|
576
|
+
@uri.normalized_query.should == "query=value"
|
577
|
+
end
|
578
|
+
|
579
|
+
it "returns 'fragment' for #fragment" do
|
580
|
+
@uri.fragment.should == "fragment"
|
581
|
+
end
|
582
|
+
|
583
|
+
it "returns 'fragment' for #normalized_fragment" do
|
584
|
+
@uri.normalized_fragment.should == "fragment"
|
585
|
+
end
|
586
|
+
|
587
|
+
it "returns #hash" do
|
588
|
+
@uri.hash.should_not be nil
|
589
|
+
end
|
590
|
+
|
591
|
+
it "returns #to_s" do
|
592
|
+
@uri.to_s.should ==
|
593
|
+
"http://user:password@example.com:8080/path?query=value#fragment"
|
594
|
+
end
|
595
|
+
|
596
|
+
it "should not be empty" do
|
597
|
+
@uri.should_not be_empty
|
598
|
+
end
|
599
|
+
|
600
|
+
it "should not be frozen" do
|
601
|
+
@uri.should_not be_frozen
|
602
|
+
end
|
603
|
+
|
604
|
+
it "should allow destructive operations" do
|
605
|
+
expect { @uri.normalize! }.not_to raise_error
|
606
|
+
end
|
607
|
+
end
|
608
|
+
|
221
609
|
describe Addressable::URI, "when frozen" do
|
222
610
|
before do
|
223
611
|
@uri = Addressable::URI.new.freeze
|
@@ -232,7 +620,7 @@ describe Addressable::URI, "when frozen" do
|
|
232
620
|
end
|
233
621
|
|
234
622
|
it "returns nil for #user" do
|
235
|
-
@uri.user
|
623
|
+
@uri.user.should == nil
|
236
624
|
end
|
237
625
|
|
238
626
|
it "returns nil for #normalized_user" do
|
@@ -322,6 +710,161 @@ describe Addressable::URI, "when frozen" do
|
|
322
710
|
it "returns #to_s" do
|
323
711
|
@uri.to_s.should == ''
|
324
712
|
end
|
713
|
+
|
714
|
+
it "should be empty" do
|
715
|
+
@uri.should be_empty
|
716
|
+
end
|
717
|
+
|
718
|
+
it "should be frozen" do
|
719
|
+
@uri.should be_frozen
|
720
|
+
end
|
721
|
+
|
722
|
+
it "should not be frozen after duping" do
|
723
|
+
@uri.dup.should_not be_frozen
|
724
|
+
end
|
725
|
+
|
726
|
+
it "should not allow destructive operations" do
|
727
|
+
expect { @uri.normalize! }.to raise_error { |error|
|
728
|
+
error.message.should match(/can't modify frozen/)
|
729
|
+
error.should satisfy { |e| RuntimeError === e || TypeError === e }
|
730
|
+
}
|
731
|
+
end
|
732
|
+
end
|
733
|
+
|
734
|
+
describe Addressable::URI, "when frozen" do
|
735
|
+
before do
|
736
|
+
@uri = Addressable::URI.parse(
|
737
|
+
"HTTP://example.com.:%38%30/%70a%74%68?a=%31#1%323"
|
738
|
+
).freeze
|
739
|
+
end
|
740
|
+
|
741
|
+
it "returns 'HTTP' for #scheme" do
|
742
|
+
@uri.scheme.should == "HTTP"
|
743
|
+
end
|
744
|
+
|
745
|
+
it "returns 'http' for #normalized_scheme" do
|
746
|
+
@uri.normalized_scheme.should == "http"
|
747
|
+
@uri.normalize.scheme.should == "http"
|
748
|
+
end
|
749
|
+
|
750
|
+
it "returns nil for #user" do
|
751
|
+
@uri.user.should == nil
|
752
|
+
end
|
753
|
+
|
754
|
+
it "returns nil for #normalized_user" do
|
755
|
+
@uri.normalized_user.should == nil
|
756
|
+
end
|
757
|
+
|
758
|
+
it "returns nil for #password" do
|
759
|
+
@uri.password.should == nil
|
760
|
+
end
|
761
|
+
|
762
|
+
it "returns nil for #normalized_password" do
|
763
|
+
@uri.normalized_password.should == nil
|
764
|
+
end
|
765
|
+
|
766
|
+
it "returns nil for #userinfo" do
|
767
|
+
@uri.userinfo.should == nil
|
768
|
+
end
|
769
|
+
|
770
|
+
it "returns nil for #normalized_userinfo" do
|
771
|
+
@uri.normalized_userinfo.should == nil
|
772
|
+
end
|
773
|
+
|
774
|
+
it "returns 'example.com.' for #host" do
|
775
|
+
@uri.host.should == "example.com."
|
776
|
+
end
|
777
|
+
|
778
|
+
it "returns nil for #normalized_host" do
|
779
|
+
@uri.normalized_host.should == "example.com"
|
780
|
+
@uri.normalize.host.should == "example.com"
|
781
|
+
end
|
782
|
+
|
783
|
+
it "returns 'example.com.:80' for #authority" do
|
784
|
+
@uri.authority.should == "example.com.:80"
|
785
|
+
end
|
786
|
+
|
787
|
+
it "returns 'example.com:80' for #normalized_authority" do
|
788
|
+
@uri.normalized_authority.should == "example.com"
|
789
|
+
@uri.normalize.authority.should == "example.com"
|
790
|
+
end
|
791
|
+
|
792
|
+
it "returns 80 for #port" do
|
793
|
+
@uri.port.should == 80
|
794
|
+
end
|
795
|
+
|
796
|
+
it "returns nil for #normalized_port" do
|
797
|
+
@uri.normalized_port.should == nil
|
798
|
+
@uri.normalize.port.should == nil
|
799
|
+
end
|
800
|
+
|
801
|
+
it "returns 80 for #default_port" do
|
802
|
+
@uri.default_port.should == 80
|
803
|
+
end
|
804
|
+
|
805
|
+
it "returns 'HTTP://example.com.:80' for #site" do
|
806
|
+
@uri.site.should == "HTTP://example.com.:80"
|
807
|
+
end
|
808
|
+
|
809
|
+
it "returns 'http://example.com' for #normalized_site" do
|
810
|
+
@uri.normalized_site.should == "http://example.com"
|
811
|
+
@uri.normalize.site.should == "http://example.com"
|
812
|
+
end
|
813
|
+
|
814
|
+
it "returns '/%70a%74%68' for #path" do
|
815
|
+
@uri.path.should == "/%70a%74%68"
|
816
|
+
end
|
817
|
+
|
818
|
+
it "returns '/path' for #normalized_path" do
|
819
|
+
@uri.normalized_path.should == "/path"
|
820
|
+
@uri.normalize.path.should == "/path"
|
821
|
+
end
|
822
|
+
|
823
|
+
it "returns 'a=%31' for #query" do
|
824
|
+
@uri.query.should == "a=%31"
|
825
|
+
end
|
826
|
+
|
827
|
+
it "returns 'a=1' for #normalized_query" do
|
828
|
+
@uri.normalized_query.should == "a=1"
|
829
|
+
@uri.normalize.query.should == "a=1"
|
830
|
+
end
|
831
|
+
|
832
|
+
it "returns '1%323' for #fragment" do
|
833
|
+
@uri.fragment.should == "1%323"
|
834
|
+
end
|
835
|
+
|
836
|
+
it "returns '123' for #normalized_fragment" do
|
837
|
+
@uri.normalized_fragment.should == "123"
|
838
|
+
@uri.normalize.fragment.should == "123"
|
839
|
+
end
|
840
|
+
|
841
|
+
it "returns #hash" do
|
842
|
+
@uri.hash.should_not be nil
|
843
|
+
end
|
844
|
+
|
845
|
+
it "returns #to_s" do
|
846
|
+
@uri.to_s.should == 'HTTP://example.com.:80/%70a%74%68?a=%31#1%323'
|
847
|
+
@uri.normalize.to_s.should == 'http://example.com/path?a=1#123'
|
848
|
+
end
|
849
|
+
|
850
|
+
it "should not be empty" do
|
851
|
+
@uri.should_not be_empty
|
852
|
+
end
|
853
|
+
|
854
|
+
it "should be frozen" do
|
855
|
+
@uri.should be_frozen
|
856
|
+
end
|
857
|
+
|
858
|
+
it "should not be frozen after duping" do
|
859
|
+
@uri.dup.should_not be_frozen
|
860
|
+
end
|
861
|
+
|
862
|
+
it "should not allow destructive operations" do
|
863
|
+
expect { @uri.normalize! }.to raise_error { |error|
|
864
|
+
error.message.should match(/can't modify frozen/)
|
865
|
+
error.should satisfy { |e| RuntimeError === e || TypeError === e }
|
866
|
+
}
|
867
|
+
end
|
325
868
|
end
|
326
869
|
|
327
870
|
describe Addressable::URI, "when created from string components" do
|
@@ -463,7 +1006,7 @@ end
|
|
463
1006
|
describe Addressable::URI, "when parsed from something that looks " +
|
464
1007
|
"like a URI object" do
|
465
1008
|
it "should parse without error" do
|
466
|
-
uri = Addressable::URI.parse(URI::HTTP.new("http://example.com/"))
|
1009
|
+
uri = Addressable::URI.parse(Fake::URI::HTTP.new("http://example.com/"))
|
467
1010
|
(lambda do
|
468
1011
|
Addressable::URI.parse(uri)
|
469
1012
|
end).should_not raise_error
|
@@ -696,6 +1239,50 @@ describe Addressable::URI, "when parsed from " +
|
|
696
1239
|
end
|
697
1240
|
end
|
698
1241
|
|
1242
|
+
# Section 2 of RFC 6068
|
1243
|
+
describe Addressable::URI, "when parsed from " +
|
1244
|
+
"'mailto:?to=addr1@an.example,addr2@an.example'" do
|
1245
|
+
before do
|
1246
|
+
@uri = Addressable::URI.parse(
|
1247
|
+
"mailto:?to=addr1@an.example,addr2@an.example"
|
1248
|
+
)
|
1249
|
+
end
|
1250
|
+
|
1251
|
+
it "should use the 'mailto' scheme" do
|
1252
|
+
@uri.scheme.should == "mailto"
|
1253
|
+
end
|
1254
|
+
|
1255
|
+
it "should not be considered to be ip-based" do
|
1256
|
+
@uri.should_not be_ip_based
|
1257
|
+
end
|
1258
|
+
|
1259
|
+
it "should not have an inferred_port" do
|
1260
|
+
@uri.inferred_port.should == nil
|
1261
|
+
end
|
1262
|
+
|
1263
|
+
it "should have a path of ''" do
|
1264
|
+
@uri.path.should == ""
|
1265
|
+
end
|
1266
|
+
|
1267
|
+
it "should not have a request URI" do
|
1268
|
+
@uri.request_uri.should == nil
|
1269
|
+
end
|
1270
|
+
|
1271
|
+
it "should have the To: field value parameterized" do
|
1272
|
+
@uri.query_values(Hash)["to"].should == (
|
1273
|
+
"addr1@an.example,addr2@an.example"
|
1274
|
+
)
|
1275
|
+
end
|
1276
|
+
|
1277
|
+
it "should be considered to be in normal form" do
|
1278
|
+
@uri.normalize.should be_eql(@uri)
|
1279
|
+
end
|
1280
|
+
|
1281
|
+
it "should have a 'null' origin" do
|
1282
|
+
@uri.origin.should == 'null'
|
1283
|
+
end
|
1284
|
+
end
|
1285
|
+
|
699
1286
|
# Section 1.1.2 of RFC 3986
|
700
1287
|
describe Addressable::URI, "when parsed from " +
|
701
1288
|
"'news:comp.infosystems.www.servers.unix'" do
|
@@ -1050,9 +1637,9 @@ describe Addressable::URI, "when parsed from " +
|
|
1050
1637
|
Addressable::URI.parse("/path/")
|
1051
1638
|
end
|
1052
1639
|
|
1053
|
-
it "should have a route of '
|
1640
|
+
it "should have a route of '..' from 'http://example.com/path/'" do
|
1054
1641
|
@uri.route_from("http://example.com/path/").should ==
|
1055
|
-
Addressable::URI.parse("
|
1642
|
+
Addressable::URI.parse("..")
|
1056
1643
|
end
|
1057
1644
|
|
1058
1645
|
it "should have a route of '#' to 'http://example.com/'" do
|
@@ -1257,6 +1844,28 @@ describe Addressable::URI, "when parsing IPv6 addresses" do
|
|
1257
1844
|
end
|
1258
1845
|
end
|
1259
1846
|
|
1847
|
+
describe Addressable::URI, "when parsing IPv6 address" do
|
1848
|
+
subject { Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") }
|
1849
|
+
its(:host) { should == '[3ffe:1900:4545:3:200:f8ff:fe21:67cf]' }
|
1850
|
+
its(:hostname) { should == '3ffe:1900:4545:3:200:f8ff:fe21:67cf' }
|
1851
|
+
end
|
1852
|
+
|
1853
|
+
describe Addressable::URI, "when assigning IPv6 address" do
|
1854
|
+
it "should allow to set bare IPv6 address as hostname" do
|
1855
|
+
uri = Addressable::URI.parse("http://[::1]/")
|
1856
|
+
uri.hostname = '3ffe:1900:4545:3:200:f8ff:fe21:67cf'
|
1857
|
+
uri.to_s.should == 'http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'
|
1858
|
+
end
|
1859
|
+
|
1860
|
+
it "should not allow to set bare IPv6 address as host" do
|
1861
|
+
uri = Addressable::URI.parse("http://[::1]/")
|
1862
|
+
pending "not checked"
|
1863
|
+
(lambda do
|
1864
|
+
uri.host = '3ffe:1900:4545:3:200:f8ff:fe21:67cf'
|
1865
|
+
end).should raise_error(Addressable::URI::InvalidURIError)
|
1866
|
+
end
|
1867
|
+
end
|
1868
|
+
|
1260
1869
|
describe Addressable::URI, "when parsing IPvFuture addresses" do
|
1261
1870
|
it "should not raise an error for " +
|
1262
1871
|
"'http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do
|
@@ -1924,10 +2533,10 @@ describe Addressable::URI, "when parsed from " +
|
|
1924
2533
|
Addressable::URI.parse("http://example.com:8080/")
|
1925
2534
|
end
|
1926
2535
|
|
1927
|
-
it "should have a route of '
|
2536
|
+
it "should have a route of '../../' from " +
|
1928
2537
|
"'http://example.com:8080/path/to/'" do
|
1929
2538
|
@uri.route_from("http://example.com:8080/path/to/").should ==
|
1930
|
-
Addressable::URI.parse("
|
2539
|
+
Addressable::URI.parse("../../")
|
1931
2540
|
end
|
1932
2541
|
|
1933
2542
|
it "should have a route of 'http://example.com:8080/' from " +
|
@@ -2208,6 +2817,25 @@ describe Addressable::URI, "when parsed from " +
|
|
2208
2817
|
Addressable::URI.parse("resource/")
|
2209
2818
|
end
|
2210
2819
|
|
2820
|
+
it "should have a route of '../' from " +
|
2821
|
+
"'http://example.com/path/to/resource/sub'" do
|
2822
|
+
@uri.route_from("http://example.com/path/to/resource/sub").should ==
|
2823
|
+
Addressable::URI.parse("../")
|
2824
|
+
end
|
2825
|
+
|
2826
|
+
|
2827
|
+
it "should have a route of 'resource/' from " +
|
2828
|
+
"'http://example.com/path/to/another'" do
|
2829
|
+
@uri.route_from("http://example.com/path/to/another").should ==
|
2830
|
+
Addressable::URI.parse("resource/")
|
2831
|
+
end
|
2832
|
+
|
2833
|
+
it "should have a route of 'resource/' from " +
|
2834
|
+
"'http://example.com/path/to/res'" do
|
2835
|
+
@uri.route_from("http://example.com/path/to/res").should ==
|
2836
|
+
Addressable::URI.parse("resource/")
|
2837
|
+
end
|
2838
|
+
|
2211
2839
|
it "should have a route of 'resource/' from " +
|
2212
2840
|
"'http://example.com:80/path/to/'" do
|
2213
2841
|
@uri.route_from("http://example.com:80/path/to/").should ==
|
@@ -2226,10 +2854,10 @@ describe Addressable::URI, "when parsed from " +
|
|
2226
2854
|
Addressable::URI.parse("http://example.com/path/to/resource/")
|
2227
2855
|
end
|
2228
2856
|
|
2229
|
-
it "should have a route of '
|
2857
|
+
it "should have a route of '../../path/to/resource/' from " +
|
2230
2858
|
"'http://example.com/to/resource/'" do
|
2231
2859
|
@uri.route_from("http://example.com/to/resource/").should ==
|
2232
|
-
Addressable::URI.parse("
|
2860
|
+
Addressable::URI.parse("../../path/to/resource/")
|
2233
2861
|
end
|
2234
2862
|
|
2235
2863
|
it "should correctly convert to a hash" do
|
@@ -2768,13 +3396,13 @@ describe Addressable::URI, "when parsed from " +
|
|
2768
3396
|
@uri.normalize.should be_eql(@uri)
|
2769
3397
|
end
|
2770
3398
|
|
2771
|
-
it "should have a route of '
|
3399
|
+
it "should have a route of '../../' to " +
|
2772
3400
|
"'http://user:pass@example.com/path/'" do
|
2773
3401
|
@uri.route_to("http://user:pass@example.com/path/").should ==
|
2774
|
-
Addressable::URI.parse("
|
3402
|
+
Addressable::URI.parse("../../")
|
2775
3403
|
end
|
2776
3404
|
|
2777
|
-
it "should have a route of '
|
3405
|
+
it "should have a route of 'to/resource?query=x#fragment' " +
|
2778
3406
|
"from 'http://user:pass@example.com/path/'" do
|
2779
3407
|
@uri.route_from("http://user:pass@example.com/path/").should ==
|
2780
3408
|
Addressable::URI.parse("to/resource?query=x#fragment")
|
@@ -3102,6 +3730,27 @@ describe Addressable::URI, "when parsed from " +
|
|
3102
3730
|
end
|
3103
3731
|
end
|
3104
3732
|
|
3733
|
+
describe Addressable::URI, "when parsed from " +
|
3734
|
+
"'http://example.com/?q='one;two'&x=1'" do
|
3735
|
+
before do
|
3736
|
+
@uri = Addressable::URI.parse("http://example.com/?q='one;two'&x=1")
|
3737
|
+
end
|
3738
|
+
|
3739
|
+
it "should have a query of 'q='one;two'&x=1'" do
|
3740
|
+
@uri.query.should == "q='one;two'&x=1"
|
3741
|
+
end
|
3742
|
+
|
3743
|
+
it "should have query_values of {\"q\" => \"'one;two'\", \"x\" => \"1\"}" do
|
3744
|
+
@uri.query_values.should == {"q" => "'one;two'", "x" => "1"}
|
3745
|
+
end
|
3746
|
+
|
3747
|
+
it "should escape the ';' character when normalizing to avoid ambiguity " +
|
3748
|
+
"with the W3C HTML 4.01 specification" do
|
3749
|
+
# HTML 4.01 Section B.2.2
|
3750
|
+
@uri.normalize.query.should == "q='one%3Btwo'&x=1"
|
3751
|
+
end
|
3752
|
+
end
|
3753
|
+
|
3105
3754
|
describe Addressable::URI, "when parsed from " +
|
3106
3755
|
"'http://example.com/?&&x=b'" do
|
3107
3756
|
before do
|
@@ -5159,3 +5808,29 @@ describe Addressable::URI, "when assigning path values" do
|
|
5159
5808
|
end).should_not raise_error(Addressable::URI::InvalidURIError)
|
5160
5809
|
end
|
5161
5810
|
end
|
5811
|
+
|
5812
|
+
describe Addressable::URI, "when initializing a subclass of Addressable::URI" do
|
5813
|
+
before do
|
5814
|
+
@uri = Class.new(Addressable::URI).new
|
5815
|
+
end
|
5816
|
+
|
5817
|
+
it "should have the same class after being parsed" do
|
5818
|
+
@uri.class.should == Addressable::URI.parse(@uri).class
|
5819
|
+
end
|
5820
|
+
|
5821
|
+
it "should have the same class as its duplicate" do
|
5822
|
+
@uri.class.should == @uri.dup.class
|
5823
|
+
end
|
5824
|
+
|
5825
|
+
it "should have the same class after being normalized" do
|
5826
|
+
@uri.class.should == @uri.normalize.class
|
5827
|
+
end
|
5828
|
+
|
5829
|
+
it "should have the same class after being merged" do
|
5830
|
+
@uri.class.should == @uri.merge(:path => 'path').class
|
5831
|
+
end
|
5832
|
+
|
5833
|
+
it "should have the same class after being joined" do
|
5834
|
+
@uri.class.should == @uri.join('path').class
|
5835
|
+
end
|
5836
|
+
end
|