195
191
dirname('path/to/foo/', exclude_trailing_slash=False))
196
192
self.assertEqual('path/..', dirname('path/../foo'))
197
193
self.assertEqual('../path', dirname('../path/foo'))
199
def test_is_url(self):
200
self.assertTrue(urlutils.is_url('http://foo/bar'))
201
self.assertTrue(urlutils.is_url('bzr+ssh://foo/bar'))
202
self.assertTrue(urlutils.is_url('lp:foo/bar'))
203
self.assertTrue(urlutils.is_url('file:///foo/bar'))
204
self.assertFalse(urlutils.is_url(''))
205
self.assertFalse(urlutils.is_url('foo'))
206
self.assertFalse(urlutils.is_url('foo/bar'))
207
self.assertFalse(urlutils.is_url('/foo'))
208
self.assertFalse(urlutils.is_url('/foo/bar'))
209
self.assertFalse(urlutils.is_url('C:/'))
210
self.assertFalse(urlutils.is_url('C:/foo'))
211
self.assertFalse(urlutils.is_url('C:/foo/bar'))
213
195
def test_join(self):
214
196
def test(expected, *args):
215
197
joined = urlutils.join(*args)
216
198
self.assertEqual(expected, joined)
200
# Test a single element
218
203
# Test relative path joining
219
test('foo', 'foo') # relative fragment with nothing is preserved.
220
204
test('foo/bar', 'foo', 'bar')
221
205
test('http://foo/bar', 'http://foo', 'bar')
222
206
test('http://foo/bar', 'http://foo', '.', 'bar')
223
207
test('http://foo/baz', 'http://foo', 'bar', '../baz')
224
208
test('http://foo/bar/baz', 'http://foo', 'bar/baz')
225
209
test('http://foo/baz', 'http://foo', 'bar/../baz')
226
test('http://foo/baz', 'http://foo/bar/', '../baz')
227
test('lp:foo/bar', 'lp:foo', 'bar')
228
test('lp:foo/bar/baz', 'lp:foo', 'bar/baz')
231
test('http://foo', 'http://foo') # abs url with nothing is preserved.
232
212
test('http://bar', 'http://foo', 'http://bar')
233
213
test('sftp://bzr/foo', 'http://foo', 'bar', 'sftp://bzr/foo')
234
214
test('file:///bar', 'foo', 'file:///bar')
235
test('http://bar/', 'http://foo', 'http://bar/')
236
test('http://bar/a', 'http://foo', 'http://bar/a')
237
test('http://bar/a/', 'http://foo', 'http://bar/a/')
238
test('lp:bar', 'http://foo', 'lp:bar')
239
test('lp:bar', 'lp:foo', 'lp:bar')
240
test('file:///stuff', 'lp:foo', 'file:///stuff')
242
216
# From a base path
243
217
test('file:///foo', 'file:///', 'foo')
244
218
test('file:///bar/foo', 'file:///bar/', 'foo')
245
219
test('http://host/foo', 'http://host/', 'foo')
246
220
test('http://host/', 'http://host', '')
248
222
# Invalid joinings
249
223
# Cannot go above root
250
# Implicitly at root:
251
224
self.assertRaises(InvalidURLJoin, urlutils.join,
252
225
'http://foo', '../baz')
253
self.assertRaises(InvalidURLJoin, urlutils.join,
255
# Joining from a path explicitly under the root.
256
self.assertRaises(InvalidURLJoin, urlutils.join,
257
'http://foo/a', '../../b')
259
def test_joinpath(self):
260
def test(expected, *args):
261
joined = urlutils.joinpath(*args)
262
self.assertEqual(expected, joined)
264
# Test a single element
267
# Test relative path joining
268
test('foo/bar', 'foo', 'bar')
269
test('foo/bar', 'foo', '.', 'bar')
270
test('foo/baz', 'foo', 'bar', '../baz')
271
test('foo/bar/baz', 'foo', 'bar/baz')
272
test('foo/baz', 'foo', 'bar/../baz')
274
# Test joining to an absolute path
276
test('/foo', '/foo', '.')
277
test('/foo/bar', '/foo', 'bar')
278
test('/', '/foo', '..')
280
# Test joining with an absolute path
281
test('/bar', 'foo', '/bar')
283
# Test joining to a path with a trailing slash
284
test('foo/bar', 'foo/', 'bar')
287
# Cannot go above root
288
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '../baz')
289
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '..')
290
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '/..')
292
def test_join_segment_parameters_raw(self):
293
join_segment_parameters_raw = urlutils.join_segment_parameters_raw
294
self.assertEquals("/somedir/path",
295
join_segment_parameters_raw("/somedir/path"))
296
self.assertEquals("/somedir/path,rawdata",
297
join_segment_parameters_raw("/somedir/path", "rawdata"))
298
self.assertRaises(InvalidURLJoin,
299
join_segment_parameters_raw, "/somedir/path",
300
"rawdata1,rawdata2,rawdata3")
301
self.assertEquals("/somedir/path,bla,bar",
302
join_segment_parameters_raw("/somedir/path", "bla", "bar"))
303
self.assertEquals("/somedir,exist=some/path,bla,bar",
304
join_segment_parameters_raw("/somedir,exist=some/path",
306
self.assertRaises(TypeError, join_segment_parameters_raw,
309
def test_join_segment_parameters(self):
310
join_segment_parameters = urlutils.join_segment_parameters
311
self.assertEquals("/somedir/path",
312
join_segment_parameters("/somedir/path", {}))
313
self.assertEquals("/somedir/path,key1=val1",
314
join_segment_parameters("/somedir/path", {"key1": "val1"}))
315
self.assertRaises(InvalidURLJoin,
316
join_segment_parameters, "/somedir/path",
317
{"branch": "brr,brr,brr"})
318
self.assertRaises(InvalidURLJoin,
319
join_segment_parameters, "/somedir/path", {"key1=val1": "val2"})
320
self.assertEquals("/somedir/path,key1=val1,key2=val2",
321
join_segment_parameters("/somedir/path", {
322
"key1": "val1", "key2": "val2"}))
323
self.assertEquals("/somedir/path,key1=val1,key2=val2",
324
join_segment_parameters("/somedir/path,key1=val1", {
326
self.assertEquals("/somedir/path,key1=val2",
327
join_segment_parameters("/somedir/path,key1=val1", {
329
self.assertEquals("/somedir,exist=some/path,key1=val1",
330
join_segment_parameters("/somedir,exist=some/path",
332
self.assertEquals("/,key1=val1,key2=val2",
333
join_segment_parameters("/,key1=val1", {"key2": "val2"}))
334
self.assertRaises(TypeError,
335
join_segment_parameters, "/,key1=val1", {"foo": 42})
337
227
def test_function_type(self):
338
228
if sys.platform == 'win32':
476
356
self.assertEqual(('path/..', 'foo'), split('path/../foo'))
477
357
self.assertEqual(('../path', 'foo'), split('../path/foo'))
479
def test_split_segment_parameters_raw(self):
480
split_segment_parameters_raw = urlutils.split_segment_parameters_raw
481
self.assertEquals(("/some/path", []),
482
split_segment_parameters_raw("/some/path"))
483
self.assertEquals(("/some/path", ["tip"]),
484
split_segment_parameters_raw("/some/path,tip"))
485
self.assertEquals(("/some,dir/path", ["tip"]),
486
split_segment_parameters_raw("/some,dir/path,tip"))
487
self.assertEquals(("/somedir/path", ["heads%2Ftip"]),
488
split_segment_parameters_raw("/somedir/path,heads%2Ftip"))
489
self.assertEquals(("/somedir/path", ["heads%2Ftip", "bar"]),
490
split_segment_parameters_raw("/somedir/path,heads%2Ftip,bar"))
491
self.assertEquals(("/", ["key1=val1"]),
492
split_segment_parameters_raw(",key1=val1"))
493
self.assertEquals(("foo/", ["key1=val1"]),
494
split_segment_parameters_raw("foo/,key1=val1"))
495
self.assertEquals(("foo/base,la=bla/other/elements", []),
496
split_segment_parameters_raw("foo/base,la=bla/other/elements"))
497
self.assertEquals(("foo/base,la=bla/other/elements", ["a=b"]),
498
split_segment_parameters_raw("foo/base,la=bla/other/elements,a=b"))
500
def test_split_segment_parameters(self):
501
split_segment_parameters = urlutils.split_segment_parameters
502
self.assertEquals(("/some/path", {}),
503
split_segment_parameters("/some/path"))
504
self.assertEquals(("/some/path", {"branch": "tip"}),
505
split_segment_parameters("/some/path,branch=tip"))
506
self.assertEquals(("/some,dir/path", {"branch": "tip"}),
507
split_segment_parameters("/some,dir/path,branch=tip"))
508
self.assertEquals(("/somedir/path", {"ref": "heads%2Ftip"}),
509
split_segment_parameters("/somedir/path,ref=heads%2Ftip"))
510
self.assertEquals(("/somedir/path",
511
{"ref": "heads%2Ftip", "key1": "val1"}),
512
split_segment_parameters(
513
"/somedir/path,ref=heads%2Ftip,key1=val1"))
514
self.assertEquals(("/somedir/path", {"ref": "heads%2F=tip"}),
515
split_segment_parameters("/somedir/path,ref=heads%2F=tip"))
516
self.assertEquals(("/", {"key1": "val1"}),
517
split_segment_parameters(",key1=val1"))
518
self.assertEquals(("foo/", {"key1": "val1"}),
519
split_segment_parameters("foo/,key1=val1"))
520
self.assertEquals(("foo/base,key1=val1/other/elements", {}),
521
split_segment_parameters("foo/base,key1=val1/other/elements"))
522
self.assertEquals(("foo/base,key1=val1/other/elements",
523
{"key2": "val2"}), split_segment_parameters(
524
"foo/base,key1=val1/other/elements,key2=val2"))
526
359
def test_win32_strip_local_trailing_slash(self):
527
360
strip = urlutils._win32_strip_local_trailing_slash
528
361
self.assertEqual('file://', strip('file://'))
711
514
os.chdir(u'dod\xe9')
713
# On Mac OSX this directory is actually:
516
# On Mac OSX this directory is actually:
714
517
# u'/dode\u0301' => '/dode\xcc\x81
715
# but we should normalize it back to
518
# but we should normalize it back to
716
519
# u'/dod\xe9' => '/dod\xc3\xa9'
717
520
url = urlutils.local_path_to_url('.')
718
521
self.assertEndsWith(url, '/dod%C3%A9')
721
class TestDeriveToLocation(TestCase):
722
"""Test that the mapping of FROM_LOCATION to TO_LOCATION works."""
724
def test_to_locations_derived_from_paths(self):
725
derive = urlutils.derive_to_location
726
self.assertEqual("bar", derive("bar"))
727
self.assertEqual("bar", derive("../bar"))
728
self.assertEqual("bar", derive("/foo/bar"))
729
self.assertEqual("bar", derive("c:/foo/bar"))
730
self.assertEqual("bar", derive("c:bar"))
732
def test_to_locations_derived_from_urls(self):
733
derive = urlutils.derive_to_location
734
self.assertEqual("bar", derive("http://foo/bar"))
735
self.assertEqual("bar", derive("bzr+ssh://foo/bar"))
736
self.assertEqual("foo-bar", derive("lp:foo-bar"))
739
class TestRebaseURL(TestCase):
740
"""Test the behavior of rebase_url."""
742
def test_non_relative(self):
743
result = urlutils.rebase_url('file://foo', 'file://foo',
745
self.assertEqual('file://foo', result)
746
result = urlutils.rebase_url('/foo', 'file://foo',
748
self.assertEqual('/foo', result)
750
def test_different_ports(self):
751
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
752
'foo', 'http://bar:80', 'http://bar:81')
753
self.assertEqual(str(e), "URLs differ by more than path:"
754
" 'http://bar:80' and 'http://bar:81'")
756
def test_different_hosts(self):
757
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
758
'foo', 'http://bar', 'http://baz')
759
self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
762
def test_different_protocol(self):
763
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
764
'foo', 'http://bar', 'ftp://bar')
765
self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
768
def test_rebase_success(self):
769
self.assertEqual('../bar', urlutils.rebase_url('bar', 'http://baz/',
771
self.assertEqual('qux/bar', urlutils.rebase_url('bar',
772
'http://baz/qux', 'http://baz/'))
773
self.assertEqual('.', urlutils.rebase_url('foo',
774
'http://bar/', 'http://bar/foo/'))
775
self.assertEqual('qux/bar', urlutils.rebase_url('../bar',
776
'http://baz/qux/foo', 'http://baz/'))
778
def test_determine_relative_path(self):
779
self.assertEqual('../../baz/bar',
780
urlutils.determine_relative_path(
781
'/qux/quxx', '/baz/bar'))
782
self.assertEqual('..',
783
urlutils.determine_relative_path(
785
self.assertEqual('baz',
786
urlutils.determine_relative_path(
788
self.assertEqual('.', urlutils.determine_relative_path(
792
class TestParseURL(TestCase):
794
def test_parse_url(self):
795
self.assertEqual(urlutils.parse_url('http://example.com:80/one'),
796
('http', None, None, 'example.com', 80, '/one'))
797
self.assertEqual(urlutils.parse_url('http://[1:2:3::40]/one'),
798
('http', None, None, '1:2:3::40', None, '/one'))
799
self.assertEqual(urlutils.parse_url('http://[1:2:3::40]:80/one'),
800
('http', None, None, '1:2:3::40', 80, '/one'))