addressable 2.0.2 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +14 -0
- data/README +18 -6
- data/Rakefile +0 -1
- data/lib/addressable/idna.rb +24 -20
- data/lib/addressable/template.rb +1024 -0
- data/lib/addressable/uri.rb +192 -765
- data/lib/addressable/version.rb +3 -2
- data/spec/addressable/idna_spec.rb +6 -5
- data/spec/addressable/template_spec.rb +2111 -0
- data/spec/addressable/uri_spec.rb +343 -1119
- metadata +4 -2
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
2
|
#--
|
3
3
|
# Addressable, Copyright (c) 2006-2007 Bob Aman
|
4
4
|
#
|
@@ -30,48 +30,37 @@ require "addressable/uri"
|
|
30
30
|
if !"".respond_to?("force_encoding")
|
31
31
|
class String
|
32
32
|
def force_encoding(encoding)
|
33
|
-
|
33
|
+
@encoding = encoding
|
34
34
|
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class Encoding
|
38
|
-
UTF_8 = Encoding.new
|
39
|
-
ASCII_8BIT = Encoding.new
|
40
|
-
end
|
41
|
-
end
|
42
35
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
return true
|
36
|
+
def encoding
|
37
|
+
@encoding ||= Encoding::ASCII_8BIT
|
38
|
+
end
|
47
39
|
end
|
48
40
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
41
|
+
class Encoding
|
42
|
+
def initialize(name)
|
43
|
+
@name = name
|
44
|
+
end
|
53
45
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
return value
|
58
|
-
end
|
46
|
+
def to_s
|
47
|
+
return @name
|
48
|
+
end
|
59
49
|
|
60
|
-
|
61
|
-
|
62
|
-
return ".*"
|
50
|
+
UTF_8 = Encoding.new("UTF-8")
|
51
|
+
ASCII_8BIT = Encoding.new("US-ASCII")
|
63
52
|
end
|
64
53
|
end
|
65
54
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
end
|
55
|
+
module URI
|
56
|
+
class HTTP
|
57
|
+
def initialize(uri)
|
58
|
+
@uri = uri
|
59
|
+
end
|
71
60
|
|
72
|
-
|
73
|
-
|
74
|
-
|
61
|
+
def to_s
|
62
|
+
return @uri.to_s
|
63
|
+
end
|
75
64
|
end
|
76
65
|
end
|
77
66
|
|
@@ -104,6 +93,37 @@ describe Addressable::URI, "when created from nil components" do
|
|
104
93
|
it "should be an empty uri" do
|
105
94
|
@uri.to_s.should == ""
|
106
95
|
end
|
96
|
+
|
97
|
+
it "should still be an empty uri if the scheme is set to whitespace" do
|
98
|
+
@uri.scheme = "\t \n"
|
99
|
+
@uri.to_s.should == ""
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should raise an error if set into an invalid state" do
|
103
|
+
(lambda do
|
104
|
+
@uri.user = "user"
|
105
|
+
end).should raise_error(Addressable::URI::InvalidURIError)
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should raise an error if set into an invalid state" do
|
109
|
+
(lambda do
|
110
|
+
@uri.password = "pass"
|
111
|
+
end).should raise_error(Addressable::URI::InvalidURIError)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should raise an error if set into an invalid state" do
|
115
|
+
(lambda do
|
116
|
+
@uri.scheme = "http"
|
117
|
+
@uri.fragment = "fragment"
|
118
|
+
end).should raise_error(Addressable::URI::InvalidURIError)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should raise an error if set into an invalid state" do
|
122
|
+
(lambda do
|
123
|
+
@uri.fragment = "fragment"
|
124
|
+
@uri.scheme = "http"
|
125
|
+
end).should raise_error(Addressable::URI::InvalidURIError)
|
126
|
+
end
|
107
127
|
end
|
108
128
|
|
109
129
|
describe Addressable::URI, "when created from string components" do
|
@@ -139,7 +159,9 @@ end
|
|
139
159
|
describe Addressable::URI, "when created with both an authority and a user" do
|
140
160
|
it "should raise an error" do
|
141
161
|
(lambda do
|
142
|
-
Addressable::URI.new(
|
162
|
+
Addressable::URI.new(
|
163
|
+
:user => "user", :authority => "user@example.com:80"
|
164
|
+
)
|
143
165
|
end).should raise_error(ArgumentError)
|
144
166
|
end
|
145
167
|
end
|
@@ -181,8 +203,60 @@ describe Addressable::URI, "when created with a path that hasn't been " +
|
|
181
203
|
end
|
182
204
|
end
|
183
205
|
|
206
|
+
describe Addressable::URI, "when parsed from an Addressable::URI object" do
|
207
|
+
it "should return the object" do
|
208
|
+
uri = Addressable::URI.parse("http://example.com/")
|
209
|
+
(lambda do
|
210
|
+
Addressable::URI.parse(uri).object_id.should == uri.object_id
|
211
|
+
end).should_not raise_error
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should return the object" do
|
215
|
+
uri = Addressable::URI.parse("http://example.com/")
|
216
|
+
(lambda do
|
217
|
+
Addressable::URI.heuristic_parse(uri).object_id.should == uri.object_id
|
218
|
+
end).should_not raise_error
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
describe Addressable::URI, "when parsed from something that looks " +
|
223
|
+
"like a URI object" do
|
224
|
+
it "should parse without error" do
|
225
|
+
uri = Addressable::URI.parse(URI::HTTP.new("http://example.com/"))
|
226
|
+
(lambda do
|
227
|
+
Addressable::URI.parse(uri)
|
228
|
+
end).should_not raise_error
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
describe Addressable::URI, "when parsed from ''" do
|
233
|
+
before do
|
234
|
+
@uri = Addressable::URI.parse("")
|
235
|
+
end
|
236
|
+
|
237
|
+
it "should have no scheme" do
|
238
|
+
@uri.scheme.should == nil
|
239
|
+
end
|
240
|
+
|
241
|
+
it "should not be considered to be ip-based" do
|
242
|
+
@uri.should_not be_ip_based
|
243
|
+
end
|
244
|
+
|
245
|
+
it "should have a path of ''" do
|
246
|
+
@uri.path.should == ""
|
247
|
+
end
|
248
|
+
|
249
|
+
it "should be considered relative" do
|
250
|
+
@uri.should be_relative
|
251
|
+
end
|
252
|
+
|
253
|
+
it "should be considered to be in normal form" do
|
254
|
+
@uri.normalize.should be_eql(@uri)
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
184
258
|
# Section 1.1.2 of RFC 3986
|
185
|
-
describe Addressable::URI, "
|
259
|
+
describe Addressable::URI, "when parsed from " +
|
186
260
|
"'ftp://ftp.is.co.za/rfc/rfc1808.txt'" do
|
187
261
|
before do
|
188
262
|
@uri = Addressable::URI.parse("ftp://ftp.is.co.za/rfc/rfc1808.txt")
|
@@ -210,7 +284,7 @@ describe Addressable::URI, " when parsed from " +
|
|
210
284
|
end
|
211
285
|
|
212
286
|
# Section 1.1.2 of RFC 3986
|
213
|
-
describe Addressable::URI, "
|
287
|
+
describe Addressable::URI, "when parsed from " +
|
214
288
|
"'http://www.ietf.org/rfc/rfc2396.txt'" do
|
215
289
|
before do
|
216
290
|
@uri = Addressable::URI.parse("http://www.ietf.org/rfc/rfc2396.txt")
|
@@ -287,10 +361,16 @@ describe Addressable::URI, "when parsed from " +
|
|
287
361
|
@uri.omit!(:scheme, :authority)
|
288
362
|
@uri.to_s.should == "/c=GB?objectClass?one"
|
289
363
|
end
|
364
|
+
|
365
|
+
it "should raise an error if omission would create an invalid URI" do
|
366
|
+
(lambda do
|
367
|
+
@uri.omit(:authority, :path)
|
368
|
+
end).should raise_error(Addressable::URI::InvalidURIError)
|
369
|
+
end
|
290
370
|
end
|
291
371
|
|
292
372
|
# Section 1.1.2 of RFC 3986
|
293
|
-
describe Addressable::URI, "
|
373
|
+
describe Addressable::URI, "when parsed from " +
|
294
374
|
"'mailto:John.Doe@example.com'" do
|
295
375
|
before do
|
296
376
|
@uri = Addressable::URI.parse("mailto:John.Doe@example.com")
|
@@ -314,7 +394,7 @@ describe Addressable::URI, " when parsed from " +
|
|
314
394
|
end
|
315
395
|
|
316
396
|
# Section 1.1.2 of RFC 3986
|
317
|
-
describe Addressable::URI, "
|
397
|
+
describe Addressable::URI, "when parsed from " +
|
318
398
|
"'news:comp.infosystems.www.servers.unix'" do
|
319
399
|
before do
|
320
400
|
@uri = Addressable::URI.parse("news:comp.infosystems.www.servers.unix")
|
@@ -362,7 +442,7 @@ describe Addressable::URI, "when parsed from " +
|
|
362
442
|
end
|
363
443
|
|
364
444
|
# Section 1.1.2 of RFC 3986
|
365
|
-
describe Addressable::URI, "
|
445
|
+
describe Addressable::URI, "when parsed from " +
|
366
446
|
"'telnet://192.0.2.16:80/'" do
|
367
447
|
before do
|
368
448
|
@uri = Addressable::URI.parse("telnet://192.0.2.16:80/")
|
@@ -394,7 +474,7 @@ describe Addressable::URI, " when parsed from " +
|
|
394
474
|
end
|
395
475
|
|
396
476
|
# Section 1.1.2 of RFC 3986
|
397
|
-
describe Addressable::URI, "
|
477
|
+
describe Addressable::URI, "when parsed from " +
|
398
478
|
"'urn:oasis:names:specification:docbook:dtd:xml:4.1.2'" do
|
399
479
|
before do
|
400
480
|
@uri = Addressable::URI.parse(
|
@@ -419,7 +499,7 @@ describe Addressable::URI, " when parsed from " +
|
|
419
499
|
end
|
420
500
|
end
|
421
501
|
|
422
|
-
describe Addressable::URI, "
|
502
|
+
describe Addressable::URI, "when parsed from " +
|
423
503
|
"'http://example.com'" do
|
424
504
|
before do
|
425
505
|
@uri = Addressable::URI.parse("http://example.com")
|
@@ -611,6 +691,7 @@ describe Addressable::URI, " when parsed from " +
|
|
611
691
|
@uri.normalized_password.should == "secret%40123%21"
|
612
692
|
@uri.user.should == ""
|
613
693
|
@uri.normalize.to_s.should == "http://:secret%40123%21@example.com/"
|
694
|
+
@uri.omit(:password).to_s.should == "http://example.com"
|
614
695
|
end
|
615
696
|
|
616
697
|
it "should have the correct user/pass after repeated assignment" do
|
@@ -668,7 +749,7 @@ describe Addressable::URI, " when parsed from " +
|
|
668
749
|
end
|
669
750
|
end
|
670
751
|
|
671
|
-
describe Addressable::URI, "
|
752
|
+
describe Addressable::URI, "when parsed from " +
|
672
753
|
"'http://example.com/'" do
|
673
754
|
before do
|
674
755
|
@uri = Addressable::URI.parse("http://example.com/")
|
@@ -738,12 +819,12 @@ describe Addressable::URI, " when parsed from " +
|
|
738
819
|
@uri.hash.should_not == @uri.to_s.hash
|
739
820
|
end
|
740
821
|
|
741
|
-
it "should have the same hash as an
|
742
|
-
@uri.hash.should == Addressable::URI.parse("http://example.com
|
822
|
+
it "should have the same hash as an equal URI" do
|
823
|
+
@uri.hash.should == Addressable::URI.parse("http://example.com/").hash
|
743
824
|
end
|
744
825
|
end
|
745
826
|
|
746
|
-
describe Addressable::URI, "
|
827
|
+
describe Addressable::URI, "when parsed from " +
|
747
828
|
"'http://@example.com/'" do
|
748
829
|
before do
|
749
830
|
@uri = Addressable::URI.parse("http://@example.com/")
|
@@ -771,7 +852,7 @@ describe Addressable::URI, " when parsed from " +
|
|
771
852
|
end
|
772
853
|
end
|
773
854
|
|
774
|
-
describe Addressable::URI, "
|
855
|
+
describe Addressable::URI, "when parsed from " +
|
775
856
|
"'http://example.com./'" do
|
776
857
|
before do
|
777
858
|
@uri = Addressable::URI.parse("http://example.com./")
|
@@ -790,7 +871,7 @@ describe Addressable::URI, " when parsed from " +
|
|
790
871
|
end
|
791
872
|
end
|
792
873
|
|
793
|
-
describe Addressable::URI, "
|
874
|
+
describe Addressable::URI, "when parsed from " +
|
794
875
|
"'http://:@example.com/'" do
|
795
876
|
before do
|
796
877
|
@uri = Addressable::URI.parse("http://:@example.com/")
|
@@ -818,7 +899,7 @@ describe Addressable::URI, " when parsed from " +
|
|
818
899
|
end
|
819
900
|
end
|
820
901
|
|
821
|
-
describe Addressable::URI, "
|
902
|
+
describe Addressable::URI, "when parsed from " +
|
822
903
|
"'http://example.com/~smith/'" do
|
823
904
|
before do
|
824
905
|
@uri = Addressable::URI.parse("http://example.com/~smith/")
|
@@ -839,7 +920,31 @@ describe Addressable::URI, " when parsed from " +
|
|
839
920
|
end
|
840
921
|
end
|
841
922
|
|
842
|
-
describe Addressable::URI, "
|
923
|
+
describe Addressable::URI, "when parsed from " +
|
924
|
+
"'http://example.com/%E8'" do
|
925
|
+
before do
|
926
|
+
@uri = Addressable::URI.parse("http://example.com/%E8")
|
927
|
+
end
|
928
|
+
|
929
|
+
it "should not raise an exception when normalized" do
|
930
|
+
(lambda do
|
931
|
+
@uri.normalize
|
932
|
+
end).should_not raise_error(ArgumentError)
|
933
|
+
end
|
934
|
+
|
935
|
+
it "should be considered to be in normal form" do
|
936
|
+
@uri.normalize.should be_eql(@uri)
|
937
|
+
end
|
938
|
+
|
939
|
+
it "should not change if encoded with the normalizing algorithm" do
|
940
|
+
Addressable::URI.normalized_encode(@uri).to_s.should ==
|
941
|
+
"http://example.com/%E8"
|
942
|
+
Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s.should ===
|
943
|
+
"http://example.com/%E8"
|
944
|
+
end
|
945
|
+
end
|
946
|
+
|
947
|
+
describe Addressable::URI, "when parsed from " +
|
843
948
|
"'http://example.com/%C3%87'" do
|
844
949
|
before do
|
845
950
|
@uri = Addressable::URI.parse("http://example.com/%C3%87")
|
@@ -884,7 +989,7 @@ describe Addressable::URI, " when parsed from " +
|
|
884
989
|
end
|
885
990
|
end
|
886
991
|
|
887
|
-
describe Addressable::URI, "
|
992
|
+
describe Addressable::URI, "when parsed from " +
|
888
993
|
"'http://example.com/?q=string'" do
|
889
994
|
before do
|
890
995
|
@uri = Addressable::URI.parse("http://example.com/?q=string")
|
@@ -943,7 +1048,7 @@ describe Addressable::URI, " when parsed from " +
|
|
943
1048
|
end
|
944
1049
|
end
|
945
1050
|
|
946
|
-
describe Addressable::URI, "
|
1051
|
+
describe Addressable::URI, "when parsed from " +
|
947
1052
|
"'http://example.com:80/'" do
|
948
1053
|
before do
|
949
1054
|
@uri = Addressable::URI.parse("http://example.com:80/")
|
@@ -1055,7 +1160,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1055
1160
|
end
|
1056
1161
|
end
|
1057
1162
|
|
1058
|
-
describe Addressable::URI, "
|
1163
|
+
describe Addressable::URI, "when parsed from " +
|
1059
1164
|
"'http://example.com:8080/'" do
|
1060
1165
|
before do
|
1061
1166
|
@uri = Addressable::URI.parse("http://example.com:8080/")
|
@@ -1152,7 +1257,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1152
1257
|
end
|
1153
1258
|
end
|
1154
1259
|
|
1155
|
-
describe Addressable::URI, "
|
1260
|
+
describe Addressable::URI, "when parsed from " +
|
1156
1261
|
"'http://example.com:%38%30/'" do
|
1157
1262
|
before do
|
1158
1263
|
@uri = Addressable::URI.parse("http://example.com:%38%30/")
|
@@ -1171,7 +1276,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1171
1276
|
end
|
1172
1277
|
end
|
1173
1278
|
|
1174
|
-
describe Addressable::URI, "
|
1279
|
+
describe Addressable::URI, "when parsed from " +
|
1175
1280
|
"'http://example.com/path/to/resource/'" do
|
1176
1281
|
before do
|
1177
1282
|
@uri = Addressable::URI.parse("http://example.com/path/to/resource/")
|
@@ -1409,7 +1514,7 @@ describe Addressable::URI, "when parsed from " +
|
|
1409
1514
|
end
|
1410
1515
|
end
|
1411
1516
|
|
1412
|
-
describe Addressable::URI, "
|
1517
|
+
describe Addressable::URI, "when parsed from " +
|
1413
1518
|
"'http://example.com/file.txt'" do
|
1414
1519
|
before do
|
1415
1520
|
@uri = Addressable::URI.parse("http://example.com/file.txt")
|
@@ -1460,7 +1565,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1460
1565
|
end
|
1461
1566
|
end
|
1462
1567
|
|
1463
|
-
describe Addressable::URI, "
|
1568
|
+
describe Addressable::URI, "when parsed from " +
|
1464
1569
|
"'http://example.com/file.txt;parameter'" do
|
1465
1570
|
before do
|
1466
1571
|
@uri = Addressable::URI.parse("http://example.com/file.txt;parameter")
|
@@ -1511,7 +1616,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1511
1616
|
end
|
1512
1617
|
end
|
1513
1618
|
|
1514
|
-
describe Addressable::URI, "
|
1619
|
+
describe Addressable::URI, "when parsed from " +
|
1515
1620
|
"'http://example.com/file.txt;x=y'" do
|
1516
1621
|
before do
|
1517
1622
|
@uri = Addressable::URI.parse("http://example.com/file.txt;x=y")
|
@@ -1566,7 +1671,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1566
1671
|
end
|
1567
1672
|
end
|
1568
1673
|
|
1569
|
-
describe Addressable::URI, "
|
1674
|
+
describe Addressable::URI, "when parsed from " +
|
1570
1675
|
"'svn+ssh://developername@rubyforge.org/var/svn/project'" do
|
1571
1676
|
before do
|
1572
1677
|
@uri = Addressable::URI.parse(
|
@@ -1599,7 +1704,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1599
1704
|
end
|
1600
1705
|
end
|
1601
1706
|
|
1602
|
-
describe Addressable::URI, "
|
1707
|
+
describe Addressable::URI, "when parsed from " +
|
1603
1708
|
"'ssh+svn://developername@rubyforge.org/var/svn/project'" do
|
1604
1709
|
before do
|
1605
1710
|
@uri = Addressable::URI.parse(
|
@@ -1636,7 +1741,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1636
1741
|
end
|
1637
1742
|
end
|
1638
1743
|
|
1639
|
-
describe Addressable::URI, "
|
1744
|
+
describe Addressable::URI, "when parsed from " +
|
1640
1745
|
"'mailto:user@example.com'" do
|
1641
1746
|
before do
|
1642
1747
|
@uri = Addressable::URI.parse("mailto:user@example.com")
|
@@ -1663,7 +1768,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1663
1768
|
end
|
1664
1769
|
end
|
1665
1770
|
|
1666
|
-
describe Addressable::URI, "
|
1771
|
+
describe Addressable::URI, "when parsed from " +
|
1667
1772
|
"'tag:example.com,2006-08-18:/path/to/something'" do
|
1668
1773
|
before do
|
1669
1774
|
@uri = Addressable::URI.parse(
|
@@ -1692,7 +1797,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1692
1797
|
end
|
1693
1798
|
end
|
1694
1799
|
|
1695
|
-
describe Addressable::URI, "
|
1800
|
+
describe Addressable::URI, "when parsed from " +
|
1696
1801
|
"'http://example.com/x;y/'" do
|
1697
1802
|
before do
|
1698
1803
|
@uri = Addressable::URI.parse("http://example.com/x;y/")
|
@@ -1703,7 +1808,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1703
1808
|
end
|
1704
1809
|
end
|
1705
1810
|
|
1706
|
-
describe Addressable::URI, "
|
1811
|
+
describe Addressable::URI, "when parsed from " +
|
1707
1812
|
"'http://example.com/?x=1&y=2'" do
|
1708
1813
|
before do
|
1709
1814
|
@uri = Addressable::URI.parse("http://example.com/?x=1&y=2")
|
@@ -1714,7 +1819,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1714
1819
|
end
|
1715
1820
|
end
|
1716
1821
|
|
1717
|
-
describe Addressable::URI, "
|
1822
|
+
describe Addressable::URI, "when parsed from " +
|
1718
1823
|
"'view-source:http://example.com/'" do
|
1719
1824
|
before do
|
1720
1825
|
@uri = Addressable::URI.parse("view-source:http://example.com/")
|
@@ -1733,7 +1838,7 @@ describe Addressable::URI, " when parsed from " +
|
|
1733
1838
|
end
|
1734
1839
|
end
|
1735
1840
|
|
1736
|
-
describe Addressable::URI, "
|
1841
|
+
describe Addressable::URI, "when parsed from " +
|
1737
1842
|
"'http://user:pass@example.com/path/to/resource?query=x#fragment'" do
|
1738
1843
|
before do
|
1739
1844
|
@uri = Addressable::URI.parse(
|
@@ -1831,11 +1936,15 @@ describe Addressable::URI, " when parsed from " +
|
|
1831
1936
|
@uri.scheme.should == "ftp"
|
1832
1937
|
@uri.to_s.should ==
|
1833
1938
|
"ftp://user:pass@example.com/path/to/resource?query=x#fragment"
|
1939
|
+
@uri.to_str.should ==
|
1940
|
+
"ftp://user:pass@example.com/path/to/resource?query=x#fragment"
|
1834
1941
|
@uri.scheme = "bogus!"
|
1835
1942
|
@uri.scheme.should == "bogus!"
|
1836
1943
|
@uri.normalized_scheme.should == "bogus%21"
|
1837
1944
|
@uri.normalize.to_s.should ==
|
1838
1945
|
"bogus%21://user:pass@example.com/path/to/resource?query=x#fragment"
|
1946
|
+
@uri.normalize.to_str.should ==
|
1947
|
+
"bogus%21://user:pass@example.com/path/to/resource?query=x#fragment"
|
1839
1948
|
end
|
1840
1949
|
|
1841
1950
|
it "should have the correct authority segment after assignment" do
|
@@ -1917,10 +2026,12 @@ describe Addressable::URI, " when parsed from " +
|
|
1917
2026
|
end
|
1918
2027
|
|
1919
2028
|
it "should have the correct query string after hash assignment" do
|
1920
|
-
@uri.query_values = {"?uestion mark"=>"=sign", "hello"=>"
|
2029
|
+
@uri.query_values = {"?uestion mark"=>"=sign", "hello"=>"g\xC3\xBCnther"}
|
1921
2030
|
@uri.query.split("&").should include("%3Fuestion%20mark=%3Dsign")
|
1922
2031
|
@uri.query.split("&").should include("hello=g%C3%BCnther")
|
1923
|
-
@uri.query_values.should == {
|
2032
|
+
@uri.query_values.should == {
|
2033
|
+
"?uestion mark"=>"=sign", "hello"=>"g\xC3\xBCnther"
|
2034
|
+
}
|
1924
2035
|
end
|
1925
2036
|
|
1926
2037
|
it "should have the correct query string after flag hash assignment" do
|
@@ -1933,6 +2044,12 @@ describe Addressable::URI, " when parsed from " +
|
|
1933
2044
|
}
|
1934
2045
|
end
|
1935
2046
|
|
2047
|
+
it "should raise an error if query values are set to a bogus type" do
|
2048
|
+
(lambda do
|
2049
|
+
@uri.query_values = "bogus"
|
2050
|
+
end).should raise_error(TypeError)
|
2051
|
+
end
|
2052
|
+
|
1936
2053
|
it "should have the correct fragment after assignment" do
|
1937
2054
|
@uri.fragment = "newfragment"
|
1938
2055
|
@uri.fragment.should == "newfragment"
|
@@ -2023,7 +2140,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2023
2140
|
end
|
2024
2141
|
end
|
2025
2142
|
|
2026
|
-
describe Addressable::URI, "
|
2143
|
+
describe Addressable::URI, "when parsed from " +
|
2027
2144
|
"'http://user@example.com'" do
|
2028
2145
|
before do
|
2029
2146
|
@uri = Addressable::URI.parse("http://user@example.com")
|
@@ -2111,7 +2228,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2111
2228
|
end
|
2112
2229
|
end
|
2113
2230
|
|
2114
|
-
describe Addressable::URI, "
|
2231
|
+
describe Addressable::URI, "when parsed from " +
|
2115
2232
|
"'http://user:@example.com'" do
|
2116
2233
|
before do
|
2117
2234
|
@uri = Addressable::URI.parse("http://user:@example.com")
|
@@ -2166,7 +2283,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2166
2283
|
end
|
2167
2284
|
end
|
2168
2285
|
|
2169
|
-
describe Addressable::URI, "
|
2286
|
+
describe Addressable::URI, "when parsed from " +
|
2170
2287
|
"'http://:pass@example.com'" do
|
2171
2288
|
before do
|
2172
2289
|
@uri = Addressable::URI.parse("http://:pass@example.com")
|
@@ -2226,7 +2343,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2226
2343
|
end
|
2227
2344
|
end
|
2228
2345
|
|
2229
|
-
describe Addressable::URI, "
|
2346
|
+
describe Addressable::URI, "when parsed from " +
|
2230
2347
|
"'http://:@example.com'" do
|
2231
2348
|
before do
|
2232
2349
|
@uri = Addressable::URI.parse("http://:@example.com")
|
@@ -2282,7 +2399,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2282
2399
|
end
|
2283
2400
|
end
|
2284
2401
|
|
2285
|
-
describe Addressable::URI, "
|
2402
|
+
describe Addressable::URI, "when parsed from " +
|
2286
2403
|
"'#example'" do
|
2287
2404
|
before do
|
2288
2405
|
@uri = Addressable::URI.parse("#example")
|
@@ -2309,7 +2426,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2309
2426
|
end
|
2310
2427
|
end
|
2311
2428
|
|
2312
|
-
describe Addressable::URI, "
|
2429
|
+
describe Addressable::URI, "when parsed from " +
|
2313
2430
|
"the network-path reference '//example.com/'" do
|
2314
2431
|
before do
|
2315
2432
|
@uri = Addressable::URI.parse("//example.com/")
|
@@ -2337,7 +2454,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2337
2454
|
end
|
2338
2455
|
end
|
2339
2456
|
|
2340
|
-
describe Addressable::URI, "
|
2457
|
+
describe Addressable::URI, "when parsed from " +
|
2341
2458
|
"'feed://http://example.com/'" do
|
2342
2459
|
before do
|
2343
2460
|
@uri = Addressable::URI.parse("feed://http://example.com/")
|
@@ -2352,7 +2469,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2352
2469
|
end
|
2353
2470
|
end
|
2354
2471
|
|
2355
|
-
describe Addressable::URI, "
|
2472
|
+
describe Addressable::URI, "when parsed from " +
|
2356
2473
|
"'feed:http://example.com/'" do
|
2357
2474
|
before do
|
2358
2475
|
@uri = Addressable::URI.parse("feed:http://example.com/")
|
@@ -2381,7 +2498,7 @@ describe Addressable::URI, "when parsed from " +
|
|
2381
2498
|
end
|
2382
2499
|
end
|
2383
2500
|
|
2384
|
-
describe Addressable::URI, "
|
2501
|
+
describe Addressable::URI, "when parsed from " +
|
2385
2502
|
"'http://example.com/indirect/path/./to/../resource/'" do
|
2386
2503
|
before do
|
2387
2504
|
@uri = Addressable::URI.parse(
|
@@ -2411,7 +2528,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2411
2528
|
end
|
2412
2529
|
end
|
2413
2530
|
|
2414
|
-
describe Addressable::URI, "
|
2531
|
+
describe Addressable::URI, "when parsed from " +
|
2415
2532
|
"'http://under_score.example.com/'" do
|
2416
2533
|
it "should not cause an error" do
|
2417
2534
|
(lambda do
|
@@ -2420,7 +2537,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2420
2537
|
end
|
2421
2538
|
end
|
2422
2539
|
|
2423
|
-
describe Addressable::URI, "
|
2540
|
+
describe Addressable::URI, "when parsed from " +
|
2424
2541
|
"'./this:that'" do
|
2425
2542
|
before do
|
2426
2543
|
@uri = Addressable::URI.parse("./this:that")
|
@@ -2450,7 +2567,26 @@ describe Addressable::URI, "when parsed from " +
|
|
2450
2567
|
end
|
2451
2568
|
end
|
2452
2569
|
|
2453
|
-
describe Addressable::URI, "
|
2570
|
+
describe Addressable::URI, "when parsed from '?'" do
|
2571
|
+
before do
|
2572
|
+
@uri = Addressable::URI.parse("?")
|
2573
|
+
end
|
2574
|
+
|
2575
|
+
it "should have the correct subscript notation query values" do
|
2576
|
+
@uri.query_values.should == {}
|
2577
|
+
@uri.query_values(:notation => :subscript).should == {}
|
2578
|
+
end
|
2579
|
+
|
2580
|
+
it "should have the correct dot notation query values" do
|
2581
|
+
@uri.query_values(:notation => :dot).should == {}
|
2582
|
+
end
|
2583
|
+
|
2584
|
+
it "should have the correct flat notation query values" do
|
2585
|
+
@uri.query_values(:notation => :flat).should == {}
|
2586
|
+
end
|
2587
|
+
end
|
2588
|
+
|
2589
|
+
describe Addressable::URI, "when parsed from '?one=1&two=2&three=3'" do
|
2454
2590
|
before do
|
2455
2591
|
@uri = Addressable::URI.parse("?one=1&two=2&three=3")
|
2456
2592
|
end
|
@@ -2466,7 +2602,7 @@ describe Addressable::URI, " when parsed from '?one=1&two=2&three=3'" do
|
|
2466
2602
|
end
|
2467
2603
|
end
|
2468
2604
|
|
2469
|
-
describe Addressable::URI, "
|
2605
|
+
describe Addressable::URI, "when parsed from '?one[two][three]=four'" do
|
2470
2606
|
before do
|
2471
2607
|
@uri = Addressable::URI.parse("?one[two][three]=four")
|
2472
2608
|
end
|
@@ -2482,7 +2618,7 @@ describe Addressable::URI, " when parsed from '?one[two][three]=four'" do
|
|
2482
2618
|
end
|
2483
2619
|
end
|
2484
2620
|
|
2485
|
-
describe Addressable::URI, "
|
2621
|
+
describe Addressable::URI, "when parsed from '?one.two.three=four'" do
|
2486
2622
|
before do
|
2487
2623
|
@uri = Addressable::URI.parse("?one.two.three=four")
|
2488
2624
|
end
|
@@ -2500,7 +2636,7 @@ describe Addressable::URI, " when parsed from '?one.two.three=four'" do
|
|
2500
2636
|
end
|
2501
2637
|
end
|
2502
2638
|
|
2503
|
-
describe Addressable::URI, "
|
2639
|
+
describe Addressable::URI, "when parsed from " +
|
2504
2640
|
"'?one[two][three]=four&one[two][five]=six'" do
|
2505
2641
|
before do
|
2506
2642
|
@uri = Addressable::URI.parse("?one[two][three]=four&one[two][five]=six")
|
@@ -2520,7 +2656,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2520
2656
|
end
|
2521
2657
|
end
|
2522
2658
|
|
2523
|
-
describe Addressable::URI, "
|
2659
|
+
describe Addressable::URI, "when parsed from " +
|
2524
2660
|
"'?one.two.three=four&one.two.five=six'" do
|
2525
2661
|
before do
|
2526
2662
|
@uri = Addressable::URI.parse("?one.two.three=four&one.two.five=six")
|
@@ -2540,7 +2676,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2540
2676
|
end
|
2541
2677
|
end
|
2542
2678
|
|
2543
|
-
describe Addressable::URI, "
|
2679
|
+
describe Addressable::URI, "when parsed from " +
|
2544
2680
|
"'?one[two][three][]=four&one[two][three][]=five'" do
|
2545
2681
|
before do
|
2546
2682
|
@uri = Addressable::URI.parse(
|
@@ -2548,7 +2684,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2548
2684
|
)
|
2549
2685
|
end
|
2550
2686
|
|
2551
|
-
it "should have the correct
|
2687
|
+
it "should have the correct subscript notation query values" do
|
2552
2688
|
@uri.query_values(:notation => :subscript).should == {
|
2553
2689
|
"one" => {"two" => {"three" => ["four", "five"]}}
|
2554
2690
|
}
|
@@ -2561,7 +2697,22 @@ describe Addressable::URI, " when parsed from " +
|
|
2561
2697
|
end
|
2562
2698
|
end
|
2563
2699
|
|
2564
|
-
describe Addressable::URI, "
|
2700
|
+
describe Addressable::URI, "when parsed from " +
|
2701
|
+
"'?one[two][three][0]=four&one[two][three][1]=five'" do
|
2702
|
+
before do
|
2703
|
+
@uri = Addressable::URI.parse(
|
2704
|
+
"?one[two][three][0]=four&one[two][three][1]=five"
|
2705
|
+
)
|
2706
|
+
end
|
2707
|
+
|
2708
|
+
it "should have the correct subscript notation query values" do
|
2709
|
+
@uri.query_values(:notation => :subscript).should == {
|
2710
|
+
"one" => {"two" => {"three" => ["four", "five"]}}
|
2711
|
+
}
|
2712
|
+
end
|
2713
|
+
end
|
2714
|
+
|
2715
|
+
describe Addressable::URI, "when parsed from " +
|
2565
2716
|
"'http://www.詹姆斯.com/'" do
|
2566
2717
|
before do
|
2567
2718
|
@uri = Addressable::URI.parse("http://www.詹姆斯.com/")
|
@@ -2578,7 +2729,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2578
2729
|
end
|
2579
2730
|
end
|
2580
2731
|
|
2581
|
-
describe Addressable::URI, "
|
2732
|
+
describe Addressable::URI, "when parsed from " +
|
2582
2733
|
"'http://www.詹姆斯.com/ some spaces /'" do
|
2583
2734
|
before do
|
2584
2735
|
@uri = Addressable::URI.parse("http://www.詹姆斯.com/ some spaces /")
|
@@ -2597,7 +2748,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2597
2748
|
end
|
2598
2749
|
end
|
2599
2750
|
|
2600
|
-
describe Addressable::URI, "
|
2751
|
+
describe Addressable::URI, "when parsed from " +
|
2601
2752
|
"'http://www.xn--8ws00zhy3a.com/'" do
|
2602
2753
|
before do
|
2603
2754
|
@uri = Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/")
|
@@ -2606,9 +2757,17 @@ describe Addressable::URI, " when parsed from " +
|
|
2606
2757
|
it "should be displayed as http://www.詹姆斯.com/" do
|
2607
2758
|
@uri.display_uri.to_s.should == "http://www.詹姆斯.com/"
|
2608
2759
|
end
|
2760
|
+
|
2761
|
+
it "should properly force the encoding" do
|
2762
|
+
display_string = @uri.display_uri.to_str
|
2763
|
+
display_string.should == "http://www.詹姆斯.com/"
|
2764
|
+
if display_string.respond_to?(:encoding)
|
2765
|
+
display_string.encoding.to_s.should == Encoding::UTF_8.to_s
|
2766
|
+
end
|
2767
|
+
end
|
2609
2768
|
end
|
2610
2769
|
|
2611
|
-
describe Addressable::URI, "
|
2770
|
+
describe Addressable::URI, "when parsed from " +
|
2612
2771
|
"'http://www.詹姆斯.com/atomtests/iri/詹.html'" do
|
2613
2772
|
before do
|
2614
2773
|
@uri = Addressable::URI.parse("http://www.詹姆斯.com/atomtests/iri/詹.html")
|
@@ -2623,7 +2782,7 @@ describe Addressable::URI, " when parsed from " +
|
|
2623
2782
|
end
|
2624
2783
|
end
|
2625
2784
|
|
2626
|
-
describe Addressable::URI, "
|
2785
|
+
describe Addressable::URI, "when parsed from a percent-encoded IRI" do
|
2627
2786
|
before do
|
2628
2787
|
@uri = Addressable::URI.parse(
|
2629
2788
|
"http://www.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA" +
|
@@ -2936,47 +3095,6 @@ describe Addressable::URI, "with a base uri of 'http://a/b/c/d;p?q'" do
|
|
2936
3095
|
end
|
2937
3096
|
end
|
2938
3097
|
|
2939
|
-
describe Addressable::URI, "when extracting from an arbitrary text" do
|
2940
|
-
before do
|
2941
|
-
@text = File.open(File.expand_path(
|
2942
|
-
File.dirname(__FILE__) + "/../data/rfc3986.txt")) { |file| file.read }
|
2943
|
-
end
|
2944
|
-
|
2945
|
-
it "should have all obvious URIs extractable from it" do
|
2946
|
-
@uris = Addressable::URI.extract(@text)
|
2947
|
-
@uris.should include("http://www.w3.org/People/Berners-Lee/")
|
2948
|
-
@uris.should include("http://roy.gbiv.com/")
|
2949
|
-
@uris.should include("http://larry.masinter.net/")
|
2950
|
-
@uris = Addressable::URI.extract(@text,
|
2951
|
-
:base => "http://example.com/", :parse => true)
|
2952
|
-
@uris.should include(
|
2953
|
-
Addressable::URI.parse("http://www.w3.org/People/Berners-Lee/"))
|
2954
|
-
@uris.should include(
|
2955
|
-
Addressable::URI.parse("http://roy.gbiv.com/"))
|
2956
|
-
@uris.should include(
|
2957
|
-
Addressable::URI.parse("http://larry.masinter.net/"))
|
2958
|
-
end
|
2959
|
-
end
|
2960
|
-
|
2961
|
-
describe Addressable::URI, "when extracting from an arbitrary text " +
|
2962
|
-
"containing invalid URIs" do
|
2963
|
-
before do
|
2964
|
-
@text = <<-TEXT
|
2965
|
-
This is an invalid URI:
|
2966
|
-
http://example.com:bogus/path/to/something/
|
2967
|
-
This is a valid URI:
|
2968
|
-
http://example.com:80/path/to/something/
|
2969
|
-
TEXT
|
2970
|
-
end
|
2971
|
-
|
2972
|
-
it "should ignore invalid URIs when extracting" do
|
2973
|
-
@uris = Addressable::URI.extract(@text)
|
2974
|
-
@uris.should include("http://example.com:80/path/to/something/")
|
2975
|
-
@uris.should_not include("http://example.com:bogus/path/to/something/")
|
2976
|
-
@uris.size.should == 1
|
2977
|
-
end
|
2978
|
-
end
|
2979
|
-
|
2980
3098
|
describe Addressable::URI, "when converting the path " +
|
2981
3099
|
"'relative/path/to/something'" do
|
2982
3100
|
before do
|
@@ -2986,13 +3104,13 @@ describe Addressable::URI, "when converting the path " +
|
|
2986
3104
|
it "should convert to " +
|
2987
3105
|
"\'relative/path/to/something\'" do
|
2988
3106
|
@uri = Addressable::URI.convert_path(@path)
|
2989
|
-
@uri.
|
3107
|
+
@uri.to_str.should == "relative/path/to/something"
|
2990
3108
|
end
|
2991
3109
|
|
2992
3110
|
it "should join with an absolute file path correctly" do
|
2993
3111
|
@base = Addressable::URI.convert_path("/absolute/path/")
|
2994
3112
|
@uri = Addressable::URI.convert_path(@path)
|
2995
|
-
(@base + @uri).
|
3113
|
+
(@base + @uri).to_str.should ==
|
2996
3114
|
"file:///absolute/path/relative/path/to/something"
|
2997
3115
|
end
|
2998
3116
|
end
|
@@ -3017,12 +3135,12 @@ describe Addressable::URI, "when given the root directory" do
|
|
3017
3135
|
if RUBY_PLATFORM =~ /mswin/
|
3018
3136
|
it "should convert to \'file:///c:/\'" do
|
3019
3137
|
@uri = Addressable::URI.convert_path(@path)
|
3020
|
-
@uri.
|
3138
|
+
@uri.to_str.should == "file:///c:/"
|
3021
3139
|
end
|
3022
3140
|
else
|
3023
3141
|
it "should convert to \'file:///\'" do
|
3024
3142
|
@uri = Addressable::URI.convert_path(@path)
|
3025
|
-
@uri.
|
3143
|
+
@uri.to_str.should == "file:///"
|
3026
3144
|
end
|
3027
3145
|
end
|
3028
3146
|
end
|
@@ -3035,11 +3153,11 @@ describe Addressable::URI, "when given the path '/home/user/'" do
|
|
3035
3153
|
it "should convert to " +
|
3036
3154
|
"\'file:///home/user/\'" do
|
3037
3155
|
@uri = Addressable::URI.convert_path(@path)
|
3038
|
-
@uri.
|
3156
|
+
@uri.to_str.should == "file:///home/user/"
|
3039
3157
|
end
|
3040
3158
|
end
|
3041
3159
|
|
3042
|
-
describe Addressable::URI, "
|
3160
|
+
describe Addressable::URI, "when given the path " +
|
3043
3161
|
"'c:\\windows\\My Documents 100%20\\foo.txt'" do
|
3044
3162
|
before do
|
3045
3163
|
@path = "c:\\windows\\My Documents 100%20\\foo.txt"
|
@@ -3048,11 +3166,11 @@ describe Addressable::URI, " when given the path " +
|
|
3048
3166
|
it "should convert to " +
|
3049
3167
|
"\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
|
3050
3168
|
@uri = Addressable::URI.convert_path(@path)
|
3051
|
-
@uri.
|
3169
|
+
@uri.to_str.should == "file:///c:/windows/My%20Documents%20100%20/foo.txt"
|
3052
3170
|
end
|
3053
3171
|
end
|
3054
3172
|
|
3055
|
-
describe Addressable::URI, "
|
3173
|
+
describe Addressable::URI, "when given the path " +
|
3056
3174
|
"'file://c:\\windows\\My Documents 100%20\\foo.txt'" do
|
3057
3175
|
before do
|
3058
3176
|
@path = "file://c:\\windows\\My Documents 100%20\\foo.txt"
|
@@ -3061,11 +3179,11 @@ describe Addressable::URI, " when given the path " +
|
|
3061
3179
|
it "should convert to " +
|
3062
3180
|
"\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
|
3063
3181
|
@uri = Addressable::URI.convert_path(@path)
|
3064
|
-
@uri.
|
3182
|
+
@uri.to_str.should == "file:///c:/windows/My%20Documents%20100%20/foo.txt"
|
3065
3183
|
end
|
3066
3184
|
end
|
3067
3185
|
|
3068
|
-
describe Addressable::URI, "
|
3186
|
+
describe Addressable::URI, "when given the path " +
|
3069
3187
|
"'file:c:\\windows\\My Documents 100%20\\foo.txt'" do
|
3070
3188
|
before do
|
3071
3189
|
@path = "file:c:\\windows\\My Documents 100%20\\foo.txt"
|
@@ -3074,11 +3192,11 @@ describe Addressable::URI, " when given the path " +
|
|
3074
3192
|
it "should convert to " +
|
3075
3193
|
"\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
|
3076
3194
|
@uri = Addressable::URI.convert_path(@path)
|
3077
|
-
@uri.
|
3195
|
+
@uri.to_str.should == "file:///c:/windows/My%20Documents%20100%20/foo.txt"
|
3078
3196
|
end
|
3079
3197
|
end
|
3080
3198
|
|
3081
|
-
describe Addressable::URI, "
|
3199
|
+
describe Addressable::URI, "when given the path " +
|
3082
3200
|
"'file:/c:\\windows\\My Documents 100%20\\foo.txt'" do
|
3083
3201
|
before do
|
3084
3202
|
@path = "file:/c:\\windows\\My Documents 100%20\\foo.txt"
|
@@ -3087,11 +3205,11 @@ describe Addressable::URI, " when given the path " +
|
|
3087
3205
|
it "should convert to " +
|
3088
3206
|
"\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
|
3089
3207
|
@uri = Addressable::URI.convert_path(@path)
|
3090
|
-
@uri.
|
3208
|
+
@uri.to_str.should == "file:///c:/windows/My%20Documents%20100%20/foo.txt"
|
3091
3209
|
end
|
3092
3210
|
end
|
3093
3211
|
|
3094
|
-
describe Addressable::URI, "
|
3212
|
+
describe Addressable::URI, "when given the path " +
|
3095
3213
|
"'file:///c|/windows/My%20Documents%20100%20/foo.txt'" do
|
3096
3214
|
before do
|
3097
3215
|
@path = "file:///c|/windows/My%20Documents%20100%20/foo.txt"
|
@@ -3100,7 +3218,7 @@ describe Addressable::URI, " when given the path " +
|
|
3100
3218
|
it "should convert to " +
|
3101
3219
|
"\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
|
3102
3220
|
@uri = Addressable::URI.convert_path(@path)
|
3103
|
-
@uri.
|
3221
|
+
@uri.to_str.should == "file:///c:/windows/My%20Documents%20100%20/foo.txt"
|
3104
3222
|
end
|
3105
3223
|
end
|
3106
3224
|
|
@@ -3111,480 +3229,7 @@ describe Addressable::URI, "when given an http protocol URI" do
|
|
3111
3229
|
|
3112
3230
|
it "should not do any conversion at all" do
|
3113
3231
|
@uri = Addressable::URI.convert_path(@path)
|
3114
|
-
@uri.
|
3115
|
-
end
|
3116
|
-
end
|
3117
|
-
|
3118
|
-
describe Addressable::URI, " when given the template pattern " +
|
3119
|
-
"'http://example.com/search/{query}/' " +
|
3120
|
-
"to be processed with the ExampleProcessor" do
|
3121
|
-
before do
|
3122
|
-
@pattern = "http://example.com/search/{query}/"
|
3123
|
-
end
|
3124
|
-
|
3125
|
-
it "should expand to " +
|
3126
|
-
"'http://example.com/search/an+example+search+query/' " +
|
3127
|
-
"with a mapping of {\"query\" => \"an example search query\"} " do
|
3128
|
-
Addressable::URI.expand_template(
|
3129
|
-
"http://example.com/search/{query}/",
|
3130
|
-
{"query" => "an example search query"},
|
3131
|
-
ExampleProcessor).to_s.should ==
|
3132
|
-
"http://example.com/search/an+example+search+query/"
|
3133
|
-
end
|
3134
|
-
|
3135
|
-
it "should raise an error " +
|
3136
|
-
"with a mapping of {\"query\" => \"invalid!\"}" do
|
3137
|
-
(lambda do
|
3138
|
-
Addressable::URI.expand_template(
|
3139
|
-
"http://example.com/search/{query}/",
|
3140
|
-
{"query" => "invalid!"},
|
3141
|
-
ExampleProcessor).to_s
|
3142
|
-
end).should raise_error
|
3143
|
-
end
|
3144
|
-
end
|
3145
|
-
|
3146
|
-
# Section 3.3.1 of the URI Template draft v 01
|
3147
|
-
describe Addressable::URI, " when given the mapping supplied in " +
|
3148
|
-
"Section 3.3.1 of the URI Template draft v 01" do
|
3149
|
-
before do
|
3150
|
-
@mapping = {
|
3151
|
-
"a" => "fred",
|
3152
|
-
"b" => "barney",
|
3153
|
-
"c" => "cheeseburger",
|
3154
|
-
"d" => "one two three",
|
3155
|
-
"e" => "20% tricky",
|
3156
|
-
"f" => "",
|
3157
|
-
"20" => "this-is-spinal-tap",
|
3158
|
-
"scheme" => "https",
|
3159
|
-
"p" => "quote=to+be+or+not+to+be",
|
3160
|
-
"q" => "hullo#world"
|
3161
|
-
}
|
3162
|
-
end
|
3163
|
-
|
3164
|
-
it "should result in 'http://example.org/page1#fred' " +
|
3165
|
-
"when used to expand 'http://example.org/page1\#{a}'" do
|
3166
|
-
Addressable::URI.expand_template(
|
3167
|
-
"http://example.org/page1\#{a}",
|
3168
|
-
@mapping
|
3169
|
-
).to_s.should == "http://example.org/page1#fred"
|
3170
|
-
end
|
3171
|
-
|
3172
|
-
it "should result in 'http://example.org/fred/barney/' " +
|
3173
|
-
"when used to expand 'http://example.org/{a}/{b}/'" do
|
3174
|
-
Addressable::URI.expand_template(
|
3175
|
-
"http://example.org/{a}/{b}/",
|
3176
|
-
@mapping
|
3177
|
-
).to_s.should == "http://example.org/fred/barney/"
|
3178
|
-
end
|
3179
|
-
|
3180
|
-
it "should result in 'http://example.org/fredbarney/' " +
|
3181
|
-
"when used to expand 'http://example.org/{a}{b}/'" do
|
3182
|
-
Addressable::URI.expand_template(
|
3183
|
-
"http://example.org/{a}{b}/",
|
3184
|
-
@mapping
|
3185
|
-
).to_s.should == "http://example.org/fredbarney/"
|
3186
|
-
end
|
3187
|
-
|
3188
|
-
it "should result in " +
|
3189
|
-
"'http://example.com/order/cheeseburger/cheeseburger/cheeseburger/' " +
|
3190
|
-
"when used to expand 'http://example.com/order/{c}/{c}/{c}/'" do
|
3191
|
-
Addressable::URI.expand_template(
|
3192
|
-
"http://example.com/order/{c}/{c}/{c}/",
|
3193
|
-
@mapping
|
3194
|
-
).to_s.should ==
|
3195
|
-
"http://example.com/order/cheeseburger/cheeseburger/cheeseburger/"
|
3196
|
-
end
|
3197
|
-
|
3198
|
-
it "should result in 'http://example.org/one%20two%20three' " +
|
3199
|
-
"when used to expand 'http://example.org/{d}'" do
|
3200
|
-
Addressable::URI.expand_template(
|
3201
|
-
"http://example.org/{d}",
|
3202
|
-
@mapping
|
3203
|
-
).to_s.should == "http://example.org/one%20two%20three"
|
3204
|
-
end
|
3205
|
-
|
3206
|
-
it "should result in 'http://example.org/20%25%20tricky' " +
|
3207
|
-
"when used to expand 'http://example.org/{e}'" do
|
3208
|
-
Addressable::URI.expand_template(
|
3209
|
-
"http://example.org/{e}",
|
3210
|
-
@mapping
|
3211
|
-
).to_s.should == "http://example.org/20%25%20tricky"
|
3212
|
-
end
|
3213
|
-
|
3214
|
-
it "should result in 'http://example.com//' " +
|
3215
|
-
"when used to expand 'http://example.com/{f}/'" do
|
3216
|
-
Addressable::URI.expand_template(
|
3217
|
-
"http://example.com/{f}/",
|
3218
|
-
@mapping
|
3219
|
-
).to_s.should == "http://example.com//"
|
3220
|
-
end
|
3221
|
-
|
3222
|
-
it "should result in " +
|
3223
|
-
"'https://this-is-spinal-tap.example.org?date=&option=fred' " +
|
3224
|
-
"when used to expand " +
|
3225
|
-
"'{scheme}://{20}.example.org?date={wilma}&option={a}'" do
|
3226
|
-
Addressable::URI.expand_template(
|
3227
|
-
"{scheme}://{20}.example.org?date={wilma}&option={a}",
|
3228
|
-
@mapping
|
3229
|
-
).to_s.should ==
|
3230
|
-
"https://this-is-spinal-tap.example.org?date=&option=fred"
|
3231
|
-
end
|
3232
|
-
|
3233
|
-
# The v 01 draft conflicts with the v 03 draft here.
|
3234
|
-
# The Addressable implementation uses v 03.
|
3235
|
-
it "should result in " +
|
3236
|
-
"'http://example.org?quote%3Dto%2Bbe%2Bor%2Bnot%2Bto%2Bbe' " +
|
3237
|
-
"when used to expand 'http://example.org?{p}'" do
|
3238
|
-
Addressable::URI.expand_template(
|
3239
|
-
"http://example.org?{p}",
|
3240
|
-
@mapping
|
3241
|
-
).to_s.should == "http://example.org?quote%3Dto%2Bbe%2Bor%2Bnot%2Bto%2Bbe"
|
3242
|
-
end
|
3243
|
-
|
3244
|
-
# The v 01 draft conflicts with the v 03 draft here.
|
3245
|
-
# The Addressable implementation uses v 03.
|
3246
|
-
it "should result in 'http://example.com/hullo%23world' " +
|
3247
|
-
"when used to expand 'http://example.com/{q}'" do
|
3248
|
-
Addressable::URI.expand_template(
|
3249
|
-
"http://example.com/{q}",
|
3250
|
-
@mapping
|
3251
|
-
).to_s.should == "http://example.com/hullo%23world"
|
3252
|
-
end
|
3253
|
-
end
|
3254
|
-
|
3255
|
-
# Section 4.5 of the URI Template draft v 03
|
3256
|
-
describe Addressable::URI, " when given the mapping supplied in " +
|
3257
|
-
"Section 4.5 of the URI Template draft v 03" do
|
3258
|
-
before do
|
3259
|
-
@mapping = {
|
3260
|
-
"foo" => "ϓ",
|
3261
|
-
"bar" => "fred",
|
3262
|
-
"baz" => "10,20,30",
|
3263
|
-
"qux" => ["10","20","30"],
|
3264
|
-
"corge" => [],
|
3265
|
-
"grault" => "",
|
3266
|
-
"garply" => "a/b/c",
|
3267
|
-
"waldo" => "ben & jerrys",
|
3268
|
-
"fred" => ["fred", "", "wilma"],
|
3269
|
-
"plugh" => ["ẛ", "ṡ"],
|
3270
|
-
"1-a_b.c" => "200"
|
3271
|
-
}
|
3272
|
-
end
|
3273
|
-
|
3274
|
-
it "should result in 'http://example.org/?q=fred' " +
|
3275
|
-
"when used to expand 'http://example.org/?q={bar}'" do
|
3276
|
-
Addressable::URI.expand_template(
|
3277
|
-
"http://example.org/?q={bar}",
|
3278
|
-
@mapping
|
3279
|
-
).to_s.should == "http://example.org/?q=fred"
|
3280
|
-
end
|
3281
|
-
|
3282
|
-
it "should result in '/' " +
|
3283
|
-
"when used to expand '/{xyzzy}'" do
|
3284
|
-
Addressable::URI.expand_template(
|
3285
|
-
"/{xyzzy}",
|
3286
|
-
@mapping
|
3287
|
-
).to_s.should == "/"
|
3288
|
-
end
|
3289
|
-
|
3290
|
-
it "should result in " +
|
3291
|
-
"'http://example.org/?foo=%CE%8E&bar=fred&baz=10%2C20%2C30' " +
|
3292
|
-
"when used to expand " +
|
3293
|
-
"'http://example.org/?{-join|&|foo,bar,xyzzy,baz}'" do
|
3294
|
-
Addressable::URI.expand_template(
|
3295
|
-
"http://example.org/?{-join|&|foo,bar,xyzzy,baz}",
|
3296
|
-
@mapping
|
3297
|
-
).to_s.should ==
|
3298
|
-
"http://example.org/?foo=%CE%8E&bar=fred&baz=10%2C20%2C30"
|
3299
|
-
end
|
3300
|
-
|
3301
|
-
it "should result in 'http://example.org/?d=10,20,30' " +
|
3302
|
-
"when used to expand 'http://example.org/?d={-list|,|qux}'" do
|
3303
|
-
Addressable::URI.expand_template(
|
3304
|
-
"http://example.org/?d={-list|,|qux}",
|
3305
|
-
@mapping
|
3306
|
-
).to_s.should == "http://example.org/?d=10,20,30"
|
3307
|
-
end
|
3308
|
-
|
3309
|
-
it "should result in 'http://example.org/?d=10&d=20&d=30' " +
|
3310
|
-
"when used to expand 'http://example.org/?d={-list|&d=|qux}'" do
|
3311
|
-
Addressable::URI.expand_template(
|
3312
|
-
"http://example.org/?d={-list|&d=|qux}",
|
3313
|
-
@mapping
|
3314
|
-
).to_s.should == "http://example.org/?d=10&d=20&d=30"
|
3315
|
-
end
|
3316
|
-
|
3317
|
-
it "should result in 'http://example.org/fredfred/a%2Fb%2Fc' " +
|
3318
|
-
"when used to expand 'http://example.org/{bar}{bar}/{garply}'" do
|
3319
|
-
Addressable::URI.expand_template(
|
3320
|
-
"http://example.org/{bar}{bar}/{garply}",
|
3321
|
-
@mapping
|
3322
|
-
).to_s.should == "http://example.org/fredfred/a%2Fb%2Fc"
|
3323
|
-
end
|
3324
|
-
|
3325
|
-
it "should result in 'http://example.org/fred/fred//wilma' " +
|
3326
|
-
"when used to expand 'http://example.org/{bar}{-prefix|/|fred}'" do
|
3327
|
-
Addressable::URI.expand_template(
|
3328
|
-
"http://example.org/{bar}{-prefix|/|fred}",
|
3329
|
-
@mapping
|
3330
|
-
).to_s.should == "http://example.org/fred/fred//wilma"
|
3331
|
-
end
|
3332
|
-
|
3333
|
-
it "should result in ':%E1%B9%A1:%E1%B9%A1:' " +
|
3334
|
-
"when used to expand '{-neg|:|corge}{-suffix|:|plugh}'" do
|
3335
|
-
Addressable::URI.expand_template(
|
3336
|
-
"{-neg|:|corge}{-suffix|:|plugh}",
|
3337
|
-
@mapping
|
3338
|
-
).to_s.should == ":%E1%B9%A1:%E1%B9%A1:"
|
3339
|
-
end
|
3340
|
-
|
3341
|
-
it "should result in '../ben%20%26%20jerrys/' " +
|
3342
|
-
"when used to expand '../{waldo}/'" do
|
3343
|
-
Addressable::URI.expand_template(
|
3344
|
-
"../{waldo}/",
|
3345
|
-
@mapping
|
3346
|
-
).to_s.should == "../ben%20%26%20jerrys/"
|
3347
|
-
end
|
3348
|
-
|
3349
|
-
it "should result in 'telnet:192.0.2.16:80' " +
|
3350
|
-
"when used to expand 'telnet:192.0.2.16{-opt|:80|grault}'" do
|
3351
|
-
Addressable::URI.expand_template(
|
3352
|
-
"telnet:192.0.2.16{-opt|:80|grault}",
|
3353
|
-
@mapping
|
3354
|
-
).to_s.should == "telnet:192.0.2.16:80"
|
3355
|
-
end
|
3356
|
-
|
3357
|
-
it "should result in ':200:' " +
|
3358
|
-
"when used to expand ':{1-a_b.c}:'" do
|
3359
|
-
Addressable::URI.expand_template(
|
3360
|
-
":{1-a_b.c}:",
|
3361
|
-
@mapping
|
3362
|
-
).to_s.should == ":200:"
|
3363
|
-
end
|
3364
|
-
end
|
3365
|
-
|
3366
|
-
describe Addressable::URI, "when given a mapping that contains a " +
|
3367
|
-
"template-var within a value" do
|
3368
|
-
before do
|
3369
|
-
@mapping = {
|
3370
|
-
"a" => "{b}",
|
3371
|
-
"b" => "barney",
|
3372
|
-
}
|
3373
|
-
end
|
3374
|
-
|
3375
|
-
it "should result in 'http://example.com/%7Bb%7D/barney/' " +
|
3376
|
-
"when used to expand 'http://example.com/{a}/{b}/'" do
|
3377
|
-
Addressable::URI.expand_template(
|
3378
|
-
"http://example.com/{a}/{b}/",
|
3379
|
-
@mapping).to_s.should == "http://example.com/%7Bb%7D/barney/"
|
3380
|
-
end
|
3381
|
-
|
3382
|
-
it "should result in 'http://example.com//%7Bb%7D/' " +
|
3383
|
-
"when used to expand 'http://example.com/{-opt|foo|foo}/{a}/'" do
|
3384
|
-
Addressable::URI.expand_template(
|
3385
|
-
"http://example.com/{-opt|foo|foo}/{a}/",
|
3386
|
-
@mapping).to_s.should == "http://example.com//%7Bb%7D/"
|
3387
|
-
end
|
3388
|
-
|
3389
|
-
it "should result in 'http://example.com//%7Bb%7D/' " +
|
3390
|
-
"when used to expand 'http://example.com/{-neg|foo|b}/{a}/'" do
|
3391
|
-
Addressable::URI.expand_template(
|
3392
|
-
"http://example.com/{-neg|foo|b}/{a}/",
|
3393
|
-
@mapping).to_s.should == "http://example.com//%7Bb%7D/"
|
3394
|
-
end
|
3395
|
-
|
3396
|
-
it "should result in 'http://example.com//barney/%7Bb%7D/' " +
|
3397
|
-
"when used to expand 'http://example.com/{-prefix|/|b}/{a}/'" do
|
3398
|
-
Addressable::URI.expand_template(
|
3399
|
-
"http://example.com/{-prefix|/|b}/{a}/",
|
3400
|
-
@mapping).to_s.should == "http://example.com//barney/%7Bb%7D/"
|
3401
|
-
end
|
3402
|
-
|
3403
|
-
it "should result in 'http://example.com/barney//%7Bb%7D/' " +
|
3404
|
-
"when used to expand 'http://example.com/{-suffix|/|b}/{a}/'" do
|
3405
|
-
Addressable::URI.expand_template(
|
3406
|
-
"http://example.com/{-suffix|/|b}/{a}/",
|
3407
|
-
@mapping).to_s.should == "http://example.com/barney//%7Bb%7D/"
|
3408
|
-
end
|
3409
|
-
|
3410
|
-
it "should result in 'http://example.com/%7Bb%7D/?b=barney&c=42' " +
|
3411
|
-
"when used to expand 'http://example.com/{a}/?{-join|&|b,c=42}'" do
|
3412
|
-
Addressable::URI.expand_template(
|
3413
|
-
"http://example.com/{a}/?{-join|&|b,c=42}",
|
3414
|
-
@mapping).to_s.should == "http://example.com/%7Bb%7D/?b=barney&c=42"
|
3415
|
-
end
|
3416
|
-
|
3417
|
-
it "should result in 'http://example.com/42/?b=barney' " +
|
3418
|
-
"when used to expand 'http://example.com/{c=42}/?{-join|&|b}'" do
|
3419
|
-
Addressable::URI.expand_template(
|
3420
|
-
"http://example.com/{c=42}/?{-join|&|b}",
|
3421
|
-
@mapping).to_s.should == "http://example.com/42/?b=barney"
|
3422
|
-
end
|
3423
|
-
end
|
3424
|
-
|
3425
|
-
describe Addressable::URI, "when given a single variable mapping" do
|
3426
|
-
before do
|
3427
|
-
@mapping = {
|
3428
|
-
"foo" => "fred"
|
3429
|
-
}
|
3430
|
-
end
|
3431
|
-
|
3432
|
-
it "should result in 'fred' when used to expand '{foo}'" do
|
3433
|
-
Addressable::URI.expand_template(
|
3434
|
-
"{foo}",
|
3435
|
-
@mapping
|
3436
|
-
).to_s.should == "fred"
|
3437
|
-
end
|
3438
|
-
|
3439
|
-
it "should result in 'wilma' when used to expand '{bar=wilma}'" do
|
3440
|
-
Addressable::URI.expand_template(
|
3441
|
-
"{bar=wilma}",
|
3442
|
-
@mapping
|
3443
|
-
).to_s.should == "wilma"
|
3444
|
-
end
|
3445
|
-
|
3446
|
-
it "should result in '' when used to expand '{baz}'" do
|
3447
|
-
Addressable::URI.expand_template(
|
3448
|
-
"{baz}",
|
3449
|
-
@mapping
|
3450
|
-
).to_s.should == ""
|
3451
|
-
end
|
3452
|
-
end
|
3453
|
-
|
3454
|
-
describe Addressable::URI, "when given a simple mapping" do
|
3455
|
-
before do
|
3456
|
-
@mapping = {
|
3457
|
-
"foo" => "fred",
|
3458
|
-
"bar" => "barney",
|
3459
|
-
"baz" => ""
|
3460
|
-
}
|
3461
|
-
end
|
3462
|
-
|
3463
|
-
it "should result in 'foo=fred&bar=barney&baz=' when used to expand " +
|
3464
|
-
"'{-join|&|foo,bar,baz,qux}'" do
|
3465
|
-
Addressable::URI.expand_template(
|
3466
|
-
"{-join|&|foo,bar,baz,qux}",
|
3467
|
-
@mapping
|
3468
|
-
).to_s.should == "foo=fred&bar=barney&baz="
|
3469
|
-
end
|
3470
|
-
|
3471
|
-
it "should result in 'bar=barney' when used to expand " +
|
3472
|
-
"'{-join|&|bar}'" do
|
3473
|
-
Addressable::URI.expand_template(
|
3474
|
-
"{-join|&|bar}",
|
3475
|
-
@mapping
|
3476
|
-
).to_s.should == "bar=barney"
|
3477
|
-
end
|
3478
|
-
|
3479
|
-
it "should result in '' when used to expand " +
|
3480
|
-
"'{-join|&|qux}'" do
|
3481
|
-
Addressable::URI.expand_template(
|
3482
|
-
"{-join|&|qux}",
|
3483
|
-
@mapping
|
3484
|
-
).to_s.should == ""
|
3485
|
-
end
|
3486
|
-
end
|
3487
|
-
|
3488
|
-
describe Addressable::URI, "when given a mapping containing values " +
|
3489
|
-
"that are already percent-encoded" do
|
3490
|
-
before do
|
3491
|
-
@mapping = {
|
3492
|
-
"a" => "%7Bb%7D"
|
3493
|
-
}
|
3494
|
-
end
|
3495
|
-
|
3496
|
-
it "should result in 'http://example.com/%257Bb%257D/' " +
|
3497
|
-
"when used to expand 'http://example.com/{a}/'" do
|
3498
|
-
Addressable::URI.expand_template(
|
3499
|
-
"http://example.com/{a}/",
|
3500
|
-
@mapping).to_s.should == "http://example.com/%257Bb%257D/"
|
3501
|
-
end
|
3502
|
-
end
|
3503
|
-
|
3504
|
-
describe Addressable::URI, "when given a mapping containing bogus values" do
|
3505
|
-
it "should raise a TypeError" do
|
3506
|
-
(lambda do
|
3507
|
-
Addressable::URI.expand_template(
|
3508
|
-
"http://example.com/{bogus}/", {
|
3509
|
-
"bogus" => 42
|
3510
|
-
}
|
3511
|
-
)
|
3512
|
-
end).should raise_error(TypeError)
|
3513
|
-
end
|
3514
|
-
end
|
3515
|
-
|
3516
|
-
describe Addressable::URI, "when given a pattern with bogus operators" do
|
3517
|
-
it "should raise an InvalidTemplateOperatorError" do
|
3518
|
-
(lambda do
|
3519
|
-
Addressable::URI.expand_template(
|
3520
|
-
"http://example.com/{-bogus|/|a,b,c}/", {
|
3521
|
-
"a" => "a", "b" => "b", "c" => "c"
|
3522
|
-
}
|
3523
|
-
)
|
3524
|
-
end).should raise_error(Addressable::URI::InvalidTemplateOperatorError)
|
3525
|
-
end
|
3526
|
-
|
3527
|
-
it "should raise an InvalidTemplateOperatorError" do
|
3528
|
-
(lambda do
|
3529
|
-
Addressable::URI.expand_template(
|
3530
|
-
"http://example.com/{-prefix|/|a,b,c}/", {
|
3531
|
-
"a" => "a", "b" => "b", "c" => "c"
|
3532
|
-
}
|
3533
|
-
)
|
3534
|
-
end).should raise_error(Addressable::URI::InvalidTemplateOperatorError)
|
3535
|
-
end
|
3536
|
-
|
3537
|
-
it "should raise an InvalidTemplateOperatorError" do
|
3538
|
-
(lambda do
|
3539
|
-
Addressable::URI.expand_template(
|
3540
|
-
"http://example.com/{-suffix|/|a,b,c}/", {
|
3541
|
-
"a" => "a", "b" => "b", "c" => "c"
|
3542
|
-
}
|
3543
|
-
)
|
3544
|
-
end).should raise_error(Addressable::URI::InvalidTemplateOperatorError)
|
3545
|
-
end
|
3546
|
-
|
3547
|
-
it "should raise an InvalidTemplateOperatorError" do
|
3548
|
-
(lambda do
|
3549
|
-
Addressable::URI.expand_template(
|
3550
|
-
"http://example.com/{-join|/|a,b,c}/", {
|
3551
|
-
"a" => ["a"], "b" => ["b"], "c" => "c"
|
3552
|
-
}
|
3553
|
-
)
|
3554
|
-
end).should raise_error(Addressable::URI::InvalidTemplateOperatorError)
|
3555
|
-
end
|
3556
|
-
|
3557
|
-
it "should raise an InvalidTemplateOperatorError" do
|
3558
|
-
(lambda do
|
3559
|
-
Addressable::URI.expand_template(
|
3560
|
-
"http://example.com/{-list|/|a,b,c}/", {
|
3561
|
-
"a" => ["a"], "b" => ["b"], "c" => "c"
|
3562
|
-
}
|
3563
|
-
)
|
3564
|
-
end).should raise_error(Addressable::URI::InvalidTemplateOperatorError)
|
3565
|
-
end
|
3566
|
-
end
|
3567
|
-
|
3568
|
-
describe Addressable::URI, "when given a mapping that contains an Array" do
|
3569
|
-
before do
|
3570
|
-
@mapping = {"query" => "an example search query".split(" ")}
|
3571
|
-
end
|
3572
|
-
|
3573
|
-
it "should result in 'http://example.com/search/an+example+search+query/'" +
|
3574
|
-
" when used to expand 'http://example.com/search/{-list|+|query}/'" do
|
3575
|
-
Addressable::URI.expand_template(
|
3576
|
-
"http://example.com/search/{-list|+|query}/",
|
3577
|
-
@mapping).to_s.should ==
|
3578
|
-
"http://example.com/search/an+example+search+query/"
|
3579
|
-
end
|
3580
|
-
|
3581
|
-
it "should result in 'http://example.com/search/an+example+search+query/'" +
|
3582
|
-
" when used to expand 'http://example.com/search/{-list|+|query}/'" +
|
3583
|
-
" with a NoOpProcessor" do
|
3584
|
-
Addressable::URI.expand_template(
|
3585
|
-
"http://example.com/search/{-list|+|query}/",
|
3586
|
-
@mapping, NoOpProcessor).to_s.should ==
|
3587
|
-
"http://example.com/search/an+example+search+query/"
|
3232
|
+
@uri.to_str.should == "http://example.com/"
|
3588
3233
|
end
|
3589
3234
|
end
|
3590
3235
|
|
@@ -3598,7 +3243,7 @@ class SuperString
|
|
3598
3243
|
end
|
3599
3244
|
end
|
3600
3245
|
|
3601
|
-
describe Addressable::URI, "
|
3246
|
+
describe Addressable::URI, "when parsing a non-String object" do
|
3602
3247
|
it "should correctly parse anything with a 'to_str' method" do
|
3603
3248
|
Addressable::URI.parse(SuperString.new(42))
|
3604
3249
|
end
|
@@ -3606,7 +3251,7 @@ describe Addressable::URI, " when parsing a non-String object" do
|
|
3606
3251
|
it "should raise a TypeError for objects than cannot be converted" do
|
3607
3252
|
(lambda do
|
3608
3253
|
Addressable::URI.parse(42)
|
3609
|
-
end).should raise_error(TypeError)
|
3254
|
+
end).should raise_error(TypeError, "Can't convert Fixnum into String.")
|
3610
3255
|
end
|
3611
3256
|
|
3612
3257
|
it "should correctly parse heuristically anything with a 'to_str' method" do
|
@@ -3616,7 +3261,7 @@ describe Addressable::URI, " when parsing a non-String object" do
|
|
3616
3261
|
it "should raise a TypeError for objects than cannot be converted" do
|
3617
3262
|
(lambda do
|
3618
3263
|
Addressable::URI.heuristic_parse(42)
|
3619
|
-
end).should raise_error(TypeError)
|
3264
|
+
end).should raise_error(TypeError, "Can't convert Fixnum into String.")
|
3620
3265
|
end
|
3621
3266
|
end
|
3622
3267
|
|
@@ -3698,514 +3343,50 @@ describe Addressable::URI, "when encoding a bogus object" do
|
|
3698
3343
|
end
|
3699
3344
|
end
|
3700
3345
|
|
3701
|
-
describe Addressable::URI, "
|
3702
|
-
"'/'" do
|
3703
|
-
before do
|
3704
|
-
@uri = Addressable::URI.parse("/")
|
3705
|
-
end
|
3706
|
-
|
3707
|
-
it "should have the correct mapping when extracting values " +
|
3708
|
-
"using the pattern '/'" do
|
3709
|
-
@uri.extract_mapping("/").should == {}
|
3710
|
-
end
|
3711
|
-
end
|
3712
|
-
|
3713
|
-
describe Addressable::URI, " when parsed from '/one/'" do
|
3714
|
-
before do
|
3715
|
-
@uri = Addressable::URI.parse("/one/")
|
3716
|
-
end
|
3717
|
-
|
3718
|
-
it "should not match the pattern '/two/'" do
|
3719
|
-
@uri.extract_mapping("/two/").should == nil
|
3720
|
-
end
|
3721
|
-
|
3722
|
-
it "should have the correct mapping when extracting values " +
|
3723
|
-
"using the pattern '/{number}/'" do
|
3724
|
-
@uri.extract_mapping("/{number}/").should == {"number" => "one"}
|
3725
|
-
end
|
3726
|
-
end
|
3727
|
-
|
3728
|
-
describe Addressable::URI, " when parsed from '/one/two/'" do
|
3729
|
-
before do
|
3730
|
-
@uri = Addressable::URI.parse("/one/two/")
|
3731
|
-
end
|
3732
|
-
|
3733
|
-
it "should not match the pattern '/{number}/' " +
|
3734
|
-
"with the SlashlessProcessor" do
|
3735
|
-
@uri.extract_mapping("/{number}/", SlashlessProcessor).should == nil
|
3736
|
-
end
|
3737
|
-
|
3738
|
-
it "should have the correct mapping when extracting values " +
|
3739
|
-
"using the pattern '/{number}/' without a processor" do
|
3740
|
-
@uri.extract_mapping("/{number}/").should == {
|
3741
|
-
"number" => "one/two"
|
3742
|
-
}
|
3743
|
-
end
|
3744
|
-
|
3745
|
-
it "should have the correct mapping when extracting values " +
|
3746
|
-
"using the pattern '/{first}/{second}/' with the SlashlessProcessor" do
|
3747
|
-
@uri.extract_mapping("/{first}/{second}/", SlashlessProcessor).should == {
|
3748
|
-
"first" => "one",
|
3749
|
-
"second" => "two"
|
3750
|
-
}
|
3751
|
-
end
|
3752
|
-
end
|
3753
|
-
|
3754
|
-
describe Addressable::URI, " when parsed from " +
|
3755
|
-
"'http://example.com/search/an+example+search+query/'" do
|
3756
|
-
before do
|
3757
|
-
@uri = Addressable::URI.parse(
|
3758
|
-
"http://example.com/search/an+example+search+query/")
|
3759
|
-
end
|
3760
|
-
|
3761
|
-
it "should have the correct mapping when extracting values using " +
|
3762
|
-
"the pattern 'http://example.com/search/{query}/' with the " +
|
3763
|
-
"ExampleProcessor" do
|
3764
|
-
@uri.extract_mapping(
|
3765
|
-
"http://example.com/search/{query}/", ExampleProcessor
|
3766
|
-
).should == {
|
3767
|
-
"query" => "an example search query"
|
3768
|
-
}
|
3769
|
-
end
|
3770
|
-
|
3771
|
-
it "should have the correct mapping when extracting values " +
|
3772
|
-
"using the pattern " +
|
3773
|
-
"'http://example.com/search/{-list|+|query}/'" do
|
3774
|
-
@uri.extract_mapping(
|
3775
|
-
"http://example.com/search/{-list|+|query}/"
|
3776
|
-
).should == {
|
3777
|
-
"query" => ["an", "example", "search", "query"]
|
3778
|
-
}
|
3779
|
-
end
|
3780
|
-
|
3781
|
-
it "should return nil when extracting values using " +
|
3782
|
-
"a non-matching pattern" do
|
3783
|
-
@uri.extract_mapping(
|
3784
|
-
"http://bogus.com/{thingy}/"
|
3785
|
-
).should == nil
|
3786
|
-
end
|
3787
|
-
end
|
3788
|
-
|
3789
|
-
describe Addressable::URI, " when parsed from " +
|
3790
|
-
"'http://example.com/a/b/c/'" do
|
3791
|
-
before do
|
3792
|
-
@uri = Addressable::URI.parse(
|
3793
|
-
"http://example.com/a/b/c/")
|
3794
|
-
end
|
3795
|
-
|
3796
|
-
it "should have the correct mapping when extracting values " +
|
3797
|
-
"using the pattern " +
|
3798
|
-
"'http://example.com/{first}/{second}/' with the ExampleProcessor" do
|
3799
|
-
@uri.extract_mapping(
|
3800
|
-
"http://example.com/{first}/{second}/", ExampleProcessor
|
3801
|
-
).should == {
|
3802
|
-
"first" => "a",
|
3803
|
-
"second" => "b/c"
|
3804
|
-
}
|
3805
|
-
end
|
3806
|
-
|
3807
|
-
it "should have the correct mapping when extracting values " +
|
3808
|
-
"using the pattern " +
|
3809
|
-
"'http://example.com/{first}/{-list|/|second}/'" do
|
3810
|
-
@uri.extract_mapping(
|
3811
|
-
"http://example.com/{first}/{-list|/|second}/"
|
3812
|
-
).should == {
|
3813
|
-
"first" => "a",
|
3814
|
-
"second" => ["b", "c"]
|
3815
|
-
}
|
3816
|
-
end
|
3817
|
-
|
3818
|
-
it "should have the correct mapping when extracting values " +
|
3819
|
-
"using the pattern " +
|
3820
|
-
"'http://example.com/{first}/{-list|/|rot13}/' " +
|
3821
|
-
"with the ExampleProcessor" do
|
3822
|
-
@uri.extract_mapping(
|
3823
|
-
"http://example.com/{first}/{-list|/|rot13}/",
|
3824
|
-
ExampleProcessor
|
3825
|
-
).should == {
|
3826
|
-
"first" => "a",
|
3827
|
-
"rot13" => ["o", "p"]
|
3828
|
-
}
|
3829
|
-
end
|
3830
|
-
|
3831
|
-
it "should have the correct mapping when extracting values " +
|
3832
|
-
"using the pattern " +
|
3833
|
-
"'http://example.com/{-list|/|rot13}/' " +
|
3834
|
-
"with the ExampleProcessor" do
|
3835
|
-
@uri.extract_mapping(
|
3836
|
-
"http://example.com/{-list|/|rot13}/",
|
3837
|
-
ExampleProcessor
|
3838
|
-
).should == {
|
3839
|
-
"rot13" => ["n", "o", "p"]
|
3840
|
-
}
|
3841
|
-
end
|
3842
|
-
|
3843
|
-
it "should not map to anything when extracting values " +
|
3844
|
-
"using the pattern " +
|
3845
|
-
"'http://example.com/{-list|/|rot13}/'" do
|
3846
|
-
@uri.extract_mapping("http://example.com/{-join|/|a,b,c}/").should == nil
|
3847
|
-
end
|
3848
|
-
end
|
3849
|
-
|
3850
|
-
describe Addressable::URI, " when parsed from " +
|
3851
|
-
"'http://example.com/?a=one&b=two&c=three'" do
|
3852
|
-
before do
|
3853
|
-
@uri = Addressable::URI.parse("http://example.com/?a=one&b=two&c=three")
|
3854
|
-
end
|
3855
|
-
|
3856
|
-
it "should have the correct mapping when extracting values " +
|
3857
|
-
"using the pattern " +
|
3858
|
-
"'http://example.com/?{-join|&|a,b,c}'" do
|
3859
|
-
@uri.extract_mapping(
|
3860
|
-
"http://example.com/?{-join|&|a,b,c}"
|
3861
|
-
).should == {
|
3862
|
-
"a" => "one",
|
3863
|
-
"b" => "two",
|
3864
|
-
"c" => "three"
|
3865
|
-
}
|
3866
|
-
end
|
3867
|
-
end
|
3868
|
-
|
3869
|
-
describe Addressable::URI, " when parsed from " +
|
3870
|
-
"'http://example.com/?rot13=frperg'" do
|
3871
|
-
before do
|
3872
|
-
@uri = Addressable::URI.parse("http://example.com/?rot13=frperg")
|
3873
|
-
end
|
3874
|
-
|
3875
|
-
it "should have the correct mapping when extracting values " +
|
3876
|
-
"using the pattern " +
|
3877
|
-
"'http://example.com/?{-join|&|rot13}' with the ExampleProcessor" do
|
3878
|
-
@uri.extract_mapping(
|
3879
|
-
"http://example.com/?{-join|&|rot13}",
|
3880
|
-
ExampleProcessor
|
3881
|
-
).should == {
|
3882
|
-
"rot13" => "secret"
|
3883
|
-
}
|
3884
|
-
end
|
3885
|
-
end
|
3886
|
-
|
3887
|
-
describe Addressable::URI, " when parsed from " +
|
3888
|
-
"'http://example.com/one/spacer/two/'" do
|
3889
|
-
before do
|
3890
|
-
@uri = Addressable::URI.parse("http://example.com/one/spacer/two/")
|
3891
|
-
end
|
3892
|
-
|
3893
|
-
it "should have the correct mapping when extracting values " +
|
3894
|
-
"using the pattern " +
|
3895
|
-
"'http://example.com/{first}/spacer/{second}/'" do
|
3896
|
-
@uri.extract_mapping(
|
3897
|
-
"http://example.com/{first}/spacer/{second}/"
|
3898
|
-
).should == {
|
3899
|
-
"first" => "one",
|
3900
|
-
"second" => "two"
|
3901
|
-
}
|
3902
|
-
end
|
3903
|
-
|
3904
|
-
it "should have the correct mapping when extracting values " +
|
3905
|
-
"using the pattern " +
|
3906
|
-
"'http://example.com{-prefix|/|stuff}/'" do
|
3907
|
-
@uri.extract_mapping(
|
3908
|
-
"http://example.com{-prefix|/|stuff}/"
|
3909
|
-
).should == {
|
3910
|
-
"stuff" => ["one", "spacer", "two"]
|
3911
|
-
}
|
3912
|
-
end
|
3913
|
-
|
3914
|
-
it "should have the correct mapping when extracting values " +
|
3915
|
-
"using the pattern " +
|
3916
|
-
"'http://example.com/o{-prefix|/|stuff}/'" do
|
3917
|
-
@uri.extract_mapping(
|
3918
|
-
"http://example.com/o{-prefix|/|stuff}/"
|
3919
|
-
).should == nil
|
3920
|
-
end
|
3921
|
-
|
3922
|
-
it "should have the correct mapping when extracting values " +
|
3923
|
-
"using the pattern " +
|
3924
|
-
"'http://example.com/{first}/spacer{-prefix|/|stuff}/'" do
|
3925
|
-
@uri.extract_mapping(
|
3926
|
-
"http://example.com/{first}/spacer{-prefix|/|stuff}/"
|
3927
|
-
).should == {
|
3928
|
-
"first" => "one",
|
3929
|
-
"stuff" => ["two"]
|
3930
|
-
}
|
3931
|
-
end
|
3932
|
-
|
3933
|
-
it "should not match anything when extracting values " +
|
3934
|
-
"using the incorrect suffix pattern " +
|
3935
|
-
"'http://example.com/{-prefix|/|stuff}/'" do
|
3936
|
-
@uri.extract_mapping(
|
3937
|
-
"http://example.com/{-prefix|/|stuff}/"
|
3938
|
-
).should == nil
|
3939
|
-
end
|
3940
|
-
|
3941
|
-
it "should have the correct mapping when extracting values " +
|
3942
|
-
"using the pattern " +
|
3943
|
-
"'http://example.com{-prefix|/|rot13}/' with the ExampleProcessor" do
|
3944
|
-
@uri.extract_mapping(
|
3945
|
-
"http://example.com{-prefix|/|rot13}/",
|
3946
|
-
ExampleProcessor
|
3947
|
-
).should == {
|
3948
|
-
"rot13" => ["bar", "fcnpre", "gjb"]
|
3949
|
-
}
|
3950
|
-
end
|
3951
|
-
|
3952
|
-
it "should have the correct mapping when extracting values " +
|
3953
|
-
"using the pattern " +
|
3954
|
-
"'http://example.com{-prefix|/|rot13}' with the ExampleProcessor" do
|
3955
|
-
@uri.extract_mapping(
|
3956
|
-
"http://example.com{-prefix|/|rot13}",
|
3957
|
-
ExampleProcessor
|
3958
|
-
).should == {
|
3959
|
-
"rot13" => ["bar", "fcnpre", "gjb", ""]
|
3960
|
-
}
|
3961
|
-
end
|
3962
|
-
|
3963
|
-
it "should not match anything when extracting values " +
|
3964
|
-
"using the incorrect suffix pattern " +
|
3965
|
-
"'http://example.com/{-prefix|/|rot13}' with the ExampleProcessor" do
|
3966
|
-
@uri.extract_mapping(
|
3967
|
-
"http://example.com/{-prefix|/|rot13}",
|
3968
|
-
ExampleProcessor
|
3969
|
-
).should == nil
|
3970
|
-
end
|
3971
|
-
|
3972
|
-
it "should have the correct mapping when extracting values " +
|
3973
|
-
"using the pattern " +
|
3974
|
-
"'http://example.com/{-suffix|/|stuff}'" do
|
3975
|
-
@uri.extract_mapping(
|
3976
|
-
"http://example.com/{-suffix|/|stuff}"
|
3977
|
-
).should == {
|
3978
|
-
"stuff" => ["one", "spacer", "two"]
|
3979
|
-
}
|
3980
|
-
end
|
3981
|
-
|
3982
|
-
it "should have the correct mapping when extracting values " +
|
3983
|
-
"using the pattern " +
|
3984
|
-
"'http://example.com/{-suffix|/|stuff}o'" do
|
3985
|
-
@uri.extract_mapping(
|
3986
|
-
"http://example.com/{-suffix|/|stuff}o"
|
3987
|
-
).should == nil
|
3988
|
-
end
|
3989
|
-
|
3990
|
-
it "should have the correct mapping when extracting values " +
|
3991
|
-
"using the pattern " +
|
3992
|
-
"'http://example.com/o{-suffix|/|stuff}'" do
|
3993
|
-
@uri.extract_mapping(
|
3994
|
-
"http://example.com/o{-suffix|/|stuff}"
|
3995
|
-
).should == {"stuff"=>["ne", "spacer", "two"]}
|
3996
|
-
end
|
3997
|
-
|
3998
|
-
it "should have the correct mapping when extracting values " +
|
3999
|
-
"using the pattern " +
|
4000
|
-
"'http://example.com/{first}/spacer/{-suffix|/|stuff}'" do
|
4001
|
-
@uri.extract_mapping(
|
4002
|
-
"http://example.com/{first}/spacer/{-suffix|/|stuff}"
|
4003
|
-
).should == {
|
4004
|
-
"first" => "one",
|
4005
|
-
"stuff" => ["two"]
|
4006
|
-
}
|
4007
|
-
end
|
4008
|
-
|
4009
|
-
it "should not match anything when extracting values " +
|
4010
|
-
"using the incorrect suffix pattern " +
|
4011
|
-
"'http://example.com/{-suffix|/|stuff}/'" do
|
4012
|
-
@uri.extract_mapping(
|
4013
|
-
"http://example.com/{-suffix|/|stuff}/"
|
4014
|
-
).should == nil
|
4015
|
-
end
|
4016
|
-
|
4017
|
-
it "should have the correct mapping when extracting values " +
|
4018
|
-
"using the pattern " +
|
4019
|
-
"'http://example.com/{-suffix|/|rot13}' with the ExampleProcessor" do
|
4020
|
-
@uri.extract_mapping(
|
4021
|
-
"http://example.com/{-suffix|/|rot13}",
|
4022
|
-
ExampleProcessor
|
4023
|
-
).should == {
|
4024
|
-
"rot13" => ["bar", "fcnpre", "gjb"]
|
4025
|
-
}
|
4026
|
-
end
|
4027
|
-
|
4028
|
-
it "should have the correct mapping when extracting values " +
|
4029
|
-
"using the pattern " +
|
4030
|
-
"'http://example.com{-suffix|/|rot13}' with the ExampleProcessor" do
|
4031
|
-
@uri.extract_mapping(
|
4032
|
-
"http://example.com{-suffix|/|rot13}",
|
4033
|
-
ExampleProcessor
|
4034
|
-
).should == {
|
4035
|
-
"rot13" => ["", "bar", "fcnpre", "gjb"]
|
4036
|
-
}
|
4037
|
-
end
|
4038
|
-
|
4039
|
-
it "should not match anything when extracting values " +
|
4040
|
-
"using the incorrect suffix pattern " +
|
4041
|
-
"'http://example.com/{-suffix|/|rot13}/' with the ExampleProcessor" do
|
4042
|
-
@uri.extract_mapping(
|
4043
|
-
"http://example.com/{-suffix|/|rot13}/",
|
4044
|
-
ExampleProcessor
|
4045
|
-
).should == nil
|
4046
|
-
end
|
4047
|
-
end
|
4048
|
-
|
4049
|
-
describe Addressable::URI, " when parsed from " +
|
4050
|
-
"'http://example.com/?email=bob@sporkmonger.com'" do
|
3346
|
+
describe Addressable::URI, "when given the input " +
|
3347
|
+
"'http://example.com/'" do
|
4051
3348
|
before do
|
4052
|
-
@
|
4053
|
-
"http://example.com/?email=bob@sporkmonger.com"
|
4054
|
-
)
|
4055
|
-
end
|
4056
|
-
|
4057
|
-
it "should not match anything when extracting values " +
|
4058
|
-
"using the incorrect opt pattern " +
|
4059
|
-
"'http://example.com/?email={-opt|bogus@bogus.com|test}'" do
|
4060
|
-
@uri.extract_mapping(
|
4061
|
-
"http://example.com/?email={-opt|bogus@bogus.com|test}"
|
4062
|
-
).should == nil
|
4063
|
-
end
|
4064
|
-
|
4065
|
-
it "should not match anything when extracting values " +
|
4066
|
-
"using the incorrect neg pattern " +
|
4067
|
-
"'http://example.com/?email={-neg|bogus@bogus.com|test}'" do
|
4068
|
-
@uri.extract_mapping(
|
4069
|
-
"http://example.com/?email={-neg|bogus@bogus.com|test}"
|
4070
|
-
).should == nil
|
4071
|
-
end
|
4072
|
-
|
4073
|
-
it "should indicate a match when extracting values " +
|
4074
|
-
"using the opt pattern " +
|
4075
|
-
"'http://example.com/?email={-opt|bob@sporkmonger.com|test}'" do
|
4076
|
-
@uri.extract_mapping(
|
4077
|
-
"http://example.com/?email={-opt|bob@sporkmonger.com|test}"
|
4078
|
-
).should == {}
|
3349
|
+
@input = "http://example.com/"
|
4079
3350
|
end
|
4080
3351
|
|
4081
|
-
it "should
|
4082
|
-
|
4083
|
-
|
4084
|
-
@uri.extract_mapping(
|
4085
|
-
"http://example.com/?email={-neg|bob@sporkmonger.com|test}"
|
4086
|
-
).should == {}
|
3352
|
+
it "should heuristically parse to 'http://example.com/'" do
|
3353
|
+
@uri = Addressable::URI.heuristic_parse(@input)
|
3354
|
+
@uri.to_s.should == "http://example.com/"
|
4087
3355
|
end
|
4088
3356
|
end
|
4089
3357
|
|
4090
|
-
describe Addressable::URI, " when parsed from " +
|
4091
|
-
"'http://example.com/?email='" do
|
4092
|
-
before do
|
4093
|
-
@uri = Addressable::URI.parse(
|
4094
|
-
"http://example.com/?email="
|
4095
|
-
)
|
4096
|
-
end
|
4097
|
-
|
4098
|
-
it "should indicate a match when extracting values " +
|
4099
|
-
"using the opt pattern " +
|
4100
|
-
"'http://example.com/?email={-opt|bob@sporkmonger.com|test}'" do
|
4101
|
-
@uri.extract_mapping(
|
4102
|
-
"http://example.com/?email={-opt|bob@sporkmonger.com|test}"
|
4103
|
-
).should == {}
|
4104
|
-
end
|
4105
|
-
|
4106
|
-
it "should indicate a match when extracting values " +
|
4107
|
-
"using the neg pattern " +
|
4108
|
-
"'http://example.com/?email={-neg|bob@sporkmonger.com|test}'" do
|
4109
|
-
@uri.extract_mapping(
|
4110
|
-
"http://example.com/?email={-neg|bob@sporkmonger.com|test}"
|
4111
|
-
).should == {}
|
4112
|
-
end
|
4113
|
-
end
|
4114
3358
|
|
4115
|
-
describe Addressable::URI, "
|
4116
|
-
"'http
|
3359
|
+
describe Addressable::URI, "when given the input " +
|
3360
|
+
"'http:example.com/'" do
|
4117
3361
|
before do
|
4118
|
-
@
|
4119
|
-
"http://example.com/a/b/c/?one=1&two=2#foo"
|
4120
|
-
)
|
3362
|
+
@input = "http:example.com/"
|
4121
3363
|
end
|
4122
3364
|
|
4123
|
-
it "should
|
4124
|
-
|
4125
|
-
|
4126
|
-
@uri.extract_mapping(
|
4127
|
-
"http://{host}/{-suffix|/|segments}?{-join|&|one,two}\#{fragment}"
|
4128
|
-
).should == {
|
4129
|
-
"host" => "example.com",
|
4130
|
-
"segments" => ["a", "b", "c"],
|
4131
|
-
"one" => "1",
|
4132
|
-
"two" => "2",
|
4133
|
-
"fragment" => "foo"
|
4134
|
-
}
|
3365
|
+
it "should heuristically parse to 'http://example.com/'" do
|
3366
|
+
@uri = Addressable::URI.heuristic_parse(@input)
|
3367
|
+
@uri.to_s.should == "http://example.com/"
|
4135
3368
|
end
|
4136
3369
|
|
4137
|
-
it "should
|
4138
|
-
"
|
4139
|
-
|
4140
|
-
@uri.
|
4141
|
-
"http://{host}/{-suffix|/|segments}?{-join|&|one}\#{fragment}"
|
4142
|
-
).should == nil
|
4143
|
-
end
|
4144
|
-
|
4145
|
-
it "should not match when extracting values " +
|
4146
|
-
"using the pattern " +
|
4147
|
-
"'http://{host}/{-suffix|/|segments}?{-join|&|bogus}\#{fragment}'" do
|
4148
|
-
@uri.extract_mapping(
|
4149
|
-
"http://{host}/{-suffix|/|segments}?{-join|&|bogus}\#{fragment}"
|
4150
|
-
).should == nil
|
4151
|
-
end
|
4152
|
-
|
4153
|
-
it "should not match when extracting values " +
|
4154
|
-
"using the pattern " +
|
4155
|
-
"'http://{host}/{-suffix|/|segments}?" +
|
4156
|
-
"{-join|&|one,bogus}\#{fragment}'" do
|
4157
|
-
@uri.extract_mapping(
|
4158
|
-
"http://{host}/{-suffix|/|segments}?{-join|&|one,bogus}\#{fragment}"
|
4159
|
-
).should == nil
|
4160
|
-
end
|
4161
|
-
|
4162
|
-
it "should not match when extracting values " +
|
4163
|
-
"using the pattern " +
|
4164
|
-
"'http://{host}/{-suffix|/|segments}?" +
|
4165
|
-
"{-join|&|one,two,bogus}\#{fragment}'" do
|
4166
|
-
@uri.extract_mapping(
|
4167
|
-
"http://{host}/{-suffix|/|segments}?{-join|&|one,two,bogus}\#{fragment}"
|
4168
|
-
).should == {
|
4169
|
-
"host" => "example.com",
|
4170
|
-
"segments" => ["a", "b", "c"],
|
4171
|
-
"one" => "1",
|
4172
|
-
"two" => "2",
|
4173
|
-
"fragment" => "foo"
|
4174
|
-
}
|
3370
|
+
it "should heuristically parse to 'http://example.com/' " +
|
3371
|
+
"even with a scheme hint of 'ftp'" do
|
3372
|
+
@uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'})
|
3373
|
+
@uri.to_s.should == "http://example.com/"
|
4175
3374
|
end
|
4176
3375
|
end
|
4177
3376
|
|
4178
|
-
describe Addressable::URI, "when given
|
3377
|
+
describe Addressable::URI, "when given the input " +
|
3378
|
+
"'http://example.com/example.com/'" do
|
4179
3379
|
before do
|
4180
|
-
@
|
3380
|
+
@input = "http://example.com/example.com/"
|
4181
3381
|
end
|
4182
3382
|
|
4183
|
-
it "should
|
4184
|
-
(
|
4185
|
-
|
4186
|
-
end).should raise_error(Addressable::URI::InvalidTemplateOperatorError)
|
4187
|
-
end
|
4188
|
-
|
4189
|
-
it "should raise an InvalidTemplateOperatorError" do
|
4190
|
-
(lambda do
|
4191
|
-
@uri.extract_mapping("http://example.com/{-prefix|/|a,b,c}/")
|
4192
|
-
end).should raise_error(Addressable::URI::InvalidTemplateOperatorError)
|
4193
|
-
end
|
4194
|
-
|
4195
|
-
it "should raise an InvalidTemplateOperatorError" do
|
4196
|
-
(lambda do
|
4197
|
-
@uri.extract_mapping("http://example.com/{-suffix|/|a,b,c}/")
|
4198
|
-
end).should raise_error(Addressable::URI::InvalidTemplateOperatorError)
|
4199
|
-
end
|
4200
|
-
|
4201
|
-
it "should raise an InvalidTemplateOperatorError" do
|
4202
|
-
(lambda do
|
4203
|
-
@uri.extract_mapping("http://example.com/{-list|/|a,b,c}/")
|
4204
|
-
end).should raise_error(Addressable::URI::InvalidTemplateOperatorError)
|
3383
|
+
it "should heuristically parse to 'http://example.com/example.com/'" do
|
3384
|
+
@uri = Addressable::URI.heuristic_parse(@input)
|
3385
|
+
@uri.to_s.should == "http://example.com/example.com/"
|
4205
3386
|
end
|
4206
3387
|
end
|
4207
3388
|
|
4208
|
-
describe Addressable::URI, "
|
3389
|
+
describe Addressable::URI, "when given the input " +
|
4209
3390
|
"'/path/to/resource'" do
|
4210
3391
|
before do
|
4211
3392
|
@input = "/path/to/resource"
|
@@ -4217,7 +3398,7 @@ describe Addressable::URI, " when given the input " +
|
|
4217
3398
|
end
|
4218
3399
|
end
|
4219
3400
|
|
4220
|
-
describe Addressable::URI, "
|
3401
|
+
describe Addressable::URI, "when given the input " +
|
4221
3402
|
"'relative/path/to/resource'" do
|
4222
3403
|
before do
|
4223
3404
|
@input = "relative/path/to/resource"
|
@@ -4229,7 +3410,7 @@ describe Addressable::URI, " when given the input " +
|
|
4229
3410
|
end
|
4230
3411
|
end
|
4231
3412
|
|
4232
|
-
describe Addressable::URI, "
|
3413
|
+
describe Addressable::URI, "when given the input " +
|
4233
3414
|
"'example.com'" do
|
4234
3415
|
before do
|
4235
3416
|
@input = "example.com"
|
@@ -4241,7 +3422,7 @@ describe Addressable::URI, " when given the input " +
|
|
4241
3422
|
end
|
4242
3423
|
end
|
4243
3424
|
|
4244
|
-
describe Addressable::URI, "
|
3425
|
+
describe Addressable::URI, "when given the input " +
|
4245
3426
|
"'example.com' and a scheme hint of 'ftp'" do
|
4246
3427
|
before do
|
4247
3428
|
@input = "example.com"
|
@@ -4254,7 +3435,7 @@ describe Addressable::URI, " when given the input " +
|
|
4254
3435
|
end
|
4255
3436
|
end
|
4256
3437
|
|
4257
|
-
describe Addressable::URI, "
|
3438
|
+
describe Addressable::URI, "when given the input " +
|
4258
3439
|
"'example.com:21' and a scheme hint of 'ftp'" do
|
4259
3440
|
before do
|
4260
3441
|
@input = "example.com:21"
|
@@ -4267,7 +3448,7 @@ describe Addressable::URI, " when given the input " +
|
|
4267
3448
|
end
|
4268
3449
|
end
|
4269
3450
|
|
4270
|
-
describe Addressable::URI, "
|
3451
|
+
describe Addressable::URI, "when given the input " +
|
4271
3452
|
"'example.com/path/to/resource'" do
|
4272
3453
|
before do
|
4273
3454
|
@input = "example.com/path/to/resource"
|
@@ -4279,7 +3460,7 @@ describe Addressable::URI, " when given the input " +
|
|
4279
3460
|
end
|
4280
3461
|
end
|
4281
3462
|
|
4282
|
-
describe Addressable::URI, "
|
3463
|
+
describe Addressable::URI, "when given the input " +
|
4283
3464
|
"'http:///example.com'" do
|
4284
3465
|
before do
|
4285
3466
|
@input = "http:///example.com"
|
@@ -4291,7 +3472,7 @@ describe Addressable::URI, " when given the input " +
|
|
4291
3472
|
end
|
4292
3473
|
end
|
4293
3474
|
|
4294
|
-
describe Addressable::URI, "
|
3475
|
+
describe Addressable::URI, "when given the input " +
|
4295
3476
|
"'feed:///example.com'" do
|
4296
3477
|
before do
|
4297
3478
|
@input = "feed:///example.com"
|
@@ -4303,7 +3484,7 @@ describe Addressable::URI, " when given the input " +
|
|
4303
3484
|
end
|
4304
3485
|
end
|
4305
3486
|
|
4306
|
-
describe Addressable::URI, "
|
3487
|
+
describe Addressable::URI, "when given the input " +
|
4307
3488
|
"'file://path/to/resource/'" do
|
4308
3489
|
before do
|
4309
3490
|
@input = "file://path/to/resource/"
|
@@ -4315,7 +3496,7 @@ describe Addressable::URI, " when given the input " +
|
|
4315
3496
|
end
|
4316
3497
|
end
|
4317
3498
|
|
4318
|
-
describe Addressable::URI, "
|
3499
|
+
describe Addressable::URI, "when given the input " +
|
4319
3500
|
"'feed://http://example.com'" do
|
4320
3501
|
before do
|
4321
3502
|
@input = "feed://http://example.com"
|
@@ -4326,3 +3507,46 @@ describe Addressable::URI, " when given the input " +
|
|
4326
3507
|
@uri.to_s.should == "feed:http://example.com"
|
4327
3508
|
end
|
4328
3509
|
end
|
3510
|
+
|
3511
|
+
describe Addressable::URI, "when assigning query values" do
|
3512
|
+
before do
|
3513
|
+
@uri = Addressable::URI.new
|
3514
|
+
end
|
3515
|
+
|
3516
|
+
it "should correctly assign {:a => 'a', :b => ['c', 'd', 'e']}" do
|
3517
|
+
@uri.query_values = {:a => "a", :b => ["c", "d", "e"]}
|
3518
|
+
@uri.query.should == "a=a&b[0]=c&b[1]=d&b[2]=e"
|
3519
|
+
end
|
3520
|
+
|
3521
|
+
it "should correctly assign " +
|
3522
|
+
"{:a => 'a', :b => [{:c => 'c', :d => 'd'}, {:e => 'e', :f => 'f'}]}" do
|
3523
|
+
@uri.query_values = {
|
3524
|
+
:a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]
|
3525
|
+
}
|
3526
|
+
@uri.query.should == "a=a&b[0][c]=c&b[0][d]=d&b[1][e]=e&b[1][f]=f"
|
3527
|
+
end
|
3528
|
+
|
3529
|
+
it "should correctly assign " +
|
3530
|
+
"{:a => 'a', :b => [{:c => true, :d => 'd'}, {:e => 'e', :f => 'f'}]}" do
|
3531
|
+
@uri.query_values = {
|
3532
|
+
:a => 'a', :b => [{:c => true, :d => 'd'}, {:e => 'e', :f => 'f'}]
|
3533
|
+
}
|
3534
|
+
@uri.query.should == "a=a&b[0][c]&b[0][d]=d&b[1][e]=e&b[1][f]=f"
|
3535
|
+
end
|
3536
|
+
|
3537
|
+
it "should correctly assign " +
|
3538
|
+
"{:a => 'a', :b => {:c => true, :d => 'd'}}" do
|
3539
|
+
@uri.query_values = {
|
3540
|
+
:a => 'a', :b => {:c => true, :d => 'd'}
|
3541
|
+
}
|
3542
|
+
@uri.query.should == "a=a&b[c]&b[d]=d"
|
3543
|
+
end
|
3544
|
+
|
3545
|
+
it "should correctly assign " +
|
3546
|
+
"{:a => 'a', :b => {:c => true, :d => 'd'}, :e => []}" do
|
3547
|
+
@uri.query_values = {
|
3548
|
+
:a => 'a', :b => {:c => true, :d => 'd'}
|
3549
|
+
}
|
3550
|
+
@uri.query.should == "a=a&b[c]&b[d]=d"
|
3551
|
+
end
|
3552
|
+
end
|