require File.expand_path('../../../spec_helper', __FILE__)
require 'uri'
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
it "conforms to the merge specifications from rfc 2396" do
@url = 'http://a/b/c/d;p?q'
@base_url = URI.parse(@url)
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'
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'
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' url.to_s.should == '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/'
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' url.to_s.should == '../../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'
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'
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'
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'
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'
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'
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'
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'
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'
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 == '.' url.to_s.should == './'
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 == './'
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 == '..' url.to_s.should == '../'
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 == '../'
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'
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 == '../..' url.to_s.should == '../../'
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 == '../../'
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'
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 == ''
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'
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'
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.'
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'
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..'
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'
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' url.to_s.should == '/../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' url.to_s.should == '/../../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' url.to_s.should == '../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/.' url.to_s.should == 'g/'
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' url.to_s.should == 'g/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' url.to_s.should == 'h'
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' url.to_s.should == '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/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' url.to_s.should == 'y'
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'
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'
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'
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'
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