addressabler 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/spec/uri_spec.rb ADDED
@@ -0,0 +1,4210 @@
1
+ require 'addressabler'
2
+ require "addressable/uri"
3
+
4
+ if !"".respond_to?("force_encoding")
5
+ class String
6
+ def force_encoding(encoding)
7
+ @encoding = encoding
8
+ end
9
+
10
+ def encoding
11
+ @encoding ||= Encoding::ASCII_8BIT
12
+ end
13
+ end
14
+
15
+ class Encoding
16
+ def initialize(name)
17
+ @name = name
18
+ end
19
+
20
+ def to_s
21
+ return @name
22
+ end
23
+
24
+ UTF_8 = Encoding.new("UTF-8")
25
+ ASCII_8BIT = Encoding.new("US-ASCII")
26
+ end
27
+ end
28
+
29
+ module URI
30
+ class HTTP
31
+ def initialize(uri)
32
+ @uri = uri
33
+ end
34
+
35
+ def to_s
36
+ return @uri.to_s
37
+ end
38
+ end
39
+ end
40
+
41
+ describe Addressable::URI, "when created with a non-numeric port number" do
42
+ it "should raise an error" do
43
+ (lambda do
44
+ Addressable::URI.new(:port => "bogus")
45
+ end).should raise_error(Addressable::URI::InvalidURIError)
46
+ end
47
+ end
48
+
49
+ describe Addressable::URI, "when created with a non-string scheme" do
50
+ it "should raise an error" do
51
+ (lambda do
52
+ Addressable::URI.new(:scheme => :bogus)
53
+ end).should raise_error(TypeError)
54
+ end
55
+ end
56
+
57
+ describe Addressable::URI, "when created with a non-string user" do
58
+ it "should raise an error" do
59
+ (lambda do
60
+ Addressable::URI.new(:user => :bogus)
61
+ end).should raise_error(TypeError)
62
+ end
63
+ end
64
+
65
+ describe Addressable::URI, "when created with a non-string password" do
66
+ it "should raise an error" do
67
+ (lambda do
68
+ Addressable::URI.new(:password => :bogus)
69
+ end).should raise_error(TypeError)
70
+ end
71
+ end
72
+
73
+ describe Addressable::URI, "when created with a non-string userinfo" do
74
+ it "should raise an error" do
75
+ (lambda do
76
+ Addressable::URI.new(:userinfo => :bogus)
77
+ end).should raise_error(TypeError)
78
+ end
79
+ end
80
+
81
+ describe Addressable::URI, "when created with a non-string host" do
82
+ it "should raise an error" do
83
+ (lambda do
84
+ Addressable::URI.new(:host => :bogus)
85
+ end).should raise_error(TypeError)
86
+ end
87
+ end
88
+
89
+ describe Addressable::URI, "when created with a non-string authority" do
90
+ it "should raise an error" do
91
+ (lambda do
92
+ Addressable::URI.new(:authority => :bogus)
93
+ end).should raise_error(TypeError)
94
+ end
95
+ end
96
+
97
+ describe Addressable::URI, "when created with a non-string authority" do
98
+ it "should raise an error" do
99
+ (lambda do
100
+ Addressable::URI.new(:authority => :bogus)
101
+ end).should raise_error(TypeError)
102
+ end
103
+ end
104
+
105
+ describe Addressable::URI, "when created with a non-string path" do
106
+ it "should raise an error" do
107
+ (lambda do
108
+ Addressable::URI.new(:path => :bogus)
109
+ end).should raise_error(TypeError)
110
+ end
111
+ end
112
+
113
+ describe Addressable::URI, "when created with a non-string query" do
114
+ it "should raise an error" do
115
+ (lambda do
116
+ Addressable::URI.new(:query => :bogus)
117
+ end).should raise_error(TypeError)
118
+ end
119
+ end
120
+
121
+ describe Addressable::URI, "when created with a non-string fragment" do
122
+ it "should raise an error" do
123
+ (lambda do
124
+ Addressable::URI.new(:fragment => :bogus)
125
+ end).should raise_error(TypeError)
126
+ end
127
+ end
128
+
129
+ describe Addressable::URI, "when created with a scheme but no hierarchical " +
130
+ "segment" do
131
+ it "should raise an error" do
132
+ (lambda do
133
+ Addressable::URI.parse("http:")
134
+ end).should raise_error(Addressable::URI::InvalidURIError)
135
+ end
136
+ end
137
+
138
+ describe Addressable::URI, "when created from nil components" do
139
+ before do
140
+ @uri = Addressable::URI.new
141
+ end
142
+
143
+ it "should have a nil site value" do
144
+ @uri.site.should == nil
145
+ end
146
+
147
+ it "should have an empty path" do
148
+ @uri.path.should == ""
149
+ end
150
+
151
+ it "should be an empty uri" do
152
+ @uri.to_s.should == ""
153
+ end
154
+
155
+ it "should raise an error if the scheme is set to whitespace" do
156
+ (lambda do
157
+ @uri.scheme = "\t \n"
158
+ end).should raise_error(Addressable::URI::InvalidURIError)
159
+ end
160
+
161
+ it "should raise an error if the scheme is set to all digits" do
162
+ (lambda do
163
+ @uri.scheme = "123"
164
+ end).should raise_error(Addressable::URI::InvalidURIError)
165
+ end
166
+
167
+ it "should raise an error if set into an invalid state" do
168
+ (lambda do
169
+ @uri.user = "user"
170
+ end).should raise_error(Addressable::URI::InvalidURIError)
171
+ end
172
+
173
+ it "should raise an error if set into an invalid state" do
174
+ (lambda do
175
+ @uri.password = "pass"
176
+ end).should raise_error(Addressable::URI::InvalidURIError)
177
+ end
178
+
179
+ it "should raise an error if set into an invalid state" do
180
+ (lambda do
181
+ @uri.scheme = "http"
182
+ @uri.fragment = "fragment"
183
+ end).should raise_error(Addressable::URI::InvalidURIError)
184
+ end
185
+
186
+ it "should raise an error if set into an invalid state" do
187
+ (lambda do
188
+ @uri.fragment = "fragment"
189
+ @uri.scheme = "http"
190
+ end).should raise_error(Addressable::URI::InvalidURIError)
191
+ end
192
+ end
193
+
194
+ describe Addressable::URI, "when created from string components" do
195
+ before do
196
+ @uri = Addressable::URI.new(
197
+ :scheme => "http", :host => "example.com"
198
+ )
199
+ end
200
+
201
+ it "should have a site value of 'http://example.com'" do
202
+ @uri.site.should == "http://example.com"
203
+ end
204
+
205
+ it "should be equal to the equivalent parsed URI" do
206
+ @uri.should == Addressable::URI.parse("http://example.com")
207
+ end
208
+
209
+ it "should raise an error if invalid components omitted" do
210
+ (lambda do
211
+ @uri.omit(:bogus)
212
+ end).should raise_error(ArgumentError)
213
+ (lambda do
214
+ @uri.omit(:scheme, :bogus, :path)
215
+ end).should raise_error(ArgumentError)
216
+ end
217
+ end
218
+
219
+ describe Addressable::URI, "when created with a nil host but " +
220
+ "non-nil authority components" do
221
+ it "should raise an error" do
222
+ (lambda do
223
+ Addressable::URI.new(:user => "user", :password => "pass", :port => 80)
224
+ end).should raise_error(Addressable::URI::InvalidURIError)
225
+ end
226
+ end
227
+
228
+ describe Addressable::URI, "when created with both an authority and a user" do
229
+ it "should raise an error" do
230
+ (lambda do
231
+ Addressable::URI.new(
232
+ :user => "user", :authority => "user@example.com:80"
233
+ )
234
+ end).should raise_error(ArgumentError)
235
+ end
236
+ end
237
+
238
+ describe Addressable::URI, "when created with an authority and no port" do
239
+ before do
240
+ @uri = Addressable::URI.new(:authority => "user@example.com")
241
+ end
242
+
243
+ it "should not infer a port" do
244
+ @uri.port.should == nil
245
+ @uri.inferred_port.should == nil
246
+ end
247
+
248
+ it "should have a site value of '//user@example.com'" do
249
+ @uri.site.should == "//user@example.com"
250
+ end
251
+ end
252
+
253
+ describe Addressable::URI, "when created with both a userinfo and a user" do
254
+ it "should raise an error" do
255
+ (lambda do
256
+ Addressable::URI.new(:user => "user", :userinfo => "user:pass")
257
+ end).should raise_error(ArgumentError)
258
+ end
259
+ end
260
+
261
+ describe Addressable::URI, "when created with a path that hasn't been " +
262
+ "prefixed with a '/' but a host specified" do
263
+ before do
264
+ @uri = Addressable::URI.new(
265
+ :scheme => "http", :host => "example.com", :path => "path"
266
+ )
267
+ end
268
+
269
+ it "should prefix a '/' to the path" do
270
+ @uri.should == Addressable::URI.parse("http://example.com/path")
271
+ end
272
+
273
+ it "should have a site value of 'http://example.com'" do
274
+ @uri.site.should == "http://example.com"
275
+ end
276
+ end
277
+
278
+ describe Addressable::URI, "when created with a path that hasn't been " +
279
+ "prefixed with a '/' but no host specified" do
280
+ before do
281
+ @uri = Addressable::URI.new(
282
+ :scheme => "http", :path => "path"
283
+ )
284
+ end
285
+
286
+ it "should not prefix a '/' to the path" do
287
+ @uri.should == Addressable::URI.parse("http:path")
288
+ end
289
+
290
+ it "should have a site value of 'http:'" do
291
+ @uri.site.should == "http:"
292
+ end
293
+ end
294
+
295
+ describe Addressable::URI, "when parsed from an Addressable::URI object" do
296
+ it "should return the object" do
297
+ uri = Addressable::URI.parse("http://example.com/")
298
+ (lambda do
299
+ Addressable::URI.parse(uri).object_id.should == uri.object_id
300
+ end).should_not raise_error
301
+ end
302
+
303
+ it "should return the object" do
304
+ uri = Addressable::URI.parse("http://example.com/")
305
+ (lambda do
306
+ Addressable::URI.heuristic_parse(uri).object_id.should == uri.object_id
307
+ end).should_not raise_error
308
+ end
309
+ end
310
+
311
+ describe Addressable::URI, "when parsed from something that looks " +
312
+ "like a URI object" do
313
+ it "should parse without error" do
314
+ uri = Addressable::URI.parse(URI::HTTP.new("http://example.com/"))
315
+ (lambda do
316
+ Addressable::URI.parse(uri)
317
+ end).should_not raise_error
318
+ end
319
+ end
320
+
321
+ describe Addressable::URI, "when parsed from ''" do
322
+ before do
323
+ @uri = Addressable::URI.parse("")
324
+ end
325
+
326
+ it "should have no scheme" do
327
+ @uri.scheme.should == nil
328
+ end
329
+
330
+ it "should not be considered to be ip-based" do
331
+ @uri.should_not be_ip_based
332
+ end
333
+
334
+ it "should have a path of ''" do
335
+ @uri.path.should == ""
336
+ end
337
+
338
+ it "should have a request URI of '/'" do
339
+ @uri.request_uri.should == "/"
340
+ end
341
+
342
+ it "should be considered relative" do
343
+ @uri.should be_relative
344
+ end
345
+
346
+ it "should be considered to be in normal form" do
347
+ @uri.normalize.should be_eql(@uri)
348
+ end
349
+ end
350
+
351
+ # Section 1.1.2 of RFC 3986
352
+ describe Addressable::URI, "when parsed from " +
353
+ "'ftp://ftp.is.co.za/rfc/rfc1808.txt'" do
354
+ before do
355
+ @uri = Addressable::URI.parse("ftp://ftp.is.co.za/rfc/rfc1808.txt")
356
+ end
357
+
358
+ it "should use the 'ftp' scheme" do
359
+ @uri.scheme.should == "ftp"
360
+ end
361
+
362
+ it "should be considered to be ip-based" do
363
+ @uri.should be_ip_based
364
+ end
365
+
366
+ it "should have a host of 'ftp.is.co.za'" do
367
+ @uri.host.should == "ftp.is.co.za"
368
+ end
369
+
370
+ it "should have a path of '/rfc/rfc1808.txt'" do
371
+ @uri.path.should == "/rfc/rfc1808.txt"
372
+ end
373
+
374
+ it "should not have a request URI" do
375
+ @uri.request_uri.should == nil
376
+ end
377
+
378
+ it "should be considered to be in normal form" do
379
+ @uri.normalize.should be_eql(@uri)
380
+ end
381
+ end
382
+
383
+ # Section 1.1.2 of RFC 3986
384
+ describe Addressable::URI, "when parsed from " +
385
+ "'http://www.ietf.org/rfc/rfc2396.txt'" do
386
+ before do
387
+ @uri = Addressable::URI.parse("http://www.ietf.org/rfc/rfc2396.txt")
388
+ end
389
+
390
+ it "should use the 'http' scheme" do
391
+ @uri.scheme.should == "http"
392
+ end
393
+
394
+ it "should be considered to be ip-based" do
395
+ @uri.should be_ip_based
396
+ end
397
+
398
+ it "should have a host of 'www.ietf.org'" do
399
+ @uri.host.should == "www.ietf.org"
400
+ end
401
+
402
+ it "should have a path of '/rfc/rfc2396.txt'" do
403
+ @uri.path.should == "/rfc/rfc2396.txt"
404
+ end
405
+
406
+ it "should have a request URI of '/rfc/rfc2396.txt'" do
407
+ @uri.request_uri.should == "/rfc/rfc2396.txt"
408
+ end
409
+
410
+ it "should be considered to be in normal form" do
411
+ @uri.normalize.should be_eql(@uri)
412
+ end
413
+
414
+ it "should correctly omit components" do
415
+ @uri.omit(:scheme).to_s.should == "//www.ietf.org/rfc/rfc2396.txt"
416
+ @uri.omit(:path).to_s.should == "http://www.ietf.org"
417
+ end
418
+
419
+ it "should correctly omit components destructively" do
420
+ @uri.omit!(:scheme)
421
+ @uri.to_s.should == "//www.ietf.org/rfc/rfc2396.txt"
422
+ end
423
+ end
424
+
425
+ # Section 1.1.2 of RFC 3986
426
+ describe Addressable::URI, "when parsed from " +
427
+ "'ldap://[2001:db8::7]/c=GB?objectClass?one'" do
428
+ before do
429
+ @uri = Addressable::URI.parse("ldap://[2001:db8::7]/c=GB?objectClass?one")
430
+ end
431
+
432
+ it "should use the 'ldap' scheme" do
433
+ @uri.scheme.should == "ldap"
434
+ end
435
+
436
+ it "should be considered to be ip-based" do
437
+ @uri.should be_ip_based
438
+ end
439
+
440
+ it "should have a host of '[2001:db8::7]'" do
441
+ @uri.host.should == "[2001:db8::7]"
442
+ end
443
+
444
+ it "should have a path of '/c=GB'" do
445
+ @uri.path.should == "/c=GB"
446
+ end
447
+
448
+ it "should not have a request URI" do
449
+ @uri.request_uri.should == nil
450
+ end
451
+
452
+ it "should not allow request URI assignment" do
453
+ (lambda do
454
+ @uri.request_uri = "/"
455
+ end).should raise_error(Addressable::URI::InvalidURIError)
456
+ end
457
+
458
+ it "should have a query of 'objectClass?one'" do
459
+ @uri.query.should == "objectClass?one"
460
+ end
461
+
462
+ it "should be considered to be in normal form" do
463
+ @uri.normalize.should be_eql(@uri)
464
+ end
465
+
466
+ it "should correctly omit components" do
467
+ @uri.omit(:scheme, :authority).to_s.should == "/c=GB?objectClass?one"
468
+ @uri.omit(:path).to_s.should == "ldap://[2001:db8::7]?objectClass?one"
469
+ end
470
+
471
+ it "should correctly omit components destructively" do
472
+ @uri.omit!(:scheme, :authority)
473
+ @uri.to_s.should == "/c=GB?objectClass?one"
474
+ end
475
+
476
+ it "should raise an error if omission would create an invalid URI" do
477
+ (lambda do
478
+ @uri.omit(:authority, :path)
479
+ end).should raise_error(Addressable::URI::InvalidURIError)
480
+ end
481
+ end
482
+
483
+ # Section 1.1.2 of RFC 3986
484
+ describe Addressable::URI, "when parsed from " +
485
+ "'mailto:John.Doe@example.com'" do
486
+ before do
487
+ @uri = Addressable::URI.parse("mailto:John.Doe@example.com")
488
+ end
489
+
490
+ it "should use the 'mailto' scheme" do
491
+ @uri.scheme.should == "mailto"
492
+ end
493
+
494
+ it "should not be considered to be ip-based" do
495
+ @uri.should_not be_ip_based
496
+ end
497
+
498
+ it "should have a path of 'John.Doe@example.com'" do
499
+ @uri.path.should == "John.Doe@example.com"
500
+ end
501
+
502
+ it "should not have a request URI" do
503
+ @uri.request_uri.should == nil
504
+ end
505
+
506
+ it "should be considered to be in normal form" do
507
+ @uri.normalize.should be_eql(@uri)
508
+ end
509
+ end
510
+
511
+ # Section 1.1.2 of RFC 3986
512
+ describe Addressable::URI, "when parsed from " +
513
+ "'news:comp.infosystems.www.servers.unix'" do
514
+ before do
515
+ @uri = Addressable::URI.parse("news:comp.infosystems.www.servers.unix")
516
+ end
517
+
518
+ it "should use the 'news' scheme" do
519
+ @uri.scheme.should == "news"
520
+ end
521
+
522
+ it "should not be considered to be ip-based" do
523
+ @uri.should_not be_ip_based
524
+ end
525
+
526
+ it "should have a path of 'comp.infosystems.www.servers.unix'" do
527
+ @uri.path.should == "comp.infosystems.www.servers.unix"
528
+ end
529
+
530
+ it "should not have a request URI" do
531
+ @uri.request_uri.should == nil
532
+ end
533
+
534
+ it "should be considered to be in normal form" do
535
+ @uri.normalize.should be_eql(@uri)
536
+ end
537
+ end
538
+
539
+ # Section 1.1.2 of RFC 3986
540
+ describe Addressable::URI, "when parsed from " +
541
+ "'tel:+1-816-555-1212'" do
542
+ before do
543
+ @uri = Addressable::URI.parse("tel:+1-816-555-1212")
544
+ end
545
+
546
+ it "should use the 'tel' scheme" do
547
+ @uri.scheme.should == "tel"
548
+ end
549
+
550
+ it "should not be considered to be ip-based" do
551
+ @uri.should_not be_ip_based
552
+ end
553
+
554
+ it "should have a path of '+1-816-555-1212'" do
555
+ @uri.path.should == "+1-816-555-1212"
556
+ end
557
+
558
+ it "should not have a request URI" do
559
+ @uri.request_uri.should == nil
560
+ end
561
+
562
+ it "should be considered to be in normal form" do
563
+ @uri.normalize.should be_eql(@uri)
564
+ end
565
+ end
566
+
567
+ # Section 1.1.2 of RFC 3986
568
+ describe Addressable::URI, "when parsed from " +
569
+ "'telnet://192.0.2.16:80/'" do
570
+ before do
571
+ @uri = Addressable::URI.parse("telnet://192.0.2.16:80/")
572
+ end
573
+
574
+ it "should use the 'telnet' scheme" do
575
+ @uri.scheme.should == "telnet"
576
+ end
577
+
578
+ it "should have a host of '192.0.2.16'" do
579
+ @uri.host.should == "192.0.2.16"
580
+ end
581
+
582
+ it "should have a port of '80'" do
583
+ @uri.port.should == 80
584
+ end
585
+
586
+ it "should be considered to be ip-based" do
587
+ @uri.should be_ip_based
588
+ end
589
+
590
+ it "should have a path of '/'" do
591
+ @uri.path.should == "/"
592
+ end
593
+
594
+ it "should not have a request URI" do
595
+ @uri.request_uri.should == nil
596
+ end
597
+
598
+ it "should be considered to be in normal form" do
599
+ @uri.normalize.should be_eql(@uri)
600
+ end
601
+ end
602
+
603
+ # Section 1.1.2 of RFC 3986
604
+ describe Addressable::URI, "when parsed from " +
605
+ "'urn:oasis:names:specification:docbook:dtd:xml:4.1.2'" do
606
+ before do
607
+ @uri = Addressable::URI.parse(
608
+ "urn:oasis:names:specification:docbook:dtd:xml:4.1.2")
609
+ end
610
+
611
+ it "should use the 'urn' scheme" do
612
+ @uri.scheme.should == "urn"
613
+ end
614
+
615
+ it "should not be considered to be ip-based" do
616
+ @uri.should_not be_ip_based
617
+ end
618
+
619
+ it "should have a path of " +
620
+ "'oasis:names:specification:docbook:dtd:xml:4.1.2'" do
621
+ @uri.path.should == "oasis:names:specification:docbook:dtd:xml:4.1.2"
622
+ end
623
+
624
+ it "should not have a request URI" do
625
+ @uri.request_uri.should == nil
626
+ end
627
+
628
+ it "should be considered to be in normal form" do
629
+ @uri.normalize.should be_eql(@uri)
630
+ end
631
+ end
632
+
633
+ describe Addressable::URI, "when parsed from " +
634
+ "'http://example.com'" do
635
+ before do
636
+ @uri = Addressable::URI.parse("http://example.com")
637
+ end
638
+
639
+ it "when inspected, should have the correct URI" do
640
+ @uri.inspect.should include("http://example.com")
641
+ end
642
+
643
+ it "when inspected, should have the correct class name" do
644
+ @uri.inspect.should include("Addressable::URI")
645
+ end
646
+
647
+ it "when inspected, should have the correct object id" do
648
+ @uri.inspect.should include("%#0x" % @uri.object_id)
649
+ end
650
+
651
+ it "should use the 'http' scheme" do
652
+ @uri.scheme.should == "http"
653
+ end
654
+
655
+ it "should be considered to be ip-based" do
656
+ @uri.should be_ip_based
657
+ end
658
+
659
+ it "should have an authority segment of 'example.com'" do
660
+ @uri.authority.should == "example.com"
661
+ end
662
+
663
+ it "should have a host of 'example.com'" do
664
+ @uri.host.should == "example.com"
665
+ end
666
+
667
+ it "should be considered ip-based" do
668
+ @uri.should be_ip_based
669
+ end
670
+
671
+ it "should have no username" do
672
+ @uri.user.should == nil
673
+ end
674
+
675
+ it "should have no password" do
676
+ @uri.password.should == nil
677
+ end
678
+
679
+ it "should use port 80" do
680
+ @uri.inferred_port.should == 80
681
+ end
682
+
683
+ it "should not have a specified port" do
684
+ @uri.port.should == nil
685
+ end
686
+
687
+ it "should have an empty path" do
688
+ @uri.path.should == ""
689
+ end
690
+
691
+ it "should have no query string" do
692
+ @uri.query.should == nil
693
+ @uri.query_values.should == nil
694
+ end
695
+
696
+ it "should have a request URI of '/'" do
697
+ @uri.request_uri.should == "/"
698
+ end
699
+
700
+ it "should have no fragment" do
701
+ @uri.fragment.should == nil
702
+ end
703
+
704
+ it "should be considered absolute" do
705
+ @uri.should be_absolute
706
+ end
707
+
708
+ it "should not be considered relative" do
709
+ @uri.should_not be_relative
710
+ end
711
+
712
+ it "should not be exactly equal to 42" do
713
+ @uri.eql?(42).should == false
714
+ end
715
+
716
+ it "should not be equal to 42" do
717
+ (@uri == 42).should == false
718
+ end
719
+
720
+ it "should not be roughly equal to 42" do
721
+ (@uri === 42).should == false
722
+ end
723
+
724
+ it "should be exactly equal to http://example.com" do
725
+ @uri.eql?(Addressable::URI.parse("http://example.com")).should == true
726
+ end
727
+
728
+ it "should be roughly equal to http://example.com/" do
729
+ (@uri === Addressable::URI.parse("http://example.com/")).should == true
730
+ end
731
+
732
+ it "should be roughly equal to the string 'http://example.com/'" do
733
+ (@uri === "http://example.com/").should == true
734
+ end
735
+
736
+ it "should not be roughly equal to the string " +
737
+ "'http://example.com:bogus/'" do
738
+ (lambda do
739
+ (@uri === "http://example.com:bogus/").should == false
740
+ end).should_not raise_error
741
+ end
742
+
743
+ it "should result in itself when joined with itself" do
744
+ @uri.join(@uri).to_s.should == "http://example.com"
745
+ @uri.join!(@uri).to_s.should == "http://example.com"
746
+ end
747
+
748
+ it "should be equivalent to http://EXAMPLE.com" do
749
+ @uri.should == Addressable::URI.parse("http://EXAMPLE.com")
750
+ end
751
+
752
+ it "should be equivalent to http://EXAMPLE.com:80/" do
753
+ @uri.should == Addressable::URI.parse("http://EXAMPLE.com:80/")
754
+ end
755
+
756
+ it "should have the same hash as http://example.com" do
757
+ @uri.hash.should == Addressable::URI.parse("http://example.com").hash
758
+ end
759
+
760
+ it "should have the same hash as http://EXAMPLE.com after assignment" do
761
+ @uri.host = "EXAMPLE.com"
762
+ @uri.hash.should == Addressable::URI.parse("http://EXAMPLE.com").hash
763
+ end
764
+
765
+ it "should have a different hash from http://EXAMPLE.com" do
766
+ @uri.hash.should_not == Addressable::URI.parse("http://EXAMPLE.com").hash
767
+ end
768
+
769
+ # Section 6.2.3 of RFC 3986
770
+ it "should be equivalent to http://example.com/" do
771
+ @uri.should == Addressable::URI.parse("http://example.com/")
772
+ end
773
+
774
+ # Section 6.2.3 of RFC 3986
775
+ it "should be equivalent to http://example.com:/" do
776
+ @uri.should == Addressable::URI.parse("http://example.com:/")
777
+ end
778
+
779
+ # Section 6.2.3 of RFC 3986
780
+ it "should be equivalent to http://example.com:80/" do
781
+ @uri.should == Addressable::URI.parse("http://example.com:80/")
782
+ end
783
+
784
+ # Section 6.2.2.1 of RFC 3986
785
+ it "should be equivalent to http://EXAMPLE.COM/" do
786
+ @uri.should == Addressable::URI.parse("http://EXAMPLE.COM/")
787
+ end
788
+
789
+ it "should have a route of '/path/' to 'http://example.com/path/'" do
790
+ @uri.route_to("http://example.com/path/").should ==
791
+ Addressable::URI.parse("/path/")
792
+ end
793
+
794
+ it "should have a route of '/' from 'http://example.com/path/'" do
795
+ @uri.route_from("http://example.com/path/").should ==
796
+ Addressable::URI.parse("/")
797
+ end
798
+
799
+ it "should have a route of '#' to 'http://example.com/'" do
800
+ @uri.route_to("http://example.com/").should ==
801
+ Addressable::URI.parse("#")
802
+ end
803
+
804
+ it "should have a route of 'http://elsewhere.com/' to " +
805
+ "'http://elsewhere.com/'" do
806
+ @uri.route_to("http://elsewhere.com/").should ==
807
+ Addressable::URI.parse("http://elsewhere.com/")
808
+ end
809
+
810
+ it "when joined with 'relative/path' should be " +
811
+ "'http://example.com/relative/path'" do
812
+ @uri.join('relative/path').should ==
813
+ Addressable::URI.parse("http://example.com/relative/path")
814
+ end
815
+
816
+ it "when joined with a bogus object a TypeError should be raised" do
817
+ (lambda do
818
+ @uri.join(42)
819
+ end).should raise_error(TypeError)
820
+ end
821
+
822
+ it "should have the correct username after assignment" do
823
+ @uri.user = "newuser"
824
+ @uri.user.should == "newuser"
825
+ @uri.password.should == nil
826
+ @uri.to_s.should == "http://newuser@example.com"
827
+ end
828
+
829
+ it "should have the correct username after assignment" do
830
+ @uri.user = "user@123!"
831
+ @uri.user.should == "user@123!"
832
+ @uri.normalized_user.should == "user%40123%21"
833
+ @uri.password.should == nil
834
+ @uri.normalize.to_s.should == "http://user%40123%21@example.com/"
835
+ end
836
+
837
+ it "should have the correct password after assignment" do
838
+ @uri.password = "newpass"
839
+ @uri.password.should == "newpass"
840
+ @uri.user.should == ""
841
+ @uri.to_s.should == "http://:newpass@example.com"
842
+ end
843
+
844
+ it "should have the correct password after assignment" do
845
+ @uri.password = "secret@123!"
846
+ @uri.password.should == "secret@123!"
847
+ @uri.normalized_password.should == "secret%40123%21"
848
+ @uri.user.should == ""
849
+ @uri.normalize.to_s.should == "http://:secret%40123%21@example.com/"
850
+ @uri.omit(:password).to_s.should == "http://example.com"
851
+ end
852
+
853
+ it "should have the correct user/pass after repeated assignment" do
854
+ @uri.user = nil
855
+ @uri.user.should == nil
856
+ @uri.password = "newpass"
857
+ @uri.password.should == "newpass"
858
+ # Username cannot be nil if the password is set
859
+ @uri.user.should == ""
860
+ @uri.to_s.should == "http://:newpass@example.com"
861
+ @uri.user = "newuser"
862
+ @uri.user.should == "newuser"
863
+ @uri.password = nil
864
+ @uri.password.should == nil
865
+ @uri.to_s.should == "http://newuser@example.com"
866
+ @uri.user = "newuser"
867
+ @uri.user.should == "newuser"
868
+ @uri.password = ""
869
+ @uri.password.should == ""
870
+ @uri.to_s.should == "http://newuser:@example.com"
871
+ @uri.password = "newpass"
872
+ @uri.password.should == "newpass"
873
+ @uri.user = nil
874
+ # Username cannot be nil if the password is set
875
+ @uri.user.should == ""
876
+ @uri.to_s.should == "http://:newpass@example.com"
877
+ end
878
+
879
+ it "should have the correct user/pass after userinfo assignment" do
880
+ @uri.user = "newuser"
881
+ @uri.user.should == "newuser"
882
+ @uri.password = "newpass"
883
+ @uri.password.should == "newpass"
884
+ @uri.userinfo = nil
885
+ @uri.userinfo.should == nil
886
+ @uri.user.should == nil
887
+ @uri.password.should == nil
888
+ end
889
+
890
+ it "should correctly convert to a hash" do
891
+ @uri.to_hash.should == {
892
+ :scheme => "http",
893
+ :user => nil,
894
+ :password => nil,
895
+ :host => "example.com",
896
+ :port => nil,
897
+ :path => "",
898
+ :query => nil,
899
+ :fragment => nil
900
+ }
901
+ end
902
+
903
+ it "should be identical to its duplicate" do
904
+ @uri.should == @uri.dup
905
+ end
906
+ end
907
+
908
+ # Section 5.1.2 of RFC 2616
909
+ describe Addressable::URI, "when parsed from " +
910
+ "'http://www.w3.org/pub/WWW/TheProject.html'" do
911
+ before do
912
+ @uri = Addressable::URI.parse("http://www.w3.org/pub/WWW/TheProject.html")
913
+ end
914
+
915
+ it "should have the correct request URI" do
916
+ @uri.request_uri.should == "/pub/WWW/TheProject.html"
917
+ end
918
+
919
+ it "should have the correct request URI after assignment" do
920
+ @uri.request_uri = "/some/where/else.html?query?string"
921
+ @uri.request_uri.should == "/some/where/else.html?query?string"
922
+ @uri.path.should == "/some/where/else.html"
923
+ @uri.query.should == "query?string"
924
+ end
925
+
926
+ it "should have the correct request URI after assignment" do
927
+ @uri.request_uri = "?x=y"
928
+ @uri.request_uri.should == "/?x=y"
929
+ @uri.path.should == "/"
930
+ @uri.query.should == "x=y"
931
+ end
932
+
933
+ it "should raise an error if the site value is set to something bogus" do
934
+ (lambda do
935
+ @uri.site = 42
936
+ end).should raise_error(TypeError)
937
+ end
938
+
939
+ it "should raise an error if the request URI is set to something bogus" do
940
+ (lambda do
941
+ @uri.request_uri = 42
942
+ end).should raise_error(TypeError)
943
+ end
944
+
945
+ it "should correctly convert to a hash" do
946
+ @uri.to_hash.should == {
947
+ :scheme => "http",
948
+ :user => nil,
949
+ :password => nil,
950
+ :host => "www.w3.org",
951
+ :port => nil,
952
+ :path => "/pub/WWW/TheProject.html",
953
+ :query => nil,
954
+ :fragment => nil
955
+ }
956
+ end
957
+ end
958
+
959
+ describe Addressable::URI, "when parsed from " +
960
+ "'http://example.com/'" do
961
+ before do
962
+ @uri = Addressable::URI.parse("http://example.com/")
963
+ end
964
+
965
+ # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
966
+ it "should be equivalent to http://example.com" do
967
+ @uri.should == Addressable::URI.parse("http://example.com")
968
+ end
969
+
970
+ # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
971
+ it "should be equivalent to HTTP://example.com/" do
972
+ @uri.should == Addressable::URI.parse("HTTP://example.com/")
973
+ end
974
+
975
+ # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
976
+ it "should be equivalent to http://example.com:/" do
977
+ @uri.should == Addressable::URI.parse("http://example.com:/")
978
+ end
979
+
980
+ # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
981
+ it "should be equivalent to http://example.com:80/" do
982
+ @uri.should == Addressable::URI.parse("http://example.com:80/")
983
+ end
984
+
985
+ # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
986
+ it "should be equivalent to http://Example.com/" do
987
+ @uri.should == Addressable::URI.parse("http://Example.com/")
988
+ end
989
+
990
+ it "should have the correct username after assignment" do
991
+ @uri.user = nil
992
+ @uri.user.should == nil
993
+ @uri.password.should == nil
994
+ @uri.to_s.should == "http://example.com/"
995
+ end
996
+
997
+ it "should have the correct password after assignment" do
998
+ @uri.password = nil
999
+ @uri.password.should == nil
1000
+ @uri.user.should == nil
1001
+ @uri.to_s.should == "http://example.com/"
1002
+ end
1003
+
1004
+ it "should have a request URI of '/'" do
1005
+ @uri.request_uri.should == "/"
1006
+ end
1007
+
1008
+ it "should correctly convert to a hash" do
1009
+ @uri.to_hash.should == {
1010
+ :scheme => "http",
1011
+ :user => nil,
1012
+ :password => nil,
1013
+ :host => "example.com",
1014
+ :port => nil,
1015
+ :path => "/",
1016
+ :query => nil,
1017
+ :fragment => nil
1018
+ }
1019
+ end
1020
+
1021
+ it "should be identical to its duplicate" do
1022
+ @uri.should == @uri.dup
1023
+ end
1024
+
1025
+ it "should have the same hash as its duplicate" do
1026
+ @uri.hash.should == @uri.dup.hash
1027
+ end
1028
+
1029
+ it "should have a different hash from its equivalent String value" do
1030
+ @uri.hash.should_not == @uri.to_s.hash
1031
+ end
1032
+
1033
+ it "should have the same hash as an equal URI" do
1034
+ @uri.hash.should == Addressable::URI.parse("http://example.com/").hash
1035
+ end
1036
+
1037
+ it "should be equivalent to http://EXAMPLE.com" do
1038
+ @uri.should == Addressable::URI.parse("http://EXAMPLE.com")
1039
+ end
1040
+
1041
+ it "should be equivalent to http://EXAMPLE.com:80/" do
1042
+ @uri.should == Addressable::URI.parse("http://EXAMPLE.com:80/")
1043
+ end
1044
+
1045
+ it "should have the same hash as http://example.com/" do
1046
+ @uri.hash.should == Addressable::URI.parse("http://example.com/").hash
1047
+ end
1048
+
1049
+ it "should have the same hash as http://example.com after assignment" do
1050
+ @uri.path = ""
1051
+ @uri.hash.should == Addressable::URI.parse("http://example.com").hash
1052
+ end
1053
+
1054
+ it "should have the same hash as http://example.com/? after assignment" do
1055
+ @uri.query = ""
1056
+ @uri.hash.should == Addressable::URI.parse("http://example.com/?").hash
1057
+ end
1058
+
1059
+ it "should have the same hash as http://example.com/? after assignment" do
1060
+ @uri.query_values = {}
1061
+ @uri.hash.should == Addressable::URI.parse("http://example.com/?").hash
1062
+ end
1063
+
1064
+ it "should have the same hash as http://example.com/# after assignment" do
1065
+ @uri.fragment = ""
1066
+ @uri.hash.should == Addressable::URI.parse("http://example.com/#").hash
1067
+ end
1068
+
1069
+ it "should have a different hash from http://example.com" do
1070
+ @uri.hash.should_not == Addressable::URI.parse("http://example.com").hash
1071
+ end
1072
+ end
1073
+
1074
+ describe Addressable::URI, "when parsed from " +
1075
+ "'http://@example.com/'" do
1076
+ before do
1077
+ @uri = Addressable::URI.parse("http://@example.com/")
1078
+ end
1079
+
1080
+ it "should be equivalent to http://example.com" do
1081
+ @uri.should == Addressable::URI.parse("http://example.com")
1082
+ end
1083
+
1084
+ it "should correctly convert to a hash" do
1085
+ @uri.to_hash.should == {
1086
+ :scheme => "http",
1087
+ :user => "",
1088
+ :password => nil,
1089
+ :host => "example.com",
1090
+ :port => nil,
1091
+ :path => "/",
1092
+ :query => nil,
1093
+ :fragment => nil
1094
+ }
1095
+ end
1096
+
1097
+ it "should be identical to its duplicate" do
1098
+ @uri.should == @uri.dup
1099
+ end
1100
+ end
1101
+
1102
+ describe Addressable::URI, "when parsed from " +
1103
+ "'http://example.com./'" do
1104
+ before do
1105
+ @uri = Addressable::URI.parse("http://example.com./")
1106
+ end
1107
+
1108
+ it "should be equivalent to http://example.com" do
1109
+ @uri.should == Addressable::URI.parse("http://example.com")
1110
+ end
1111
+
1112
+ it "should not be considered to be in normal form" do
1113
+ @uri.normalize.should_not be_eql(@uri)
1114
+ end
1115
+
1116
+ it "should be identical to its duplicate" do
1117
+ @uri.should == @uri.dup
1118
+ end
1119
+ end
1120
+
1121
+ describe Addressable::URI, "when parsed from " +
1122
+ "'http://:@example.com/'" do
1123
+ before do
1124
+ @uri = Addressable::URI.parse("http://:@example.com/")
1125
+ end
1126
+
1127
+ it "should be equivalent to http://example.com" do
1128
+ @uri.should == Addressable::URI.parse("http://example.com")
1129
+ end
1130
+
1131
+ it "should correctly convert to a hash" do
1132
+ @uri.to_hash.should == {
1133
+ :scheme => "http",
1134
+ :user => "",
1135
+ :password => "",
1136
+ :host => "example.com",
1137
+ :port => nil,
1138
+ :path => "/",
1139
+ :query => nil,
1140
+ :fragment => nil
1141
+ }
1142
+ end
1143
+
1144
+ it "should be identical to its duplicate" do
1145
+ @uri.should == @uri.dup
1146
+ end
1147
+ end
1148
+
1149
+ describe Addressable::URI, "when parsed from " +
1150
+ "'http://example.com/~smith/'" do
1151
+ before do
1152
+ @uri = Addressable::URI.parse("http://example.com/~smith/")
1153
+ end
1154
+
1155
+ # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
1156
+ it "should be equivalent to http://example.com/%7Esmith/" do
1157
+ @uri.should == Addressable::URI.parse("http://example.com/%7Esmith/")
1158
+ end
1159
+
1160
+ # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
1161
+ it "should be equivalent to http://example.com/%7esmith/" do
1162
+ @uri.should == Addressable::URI.parse("http://example.com/%7esmith/")
1163
+ end
1164
+
1165
+ it "should be identical to its duplicate" do
1166
+ @uri.should == @uri.dup
1167
+ end
1168
+ end
1169
+
1170
+ describe Addressable::URI, "when parsed from " +
1171
+ "'http://example.com/%E8'" do
1172
+ before do
1173
+ @uri = Addressable::URI.parse("http://example.com/%E8")
1174
+ end
1175
+
1176
+ it "should not raise an exception when normalized" do
1177
+ (lambda do
1178
+ @uri.normalize
1179
+ end).should_not raise_error(ArgumentError)
1180
+ end
1181
+
1182
+ it "should be considered to be in normal form" do
1183
+ @uri.normalize.should be_eql(@uri)
1184
+ end
1185
+
1186
+ it "should not change if encoded with the normalizing algorithm" do
1187
+ Addressable::URI.normalized_encode(@uri).to_s.should ==
1188
+ "http://example.com/%E8"
1189
+ Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s.should ===
1190
+ "http://example.com/%E8"
1191
+ end
1192
+ end
1193
+
1194
+ describe Addressable::URI, "when parsed from " +
1195
+ "'http://example.com/path%2Fsegment/'" do
1196
+ before do
1197
+ @uri = Addressable::URI.parse("http://example.com/path%2Fsegment/")
1198
+ end
1199
+
1200
+ it "should be considered to be in normal form" do
1201
+ @uri.normalize.should be_eql(@uri)
1202
+ end
1203
+
1204
+ it "should be equal to 'http://example.com/path%2Fsegment/'" do
1205
+ @uri.normalize.should be_eql(
1206
+ Addressable::URI.parse("http://example.com/path%2Fsegment/")
1207
+ )
1208
+ end
1209
+
1210
+ it "should not be equal to 'http://example.com/path/segment/'" do
1211
+ @uri.should_not ==
1212
+ Addressable::URI.parse("http://example.com/path/segment/")
1213
+ end
1214
+
1215
+ it "should not be equal to 'http://example.com/path/segment/'" do
1216
+ @uri.normalize.should_not be_eql(
1217
+ Addressable::URI.parse("http://example.com/path/segment/")
1218
+ )
1219
+ end
1220
+ end
1221
+
1222
+ describe Addressable::URI, "when parsed from " +
1223
+ "'http://example.com/?%F6'" do
1224
+ before do
1225
+ @uri = Addressable::URI.parse("http://example.com/?%F6")
1226
+ end
1227
+
1228
+ it "should not raise an exception when normalized" do
1229
+ (lambda do
1230
+ @uri.normalize
1231
+ end).should_not raise_error(ArgumentError)
1232
+ end
1233
+
1234
+ it "should be considered to be in normal form" do
1235
+ @uri.normalize.should be_eql(@uri)
1236
+ end
1237
+
1238
+ it "should not change if encoded with the normalizing algorithm" do
1239
+ Addressable::URI.normalized_encode(@uri).to_s.should ==
1240
+ "http://example.com/?%F6"
1241
+ Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s.should ===
1242
+ "http://example.com/?%F6"
1243
+ end
1244
+ end
1245
+
1246
+ describe Addressable::URI, "when parsed from " +
1247
+ "'http://example.com/#%F6'" do
1248
+ before do
1249
+ @uri = Addressable::URI.parse("http://example.com/#%F6")
1250
+ end
1251
+
1252
+ it "should not raise an exception when normalized" do
1253
+ (lambda do
1254
+ @uri.normalize
1255
+ end).should_not raise_error(ArgumentError)
1256
+ end
1257
+
1258
+ it "should be considered to be in normal form" do
1259
+ @uri.normalize.should be_eql(@uri)
1260
+ end
1261
+
1262
+ it "should not change if encoded with the normalizing algorithm" do
1263
+ Addressable::URI.normalized_encode(@uri).to_s.should ==
1264
+ "http://example.com/#%F6"
1265
+ Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s.should ===
1266
+ "http://example.com/#%F6"
1267
+ end
1268
+ end
1269
+
1270
+ describe Addressable::URI, "when parsed from " +
1271
+ "'http://example.com/%C3%87'" do
1272
+ before do
1273
+ @uri = Addressable::URI.parse("http://example.com/%C3%87")
1274
+ end
1275
+
1276
+ # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
1277
+ it "should be equivalent to 'http://example.com/C%CC%A7'" do
1278
+ @uri.should == Addressable::URI.parse("http://example.com/C%CC%A7")
1279
+ end
1280
+
1281
+ it "should not change if encoded with the normalizing algorithm" do
1282
+ Addressable::URI.normalized_encode(@uri).to_s.should ==
1283
+ "http://example.com/%C3%87"
1284
+ Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s.should ===
1285
+ "http://example.com/%C3%87"
1286
+ end
1287
+
1288
+ it "should raise an error if encoding with an unexpected return type" do
1289
+ (lambda do
1290
+ Addressable::URI.normalized_encode(@uri, Integer)
1291
+ end).should raise_error(TypeError)
1292
+ end
1293
+
1294
+ it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do
1295
+ Addressable::URI.encode(@uri).to_s.should ==
1296
+ "http://example.com/%25C3%2587"
1297
+ end
1298
+
1299
+ it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do
1300
+ Addressable::URI.encode(@uri, Addressable::URI).should ==
1301
+ Addressable::URI.parse("http://example.com/%25C3%2587")
1302
+ end
1303
+
1304
+ it "should raise an error if encoding with an unexpected return type" do
1305
+ (lambda do
1306
+ Addressable::URI.encode(@uri, Integer)
1307
+ end).should raise_error(TypeError)
1308
+ end
1309
+
1310
+ it "should be identical to its duplicate" do
1311
+ @uri.should == @uri.dup
1312
+ end
1313
+ end
1314
+
1315
+ describe Addressable::URI, "when parsed from " +
1316
+ "'http://example.com/?q=string'" do
1317
+ before do
1318
+ @uri = Addressable::URI.parse("http://example.com/?q=string")
1319
+ end
1320
+
1321
+ it "should use the 'http' scheme" do
1322
+ @uri.scheme.should == "http"
1323
+ end
1324
+
1325
+ it "should have an authority segment of 'example.com'" do
1326
+ @uri.authority.should == "example.com"
1327
+ end
1328
+
1329
+ it "should have a host of 'example.com'" do
1330
+ @uri.host.should == "example.com"
1331
+ end
1332
+
1333
+ it "should have no username" do
1334
+ @uri.user.should == nil
1335
+ end
1336
+
1337
+ it "should have no password" do
1338
+ @uri.password.should == nil
1339
+ end
1340
+
1341
+ it "should use port 80" do
1342
+ @uri.inferred_port.should == 80
1343
+ end
1344
+
1345
+ it "should have a path of '/'" do
1346
+ @uri.path.should == "/"
1347
+ end
1348
+
1349
+ it "should have a query string of 'q=string'" do
1350
+ @uri.query.should == "q=string"
1351
+ end
1352
+
1353
+ it "should have no fragment" do
1354
+ @uri.fragment.should == nil
1355
+ end
1356
+
1357
+ it "should be considered absolute" do
1358
+ @uri.should be_absolute
1359
+ end
1360
+
1361
+ it "should not be considered relative" do
1362
+ @uri.should_not be_relative
1363
+ end
1364
+
1365
+ it "should be considered to be in normal form" do
1366
+ @uri.normalize.should be_eql(@uri)
1367
+ end
1368
+
1369
+ it "should be identical to its duplicate" do
1370
+ @uri.should == @uri.dup
1371
+ end
1372
+ end
1373
+
1374
+ describe Addressable::URI, "when parsed from " +
1375
+ "'http://example.com:80/'" do
1376
+ before do
1377
+ @uri = Addressable::URI.parse("http://example.com:80/")
1378
+ end
1379
+
1380
+ it "should use the 'http' scheme" do
1381
+ @uri.scheme.should == "http"
1382
+ end
1383
+
1384
+ it "should have an authority segment of 'example.com:80'" do
1385
+ @uri.authority.should == "example.com:80"
1386
+ end
1387
+
1388
+ it "should have a host of 'example.com'" do
1389
+ @uri.host.should == "example.com"
1390
+ end
1391
+
1392
+ it "should have no username" do
1393
+ @uri.user.should == nil
1394
+ end
1395
+
1396
+ it "should have no password" do
1397
+ @uri.password.should == nil
1398
+ end
1399
+
1400
+ it "should use port 80" do
1401
+ @uri.port.should == 80
1402
+ end
1403
+
1404
+ it "should have a path of '/'" do
1405
+ @uri.path.should == "/"
1406
+ end
1407
+
1408
+ it "should have no query string" do
1409
+ @uri.query.should == nil
1410
+ end
1411
+
1412
+ it "should have no fragment" do
1413
+ @uri.fragment.should == nil
1414
+ end
1415
+
1416
+ it "should be considered absolute" do
1417
+ @uri.should be_absolute
1418
+ end
1419
+
1420
+ it "should not be considered relative" do
1421
+ @uri.should_not be_relative
1422
+ end
1423
+
1424
+ it "should be exactly equal to http://example.com:80/" do
1425
+ @uri.eql?(Addressable::URI.parse("http://example.com:80/")).should == true
1426
+ end
1427
+
1428
+ it "should be roughly equal to http://example.com/" do
1429
+ (@uri === Addressable::URI.parse("http://example.com/")).should == true
1430
+ end
1431
+
1432
+ it "should be roughly equal to the string 'http://example.com/'" do
1433
+ (@uri === "http://example.com/").should == true
1434
+ end
1435
+
1436
+ it "should not be roughly equal to the string " +
1437
+ "'http://example.com:bogus/'" do
1438
+ (lambda do
1439
+ (@uri === "http://example.com:bogus/").should == false
1440
+ end).should_not raise_error
1441
+ end
1442
+
1443
+ it "should result in itself when joined with itself" do
1444
+ @uri.join(@uri).to_s.should == "http://example.com:80/"
1445
+ @uri.join!(@uri).to_s.should == "http://example.com:80/"
1446
+ end
1447
+
1448
+ # Section 6.2.3 of RFC 3986
1449
+ it "should be equal to http://example.com/" do
1450
+ @uri.should == Addressable::URI.parse("http://example.com/")
1451
+ end
1452
+
1453
+ # Section 6.2.3 of RFC 3986
1454
+ it "should be equal to http://example.com:/" do
1455
+ @uri.should == Addressable::URI.parse("http://example.com:/")
1456
+ end
1457
+
1458
+ # Section 6.2.3 of RFC 3986
1459
+ it "should be equal to http://example.com:80/" do
1460
+ @uri.should == Addressable::URI.parse("http://example.com:80/")
1461
+ end
1462
+
1463
+ # Section 6.2.2.1 of RFC 3986
1464
+ it "should be equal to http://EXAMPLE.COM/" do
1465
+ @uri.should == Addressable::URI.parse("http://EXAMPLE.COM/")
1466
+ end
1467
+
1468
+ it "should correctly convert to a hash" do
1469
+ @uri.to_hash.should == {
1470
+ :scheme => "http",
1471
+ :user => nil,
1472
+ :password => nil,
1473
+ :host => "example.com",
1474
+ :port => 80,
1475
+ :path => "/",
1476
+ :query => nil,
1477
+ :fragment => nil
1478
+ }
1479
+ end
1480
+
1481
+ it "should be identical to its duplicate" do
1482
+ @uri.should == @uri.dup
1483
+ end
1484
+ end
1485
+
1486
+ describe Addressable::URI, "when parsed from " +
1487
+ "'http://example.com:8080/'" do
1488
+ before do
1489
+ @uri = Addressable::URI.parse("http://example.com:8080/")
1490
+ end
1491
+
1492
+ it "should use the 'http' scheme" do
1493
+ @uri.scheme.should == "http"
1494
+ end
1495
+
1496
+ it "should have an authority segment of 'example.com:8080'" do
1497
+ @uri.authority.should == "example.com:8080"
1498
+ end
1499
+
1500
+ it "should have a host of 'example.com'" do
1501
+ @uri.host.should == "example.com"
1502
+ end
1503
+
1504
+ it "should have no username" do
1505
+ @uri.user.should == nil
1506
+ end
1507
+
1508
+ it "should have no password" do
1509
+ @uri.password.should == nil
1510
+ end
1511
+
1512
+ it "should use port 8080" do
1513
+ @uri.port.should == 8080
1514
+ end
1515
+
1516
+ it "should have a path of '/'" do
1517
+ @uri.path.should == "/"
1518
+ end
1519
+
1520
+ it "should have no query string" do
1521
+ @uri.query.should == nil
1522
+ end
1523
+
1524
+ it "should have no fragment" do
1525
+ @uri.fragment.should == nil
1526
+ end
1527
+
1528
+ it "should be considered absolute" do
1529
+ @uri.should be_absolute
1530
+ end
1531
+
1532
+ it "should not be considered relative" do
1533
+ @uri.should_not be_relative
1534
+ end
1535
+
1536
+ it "should be exactly equal to http://example.com:8080/" do
1537
+ @uri.eql?(Addressable::URI.parse(
1538
+ "http://example.com:8080/")).should == true
1539
+ end
1540
+
1541
+ it "should have a route of 'http://example.com:8080/' from " +
1542
+ "'http://example.com/path/to/'" do
1543
+ @uri.route_from("http://example.com/path/to/").should ==
1544
+ Addressable::URI.parse("http://example.com:8080/")
1545
+ end
1546
+
1547
+ it "should have a route of 'http://example.com:8080/' from " +
1548
+ "'http://example.com:80/path/to/'" do
1549
+ @uri.route_from("http://example.com:80/path/to/").should ==
1550
+ Addressable::URI.parse("http://example.com:8080/")
1551
+ end
1552
+
1553
+ it "should have a route of '/' from " +
1554
+ "'http://example.com:8080/path/to/'" do
1555
+ @uri.route_from("http://example.com:8080/path/to/").should ==
1556
+ Addressable::URI.parse("/")
1557
+ end
1558
+
1559
+ it "should have a route of 'http://example.com:8080/' from " +
1560
+ "'http://user:pass@example.com/path/to/'" do
1561
+ @uri.route_from("http://user:pass@example.com/path/to/").should ==
1562
+ Addressable::URI.parse("http://example.com:8080/")
1563
+ end
1564
+
1565
+ it "should correctly convert to a hash" do
1566
+ @uri.to_hash.should == {
1567
+ :scheme => "http",
1568
+ :user => nil,
1569
+ :password => nil,
1570
+ :host => "example.com",
1571
+ :port => 8080,
1572
+ :path => "/",
1573
+ :query => nil,
1574
+ :fragment => nil
1575
+ }
1576
+ end
1577
+
1578
+ it "should be identical to its duplicate" do
1579
+ @uri.should == @uri.dup
1580
+ end
1581
+ end
1582
+
1583
+ describe Addressable::URI, "when parsed from " +
1584
+ "'http://example.com:%38%30/'" do
1585
+ before do
1586
+ @uri = Addressable::URI.parse("http://example.com:%38%30/")
1587
+ end
1588
+
1589
+ it "should have the correct port" do
1590
+ @uri.port.should == 80
1591
+ end
1592
+
1593
+ it "should not be considered to be in normal form" do
1594
+ @uri.normalize.should_not be_eql(@uri)
1595
+ end
1596
+
1597
+ it "should normalize to 'http://example.com/'" do
1598
+ @uri.normalize.should === "http://example.com/"
1599
+ end
1600
+ end
1601
+
1602
+ describe Addressable::URI, "when parsed from " +
1603
+ "'http://example.com/path/to/resource/'" do
1604
+ before do
1605
+ @uri = Addressable::URI.parse("http://example.com/path/to/resource/")
1606
+ end
1607
+
1608
+ it "should use the 'http' scheme" do
1609
+ @uri.scheme.should == "http"
1610
+ end
1611
+
1612
+ it "should have an authority segment of 'example.com'" do
1613
+ @uri.authority.should == "example.com"
1614
+ end
1615
+
1616
+ it "should have a host of 'example.com'" do
1617
+ @uri.host.should == "example.com"
1618
+ end
1619
+
1620
+ it "should have no username" do
1621
+ @uri.user.should == nil
1622
+ end
1623
+
1624
+ it "should have no password" do
1625
+ @uri.password.should == nil
1626
+ end
1627
+
1628
+ it "should use port 80" do
1629
+ @uri.inferred_port.should == 80
1630
+ end
1631
+
1632
+ it "should have a path of '/path/to/resource/'" do
1633
+ @uri.path.should == "/path/to/resource/"
1634
+ end
1635
+
1636
+ it "should have no query string" do
1637
+ @uri.query.should == nil
1638
+ end
1639
+
1640
+ it "should have no fragment" do
1641
+ @uri.fragment.should == nil
1642
+ end
1643
+
1644
+ it "should be considered absolute" do
1645
+ @uri.should be_absolute
1646
+ end
1647
+
1648
+ it "should not be considered relative" do
1649
+ @uri.should_not be_relative
1650
+ end
1651
+
1652
+ it "should be exactly equal to http://example.com:8080/" do
1653
+ @uri.eql?(Addressable::URI.parse(
1654
+ "http://example.com/path/to/resource/")).should == true
1655
+ end
1656
+
1657
+ it "should have a route of 'resource/' from " +
1658
+ "'http://example.com/path/to/'" do
1659
+ @uri.route_from("http://example.com/path/to/").should ==
1660
+ Addressable::URI.parse("resource/")
1661
+ end
1662
+
1663
+ it "should have a route of 'resource/' from " +
1664
+ "'http://example.com:80/path/to/'" do
1665
+ @uri.route_from("http://example.com:80/path/to/").should ==
1666
+ Addressable::URI.parse("resource/")
1667
+ end
1668
+
1669
+ it "should have a route of 'http://example.com/path/to/' from " +
1670
+ "'http://example.com:8080/path/to/'" do
1671
+ @uri.route_from("http://example.com:8080/path/to/").should ==
1672
+ Addressable::URI.parse("http://example.com/path/to/resource/")
1673
+ end
1674
+
1675
+ it "should have a route of 'http://example.com/path/to/' from " +
1676
+ "'http://user:pass@example.com/path/to/'" do
1677
+ @uri.route_from("http://user:pass@example.com/path/to/").should ==
1678
+ Addressable::URI.parse("http://example.com/path/to/resource/")
1679
+ end
1680
+
1681
+ it "should have a route of '/path/to/resource/' from " +
1682
+ "'http://example.com/to/resource/'" do
1683
+ @uri.route_from("http://example.com/to/resource/").should ==
1684
+ Addressable::URI.parse("/path/to/resource/")
1685
+ end
1686
+
1687
+ it "should correctly convert to a hash" do
1688
+ @uri.to_hash.should == {
1689
+ :scheme => "http",
1690
+ :user => nil,
1691
+ :password => nil,
1692
+ :host => "example.com",
1693
+ :port => nil,
1694
+ :path => "/path/to/resource/",
1695
+ :query => nil,
1696
+ :fragment => nil
1697
+ }
1698
+ end
1699
+
1700
+ it "should be identical to its duplicate" do
1701
+ @uri.should == @uri.dup
1702
+ end
1703
+ end
1704
+
1705
+ describe Addressable::URI, "when parsed from " +
1706
+ "'relative/path/to/resource'" do
1707
+ before do
1708
+ @uri = Addressable::URI.parse("relative/path/to/resource")
1709
+ end
1710
+
1711
+ it "should not have a scheme" do
1712
+ @uri.scheme.should == nil
1713
+ end
1714
+
1715
+ it "should not be considered ip-based" do
1716
+ @uri.should_not be_ip_based
1717
+ end
1718
+
1719
+ it "should not have an authority segment" do
1720
+ @uri.authority.should == nil
1721
+ end
1722
+
1723
+ it "should not have a host" do
1724
+ @uri.host.should == nil
1725
+ end
1726
+
1727
+ it "should have no username" do
1728
+ @uri.user.should == nil
1729
+ end
1730
+
1731
+ it "should have no password" do
1732
+ @uri.password.should == nil
1733
+ end
1734
+
1735
+ it "should not have a port" do
1736
+ @uri.port.should == nil
1737
+ end
1738
+
1739
+ it "should have a path of 'relative/path/to/resource'" do
1740
+ @uri.path.should == "relative/path/to/resource"
1741
+ end
1742
+
1743
+ it "should have no query string" do
1744
+ @uri.query.should == nil
1745
+ end
1746
+
1747
+ it "should have no fragment" do
1748
+ @uri.fragment.should == nil
1749
+ end
1750
+
1751
+ it "should not be considered absolute" do
1752
+ @uri.should_not be_absolute
1753
+ end
1754
+
1755
+ it "should be considered relative" do
1756
+ @uri.should be_relative
1757
+ end
1758
+
1759
+ it "should raise an error if routing is attempted" do
1760
+ (lambda do
1761
+ @uri.route_to("http://example.com/")
1762
+ end).should raise_error(ArgumentError, /relative\/path\/to\/resource/)
1763
+ (lambda do
1764
+ @uri.route_from("http://example.com/")
1765
+ end).should raise_error(ArgumentError, /relative\/path\/to\/resource/)
1766
+ end
1767
+
1768
+ it "when joined with 'another/relative/path' should be " +
1769
+ "'relative/path/to/another/relative/path'" do
1770
+ @uri.join('another/relative/path').should ==
1771
+ Addressable::URI.parse("relative/path/to/another/relative/path")
1772
+ end
1773
+
1774
+ it "should be identical to its duplicate" do
1775
+ @uri.should == @uri.dup
1776
+ end
1777
+ end
1778
+
1779
+ describe Addressable::URI, "when parsed from " +
1780
+ "'relative_path_with_no_slashes'" do
1781
+ before do
1782
+ @uri = Addressable::URI.parse("relative_path_with_no_slashes")
1783
+ end
1784
+
1785
+ it "should not have a scheme" do
1786
+ @uri.scheme.should == nil
1787
+ end
1788
+
1789
+ it "should not be considered ip-based" do
1790
+ @uri.should_not be_ip_based
1791
+ end
1792
+
1793
+ it "should not have an authority segment" do
1794
+ @uri.authority.should == nil
1795
+ end
1796
+
1797
+ it "should not have a host" do
1798
+ @uri.host.should == nil
1799
+ end
1800
+
1801
+ it "should have no username" do
1802
+ @uri.user.should == nil
1803
+ end
1804
+
1805
+ it "should have no password" do
1806
+ @uri.password.should == nil
1807
+ end
1808
+
1809
+ it "should not have a port" do
1810
+ @uri.port.should == nil
1811
+ end
1812
+
1813
+ it "should have a path of 'relative_path_with_no_slashes'" do
1814
+ @uri.path.should == "relative_path_with_no_slashes"
1815
+ end
1816
+
1817
+ it "should have no query string" do
1818
+ @uri.query.should == nil
1819
+ end
1820
+
1821
+ it "should have no fragment" do
1822
+ @uri.fragment.should == nil
1823
+ end
1824
+
1825
+ it "should not be considered absolute" do
1826
+ @uri.should_not be_absolute
1827
+ end
1828
+
1829
+ it "should be considered relative" do
1830
+ @uri.should be_relative
1831
+ end
1832
+
1833
+ it "when joined with 'another_relative_path' should be " +
1834
+ "'another_relative_path'" do
1835
+ @uri.join('another_relative_path').should ==
1836
+ Addressable::URI.parse("another_relative_path")
1837
+ end
1838
+ end
1839
+
1840
+ describe Addressable::URI, "when parsed from " +
1841
+ "'http://example.com/file.txt'" do
1842
+ before do
1843
+ @uri = Addressable::URI.parse("http://example.com/file.txt")
1844
+ end
1845
+
1846
+ it "should have a scheme of 'http'" do
1847
+ @uri.scheme.should == "http"
1848
+ end
1849
+
1850
+ it "should have an authority segment of 'example.com'" do
1851
+ @uri.authority.should == "example.com"
1852
+ end
1853
+
1854
+ it "should have a host of 'example.com'" do
1855
+ @uri.host.should == "example.com"
1856
+ end
1857
+
1858
+ it "should have no username" do
1859
+ @uri.user.should == nil
1860
+ end
1861
+
1862
+ it "should have no password" do
1863
+ @uri.password.should == nil
1864
+ end
1865
+
1866
+ it "should use port 80" do
1867
+ @uri.inferred_port.should == 80
1868
+ end
1869
+
1870
+ it "should have a path of '/file.txt'" do
1871
+ @uri.path.should == "/file.txt"
1872
+ end
1873
+
1874
+ it "should have a basename of 'file.txt'" do
1875
+ @uri.basename.should == "file.txt"
1876
+ end
1877
+
1878
+ it "should have an extname of '.txt'" do
1879
+ @uri.extname.should == ".txt"
1880
+ end
1881
+
1882
+ it "should have no query string" do
1883
+ @uri.query.should == nil
1884
+ end
1885
+
1886
+ it "should have no fragment" do
1887
+ @uri.fragment.should == nil
1888
+ end
1889
+ end
1890
+
1891
+ describe Addressable::URI, "when parsed from " +
1892
+ "'http://example.com/file.txt;parameter'" do
1893
+ before do
1894
+ @uri = Addressable::URI.parse("http://example.com/file.txt;parameter")
1895
+ end
1896
+
1897
+ it "should have a scheme of 'http'" do
1898
+ @uri.scheme.should == "http"
1899
+ end
1900
+
1901
+ it "should have an authority segment of 'example.com'" do
1902
+ @uri.authority.should == "example.com"
1903
+ end
1904
+
1905
+ it "should have a host of 'example.com'" do
1906
+ @uri.host.should == "example.com"
1907
+ end
1908
+
1909
+ it "should have no username" do
1910
+ @uri.user.should == nil
1911
+ end
1912
+
1913
+ it "should have no password" do
1914
+ @uri.password.should == nil
1915
+ end
1916
+
1917
+ it "should use port 80" do
1918
+ @uri.inferred_port.should == 80
1919
+ end
1920
+
1921
+ it "should have a path of '/file.txt;parameter'" do
1922
+ @uri.path.should == "/file.txt;parameter"
1923
+ end
1924
+
1925
+ it "should have a basename of 'file.txt'" do
1926
+ @uri.basename.should == "file.txt"
1927
+ end
1928
+
1929
+ it "should have an extname of '.txt'" do
1930
+ @uri.extname.should == ".txt"
1931
+ end
1932
+
1933
+ it "should have no query string" do
1934
+ @uri.query.should == nil
1935
+ end
1936
+
1937
+ it "should have no fragment" do
1938
+ @uri.fragment.should == nil
1939
+ end
1940
+ end
1941
+
1942
+ describe Addressable::URI, "when parsed from " +
1943
+ "'http://example.com/file.txt;x=y'" do
1944
+ before do
1945
+ @uri = Addressable::URI.parse("http://example.com/file.txt;x=y")
1946
+ end
1947
+
1948
+ it "should have a scheme of 'http'" do
1949
+ @uri.scheme.should == "http"
1950
+ end
1951
+
1952
+ it "should have a scheme of 'http'" do
1953
+ @uri.scheme.should == "http"
1954
+ end
1955
+
1956
+ it "should have an authority segment of 'example.com'" do
1957
+ @uri.authority.should == "example.com"
1958
+ end
1959
+
1960
+ it "should have a host of 'example.com'" do
1961
+ @uri.host.should == "example.com"
1962
+ end
1963
+
1964
+ it "should have no username" do
1965
+ @uri.user.should == nil
1966
+ end
1967
+
1968
+ it "should have no password" do
1969
+ @uri.password.should == nil
1970
+ end
1971
+
1972
+ it "should use port 80" do
1973
+ @uri.inferred_port.should == 80
1974
+ end
1975
+
1976
+ it "should have a path of '/file.txt;x=y'" do
1977
+ @uri.path.should == "/file.txt;x=y"
1978
+ end
1979
+
1980
+ it "should have an extname of '.txt'" do
1981
+ @uri.extname.should == ".txt"
1982
+ end
1983
+
1984
+ it "should have no query string" do
1985
+ @uri.query.should == nil
1986
+ end
1987
+
1988
+ it "should have no fragment" do
1989
+ @uri.fragment.should == nil
1990
+ end
1991
+
1992
+ it "should be considered to be in normal form" do
1993
+ @uri.normalize.should be_eql(@uri)
1994
+ end
1995
+ end
1996
+
1997
+ describe Addressable::URI, "when parsed from " +
1998
+ "'svn+ssh://developername@rubyforge.org/var/svn/project'" do
1999
+ before do
2000
+ @uri = Addressable::URI.parse(
2001
+ "svn+ssh://developername@rubyforge.org/var/svn/project"
2002
+ )
2003
+ end
2004
+
2005
+ it "should have a scheme of 'svn+ssh'" do
2006
+ @uri.scheme.should == "svn+ssh"
2007
+ end
2008
+
2009
+ it "should be considered to be ip-based" do
2010
+ @uri.should be_ip_based
2011
+ end
2012
+
2013
+ it "should have a path of '/var/svn/project'" do
2014
+ @uri.path.should == "/var/svn/project"
2015
+ end
2016
+
2017
+ it "should have a username of 'developername'" do
2018
+ @uri.user.should == "developername"
2019
+ end
2020
+
2021
+ it "should have no password" do
2022
+ @uri.password.should == nil
2023
+ end
2024
+
2025
+ it "should be considered to be in normal form" do
2026
+ @uri.normalize.should be_eql(@uri)
2027
+ end
2028
+ end
2029
+
2030
+ describe Addressable::URI, "when parsed from " +
2031
+ "'ssh+svn://developername@RUBYFORGE.ORG/var/svn/project'" do
2032
+ before do
2033
+ @uri = Addressable::URI.parse(
2034
+ "ssh+svn://developername@RUBYFORGE.ORG/var/svn/project"
2035
+ )
2036
+ end
2037
+
2038
+ it "should have a scheme of 'ssh+svn'" do
2039
+ @uri.scheme.should == "ssh+svn"
2040
+ end
2041
+
2042
+ it "should have a normalized scheme of 'svn+ssh'" do
2043
+ @uri.normalized_scheme.should == "svn+ssh"
2044
+ end
2045
+
2046
+ it "should have a normalized site of 'svn+ssh'" do
2047
+ @uri.normalized_site.should == "svn+ssh://developername@rubyforge.org"
2048
+ end
2049
+
2050
+ it "should not be considered to be ip-based" do
2051
+ @uri.should_not be_ip_based
2052
+ end
2053
+
2054
+ it "should have a path of '/var/svn/project'" do
2055
+ @uri.path.should == "/var/svn/project"
2056
+ end
2057
+
2058
+ it "should have a username of 'developername'" do
2059
+ @uri.user.should == "developername"
2060
+ end
2061
+
2062
+ it "should have no password" do
2063
+ @uri.password.should == nil
2064
+ end
2065
+
2066
+ it "should not be considered to be in normal form" do
2067
+ @uri.normalize.should_not be_eql(@uri)
2068
+ end
2069
+ end
2070
+
2071
+ describe Addressable::URI, "when parsed from " +
2072
+ "'mailto:user@example.com'" do
2073
+ before do
2074
+ @uri = Addressable::URI.parse("mailto:user@example.com")
2075
+ end
2076
+
2077
+ it "should have a scheme of 'mailto'" do
2078
+ @uri.scheme.should == "mailto"
2079
+ end
2080
+
2081
+ it "should not be considered to be ip-based" do
2082
+ @uri.should_not be_ip_based
2083
+ end
2084
+
2085
+ it "should have a path of 'user@example.com'" do
2086
+ @uri.path.should == "user@example.com"
2087
+ end
2088
+
2089
+ it "should have no user" do
2090
+ @uri.user.should == nil
2091
+ end
2092
+
2093
+ it "should be considered to be in normal form" do
2094
+ @uri.normalize.should be_eql(@uri)
2095
+ end
2096
+ end
2097
+
2098
+ describe Addressable::URI, "when parsed from " +
2099
+ "'tag:example.com,2006-08-18:/path/to/something'" do
2100
+ before do
2101
+ @uri = Addressable::URI.parse(
2102
+ "tag:example.com,2006-08-18:/path/to/something")
2103
+ end
2104
+
2105
+ it "should have a scheme of 'tag'" do
2106
+ @uri.scheme.should == "tag"
2107
+ end
2108
+
2109
+ it "should be considered to be ip-based" do
2110
+ @uri.should_not be_ip_based
2111
+ end
2112
+
2113
+ it "should have a path of " +
2114
+ "'example.com,2006-08-18:/path/to/something'" do
2115
+ @uri.path.should == "example.com,2006-08-18:/path/to/something"
2116
+ end
2117
+
2118
+ it "should have no user" do
2119
+ @uri.user.should == nil
2120
+ end
2121
+
2122
+ it "should be considered to be in normal form" do
2123
+ @uri.normalize.should be_eql(@uri)
2124
+ end
2125
+ end
2126
+
2127
+ describe Addressable::URI, "when parsed from " +
2128
+ "'http://example.com/x;y/'" do
2129
+ before do
2130
+ @uri = Addressable::URI.parse("http://example.com/x;y/")
2131
+ end
2132
+
2133
+ it "should be considered to be in normal form" do
2134
+ @uri.normalize.should be_eql(@uri)
2135
+ end
2136
+ end
2137
+
2138
+ describe Addressable::URI, "when parsed from " +
2139
+ "'http://example.com/?x=1&y=2'" do
2140
+ before do
2141
+ @uri = Addressable::URI.parse("http://example.com/?x=1&y=2")
2142
+ end
2143
+
2144
+ it "should be considered to be in normal form" do
2145
+ @uri.normalize.should be_eql(@uri)
2146
+ end
2147
+ end
2148
+
2149
+ describe Addressable::URI, "when parsed from " +
2150
+ "'view-source:http://example.com/'" do
2151
+ before do
2152
+ @uri = Addressable::URI.parse("view-source:http://example.com/")
2153
+ end
2154
+
2155
+ it "should have a scheme of 'view-source'" do
2156
+ @uri.scheme.should == "view-source"
2157
+ end
2158
+
2159
+ it "should have a path of 'http://example.com/'" do
2160
+ @uri.path.should == "http://example.com/"
2161
+ end
2162
+
2163
+ it "should be considered to be in normal form" do
2164
+ @uri.normalize.should be_eql(@uri)
2165
+ end
2166
+ end
2167
+
2168
+ describe Addressable::URI, "when parsed from " +
2169
+ "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do
2170
+ before do
2171
+ @uri = Addressable::URI.parse(
2172
+ "http://user:pass@example.com/path/to/resource?query=x#fragment")
2173
+ end
2174
+
2175
+ it "should use the 'http' scheme" do
2176
+ @uri.scheme.should == "http"
2177
+ end
2178
+
2179
+ it "should have an authority segment of 'user:pass@example.com'" do
2180
+ @uri.authority.should == "user:pass@example.com"
2181
+ end
2182
+
2183
+ it "should have a username of 'user'" do
2184
+ @uri.user.should == "user"
2185
+ end
2186
+
2187
+ it "should have a password of 'pass'" do
2188
+ @uri.password.should == "pass"
2189
+ end
2190
+
2191
+ it "should have a host of 'example.com'" do
2192
+ @uri.host.should == "example.com"
2193
+ end
2194
+
2195
+ it "should use port 80" do
2196
+ @uri.inferred_port.should == 80
2197
+ end
2198
+
2199
+ it "should have a path of '/path/to/resource'" do
2200
+ @uri.path.should == "/path/to/resource"
2201
+ end
2202
+
2203
+ it "should have a query string of 'query=x'" do
2204
+ @uri.query.should == "query=x"
2205
+ end
2206
+
2207
+ it "should have a fragment of 'fragment'" do
2208
+ @uri.fragment.should == "fragment"
2209
+ end
2210
+
2211
+ it "should be considered to be in normal form" do
2212
+ @uri.normalize.should be_eql(@uri)
2213
+ end
2214
+
2215
+ it "should have a route of '/path/' to " +
2216
+ "'http://user:pass@example.com/path/'" do
2217
+ @uri.route_to("http://user:pass@example.com/path/").should ==
2218
+ Addressable::URI.parse("/path/")
2219
+ end
2220
+
2221
+ it "should have a route of '/path/to/resource?query=x#fragment' " +
2222
+ "from 'http://user:pass@example.com/path/'" do
2223
+ @uri.route_from("http://user:pass@example.com/path/").should ==
2224
+ Addressable::URI.parse("to/resource?query=x#fragment")
2225
+ end
2226
+
2227
+ it "should have a route of '?query=x#fragment' " +
2228
+ "from 'http://user:pass@example.com/path/to/resource'" do
2229
+ @uri.route_from("http://user:pass@example.com/path/to/resource").should ==
2230
+ Addressable::URI.parse("?query=x#fragment")
2231
+ end
2232
+
2233
+ it "should have a route of '#fragment' " +
2234
+ "from 'http://user:pass@example.com/path/to/resource?query=x'" do
2235
+ @uri.route_from(
2236
+ "http://user:pass@example.com/path/to/resource?query=x").should ==
2237
+ Addressable::URI.parse("#fragment")
2238
+ end
2239
+
2240
+ it "should have a route of '#fragment' from " +
2241
+ "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do
2242
+ @uri.route_from(
2243
+ "http://user:pass@example.com/path/to/resource?query=x#fragment"
2244
+ ).should == Addressable::URI.parse("#fragment")
2245
+ end
2246
+
2247
+ it "should have a route of 'http://elsewhere.com/' to " +
2248
+ "'http://elsewhere.com/'" do
2249
+ @uri.route_to("http://elsewhere.com/").should ==
2250
+ Addressable::URI.parse("http://elsewhere.com/")
2251
+ end
2252
+
2253
+ it "should have a route of " +
2254
+ "'http://user:pass@example.com/path/to/resource?query=x#fragment' " +
2255
+ "from 'http://example.com/path/to/'" do
2256
+ @uri.route_from("http://elsewhere.com/path/to/").should ==
2257
+ Addressable::URI.parse(
2258
+ "http://user:pass@example.com/path/to/resource?query=x#fragment")
2259
+ end
2260
+
2261
+ it "should have the correct scheme after assignment" do
2262
+ @uri.scheme = "ftp"
2263
+ @uri.scheme.should == "ftp"
2264
+ @uri.to_s.should ==
2265
+ "ftp://user:pass@example.com/path/to/resource?query=x#fragment"
2266
+ @uri.to_str.should ==
2267
+ "ftp://user:pass@example.com/path/to/resource?query=x#fragment"
2268
+ @uri.scheme = "bogus!"
2269
+ @uri.scheme.should == "bogus!"
2270
+ @uri.normalized_scheme.should == "bogus%21"
2271
+ @uri.normalize.to_s.should ==
2272
+ "bogus%21://user:pass@example.com/path/to/resource?query=x#fragment"
2273
+ @uri.normalize.to_str.should ==
2274
+ "bogus%21://user:pass@example.com/path/to/resource?query=x#fragment"
2275
+ end
2276
+
2277
+ it "should have the correct site segment after assignment" do
2278
+ @uri.site = "https://newuser:newpass@example.com:443"
2279
+ @uri.scheme.should == "https"
2280
+ @uri.authority.should == "newuser:newpass@example.com:443"
2281
+ @uri.user.should == "newuser"
2282
+ @uri.password.should == "newpass"
2283
+ @uri.userinfo.should == "newuser:newpass"
2284
+ @uri.normalized_userinfo.should == "newuser:newpass"
2285
+ @uri.host.should == "example.com"
2286
+ @uri.port.should == 443
2287
+ @uri.inferred_port.should == 443
2288
+ @uri.to_s.should ==
2289
+ "https://newuser:newpass@example.com:443" +
2290
+ "/path/to/resource?query=x#fragment"
2291
+ end
2292
+
2293
+ it "should have the correct authority segment after assignment" do
2294
+ @uri.authority = "newuser:newpass@example.com:80"
2295
+ @uri.authority.should == "newuser:newpass@example.com:80"
2296
+ @uri.user.should == "newuser"
2297
+ @uri.password.should == "newpass"
2298
+ @uri.userinfo.should == "newuser:newpass"
2299
+ @uri.normalized_userinfo.should == "newuser:newpass"
2300
+ @uri.host.should == "example.com"
2301
+ @uri.port.should == 80
2302
+ @uri.inferred_port.should == 80
2303
+ @uri.to_s.should ==
2304
+ "http://newuser:newpass@example.com:80" +
2305
+ "/path/to/resource?query=x#fragment"
2306
+ end
2307
+
2308
+ it "should have the correct userinfo segment after assignment" do
2309
+ @uri.userinfo = "newuser:newpass"
2310
+ @uri.userinfo.should == "newuser:newpass"
2311
+ @uri.authority.should == "newuser:newpass@example.com"
2312
+ @uri.user.should == "newuser"
2313
+ @uri.password.should == "newpass"
2314
+ @uri.host.should == "example.com"
2315
+ @uri.port.should == nil
2316
+ @uri.inferred_port.should == 80
2317
+ @uri.to_s.should ==
2318
+ "http://newuser:newpass@example.com" +
2319
+ "/path/to/resource?query=x#fragment"
2320
+ end
2321
+
2322
+ it "should have the correct username after assignment" do
2323
+ @uri.user = "newuser"
2324
+ @uri.user.should == "newuser"
2325
+ @uri.authority.should == "newuser:pass@example.com"
2326
+ end
2327
+
2328
+ it "should have the correct password after assignment" do
2329
+ @uri.password = "newpass"
2330
+ @uri.password.should == "newpass"
2331
+ @uri.authority.should == "user:newpass@example.com"
2332
+ end
2333
+
2334
+ it "should have the correct host after assignment" do
2335
+ @uri.host = "newexample.com"
2336
+ @uri.host.should == "newexample.com"
2337
+ @uri.authority.should == "user:pass@newexample.com"
2338
+ end
2339
+
2340
+ it "should have the correct port after assignment" do
2341
+ @uri.port = 8080
2342
+ @uri.port.should == 8080
2343
+ @uri.authority.should == "user:pass@example.com:8080"
2344
+ end
2345
+
2346
+ it "should have the correct path after assignment" do
2347
+ @uri.path = "/newpath/to/resource"
2348
+ @uri.path.should == "/newpath/to/resource"
2349
+ @uri.to_s.should ==
2350
+ "http://user:pass@example.com/newpath/to/resource?query=x#fragment"
2351
+ end
2352
+
2353
+ it "should have the correct scheme and authority after nil assignment" do
2354
+ @uri.site = nil
2355
+ @uri.scheme.should == nil
2356
+ @uri.authority.should == nil
2357
+ @uri.to_s.should == "/path/to/resource?query=x#fragment"
2358
+ end
2359
+
2360
+ it "should have the correct scheme and authority after assignment" do
2361
+ @uri.site = "file://"
2362
+ @uri.scheme.should == "file"
2363
+ @uri.authority.should == ""
2364
+ @uri.to_s.should == "file:///path/to/resource?query=x#fragment"
2365
+ end
2366
+
2367
+ it "should have the correct path after nil assignment" do
2368
+ @uri.path = nil
2369
+ @uri.path.should == ""
2370
+ @uri.to_s.should ==
2371
+ "http://user:pass@example.com?query=x#fragment"
2372
+ end
2373
+
2374
+ it "should have the correct query string after assignment" do
2375
+ @uri.query = "newquery=x"
2376
+ @uri.query.should == "newquery=x"
2377
+ @uri.to_s.should ==
2378
+ "http://user:pass@example.com/path/to/resource?newquery=x#fragment"
2379
+ @uri.query = nil
2380
+ @uri.query.should == nil
2381
+ @uri.to_s.should ==
2382
+ "http://user:pass@example.com/path/to/resource#fragment"
2383
+ end
2384
+
2385
+ it "should have the correct query string after hash assignment" do
2386
+ @uri.query_values = {"?uestion mark"=>"=sign", "hello"=>"g\xC3\xBCnther"}
2387
+ @uri.query.split("&").should include("%3Fuestion%20mark=%3Dsign")
2388
+ @uri.query.split("&").should include("hello=g%C3%BCnther")
2389
+ @uri.query_values.should == {
2390
+ "?uestion mark"=>"=sign", "hello"=>"g\xC3\xBCnther"
2391
+ }
2392
+ end
2393
+
2394
+ it "should have the correct query string after flag hash assignment" do
2395
+ @uri.query_values = {'flag?1' => true, 'fl=ag2' => true, 'flag3' => true}
2396
+ @uri.query.split("&").should include("flag%3F1")
2397
+ @uri.query.split("&").should include("fl%3Dag2")
2398
+ @uri.query.split("&").should include("flag3")
2399
+ @uri.query_values.should == {
2400
+ 'flag?1' => true, 'fl=ag2' => true, 'flag3' => true
2401
+ }
2402
+ end
2403
+
2404
+ it "should raise an error if query values are set to a bogus type" do
2405
+ (lambda do
2406
+ @uri.query_values = "bogus"
2407
+ end).should raise_error(TypeError)
2408
+ end
2409
+
2410
+ it "should have the correct fragment after assignment" do
2411
+ @uri.fragment = "newfragment"
2412
+ @uri.fragment.should == "newfragment"
2413
+ @uri.to_s.should ==
2414
+ "http://user:pass@example.com/path/to/resource?query=x#newfragment"
2415
+
2416
+ @uri.fragment = nil
2417
+ @uri.fragment.should == nil
2418
+ @uri.to_s.should ==
2419
+ "http://user:pass@example.com/path/to/resource?query=x"
2420
+ end
2421
+
2422
+ it "should have the correct values after a merge" do
2423
+ @uri.merge(:fragment => "newfragment").to_s.should ==
2424
+ "http://user:pass@example.com/path/to/resource?query=x#newfragment"
2425
+ end
2426
+
2427
+ it "should have the correct values after a merge" do
2428
+ @uri.merge(:fragment => nil).to_s.should ==
2429
+ "http://user:pass@example.com/path/to/resource?query=x"
2430
+ end
2431
+
2432
+ it "should have the correct values after a merge" do
2433
+ @uri.merge(:userinfo => "newuser:newpass").to_s.should ==
2434
+ "http://newuser:newpass@example.com/path/to/resource?query=x#fragment"
2435
+ end
2436
+
2437
+ it "should have the correct values after a merge" do
2438
+ @uri.merge(:userinfo => nil).to_s.should ==
2439
+ "http://example.com/path/to/resource?query=x#fragment"
2440
+ end
2441
+
2442
+ it "should have the correct values after a merge" do
2443
+ @uri.merge(:path => "newpath").to_s.should ==
2444
+ "http://user:pass@example.com/newpath?query=x#fragment"
2445
+ end
2446
+
2447
+ it "should have the correct values after a merge" do
2448
+ @uri.merge(:port => "42", :path => "newpath", :query => "").to_s.should ==
2449
+ "http://user:pass@example.com:42/newpath?#fragment"
2450
+ end
2451
+
2452
+ it "should have the correct values after a merge" do
2453
+ @uri.merge(:authority => "foo:bar@baz:42").to_s.should ==
2454
+ "http://foo:bar@baz:42/path/to/resource?query=x#fragment"
2455
+ # Ensure the operation was not destructive
2456
+ @uri.to_s.should ==
2457
+ "http://user:pass@example.com/path/to/resource?query=x#fragment"
2458
+ end
2459
+
2460
+ it "should have the correct values after a destructive merge" do
2461
+ @uri.merge!(:authority => "foo:bar@baz:42")
2462
+ # Ensure the operation was destructive
2463
+ @uri.to_s.should ==
2464
+ "http://foo:bar@baz:42/path/to/resource?query=x#fragment"
2465
+ end
2466
+
2467
+ it "should fail to merge with bogus values" do
2468
+ (lambda do
2469
+ @uri.merge(:port => "bogus")
2470
+ end).should raise_error(Addressable::URI::InvalidURIError)
2471
+ end
2472
+
2473
+ it "should fail to merge with bogus values" do
2474
+ (lambda do
2475
+ @uri.merge(:authority => "bar@baz:bogus")
2476
+ end).should raise_error(Addressable::URI::InvalidURIError)
2477
+ end
2478
+
2479
+ it "should fail to merge with bogus parameters" do
2480
+ (lambda do
2481
+ @uri.merge(42)
2482
+ end).should raise_error(TypeError)
2483
+ end
2484
+
2485
+ it "should fail to merge with bogus parameters" do
2486
+ (lambda do
2487
+ @uri.merge("http://example.com/")
2488
+ end).should raise_error(TypeError)
2489
+ end
2490
+
2491
+ it "should fail to merge with both authority and subcomponents" do
2492
+ (lambda do
2493
+ @uri.merge(:authority => "foo:bar@baz:42", :port => "42")
2494
+ end).should raise_error(ArgumentError)
2495
+ end
2496
+
2497
+ it "should fail to merge with both userinfo and subcomponents" do
2498
+ (lambda do
2499
+ @uri.merge(:userinfo => "foo:bar", :user => "foo")
2500
+ end).should raise_error(ArgumentError)
2501
+ end
2502
+
2503
+ it "should be identical to its duplicate" do
2504
+ @uri.should == @uri.dup
2505
+ end
2506
+ end
2507
+
2508
+ describe Addressable::URI, "when parsed from " +
2509
+ "'http://example.com/?q&&x=b'" do
2510
+ before do
2511
+ @uri = Addressable::URI.parse("http://example.com/?q&&x=b")
2512
+ end
2513
+
2514
+ it "should have a query of 'q&&x=b'" do
2515
+ @uri.query.should == "q&&x=b"
2516
+ end
2517
+
2518
+ it "should have query_values of {'q' => true, 'x' => 'b'}" do
2519
+ @uri.query_values.should == {'q' => true, 'x' => 'b'}
2520
+ end
2521
+ end
2522
+
2523
+ describe Addressable::URI, "when parsed from " +
2524
+ "'http://example.com/?q=a+b'" do
2525
+ before do
2526
+ @uri = Addressable::URI.parse("http://example.com/?q=a+b")
2527
+ end
2528
+
2529
+ it "should have a query of 'q=a+b'" do
2530
+ @uri.query.should == "q=a+b"
2531
+ end
2532
+
2533
+ it "should have query_values of {'q' => 'a b'}" do
2534
+ @uri.query_values.should == {'q' => 'a b'}
2535
+ end
2536
+ end
2537
+
2538
+ describe Addressable::URI, "when parsed from " +
2539
+ "'http://example.com/?q=a%2bb'" do
2540
+ before do
2541
+ @uri = Addressable::URI.parse("http://example.com/?q=a%2bb")
2542
+ end
2543
+
2544
+ it "should have a query of 'q=a+b'" do
2545
+ @uri.query.should == "q=a%2bb"
2546
+ end
2547
+
2548
+ it "should have query_values of {'q' => 'a+b'}" do
2549
+ @uri.query_values.should == {'q' => 'a+b'}
2550
+ end
2551
+ end
2552
+
2553
+ describe Addressable::URI, "when parsed from " +
2554
+ "'http://example.com/?q='" do
2555
+ before do
2556
+ @uri = Addressable::URI.parse("http://example.com/?q=")
2557
+ end
2558
+
2559
+ it "should have a query of 'q='" do
2560
+ @uri.query.should == "q="
2561
+ end
2562
+
2563
+ it "should have query_values of {'q' => ''}" do
2564
+ @uri.query_values.should == {'q' => ''}
2565
+ end
2566
+ end
2567
+
2568
+ describe Addressable::URI, "when parsed from " +
2569
+ "'http://user@example.com'" do
2570
+ before do
2571
+ @uri = Addressable::URI.parse("http://user@example.com")
2572
+ end
2573
+
2574
+ it "should use the 'http' scheme" do
2575
+ @uri.scheme.should == "http"
2576
+ end
2577
+
2578
+ it "should have a username of 'user'" do
2579
+ @uri.user.should == "user"
2580
+ end
2581
+
2582
+ it "should have no password" do
2583
+ @uri.password.should == nil
2584
+ end
2585
+
2586
+ it "should have a userinfo of 'user'" do
2587
+ @uri.userinfo.should == "user"
2588
+ end
2589
+
2590
+ it "should have a normalized userinfo of 'user'" do
2591
+ @uri.normalized_userinfo.should == "user"
2592
+ end
2593
+
2594
+ it "should have a host of 'example.com'" do
2595
+ @uri.host.should == "example.com"
2596
+ end
2597
+
2598
+ it "should use port 80" do
2599
+ @uri.inferred_port.should == 80
2600
+ end
2601
+
2602
+ it "should have the correct username after assignment" do
2603
+ @uri.user = "newuser"
2604
+ @uri.user.should == "newuser"
2605
+ @uri.password.should == nil
2606
+ @uri.to_s.should == "http://newuser@example.com"
2607
+ end
2608
+
2609
+ it "should have the correct password after assignment" do
2610
+ @uri.password = "newpass"
2611
+ @uri.password.should == "newpass"
2612
+ @uri.to_s.should == "http://user:newpass@example.com"
2613
+ end
2614
+
2615
+ it "should have the correct userinfo segment after assignment" do
2616
+ @uri.userinfo = "newuser:newpass"
2617
+ @uri.userinfo.should == "newuser:newpass"
2618
+ @uri.user.should == "newuser"
2619
+ @uri.password.should == "newpass"
2620
+ @uri.host.should == "example.com"
2621
+ @uri.port.should == nil
2622
+ @uri.inferred_port.should == 80
2623
+ @uri.to_s.should == "http://newuser:newpass@example.com"
2624
+ end
2625
+
2626
+ it "should have the correct userinfo segment after nil assignment" do
2627
+ @uri.userinfo = nil
2628
+ @uri.userinfo.should == nil
2629
+ @uri.user.should == nil
2630
+ @uri.password.should == nil
2631
+ @uri.host.should == "example.com"
2632
+ @uri.port.should == nil
2633
+ @uri.inferred_port.should == 80
2634
+ @uri.to_s.should == "http://example.com"
2635
+ end
2636
+
2637
+ it "should have the correct authority segment after assignment" do
2638
+ @uri.authority = "newuser@example.com"
2639
+ @uri.authority.should == "newuser@example.com"
2640
+ @uri.user.should == "newuser"
2641
+ @uri.password.should == nil
2642
+ @uri.host.should == "example.com"
2643
+ @uri.port.should == nil
2644
+ @uri.inferred_port.should == 80
2645
+ @uri.to_s.should == "http://newuser@example.com"
2646
+ end
2647
+
2648
+ it "should raise an error after nil assignment of authority segment" do
2649
+ (lambda do
2650
+ # This would create an invalid URI
2651
+ @uri.authority = nil
2652
+ end).should raise_error
2653
+ end
2654
+ end
2655
+
2656
+ describe Addressable::URI, "when parsed from " +
2657
+ "'http://user:@example.com'" do
2658
+ before do
2659
+ @uri = Addressable::URI.parse("http://user:@example.com")
2660
+ end
2661
+
2662
+ it "should use the 'http' scheme" do
2663
+ @uri.scheme.should == "http"
2664
+ end
2665
+
2666
+ it "should have a username of 'user'" do
2667
+ @uri.user.should == "user"
2668
+ end
2669
+
2670
+ it "should have a password of ''" do
2671
+ @uri.password.should == ""
2672
+ end
2673
+
2674
+ it "should have a normalized userinfo of 'user:'" do
2675
+ @uri.normalized_userinfo.should == "user:"
2676
+ end
2677
+
2678
+ it "should have a host of 'example.com'" do
2679
+ @uri.host.should == "example.com"
2680
+ end
2681
+
2682
+ it "should use port 80" do
2683
+ @uri.inferred_port.should == 80
2684
+ end
2685
+
2686
+ it "should have the correct username after assignment" do
2687
+ @uri.user = "newuser"
2688
+ @uri.user.should == "newuser"
2689
+ @uri.password.should == ""
2690
+ @uri.to_s.should == "http://newuser:@example.com"
2691
+ end
2692
+
2693
+ it "should have the correct password after assignment" do
2694
+ @uri.password = "newpass"
2695
+ @uri.password.should == "newpass"
2696
+ @uri.to_s.should == "http://user:newpass@example.com"
2697
+ end
2698
+
2699
+ it "should have the correct authority segment after assignment" do
2700
+ @uri.authority = "newuser:@example.com"
2701
+ @uri.authority.should == "newuser:@example.com"
2702
+ @uri.user.should == "newuser"
2703
+ @uri.password.should == ""
2704
+ @uri.host.should == "example.com"
2705
+ @uri.port.should == nil
2706
+ @uri.inferred_port.should == 80
2707
+ @uri.to_s.should == "http://newuser:@example.com"
2708
+ end
2709
+ end
2710
+
2711
+ describe Addressable::URI, "when parsed from " +
2712
+ "'http://:pass@example.com'" do
2713
+ before do
2714
+ @uri = Addressable::URI.parse("http://:pass@example.com")
2715
+ end
2716
+
2717
+ it "should use the 'http' scheme" do
2718
+ @uri.scheme.should == "http"
2719
+ end
2720
+
2721
+ it "should have a username of ''" do
2722
+ @uri.user.should == ""
2723
+ end
2724
+
2725
+ it "should have a password of 'pass'" do
2726
+ @uri.password.should == "pass"
2727
+ end
2728
+
2729
+ it "should have a userinfo of ':pass'" do
2730
+ @uri.userinfo.should == ":pass"
2731
+ end
2732
+
2733
+ it "should have a normalized userinfo of ':pass'" do
2734
+ @uri.normalized_userinfo.should == ":pass"
2735
+ end
2736
+
2737
+ it "should have a host of 'example.com'" do
2738
+ @uri.host.should == "example.com"
2739
+ end
2740
+
2741
+ it "should use port 80" do
2742
+ @uri.inferred_port.should == 80
2743
+ end
2744
+
2745
+ it "should have the correct username after assignment" do
2746
+ @uri.user = "newuser"
2747
+ @uri.user.should == "newuser"
2748
+ @uri.password.should == "pass"
2749
+ @uri.to_s.should == "http://newuser:pass@example.com"
2750
+ end
2751
+
2752
+ it "should have the correct password after assignment" do
2753
+ @uri.password = "newpass"
2754
+ @uri.password.should == "newpass"
2755
+ @uri.user.should == ""
2756
+ @uri.to_s.should == "http://:newpass@example.com"
2757
+ end
2758
+
2759
+ it "should have the correct authority segment after assignment" do
2760
+ @uri.authority = ":newpass@example.com"
2761
+ @uri.authority.should == ":newpass@example.com"
2762
+ @uri.user.should == ""
2763
+ @uri.password.should == "newpass"
2764
+ @uri.host.should == "example.com"
2765
+ @uri.port.should == nil
2766
+ @uri.inferred_port.should == 80
2767
+ @uri.to_s.should == "http://:newpass@example.com"
2768
+ end
2769
+ end
2770
+
2771
+ describe Addressable::URI, "when parsed from " +
2772
+ "'http://:@example.com'" do
2773
+ before do
2774
+ @uri = Addressable::URI.parse("http://:@example.com")
2775
+ end
2776
+
2777
+ it "should use the 'http' scheme" do
2778
+ @uri.scheme.should == "http"
2779
+ end
2780
+
2781
+ it "should have a username of ''" do
2782
+ @uri.user.should == ""
2783
+ end
2784
+
2785
+ it "should have a password of ''" do
2786
+ @uri.password.should == ""
2787
+ end
2788
+
2789
+ it "should have a normalized userinfo of nil" do
2790
+ @uri.normalized_userinfo.should == nil
2791
+ end
2792
+
2793
+ it "should have a host of 'example.com'" do
2794
+ @uri.host.should == "example.com"
2795
+ end
2796
+
2797
+ it "should use port 80" do
2798
+ @uri.inferred_port.should == 80
2799
+ end
2800
+
2801
+ it "should have the correct username after assignment" do
2802
+ @uri.user = "newuser"
2803
+ @uri.user.should == "newuser"
2804
+ @uri.password.should == ""
2805
+ @uri.to_s.should == "http://newuser:@example.com"
2806
+ end
2807
+
2808
+ it "should have the correct password after assignment" do
2809
+ @uri.password = "newpass"
2810
+ @uri.password.should == "newpass"
2811
+ @uri.user.should == ""
2812
+ @uri.to_s.should == "http://:newpass@example.com"
2813
+ end
2814
+
2815
+ it "should have the correct authority segment after assignment" do
2816
+ @uri.authority = ":@newexample.com"
2817
+ @uri.authority.should == ":@newexample.com"
2818
+ @uri.user.should == ""
2819
+ @uri.password.should == ""
2820
+ @uri.host.should == "newexample.com"
2821
+ @uri.port.should == nil
2822
+ @uri.inferred_port.should == 80
2823
+ @uri.to_s.should == "http://:@newexample.com"
2824
+ end
2825
+ end
2826
+
2827
+ describe Addressable::URI, "when parsed from " +
2828
+ "'#example'" do
2829
+ before do
2830
+ @uri = Addressable::URI.parse("#example")
2831
+ end
2832
+
2833
+ it "should be considered relative" do
2834
+ @uri.should be_relative
2835
+ end
2836
+
2837
+ it "should have a host of nil" do
2838
+ @uri.host.should == nil
2839
+ end
2840
+
2841
+ it "should have a site of nil" do
2842
+ @uri.site.should == nil
2843
+ end
2844
+
2845
+ it "should have a normalized_site of nil" do
2846
+ @uri.normalized_site.should == nil
2847
+ end
2848
+
2849
+ it "should have a path of ''" do
2850
+ @uri.path.should == ""
2851
+ end
2852
+
2853
+ it "should have a query string of nil" do
2854
+ @uri.query.should == nil
2855
+ end
2856
+
2857
+ it "should have a fragment of 'example'" do
2858
+ @uri.fragment.should == "example"
2859
+ end
2860
+ end
2861
+
2862
+ describe Addressable::URI, "when parsed from " +
2863
+ "the network-path reference '//example.com/'" do
2864
+ before do
2865
+ @uri = Addressable::URI.parse("//example.com/")
2866
+ end
2867
+
2868
+ it "should be considered relative" do
2869
+ @uri.should be_relative
2870
+ end
2871
+
2872
+ it "should have a host of 'example.com'" do
2873
+ @uri.host.should == "example.com"
2874
+ end
2875
+
2876
+ it "should have a path of '/'" do
2877
+ @uri.path.should == "/"
2878
+ end
2879
+
2880
+ it "should raise an error if routing is attempted" do
2881
+ (lambda do
2882
+ @uri.route_to("http://example.com/")
2883
+ end).should raise_error(ArgumentError, /\/\/example.com\//)
2884
+ (lambda do
2885
+ @uri.route_from("http://example.com/")
2886
+ end).should raise_error(ArgumentError, /\/\/example.com\//)
2887
+ end
2888
+ end
2889
+
2890
+ describe Addressable::URI, "when parsed from " +
2891
+ "'feed://http://example.com/'" do
2892
+ before do
2893
+ @uri = Addressable::URI.parse("feed://http://example.com/")
2894
+ end
2895
+
2896
+ it "should have a host of 'http'" do
2897
+ @uri.host.should == "http"
2898
+ end
2899
+
2900
+ it "should have a path of '//example.com/'" do
2901
+ @uri.path.should == "//example.com/"
2902
+ end
2903
+ end
2904
+
2905
+ describe Addressable::URI, "when parsed from " +
2906
+ "'feed:http://example.com/'" do
2907
+ before do
2908
+ @uri = Addressable::URI.parse("feed:http://example.com/")
2909
+ end
2910
+
2911
+ it "should have a path of 'http://example.com/'" do
2912
+ @uri.path.should == "http://example.com/"
2913
+ end
2914
+
2915
+ it "should normalize to 'http://example.com/'" do
2916
+ @uri.normalize.to_s.should == "http://example.com/"
2917
+ @uri.normalize!.to_s.should == "http://example.com/"
2918
+ end
2919
+ end
2920
+
2921
+ describe Addressable::URI, "when parsed from " +
2922
+ "'example://a/b/c/%7Bfoo%7D'" do
2923
+ before do
2924
+ @uri = Addressable::URI.parse("example://a/b/c/%7Bfoo%7D")
2925
+ end
2926
+
2927
+ # Section 6.2.2 of RFC 3986
2928
+ it "should be equivalent to eXAMPLE://a/./b/../b/%63/%7bfoo%7d" do
2929
+ @uri.should ==
2930
+ Addressable::URI.parse("eXAMPLE://a/./b/../b/%63/%7bfoo%7d")
2931
+ end
2932
+ end
2933
+
2934
+ describe Addressable::URI, "when parsed from " +
2935
+ "'http://example.com/indirect/path/./to/../resource/'" do
2936
+ before do
2937
+ @uri = Addressable::URI.parse(
2938
+ "http://example.com/indirect/path/./to/../resource/")
2939
+ end
2940
+
2941
+ it "should use the 'http' scheme" do
2942
+ @uri.scheme.should == "http"
2943
+ end
2944
+
2945
+ it "should have a host of 'example.com'" do
2946
+ @uri.host.should == "example.com"
2947
+ end
2948
+
2949
+ it "should use port 80" do
2950
+ @uri.inferred_port.should == 80
2951
+ end
2952
+
2953
+ it "should have a path of '/indirect/path/./to/../resource/'" do
2954
+ @uri.path.should == "/indirect/path/./to/../resource/"
2955
+ end
2956
+
2957
+ # Section 6.2.2.3 of RFC 3986
2958
+ it "should have a normalized path of '/indirect/path/resource/'" do
2959
+ @uri.normalize.path.should == "/indirect/path/resource/"
2960
+ @uri.normalize!.path.should == "/indirect/path/resource/"
2961
+ end
2962
+ end
2963
+
2964
+ describe Addressable::URI, "when parsed from " +
2965
+ "'http://under_score.example.com/'" do
2966
+ it "should not cause an error" do
2967
+ (lambda do
2968
+ Addressable::URI.parse("http://under_score.example.com/")
2969
+ end).should_not raise_error
2970
+ end
2971
+ end
2972
+
2973
+ describe Addressable::URI, "when parsed from " +
2974
+ "'./this:that'" do
2975
+ before do
2976
+ @uri = Addressable::URI.parse("./this:that")
2977
+ end
2978
+
2979
+ it "should be considered relative" do
2980
+ @uri.should be_relative
2981
+ end
2982
+
2983
+ it "should have no scheme" do
2984
+ @uri.scheme.should == nil
2985
+ end
2986
+ end
2987
+
2988
+ describe Addressable::URI, "when parsed from " +
2989
+ "'this:that'" do
2990
+ before do
2991
+ @uri = Addressable::URI.parse("this:that")
2992
+ end
2993
+
2994
+ it "should be considered absolute" do
2995
+ @uri.should be_absolute
2996
+ end
2997
+
2998
+ it "should have a scheme of 'this'" do
2999
+ @uri.scheme.should == "this"
3000
+ end
3001
+ end
3002
+
3003
+ describe Addressable::URI, "when parsed from '?'" do
3004
+ before do
3005
+ @uri = Addressable::URI.parse("?")
3006
+ end
3007
+
3008
+ it "should have the correct subscript notation query values" do
3009
+ @uri.query_values.should == {}
3010
+ @uri.query_values(:notation => :subscript).should == {}
3011
+ end
3012
+
3013
+ it "should have the correct dot notation query values" do
3014
+ @uri.query_values(:notation => :dot).should == {}
3015
+ end
3016
+
3017
+ it "should have the correct flat notation query values" do
3018
+ @uri.query_values(:notation => :flat).should == {}
3019
+ end
3020
+ end
3021
+
3022
+ describe Addressable::URI, "when parsed from '?one=1&two=2&three=3'" do
3023
+ before do
3024
+ @uri = Addressable::URI.parse("?one=1&two=2&three=3")
3025
+ end
3026
+
3027
+ it "should have the correct query values" do
3028
+ @uri.query_values.should == {"one" => "1", "two" => "2", "three" => "3"}
3029
+ end
3030
+
3031
+ it "should raise an error for invalid query value notations" do
3032
+ (lambda do
3033
+ @uri.query_values(:notation => :bogus)
3034
+ end).should raise_error(ArgumentError)
3035
+ end
3036
+ end
3037
+
3038
+ describe Addressable::URI, "when parsed from '?one[two][three]=four'" do
3039
+ before do
3040
+ @uri = Addressable::URI.parse("?one[two][three]=four")
3041
+ end
3042
+
3043
+ it "should have the correct query values" do
3044
+ @uri.query_values.should == {"one" => {"two" => {"three" => "four"}}}
3045
+ end
3046
+
3047
+ it "should have the correct flat notation query values" do
3048
+ @uri.query_values(:notation => :flat).should == {
3049
+ "one[two][three]" => "four"
3050
+ }
3051
+ end
3052
+ end
3053
+
3054
+ describe Addressable::URI, "when parsed from '?one.two.three=four'" do
3055
+ before do
3056
+ @uri = Addressable::URI.parse("?one.two.three=four")
3057
+ end
3058
+
3059
+ it "should have the correct dot notation query values" do
3060
+ @uri.query_values(:notation => :dot).should == {
3061
+ "one" => {"two" => {"three" => "four"}}
3062
+ }
3063
+ end
3064
+
3065
+ it "should have the correct flat notation query values" do
3066
+ @uri.query_values(:notation => :flat).should == {
3067
+ "one.two.three" => "four"
3068
+ }
3069
+ end
3070
+ end
3071
+
3072
+ describe Addressable::URI, "when parsed from " +
3073
+ "'?one[two][three]=four&one[two][five]=six'" do
3074
+ before do
3075
+ @uri = Addressable::URI.parse("?one[two][three]=four&one[two][five]=six")
3076
+ end
3077
+
3078
+ it "should have the correct dot notation query values" do
3079
+ @uri.query_values(:notation => :subscript).should == {
3080
+ "one" => {"two" => {"three" => "four", "five" => "six"}}
3081
+ }
3082
+ end
3083
+
3084
+ it "should have the correct flat notation query values" do
3085
+ @uri.query_values(:notation => :flat).should == {
3086
+ "one[two][three]" => "four",
3087
+ "one[two][five]" => "six"
3088
+ }
3089
+ end
3090
+ end
3091
+
3092
+ describe Addressable::URI, "when parsed from " +
3093
+ "'?one.two.three=four&one.two.five=six'" do
3094
+ before do
3095
+ @uri = Addressable::URI.parse("?one.two.three=four&one.two.five=six")
3096
+ end
3097
+
3098
+ it "should have the correct dot notation query values" do
3099
+ @uri.query_values(:notation => :dot).should == {
3100
+ "one" => {"two" => {"three" => "four", "five" => "six"}}
3101
+ }
3102
+ end
3103
+
3104
+ it "should have the correct flat notation query values" do
3105
+ @uri.query_values(:notation => :flat).should == {
3106
+ "one.two.three" => "four",
3107
+ "one.two.five" => "six"
3108
+ }
3109
+ end
3110
+ end
3111
+
3112
+ describe Addressable::URI, "when parsed from " +
3113
+ "'?one[two][three][]=four&one[two][three][]=five'" do
3114
+ before do
3115
+ @uri = Addressable::URI.parse(
3116
+ "?one[two][three][]=four&one[two][three][]=five"
3117
+ )
3118
+ end
3119
+
3120
+ it "should have the correct subscript notation query values" do
3121
+ @uri.query_values(:notation => :subscript).should == {
3122
+ "one" => {"two" => {"three" => ["four", "five"]}}
3123
+ }
3124
+ end
3125
+
3126
+ it "should raise an error if a key is repeated in the flat notation" do
3127
+ (lambda do
3128
+ @uri.query_values(:notation => :flat)
3129
+ end).should raise_error(ArgumentError)
3130
+ end
3131
+ end
3132
+
3133
+ describe Addressable::URI, "when parsed from " +
3134
+ "'?one[two][three][0]=four&one[two][three][1]=five'" do
3135
+ before do
3136
+ @uri = Addressable::URI.parse(
3137
+ "?one[two][three][0]=four&one[two][three][1]=five"
3138
+ )
3139
+ end
3140
+
3141
+ it "should have the correct subscript notation query values" do
3142
+ @uri.query_values(:notation => :subscript).should == {
3143
+ "one" => {"two" => {"three" => ["four", "five"]}}
3144
+ }
3145
+ end
3146
+ end
3147
+
3148
+ describe Addressable::URI, "when parsed from " +
3149
+ "'http://www.詹姆斯.com/'" do
3150
+ before do
3151
+ @uri = Addressable::URI.parse("http://www.詹姆斯.com/")
3152
+ end
3153
+
3154
+ it "should be equivalent to 'http://www.xn--8ws00zhy3a.com/'" do
3155
+ @uri.should ==
3156
+ Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/")
3157
+ end
3158
+
3159
+ it "should not have domain name encoded during normalization" do
3160
+ Addressable::URI.normalized_encode(@uri.to_s).should ==
3161
+ "http://www.詹姆斯.com/"
3162
+ end
3163
+ end
3164
+
3165
+ describe Addressable::URI, "when parsed from " +
3166
+ "'http://www.詹姆斯.com/ some spaces /'" do
3167
+ before do
3168
+ @uri = Addressable::URI.parse("http://www.詹姆斯.com/ some spaces /")
3169
+ end
3170
+
3171
+ it "should be equivalent to " +
3172
+ "'http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/'" do
3173
+ @uri.should ==
3174
+ Addressable::URI.parse(
3175
+ "http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/")
3176
+ end
3177
+
3178
+ it "should not have domain name encoded during normalization" do
3179
+ Addressable::URI.normalized_encode(@uri.to_s).should ==
3180
+ "http://www.詹姆斯.com/%20some%20spaces%20/"
3181
+ end
3182
+ end
3183
+
3184
+ describe Addressable::URI, "when parsed from " +
3185
+ "'http://www.xn--8ws00zhy3a.com/'" do
3186
+ before do
3187
+ @uri = Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/")
3188
+ end
3189
+
3190
+ it "should be displayed as http://www.詹姆斯.com/" do
3191
+ @uri.display_uri.to_s.should == "http://www.詹姆斯.com/"
3192
+ end
3193
+
3194
+ it "should properly force the encoding" do
3195
+ display_string = @uri.display_uri.to_str
3196
+ display_string.should == "http://www.詹姆斯.com/"
3197
+ if display_string.respond_to?(:encoding)
3198
+ display_string.encoding.to_s.should == Encoding::UTF_8.to_s
3199
+ end
3200
+ end
3201
+ end
3202
+
3203
+ describe Addressable::URI, "when parsed from " +
3204
+ "'http://www.詹姆斯.com/atomtests/iri/詹.html'" do
3205
+ before do
3206
+ @uri = Addressable::URI.parse("http://www.詹姆斯.com/atomtests/iri/詹.html")
3207
+ end
3208
+
3209
+ it "should normalize to " +
3210
+ "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" do
3211
+ @uri.normalize.to_s.should ==
3212
+ "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html"
3213
+ @uri.normalize!.to_s.should ==
3214
+ "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html"
3215
+ end
3216
+ end
3217
+
3218
+ describe Addressable::URI, "when parsed from a percent-encoded IRI" do
3219
+ before do
3220
+ @uri = Addressable::URI.parse(
3221
+ "http://www.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA" +
3222
+ "%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3" +
3223
+ "%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82" +
3224
+ "%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0" +
3225
+ "%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3" +
3226
+ "%81%9F%E3%82%8A%E3%81%AA%E3%81%84.w3.mag.keio.ac.jp"
3227
+ )
3228
+ end
3229
+
3230
+ it "should normalize to something sane" do
3231
+ @uri.normalize.to_s.should ==
3232
+ "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" +
3233
+ "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/"
3234
+ @uri.normalize!.to_s.should ==
3235
+ "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" +
3236
+ "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/"
3237
+ end
3238
+ end
3239
+
3240
+ describe Addressable::URI, "with a base uri of 'http://a/b/c/d;p?q'" do
3241
+ before do
3242
+ @uri = Addressable::URI.parse("http://a/b/c/d;p?q")
3243
+ end
3244
+
3245
+ # Section 5.4.1 of RFC 3986
3246
+ it "when joined with 'g:h' should resolve to g:h" do
3247
+ (@uri + "g:h").to_s.should == "g:h"
3248
+ Addressable::URI.join(@uri, "g:h").to_s.should == "g:h"
3249
+ end
3250
+
3251
+ # Section 5.4.1 of RFC 3986
3252
+ it "when joined with 'g' should resolve to http://a/b/c/g" do
3253
+ (@uri + "g").to_s.should == "http://a/b/c/g"
3254
+ Addressable::URI.join(@uri.to_s, "g").to_s.should == "http://a/b/c/g"
3255
+ end
3256
+
3257
+ # Section 5.4.1 of RFC 3986
3258
+ it "when joined with './g' should resolve to http://a/b/c/g" do
3259
+ (@uri + "./g").to_s.should == "http://a/b/c/g"
3260
+ Addressable::URI.join(@uri.to_s, "./g").to_s.should == "http://a/b/c/g"
3261
+ end
3262
+
3263
+ # Section 5.4.1 of RFC 3986
3264
+ it "when joined with 'g/' should resolve to http://a/b/c/g/" do
3265
+ (@uri + "g/").to_s.should == "http://a/b/c/g/"
3266
+ Addressable::URI.join(@uri.to_s, "g/").to_s.should == "http://a/b/c/g/"
3267
+ end
3268
+
3269
+ # Section 5.4.1 of RFC 3986
3270
+ it "when joined with '/g' should resolve to http://a/g" do
3271
+ (@uri + "/g").to_s.should == "http://a/g"
3272
+ Addressable::URI.join(@uri.to_s, "/g").to_s.should == "http://a/g"
3273
+ end
3274
+
3275
+ # Section 5.4.1 of RFC 3986
3276
+ it "when joined with '//g' should resolve to http://g" do
3277
+ (@uri + "//g").to_s.should == "http://g"
3278
+ Addressable::URI.join(@uri.to_s, "//g").to_s.should == "http://g"
3279
+ end
3280
+
3281
+ # Section 5.4.1 of RFC 3986
3282
+ it "when joined with '?y' should resolve to http://a/b/c/d;p?y" do
3283
+ (@uri + "?y").to_s.should == "http://a/b/c/d;p?y"
3284
+ Addressable::URI.join(@uri.to_s, "?y").to_s.should == "http://a/b/c/d;p?y"
3285
+ end
3286
+
3287
+ # Section 5.4.1 of RFC 3986
3288
+ it "when joined with 'g?y' should resolve to http://a/b/c/g?y" do
3289
+ (@uri + "g?y").to_s.should == "http://a/b/c/g?y"
3290
+ Addressable::URI.join(@uri.to_s, "g?y").to_s.should == "http://a/b/c/g?y"
3291
+ end
3292
+
3293
+ # Section 5.4.1 of RFC 3986
3294
+ it "when joined with '#s' should resolve to http://a/b/c/d;p?q#s" do
3295
+ (@uri + "#s").to_s.should == "http://a/b/c/d;p?q#s"
3296
+ Addressable::URI.join(@uri.to_s, "#s").to_s.should ==
3297
+ "http://a/b/c/d;p?q#s"
3298
+ end
3299
+
3300
+ # Section 5.4.1 of RFC 3986
3301
+ it "when joined with 'g#s' should resolve to http://a/b/c/g#s" do
3302
+ (@uri + "g#s").to_s.should == "http://a/b/c/g#s"
3303
+ Addressable::URI.join(@uri.to_s, "g#s").to_s.should == "http://a/b/c/g#s"
3304
+ end
3305
+
3306
+ # Section 5.4.1 of RFC 3986
3307
+ it "when joined with 'g?y#s' should resolve to http://a/b/c/g?y#s" do
3308
+ (@uri + "g?y#s").to_s.should == "http://a/b/c/g?y#s"
3309
+ Addressable::URI.join(
3310
+ @uri.to_s, "g?y#s").to_s.should == "http://a/b/c/g?y#s"
3311
+ end
3312
+
3313
+ # Section 5.4.1 of RFC 3986
3314
+ it "when joined with ';x' should resolve to http://a/b/c/;x" do
3315
+ (@uri + ";x").to_s.should == "http://a/b/c/;x"
3316
+ Addressable::URI.join(@uri.to_s, ";x").to_s.should == "http://a/b/c/;x"
3317
+ end
3318
+
3319
+ # Section 5.4.1 of RFC 3986
3320
+ it "when joined with 'g;x' should resolve to http://a/b/c/g;x" do
3321
+ (@uri + "g;x").to_s.should == "http://a/b/c/g;x"
3322
+ Addressable::URI.join(@uri.to_s, "g;x").to_s.should == "http://a/b/c/g;x"
3323
+ end
3324
+
3325
+ # Section 5.4.1 of RFC 3986
3326
+ it "when joined with 'g;x?y#s' should resolve to http://a/b/c/g;x?y#s" do
3327
+ (@uri + "g;x?y#s").to_s.should == "http://a/b/c/g;x?y#s"
3328
+ Addressable::URI.join(
3329
+ @uri.to_s, "g;x?y#s").to_s.should == "http://a/b/c/g;x?y#s"
3330
+ end
3331
+
3332
+ # Section 5.4.1 of RFC 3986
3333
+ it "when joined with '' should resolve to http://a/b/c/d;p?q" do
3334
+ (@uri + "").to_s.should == "http://a/b/c/d;p?q"
3335
+ Addressable::URI.join(@uri.to_s, "").to_s.should == "http://a/b/c/d;p?q"
3336
+ end
3337
+
3338
+ # Section 5.4.1 of RFC 3986
3339
+ it "when joined with '.' should resolve to http://a/b/c/" do
3340
+ (@uri + ".").to_s.should == "http://a/b/c/"
3341
+ Addressable::URI.join(@uri.to_s, ".").to_s.should == "http://a/b/c/"
3342
+ end
3343
+
3344
+ # Section 5.4.1 of RFC 3986
3345
+ it "when joined with './' should resolve to http://a/b/c/" do
3346
+ (@uri + "./").to_s.should == "http://a/b/c/"
3347
+ Addressable::URI.join(@uri.to_s, "./").to_s.should == "http://a/b/c/"
3348
+ end
3349
+
3350
+ # Section 5.4.1 of RFC 3986
3351
+ it "when joined with '..' should resolve to http://a/b/" do
3352
+ (@uri + "..").to_s.should == "http://a/b/"
3353
+ Addressable::URI.join(@uri.to_s, "..").to_s.should == "http://a/b/"
3354
+ end
3355
+
3356
+ # Section 5.4.1 of RFC 3986
3357
+ it "when joined with '../' should resolve to http://a/b/" do
3358
+ (@uri + "../").to_s.should == "http://a/b/"
3359
+ Addressable::URI.join(@uri.to_s, "../").to_s.should == "http://a/b/"
3360
+ end
3361
+
3362
+ # Section 5.4.1 of RFC 3986
3363
+ it "when joined with '../g' should resolve to http://a/b/g" do
3364
+ (@uri + "../g").to_s.should == "http://a/b/g"
3365
+ Addressable::URI.join(@uri.to_s, "../g").to_s.should == "http://a/b/g"
3366
+ end
3367
+
3368
+ # Section 5.4.1 of RFC 3986
3369
+ it "when joined with '../..' should resolve to http://a/" do
3370
+ (@uri + "../..").to_s.should == "http://a/"
3371
+ Addressable::URI.join(@uri.to_s, "../..").to_s.should == "http://a/"
3372
+ end
3373
+
3374
+ # Section 5.4.1 of RFC 3986
3375
+ it "when joined with '../../' should resolve to http://a/" do
3376
+ (@uri + "../../").to_s.should == "http://a/"
3377
+ Addressable::URI.join(@uri.to_s, "../../").to_s.should == "http://a/"
3378
+ end
3379
+
3380
+ # Section 5.4.1 of RFC 3986
3381
+ it "when joined with '../../g' should resolve to http://a/g" do
3382
+ (@uri + "../../g").to_s.should == "http://a/g"
3383
+ Addressable::URI.join(@uri.to_s, "../../g").to_s.should == "http://a/g"
3384
+ end
3385
+
3386
+ # Section 5.4.2 of RFC 3986
3387
+ it "when joined with '../../../g' should resolve to http://a/g" do
3388
+ (@uri + "../../../g").to_s.should == "http://a/g"
3389
+ Addressable::URI.join(@uri.to_s, "../../../g").to_s.should == "http://a/g"
3390
+ end
3391
+
3392
+ it "when joined with '../.././../g' should resolve to http://a/g" do
3393
+ (@uri + "../.././../g").to_s.should == "http://a/g"
3394
+ Addressable::URI.join(@uri.to_s, "../.././../g").to_s.should ==
3395
+ "http://a/g"
3396
+ end
3397
+
3398
+ # Section 5.4.2 of RFC 3986
3399
+ it "when joined with '../../../../g' should resolve to http://a/g" do
3400
+ (@uri + "../../../../g").to_s.should == "http://a/g"
3401
+ Addressable::URI.join(
3402
+ @uri.to_s, "../../../../g").to_s.should == "http://a/g"
3403
+ end
3404
+
3405
+ # Section 5.4.2 of RFC 3986
3406
+ it "when joined with '/./g' should resolve to http://a/g" do
3407
+ (@uri + "/./g").to_s.should == "http://a/g"
3408
+ Addressable::URI.join(@uri.to_s, "/./g").to_s.should == "http://a/g"
3409
+ end
3410
+
3411
+ # Section 5.4.2 of RFC 3986
3412
+ it "when joined with '/../g' should resolve to http://a/g" do
3413
+ (@uri + "/../g").to_s.should == "http://a/g"
3414
+ Addressable::URI.join(@uri.to_s, "/../g").to_s.should == "http://a/g"
3415
+ end
3416
+
3417
+ # Section 5.4.2 of RFC 3986
3418
+ it "when joined with 'g.' should resolve to http://a/b/c/g." do
3419
+ (@uri + "g.").to_s.should == "http://a/b/c/g."
3420
+ Addressable::URI.join(@uri.to_s, "g.").to_s.should == "http://a/b/c/g."
3421
+ end
3422
+
3423
+ # Section 5.4.2 of RFC 3986
3424
+ it "when joined with '.g' should resolve to http://a/b/c/.g" do
3425
+ (@uri + ".g").to_s.should == "http://a/b/c/.g"
3426
+ Addressable::URI.join(@uri.to_s, ".g").to_s.should == "http://a/b/c/.g"
3427
+ end
3428
+
3429
+ # Section 5.4.2 of RFC 3986
3430
+ it "when joined with 'g..' should resolve to http://a/b/c/g.." do
3431
+ (@uri + "g..").to_s.should == "http://a/b/c/g.."
3432
+ Addressable::URI.join(@uri.to_s, "g..").to_s.should == "http://a/b/c/g.."
3433
+ end
3434
+
3435
+ # Section 5.4.2 of RFC 3986
3436
+ it "when joined with '..g' should resolve to http://a/b/c/..g" do
3437
+ (@uri + "..g").to_s.should == "http://a/b/c/..g"
3438
+ Addressable::URI.join(@uri.to_s, "..g").to_s.should == "http://a/b/c/..g"
3439
+ end
3440
+
3441
+ # Section 5.4.2 of RFC 3986
3442
+ it "when joined with './../g' should resolve to http://a/b/g" do
3443
+ (@uri + "./../g").to_s.should == "http://a/b/g"
3444
+ Addressable::URI.join(@uri.to_s, "./../g").to_s.should == "http://a/b/g"
3445
+ end
3446
+
3447
+ # Section 5.4.2 of RFC 3986
3448
+ it "when joined with './g/.' should resolve to http://a/b/c/g/" do
3449
+ (@uri + "./g/.").to_s.should == "http://a/b/c/g/"
3450
+ Addressable::URI.join(@uri.to_s, "./g/.").to_s.should == "http://a/b/c/g/"
3451
+ end
3452
+
3453
+ # Section 5.4.2 of RFC 3986
3454
+ it "when joined with 'g/./h' should resolve to http://a/b/c/g/h" do
3455
+ (@uri + "g/./h").to_s.should == "http://a/b/c/g/h"
3456
+ Addressable::URI.join(@uri.to_s, "g/./h").to_s.should == "http://a/b/c/g/h"
3457
+ end
3458
+
3459
+ # Section 5.4.2 of RFC 3986
3460
+ it "when joined with 'g/../h' should resolve to http://a/b/c/h" do
3461
+ (@uri + "g/../h").to_s.should == "http://a/b/c/h"
3462
+ Addressable::URI.join(@uri.to_s, "g/../h").to_s.should == "http://a/b/c/h"
3463
+ end
3464
+
3465
+ # Section 5.4.2 of RFC 3986
3466
+ it "when joined with 'g;x=1/./y' " +
3467
+ "should resolve to http://a/b/c/g;x=1/y" do
3468
+ (@uri + "g;x=1/./y").to_s.should == "http://a/b/c/g;x=1/y"
3469
+ Addressable::URI.join(
3470
+ @uri.to_s, "g;x=1/./y").to_s.should == "http://a/b/c/g;x=1/y"
3471
+ end
3472
+
3473
+ # Section 5.4.2 of RFC 3986
3474
+ it "when joined with 'g;x=1/../y' should resolve to http://a/b/c/y" do
3475
+ (@uri + "g;x=1/../y").to_s.should == "http://a/b/c/y"
3476
+ Addressable::URI.join(
3477
+ @uri.to_s, "g;x=1/../y").to_s.should == "http://a/b/c/y"
3478
+ end
3479
+
3480
+ # Section 5.4.2 of RFC 3986
3481
+ it "when joined with 'g?y/./x' " +
3482
+ "should resolve to http://a/b/c/g?y/./x" do
3483
+ (@uri + "g?y/./x").to_s.should == "http://a/b/c/g?y/./x"
3484
+ Addressable::URI.join(
3485
+ @uri.to_s, "g?y/./x").to_s.should == "http://a/b/c/g?y/./x"
3486
+ end
3487
+
3488
+ # Section 5.4.2 of RFC 3986
3489
+ it "when joined with 'g?y/../x' " +
3490
+ "should resolve to http://a/b/c/g?y/../x" do
3491
+ (@uri + "g?y/../x").to_s.should == "http://a/b/c/g?y/../x"
3492
+ Addressable::URI.join(
3493
+ @uri.to_s, "g?y/../x").to_s.should == "http://a/b/c/g?y/../x"
3494
+ end
3495
+
3496
+ # Section 5.4.2 of RFC 3986
3497
+ it "when joined with 'g#s/./x' " +
3498
+ "should resolve to http://a/b/c/g#s/./x" do
3499
+ (@uri + "g#s/./x").to_s.should == "http://a/b/c/g#s/./x"
3500
+ Addressable::URI.join(
3501
+ @uri.to_s, "g#s/./x").to_s.should == "http://a/b/c/g#s/./x"
3502
+ end
3503
+
3504
+ # Section 5.4.2 of RFC 3986
3505
+ it "when joined with 'g#s/../x' " +
3506
+ "should resolve to http://a/b/c/g#s/../x" do
3507
+ (@uri + "g#s/../x").to_s.should == "http://a/b/c/g#s/../x"
3508
+ Addressable::URI.join(
3509
+ @uri.to_s, "g#s/../x").to_s.should == "http://a/b/c/g#s/../x"
3510
+ end
3511
+
3512
+ # Section 5.4.2 of RFC 3986
3513
+ it "when joined with 'http:g' should resolve to http:g" do
3514
+ (@uri + "http:g").to_s.should == "http:g"
3515
+ Addressable::URI.join(@uri.to_s, "http:g").to_s.should == "http:g"
3516
+ end
3517
+
3518
+ # Edge case to be sure
3519
+ it "when joined with '//example.com/' should " +
3520
+ "resolve to http://example.com/" do
3521
+ (@uri + "//example.com/").to_s.should == "http://example.com/"
3522
+ Addressable::URI.join(
3523
+ @uri.to_s, "//example.com/").to_s.should == "http://example.com/"
3524
+ end
3525
+
3526
+ it "when joined with a bogus object a TypeError should be raised" do
3527
+ (lambda do
3528
+ Addressable::URI.join(@uri, 42)
3529
+ end).should raise_error(TypeError)
3530
+ end
3531
+ end
3532
+
3533
+ describe Addressable::URI, "when converting the path " +
3534
+ "'relative/path/to/something'" do
3535
+ before do
3536
+ @path = 'relative/path/to/something'
3537
+ end
3538
+
3539
+ it "should convert to " +
3540
+ "\'relative/path/to/something\'" do
3541
+ @uri = Addressable::URI.convert_path(@path)
3542
+ @uri.to_str.should == "relative/path/to/something"
3543
+ end
3544
+
3545
+ it "should join with an absolute file path correctly" do
3546
+ @base = Addressable::URI.convert_path("/absolute/path/")
3547
+ @uri = Addressable::URI.convert_path(@path)
3548
+ (@base + @uri).to_str.should ==
3549
+ "file:///absolute/path/relative/path/to/something"
3550
+ end
3551
+ end
3552
+
3553
+ describe Addressable::URI, "when converting a bogus path" do
3554
+ it "should raise a TypeError" do
3555
+ (lambda do
3556
+ Addressable::URI.convert_path(42)
3557
+ end).should raise_error(TypeError)
3558
+ end
3559
+ end
3560
+
3561
+ describe Addressable::URI, "when given a UNIX root directory" do
3562
+ before do
3563
+ @path = "/"
3564
+ end
3565
+
3566
+ it "should convert to \'file:///\'" do
3567
+ @uri = Addressable::URI.convert_path(@path)
3568
+ @uri.to_str.should == "file:///"
3569
+ end
3570
+ end
3571
+
3572
+ describe Addressable::URI, "when given a Windows root directory" do
3573
+ before do
3574
+ @path = "C:\\"
3575
+ end
3576
+
3577
+ it "should convert to \'file:///c:/\'" do
3578
+ @uri = Addressable::URI.convert_path(@path)
3579
+ @uri.to_str.should == "file:///c:/"
3580
+ end
3581
+ end
3582
+
3583
+ describe Addressable::URI, "when given the path '/home/user/'" do
3584
+ before do
3585
+ @path = '/home/user/'
3586
+ end
3587
+
3588
+ it "should convert to " +
3589
+ "\'file:///home/user/\'" do
3590
+ @uri = Addressable::URI.convert_path(@path)
3591
+ @uri.to_str.should == "file:///home/user/"
3592
+ end
3593
+ end
3594
+
3595
+ describe Addressable::URI, "when given the path " +
3596
+ "'c:\\windows\\My Documents 100%20\\foo.txt'" do
3597
+ before do
3598
+ @path = "c:\\windows\\My Documents 100%20\\foo.txt"
3599
+ end
3600
+
3601
+ it "should convert to " +
3602
+ "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
3603
+ @uri = Addressable::URI.convert_path(@path)
3604
+ @uri.to_str.should == "file:///c:/windows/My%20Documents%20100%20/foo.txt"
3605
+ end
3606
+ end
3607
+
3608
+ describe Addressable::URI, "when given the path " +
3609
+ "'file://c:\\windows\\My Documents 100%20\\foo.txt'" do
3610
+ before do
3611
+ @path = "file://c:\\windows\\My Documents 100%20\\foo.txt"
3612
+ end
3613
+
3614
+ it "should convert to " +
3615
+ "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
3616
+ @uri = Addressable::URI.convert_path(@path)
3617
+ @uri.to_str.should == "file:///c:/windows/My%20Documents%20100%20/foo.txt"
3618
+ end
3619
+ end
3620
+
3621
+ describe Addressable::URI, "when given the path " +
3622
+ "'file:c:\\windows\\My Documents 100%20\\foo.txt'" do
3623
+ before do
3624
+ @path = "file:c:\\windows\\My Documents 100%20\\foo.txt"
3625
+ end
3626
+
3627
+ it "should convert to " +
3628
+ "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
3629
+ @uri = Addressable::URI.convert_path(@path)
3630
+ @uri.to_str.should == "file:///c:/windows/My%20Documents%20100%20/foo.txt"
3631
+ end
3632
+ end
3633
+
3634
+ describe Addressable::URI, "when given the path " +
3635
+ "'file:/c:\\windows\\My Documents 100%20\\foo.txt'" do
3636
+ before do
3637
+ @path = "file:/c:\\windows\\My Documents 100%20\\foo.txt"
3638
+ end
3639
+
3640
+ it "should convert to " +
3641
+ "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
3642
+ @uri = Addressable::URI.convert_path(@path)
3643
+ @uri.to_str.should == "file:///c:/windows/My%20Documents%20100%20/foo.txt"
3644
+ end
3645
+ end
3646
+
3647
+ describe Addressable::URI, "when given the path " +
3648
+ "'file:///c|/windows/My%20Documents%20100%20/foo.txt'" do
3649
+ before do
3650
+ @path = "file:///c|/windows/My%20Documents%20100%20/foo.txt"
3651
+ end
3652
+
3653
+ it "should convert to " +
3654
+ "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
3655
+ @uri = Addressable::URI.convert_path(@path)
3656
+ @uri.to_str.should == "file:///c:/windows/My%20Documents%20100%20/foo.txt"
3657
+ end
3658
+ end
3659
+
3660
+ describe Addressable::URI, "when given an http protocol URI" do
3661
+ before do
3662
+ @path = "http://example.com/"
3663
+ end
3664
+
3665
+ it "should not do any conversion at all" do
3666
+ @uri = Addressable::URI.convert_path(@path)
3667
+ @uri.to_str.should == "http://example.com/"
3668
+ end
3669
+ end
3670
+
3671
+ class SuperString
3672
+ def initialize(string)
3673
+ @string = string.to_s
3674
+ end
3675
+
3676
+ def to_str
3677
+ return @string
3678
+ end
3679
+ end
3680
+
3681
+ describe Addressable::URI, "when parsing a non-String object" do
3682
+ it "should correctly parse anything with a 'to_str' method" do
3683
+ Addressable::URI.parse(SuperString.new(42))
3684
+ end
3685
+
3686
+ it "should raise a TypeError for objects than cannot be converted" do
3687
+ (lambda do
3688
+ Addressable::URI.parse(42)
3689
+ end).should raise_error(TypeError, "Can't convert Fixnum into String.")
3690
+ end
3691
+
3692
+ it "should correctly parse heuristically anything with a 'to_str' method" do
3693
+ Addressable::URI.heuristic_parse(SuperString.new(42))
3694
+ end
3695
+
3696
+ it "should raise a TypeError for objects than cannot be converted" do
3697
+ (lambda do
3698
+ Addressable::URI.heuristic_parse(42)
3699
+ end).should raise_error(TypeError, "Can't convert Fixnum into String.")
3700
+ end
3701
+ end
3702
+
3703
+ describe Addressable::URI, "when form encoding a hash" do
3704
+ it "should result in correct percent encoded sequence" do
3705
+ Addressable::URI.form_encode(
3706
+ {"&one" => "/1", "=two" => "?2", ":three" => "#3"}
3707
+ ).should == "%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233"
3708
+ end
3709
+
3710
+ it "should result in correct percent encoded sequence" do
3711
+ Addressable::URI.form_encode(
3712
+ {"q" => "one two three"}
3713
+ ).should == "q=one+two+three"
3714
+ end
3715
+
3716
+ it "should result in correct percent encoded sequence" do
3717
+ Addressable::URI.form_encode(
3718
+ {"key" => nil}
3719
+ ).should == "key="
3720
+ end
3721
+
3722
+ it "should result in correctly encoded newlines" do
3723
+ Addressable::URI.form_encode(
3724
+ {"text" => "one\ntwo\rthree\r\nfour\n\r"}
3725
+ ).should == "text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A"
3726
+ end
3727
+
3728
+ it "should result in a sorted percent encoded sequence" do
3729
+ Addressable::URI.form_encode(
3730
+ [["a", "1"], ["dup", "3"], ["dup", "2"]], true
3731
+ ).should == "a=1&dup=2&dup=3"
3732
+ end
3733
+ end
3734
+
3735
+ describe Addressable::URI, "when form encoding a non-Array object" do
3736
+ it "should raise a TypeError for objects than cannot be converted" do
3737
+ (lambda do
3738
+ Addressable::URI.form_encode(42)
3739
+ end).should raise_error(TypeError, "Can't convert Fixnum into Array.")
3740
+ end
3741
+ end
3742
+
3743
+ describe Addressable::URI, "when form unencoding a string" do
3744
+ it "should result in correct values" do
3745
+ Addressable::URI.form_unencode(
3746
+ "%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233"
3747
+ ).should == [["&one", "/1"], ["=two", "?2"], [":three", "#3"]]
3748
+ end
3749
+
3750
+ it "should result in correct values" do
3751
+ Addressable::URI.form_unencode(
3752
+ "q=one+two+three"
3753
+ ).should == [["q", "one two three"]]
3754
+ end
3755
+
3756
+ it "should result in correct values" do
3757
+ Addressable::URI.form_unencode(
3758
+ "text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A"
3759
+ ).should == [["text", "one\ntwo\nthree\nfour\n\n"]]
3760
+ end
3761
+
3762
+ it "should result in correct values" do
3763
+ Addressable::URI.form_unencode(
3764
+ "a=1&dup=2&dup=3"
3765
+ ).should == [["a", "1"], ["dup", "2"], ["dup", "3"]]
3766
+ end
3767
+
3768
+ it "should result in correct values" do
3769
+ Addressable::URI.form_unencode(
3770
+ "key"
3771
+ ).should == [["key", nil]]
3772
+ end
3773
+
3774
+ it "should result in correct values" do
3775
+ Addressable::URI.form_unencode("GivenName=Ren%C3%A9").should ==
3776
+ [["GivenName", "René"]]
3777
+ end
3778
+ end
3779
+
3780
+ describe Addressable::URI, "when form unencoding a non-String object" do
3781
+ it "should correctly parse anything with a 'to_str' method" do
3782
+ Addressable::URI.form_unencode(SuperString.new(42))
3783
+ end
3784
+
3785
+ it "should raise a TypeError for objects than cannot be converted" do
3786
+ (lambda do
3787
+ Addressable::URI.form_unencode(42)
3788
+ end).should raise_error(TypeError, "Can't convert Fixnum into String.")
3789
+ end
3790
+ end
3791
+
3792
+ describe Addressable::URI, "when normalizing a non-String object" do
3793
+ it "should correctly parse anything with a 'to_str' method" do
3794
+ Addressable::URI.normalize_component(SuperString.new(42))
3795
+ end
3796
+
3797
+ it "should raise a TypeError for objects than cannot be converted" do
3798
+ (lambda do
3799
+ Addressable::URI.normalize_component(42)
3800
+ end).should raise_error(TypeError, "Can't convert Fixnum into String.")
3801
+ end
3802
+
3803
+ it "should raise a TypeError for objects than cannot be converted" do
3804
+ (lambda do
3805
+ Addressable::URI.normalize_component("component", 42)
3806
+ end).should raise_error(TypeError)
3807
+ end
3808
+ end
3809
+
3810
+ describe Addressable::URI, "when normalizing a path with an encoded slash" do
3811
+ it "should result in correct percent encoded sequence" do
3812
+ Addressable::URI.parse("/path%2Fsegment/").normalize.path.should ==
3813
+ "/path%2Fsegment/"
3814
+ end
3815
+ end
3816
+
3817
+ describe Addressable::URI, "when normalizing a partially encoded string" do
3818
+ it "should result in correct percent encoded sequence" do
3819
+ Addressable::URI.normalize_component(
3820
+ "partially % encoded%21"
3821
+ ).should == "partially%20%25%20encoded!"
3822
+ end
3823
+
3824
+ it "should result in correct percent encoded sequence" do
3825
+ Addressable::URI.normalize_component(
3826
+ "partially %25 encoded!"
3827
+ ).should == "partially%20%25%20encoded!"
3828
+ end
3829
+ end
3830
+
3831
+ describe Addressable::URI, "when normalizing a unicode sequence" do
3832
+ it "should result in correct percent encoded sequence" do
3833
+ Addressable::URI.normalize_component(
3834
+ "/C%CC%A7"
3835
+ ).should == "/%C3%87"
3836
+ end
3837
+
3838
+ it "should result in correct percent encoded sequence" do
3839
+ Addressable::URI.normalize_component(
3840
+ "/%C3%87"
3841
+ ).should == "/%C3%87"
3842
+ end
3843
+ end
3844
+
3845
+ describe Addressable::URI, "when normalizing a multibyte string" do
3846
+ it "should result in correct percent encoded sequence" do
3847
+ Addressable::URI.normalize_component("günther").should ==
3848
+ "g%C3%BCnther"
3849
+ end
3850
+
3851
+ it "should result in correct percent encoded sequence" do
3852
+ Addressable::URI.normalize_component("g%C3%BCnther").should ==
3853
+ "g%C3%BCnther"
3854
+ end
3855
+ end
3856
+
3857
+ describe Addressable::URI, "when encoding a multibyte string" do
3858
+ it "should result in correct percent encoded sequence" do
3859
+ Addressable::URI.encode_component("günther").should == "g%C3%BCnther"
3860
+ end
3861
+
3862
+ it "should result in correct percent encoded sequence" do
3863
+ Addressable::URI.encode_component(
3864
+ "günther", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/
3865
+ ).should == "g%C3%BCnther"
3866
+ end
3867
+ end
3868
+
3869
+ describe Addressable::URI, "when form encoding a multibyte string" do
3870
+ it "should result in correct percent encoded sequence" do
3871
+ Addressable::URI.form_encode({"GivenName" => "René"}).should ==
3872
+ "GivenName=Ren%C3%A9"
3873
+ end
3874
+ end
3875
+
3876
+ describe Addressable::URI, "when encoding a string with ASCII chars 0-15" do
3877
+ it "should result in correct percent encoded sequence" do
3878
+ Addressable::URI.encode_component("one\ntwo").should == "one%0Atwo"
3879
+ end
3880
+
3881
+ it "should result in correct percent encoded sequence" do
3882
+ Addressable::URI.encode_component(
3883
+ "one\ntwo", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/
3884
+ ).should == "one%0Atwo"
3885
+ end
3886
+ end
3887
+
3888
+ describe Addressable::URI, "when unencoding a multibyte string" do
3889
+ it "should result in correct percent encoded sequence" do
3890
+ Addressable::URI.unencode_component("g%C3%BCnther").should == "günther"
3891
+ end
3892
+
3893
+ it "should result in correct percent encoded sequence as a URI" do
3894
+ Addressable::URI.unencode(
3895
+ "/path?g%C3%BCnther", ::Addressable::URI
3896
+ ).should == Addressable::URI.new(
3897
+ :path => "/path", :query => "günther"
3898
+ )
3899
+ end
3900
+ end
3901
+
3902
+ describe Addressable::URI, "when unencoding a bogus object" do
3903
+ it "should raise a TypeError" do
3904
+ (lambda do
3905
+ Addressable::URI.unencode_component(42)
3906
+ end).should raise_error(TypeError)
3907
+ end
3908
+
3909
+ it "should raise a TypeError" do
3910
+ (lambda do
3911
+ Addressable::URI.unencode("/path?g%C3%BCnther", Integer)
3912
+ end).should raise_error(TypeError)
3913
+ end
3914
+ end
3915
+
3916
+ describe Addressable::URI, "when encoding a bogus object" do
3917
+ it "should raise a TypeError" do
3918
+ (lambda do
3919
+ Addressable::URI.encode(42)
3920
+ end).should raise_error(TypeError)
3921
+ end
3922
+
3923
+ it "should raise a TypeError" do
3924
+ (lambda do
3925
+ Addressable::URI.normalized_encode(42)
3926
+ end).should raise_error(TypeError)
3927
+ end
3928
+
3929
+ it "should raise a TypeError" do
3930
+ (lambda do
3931
+ Addressable::URI.encode_component("günther", 42)
3932
+ end).should raise_error(TypeError)
3933
+ end
3934
+
3935
+ it "should raise a TypeError" do
3936
+ (lambda do
3937
+ Addressable::URI.encode_component(42)
3938
+ end).should raise_error(TypeError)
3939
+ end
3940
+ end
3941
+
3942
+ describe Addressable::URI, "when given the input " +
3943
+ "'http://example.com/'" do
3944
+ before do
3945
+ @input = "http://example.com/"
3946
+ end
3947
+
3948
+ it "should heuristically parse to 'http://example.com/'" do
3949
+ @uri = Addressable::URI.heuristic_parse(@input)
3950
+ @uri.to_s.should == "http://example.com/"
3951
+ end
3952
+ end
3953
+
3954
+
3955
+ describe Addressable::URI, "when given the input " +
3956
+ "'http:example.com/'" do
3957
+ before do
3958
+ @input = "http:example.com/"
3959
+ end
3960
+
3961
+ it "should heuristically parse to 'http://example.com/'" do
3962
+ @uri = Addressable::URI.heuristic_parse(@input)
3963
+ @uri.to_s.should == "http://example.com/"
3964
+ end
3965
+
3966
+ it "should heuristically parse to 'http://example.com/' " +
3967
+ "even with a scheme hint of 'ftp'" do
3968
+ @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'})
3969
+ @uri.to_s.should == "http://example.com/"
3970
+ end
3971
+ end
3972
+
3973
+ describe Addressable::URI, "when given the input " +
3974
+ "'http://example.com/example.com/'" do
3975
+ before do
3976
+ @input = "http://example.com/example.com/"
3977
+ end
3978
+
3979
+ it "should heuristically parse to 'http://example.com/example.com/'" do
3980
+ @uri = Addressable::URI.heuristic_parse(@input)
3981
+ @uri.to_s.should == "http://example.com/example.com/"
3982
+ end
3983
+ end
3984
+
3985
+ describe Addressable::URI, "when given the input " +
3986
+ "'/path/to/resource'" do
3987
+ before do
3988
+ @input = "/path/to/resource"
3989
+ end
3990
+
3991
+ it "should heuristically parse to '/path/to/resource'" do
3992
+ @uri = Addressable::URI.heuristic_parse(@input)
3993
+ @uri.to_s.should == "/path/to/resource"
3994
+ end
3995
+ end
3996
+
3997
+ describe Addressable::URI, "when given the input " +
3998
+ "'relative/path/to/resource'" do
3999
+ before do
4000
+ @input = "relative/path/to/resource"
4001
+ end
4002
+
4003
+ it "should heuristically parse to 'relative/path/to/resource'" do
4004
+ @uri = Addressable::URI.heuristic_parse(@input)
4005
+ @uri.to_s.should == "relative/path/to/resource"
4006
+ end
4007
+ end
4008
+
4009
+ describe Addressable::URI, "when given the input " +
4010
+ "'example.com'" do
4011
+ before do
4012
+ @input = "example.com"
4013
+ end
4014
+
4015
+ it "should heuristically parse to 'http://example.com'" do
4016
+ @uri = Addressable::URI.heuristic_parse(@input)
4017
+ @uri.to_s.should == "http://example.com"
4018
+ end
4019
+ end
4020
+
4021
+ describe Addressable::URI, "when given the input " +
4022
+ "'example.com' and a scheme hint of 'ftp'" do
4023
+ before do
4024
+ @input = "example.com"
4025
+ @hints = {:scheme => 'ftp'}
4026
+ end
4027
+
4028
+ it "should heuristically parse to 'http://example.com'" do
4029
+ @uri = Addressable::URI.heuristic_parse(@input, @hints)
4030
+ @uri.to_s.should == "ftp://example.com"
4031
+ end
4032
+ end
4033
+
4034
+ describe Addressable::URI, "when given the input " +
4035
+ "'example.com:21' and a scheme hint of 'ftp'" do
4036
+ before do
4037
+ @input = "example.com:21"
4038
+ @hints = {:scheme => 'ftp'}
4039
+ end
4040
+
4041
+ it "should heuristically parse to 'http://example.com:21'" do
4042
+ @uri = Addressable::URI.heuristic_parse(@input, @hints)
4043
+ @uri.to_s.should == "ftp://example.com:21"
4044
+ end
4045
+ end
4046
+
4047
+ describe Addressable::URI, "when given the input " +
4048
+ "'example.com/path/to/resource'" do
4049
+ before do
4050
+ @input = "example.com/path/to/resource"
4051
+ end
4052
+
4053
+ it "should heuristically parse to 'http://example.com/path/to/resource'" do
4054
+ @uri = Addressable::URI.heuristic_parse(@input)
4055
+ @uri.to_s.should == "http://example.com/path/to/resource"
4056
+ end
4057
+ end
4058
+
4059
+ describe Addressable::URI, "when given the input " +
4060
+ "'http:///example.com'" do
4061
+ before do
4062
+ @input = "http:///example.com"
4063
+ end
4064
+
4065
+ it "should heuristically parse to 'http://example.com'" do
4066
+ @uri = Addressable::URI.heuristic_parse(@input)
4067
+ @uri.to_s.should == "http://example.com"
4068
+ end
4069
+ end
4070
+
4071
+ describe Addressable::URI, "when given the input " +
4072
+ "'feed:///example.com'" do
4073
+ before do
4074
+ @input = "feed:///example.com"
4075
+ end
4076
+
4077
+ it "should heuristically parse to 'feed://example.com'" do
4078
+ @uri = Addressable::URI.heuristic_parse(@input)
4079
+ @uri.to_s.should == "feed://example.com"
4080
+ end
4081
+ end
4082
+
4083
+ describe Addressable::URI, "when given the input " +
4084
+ "'file://path/to/resource/'" do
4085
+ before do
4086
+ @input = "file://path/to/resource/"
4087
+ end
4088
+
4089
+ it "should heuristically parse to 'file:///path/to/resource/'" do
4090
+ @uri = Addressable::URI.heuristic_parse(@input)
4091
+ @uri.to_s.should == "file:///path/to/resource/"
4092
+ end
4093
+ end
4094
+
4095
+ describe Addressable::URI, "when given the input " +
4096
+ "'feed://http://example.com'" do
4097
+ before do
4098
+ @input = "feed://http://example.com"
4099
+ end
4100
+
4101
+ it "should heuristically parse to 'feed:http://example.com'" do
4102
+ @uri = Addressable::URI.heuristic_parse(@input)
4103
+ @uri.to_s.should == "feed:http://example.com"
4104
+ end
4105
+ end
4106
+
4107
+ describe Addressable::URI, "when assigning query values" do
4108
+ before do
4109
+ @uri = Addressable::URI.new
4110
+ end
4111
+
4112
+ it "should correctly assign {:a => 'a', :b => ['c', 'd', 'e']}" do
4113
+ @uri.query_values = {:a => "a", :b => ["c", "d", "e"]}
4114
+ @uri.query.should == "a=a&b[0]=c&b[1]=d&b[2]=e"
4115
+ end
4116
+
4117
+ it "should correctly assign " +
4118
+ "{:a => 'a', :b => [{:c => 'c', :d => 'd'}, {:e => 'e', :f => 'f'}]}" do
4119
+ @uri.query_values = {
4120
+ :a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]
4121
+ }
4122
+ @uri.query.should == "a=a&b[0][c]=c&b[0][d]=d&b[1][e]=e&b[1][f]=f"
4123
+ end
4124
+
4125
+ it "should correctly assign " +
4126
+ "{:a => 'a', :b => [{:c => true, :d => 'd'}, {:e => 'e', :f => 'f'}]}" do
4127
+ @uri.query_values = {
4128
+ :a => 'a', :b => [{:c => true, :d => 'd'}, {:e => 'e', :f => 'f'}]
4129
+ }
4130
+ @uri.query.should == "a=a&b[0][c]&b[0][d]=d&b[1][e]=e&b[1][f]=f"
4131
+ end
4132
+
4133
+ it "should correctly assign " +
4134
+ "{:a => 'a', :b => {:c => true, :d => 'd'}}" do
4135
+ @uri.query_values = {
4136
+ :a => 'a', :b => {:c => true, :d => 'd'}
4137
+ }
4138
+ @uri.query.should == "a=a&b[c]&b[d]=d"
4139
+ end
4140
+
4141
+ it "should correctly assign " +
4142
+ "{:a => 'a', :b => {:c => true, :d => 'd'}, :e => []}" do
4143
+ @uri.query_values = {
4144
+ :a => 'a', :b => {:c => true, :d => 'd'}
4145
+ }
4146
+ @uri.query.should == "a=a&b[c]&b[d]=d"
4147
+ end
4148
+
4149
+ it "should correctly assign {}" do
4150
+ @uri.query_values = {}
4151
+ @uri.query.should == ''
4152
+ end
4153
+
4154
+ it "should correctly assign nil" do
4155
+ @uri.query_values = nil
4156
+ @uri.query.should == nil
4157
+ end
4158
+
4159
+ it "should correctly sort {'ab' => 'c', :ab => 'a', :a => 'x'}" do
4160
+ @uri.query_values = {'ab' => 'c', :ab => 'a', :a => 'x'}
4161
+ @uri.query.should == "a=x&ab=a&ab=c"
4162
+ end
4163
+ end
4164
+
4165
+ describe Addressable::URI, "when assigning path values" do
4166
+ before do
4167
+ @uri = Addressable::URI.new
4168
+ end
4169
+
4170
+ it "should correctly assign paths containing colons" do
4171
+ @uri.path = "acct:bob@sporkmonger.com"
4172
+ Addressable::URI.parse(@uri.normalize.to_str).path.should == @uri.path
4173
+ @uri.normalize.to_str.should == "acct%2Fbob@sporkmonger.com"
4174
+ end
4175
+
4176
+ it "should correctly assign paths containing colons" do
4177
+ @uri.path = "/acct:bob@sporkmonger.com"
4178
+ @uri.authority = "example.com"
4179
+ @uri.normalize.to_str.should == "//example.com/acct:bob@sporkmonger.com"
4180
+ end
4181
+
4182
+ it "should correctly assign paths containing colons" do
4183
+ @uri.path = "acct:bob@sporkmonger.com"
4184
+ @uri.scheme = "something"
4185
+ @uri.normalize.to_str.should == "something:acct:bob@sporkmonger.com"
4186
+ end
4187
+
4188
+ it "should not allow relative paths to be assigned on absolute URIs" do
4189
+ (lambda do
4190
+ @uri.scheme = "http"
4191
+ @uri.host = "example.com"
4192
+ @uri.path = "acct:bob@sporkmonger.com"
4193
+ end).should raise_error(Addressable::URI::InvalidURIError)
4194
+ end
4195
+
4196
+ it "should not allow relative paths to be assigned on absolute URIs" do
4197
+ (lambda do
4198
+ @uri.path = "acct:bob@sporkmonger.com"
4199
+ @uri.scheme = "http"
4200
+ @uri.host = "example.com"
4201
+ end).should raise_error(Addressable::URI::InvalidURIError)
4202
+ end
4203
+
4204
+ it "should not allow relative paths to be assigned on absolute URIs" do
4205
+ (lambda do
4206
+ @uri.path = "uuid:0b3ecf60-3f93-11df-a9c3-001f5bfffe12"
4207
+ @uri.scheme = "urn"
4208
+ end).should_not raise_error(Addressable::URI::InvalidURIError)
4209
+ end
4210
+ end