aboutsummaryrefslogtreecommitdiffstats
path: root/spec/ruby/library/uri/plus_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/library/uri/plus_spec.rb')
-rw-r--r--spec/ruby/library/uri/plus_spec.rb459
1 files changed, 459 insertions, 0 deletions
diff --git a/spec/ruby/library/uri/plus_spec.rb b/spec/ruby/library/uri/plus_spec.rb
new file mode 100644
index 0000000000..45c1aa5e57
--- /dev/null
+++ b/spec/ruby/library/uri/plus_spec.rb
@@ -0,0 +1,459 @@
+require File.expand_path('../../../spec_helper', __FILE__)
+require 'uri'
+
+#an alias of URI#merge
+describe "URI#+" do
+ it "replaces the end of the path of the URI when added to a string that looks like a relative path" do
+ (URI('http://foo') + 'bar').should == URI("http://foo/bar")
+ (URI('http://foo/baz') + 'bar').should == URI("http://foo/bar")
+ (URI('http://foo/baz/') + 'bar').should == URI("http://foo/baz/bar")
+ (URI('mailto:foo@example.com') + "#bar").should == URI("mailto:foo@example.com#bar")
+ end
+
+ it "replaces the entire path of the URI when added to a string that begins with a /" do
+ (URI('http://foo/baz/') + '/bar').should == URI("http://foo/bar")
+ end
+
+ it "replaces the entire url when added to a string that looks like a full url" do
+ (URI.parse('http://a/b') + 'http://x/y').should == URI("http://x/y")
+ (URI.parse('telnet:example.com') + 'http://x/y').should == URI("http://x/y")
+ end
+
+ it "canonicalizes the URI's path, removing ../'s" do
+ (URI.parse('http://a/b/c/../') + "./").should == URI("http://a/b/")
+ (URI.parse('http://a/b/c/../') + ".").should == URI("http://a/b/")
+ (URI.parse('http://a/b/c/') + "../").should == URI("http://a/b/")
+ (URI.parse('http://a/b/c/../../') + "./").should == URI("http://a/")
+ (URI.parse('http://a/b/c/') + "../e/").should == URI("http://a/b/e/")
+ (URI.parse('http://a/b/c/') + "../e/../").should == URI("http://a/b/")
+ (URI.parse('http://a/b/../c/') + ".").should == URI("http://a/c/")
+
+ (URI.parse('http://a/b/c/../../../') + ".").should == URI("http://a/")
+ end
+
+ it "doesn't conconicalize the path when adding to the empty string" do
+ (URI.parse('http://a/b/c/../') + "").should == URI("http://a/b/c/../")
+ end
+
+ it "raises a URI::BadURIError when adding two relative URIs" do
+ lambda {URI.parse('a/b/c') + "d"}.should raise_error(URI::BadURIError)
+ end
+
+ #Todo: make more BDD?
+ it "conforms to the merge specifications from rfc 2396" do
+ @url = 'http://a/b/c/d;p?q'
+ @base_url = URI.parse(@url)
+
+# http://a/b/c/d;p?q
+# g:h = g:h
+ url = @base_url.merge('g:h')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g:h'
+ url = @base_url.route_to('g:h')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g:h'
+
+# http://a/b/c/d;p?q
+# g = http://a/b/c/g
+ url = @base_url.merge('g')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g'
+ url = @base_url.route_to('http://a/b/c/g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g'
+
+# http://a/b/c/d;p?q
+# ./g = http://a/b/c/g
+ url = @base_url.merge('./g')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g'
+ url = @base_url.route_to('http://a/b/c/g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == './g' # ok
+ url.to_s.should == 'g'
+
+# http://a/b/c/d;p?q
+# g/ = http://a/b/c/g/
+ url = @base_url.merge('g/')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g/'
+ url = @base_url.route_to('http://a/b/c/g/')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g/'
+
+# http://a/b/c/d;p?q
+# /g = http://a/g
+ url = @base_url.merge('/g')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/g'
+ url = @base_url.route_to('http://a/g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == '/g' # ok
+ url.to_s.should == '../../g'
+
+# http://a/b/c/d;p?q
+# //g = http://g
+ url = @base_url.merge('//g')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://g'
+ url = @base_url.route_to('http://g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == '//g'
+
+# http://a/b/c/d;p?q
+# ?y = http://a/b/c/?y
+ url = @base_url.merge('?y')
+ url.should be_kind_of(URI::HTTP)
+
+ url.to_s.should == 'http://a/b/c/d;p?y'
+
+ url = @base_url.route_to('http://a/b/c/?y')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == '?y'
+
+# http://a/b/c/d;p?q
+# g?y = http://a/b/c/g?y
+ url = @base_url.merge('g?y')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g?y'
+ url = @base_url.route_to('http://a/b/c/g?y')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g?y'
+
+# http://a/b/c/d;p?q
+# #s = (current document)#s
+ url = @base_url.merge('#s')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == @base_url.to_s + '#s'
+ url = @base_url.route_to(@base_url.to_s + '#s')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == '#s'
+
+# http://a/b/c/d;p?q
+# g#s = http://a/b/c/g#s
+ url = @base_url.merge('g#s')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g#s'
+ url = @base_url.route_to('http://a/b/c/g#s')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g#s'
+
+# http://a/b/c/d;p?q
+# g?y#s = http://a/b/c/g?y#s
+ url = @base_url.merge('g?y#s')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g?y#s'
+ url = @base_url.route_to('http://a/b/c/g?y#s')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g?y#s'
+
+# http://a/b/c/d;p?q
+# ;x = http://a/b/c/;x
+ url = @base_url.merge(';x')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/;x'
+ url = @base_url.route_to('http://a/b/c/;x')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == ';x'
+
+# http://a/b/c/d;p?q
+# g;x = http://a/b/c/g;x
+ url = @base_url.merge('g;x')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g;x'
+ url = @base_url.route_to('http://a/b/c/g;x')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g;x'
+
+# http://a/b/c/d;p?q
+# g;x?y#s = http://a/b/c/g;x?y#s
+ url = @base_url.merge('g;x?y#s')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g;x?y#s'
+ url = @base_url.route_to('http://a/b/c/g;x?y#s')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g;x?y#s'
+
+# http://a/b/c/d;p?q
+# . = http://a/b/c/
+ url = @base_url.merge('.')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/'
+ url = @base_url.route_to('http://a/b/c/')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == '.' # ok
+ url.to_s.should == './'
+
+# http://a/b/c/d;p?q
+# ./ = http://a/b/c/
+ url = @base_url.merge('./')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/'
+ url = @base_url.route_to('http://a/b/c/')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == './'
+
+# http://a/b/c/d;p?q
+# .. = http://a/b/
+ url = @base_url.merge('..')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/'
+ url = @base_url.route_to('http://a/b/')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == '..' # ok
+ url.to_s.should == '../'
+
+# http://a/b/c/d;p?q
+# ../ = http://a/b/
+ url = @base_url.merge('../')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/'
+ url = @base_url.route_to('http://a/b/')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == '../'
+
+# http://a/b/c/d;p?q
+# ../g = http://a/b/g
+ url = @base_url.merge('../g')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/g'
+ url = @base_url.route_to('http://a/b/g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == '../g'
+
+# http://a/b/c/d;p?q
+# ../.. = http://a/
+ url = @base_url.merge('../..')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/'
+ url = @base_url.route_to('http://a/')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == '../..' # ok
+ url.to_s.should == '../../'
+
+# http://a/b/c/d;p?q
+# ../../ = http://a/
+ url = @base_url.merge('../../')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/'
+ url = @base_url.route_to('http://a/')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == '../../'
+
+# http://a/b/c/d;p?q
+# ../../g = http://a/g
+ url = @base_url.merge('../../g')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/g'
+ url = @base_url.route_to('http://a/g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == '../../g'
+
+# http://a/b/c/d;p?q
+# <> = (current document)
+ url = @base_url.merge('')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/d;p?q'
+ url = @base_url.route_to('http://a/b/c/d;p?q')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == ''
+
+# http://a/b/c/d;p?q
+# /./g = http://a/./g
+ url = @base_url.merge('/./g')
+ url.should be_kind_of(URI::HTTP)
+
+ url.to_s.should == 'http://a/g'
+
+ url = @base_url.route_to('http://a/./g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == '/./g'
+
+# http://a/b/c/d;p?q
+# /../g = http://a/../g
+ url = @base_url.merge('/../g')
+ url.should be_kind_of(URI::HTTP)
+
+ url.to_s.should == 'http://a/g'
+
+ url = @base_url.route_to('http://a/../g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == '/../g'
+
+# http://a/b/c/d;p?q
+# g. = http://a/b/c/g.
+ url = @base_url.merge('g.')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g.'
+ url = @base_url.route_to('http://a/b/c/g.')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g.'
+
+# http://a/b/c/d;p?q
+# .g = http://a/b/c/.g
+ url = @base_url.merge('.g')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/.g'
+ url = @base_url.route_to('http://a/b/c/.g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == '.g'
+
+# http://a/b/c/d;p?q
+# g.. = http://a/b/c/g..
+ url = @base_url.merge('g..')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g..'
+ url = @base_url.route_to('http://a/b/c/g..')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g..'
+
+# http://a/b/c/d;p?q
+# ..g = http://a/b/c/..g
+ url = @base_url.merge('..g')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/..g'
+ url = @base_url.route_to('http://a/b/c/..g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == '..g'
+
+# http://a/b/c/d;p?q
+# ../../../g = http://a/../g
+ url = @base_url.merge('../../../g')
+ url.should be_kind_of(URI::HTTP)
+
+ url.to_s.should == 'http://a/g'
+
+ url = @base_url.route_to('http://a/../g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == '../../../g' # ok? yes, it confuses you
+ url.to_s.should == '/../g' # and it is clearly
+
+# http://a/b/c/d;p?q
+# ../../../../g = http://a/../../g
+ url = @base_url.merge('../../../../g')
+ url.should be_kind_of(URI::HTTP)
+
+ url.to_s.should == 'http://a/g'
+
+ url = @base_url.route_to('http://a/../../g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == '../../../../g' # ok? yes, it confuses you
+ url.to_s.should == '/../../g' # and it is clearly
+
+# http://a/b/c/d;p?q
+# ./../g = http://a/b/g
+ url = @base_url.merge('./../g')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/g'
+ url = @base_url.route_to('http://a/b/g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == './../g' # ok
+ url.to_s.should == '../g'
+
+# http://a/b/c/d;p?q
+# ./g/. = http://a/b/c/g/
+ url = @base_url.merge('./g/.')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g/'
+ url = @base_url.route_to('http://a/b/c/g/')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == './g/.' # ok
+ url.to_s.should == 'g/'
+
+# http://a/b/c/d;p?q
+# g/./h = http://a/b/c/g/h
+ url = @base_url.merge('g/./h')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g/h'
+ url = @base_url.route_to('http://a/b/c/g/h')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == 'g/./h' # ok
+ url.to_s.should == 'g/h'
+
+# http://a/b/c/d;p?q
+# g/../h = http://a/b/c/h
+ url = @base_url.merge('g/../h')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/h'
+ url = @base_url.route_to('http://a/b/c/h')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == 'g/../h' # ok
+ url.to_s.should == 'h'
+
+# http://a/b/c/d;p?q
+# g;x=1/./y = http://a/b/c/g;x=1/y
+ url = @base_url.merge('g;x=1/./y')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g;x=1/y'
+ url = @base_url.route_to('http://a/b/c/g;x=1/y')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == 'g;x=1/./y' # ok
+ url.to_s.should == 'g;x=1/y'
+
+# http://a/b/c/d;p?q
+# g;x=1/../y = http://a/b/c/y
+ url = @base_url.merge('g;x=1/../y')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/y'
+ url = @base_url.route_to('http://a/b/c/y')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should_not == 'g;x=1/../y' # ok
+ url.to_s.should == 'y'
+
+# http://a/b/c/d;p?q
+# g?y/./x = http://a/b/c/g?y/./x
+ url = @base_url.merge('g?y/./x')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g?y/./x'
+ url = @base_url.route_to('http://a/b/c/g?y/./x')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g?y/./x'
+
+# http://a/b/c/d;p?q
+# g?y/../x = http://a/b/c/g?y/../x
+ url = @base_url.merge('g?y/../x')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g?y/../x'
+ url = @base_url.route_to('http://a/b/c/g?y/../x')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g?y/../x'
+
+# http://a/b/c/d;p?q
+# g#s/./x = http://a/b/c/g#s/./x
+ url = @base_url.merge('g#s/./x')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g#s/./x'
+ url = @base_url.route_to('http://a/b/c/g#s/./x')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g#s/./x'
+
+# http://a/b/c/d;p?q
+# g#s/../x = http://a/b/c/g#s/../x
+ url = @base_url.merge('g#s/../x')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http://a/b/c/g#s/../x'
+ url = @base_url.route_to('http://a/b/c/g#s/../x')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'g#s/../x'
+
+# http://a/b/c/d;p?q
+# http:g = http:g ; for validating parsers
+# | http://a/b/c/g ; for backwards compatibility
+ url = @base_url.merge('http:g')
+ url.should be_kind_of(URI::HTTP)
+ url.to_s.should == 'http:g'
+ url = @base_url.route_to('http:g')
+ url.should be_kind_of(URI::Generic)
+ url.to_s.should == 'http:g'
+ end
+end
+
+#TODO: incorporate these tests:
+#
+# u = URI.parse('http://foo/bar/baz')
+# assert_equal(nil, u.merge!(""))
+# assert_equal(nil, u.merge!(u))
+# assert(nil != u.merge!("."))
+# assert_equal('http://foo/bar/', u.to_s)
+# assert(nil != u.merge!("../baz"))
+# assert_equal('http://foo/baz', u.to_s)