203
194
joined = urlutils.join(*args)
204
195
self.assertEqual(expected, joined)
197
# Test a single element
206
200
# Test relative path joining
207
test('foo', 'foo') # relative fragment with nothing is preserved.
208
201
test('foo/bar', 'foo', 'bar')
209
202
test('http://foo/bar', 'http://foo', 'bar')
210
203
test('http://foo/bar', 'http://foo', '.', 'bar')
211
204
test('http://foo/baz', 'http://foo', 'bar', '../baz')
212
205
test('http://foo/bar/baz', 'http://foo', 'bar/baz')
213
206
test('http://foo/baz', 'http://foo', 'bar/../baz')
214
test('http://foo/baz', 'http://foo/bar/', '../baz')
217
test('http://foo', 'http://foo') # abs url with nothing is preserved.
218
209
test('http://bar', 'http://foo', 'http://bar')
219
210
test('sftp://bzr/foo', 'http://foo', 'bar', 'sftp://bzr/foo')
220
211
test('file:///bar', 'foo', 'file:///bar')
221
test('http://bar/', 'http://foo', 'http://bar/')
222
test('http://bar/a', 'http://foo', 'http://bar/a')
223
test('http://bar/a/', 'http://foo', 'http://bar/a/')
226
test('file:///foo', 'file:///', 'foo')
227
test('file:///bar/foo', 'file:///bar/', 'foo')
228
test('http://host/foo', 'http://host/', 'foo')
229
test('http://host/', 'http://host', '')
231
213
# Invalid joinings
232
214
# Cannot go above root
233
# Implicitly at root:
234
215
self.assertRaises(InvalidURLJoin, urlutils.join,
235
216
'http://foo', '../baz')
236
self.assertRaises(InvalidURLJoin, urlutils.join,
238
# Joining from a path explicitly under the root.
239
self.assertRaises(InvalidURLJoin, urlutils.join,
240
'http://foo/a', '../../b')
242
def test_joinpath(self):
243
def test(expected, *args):
244
joined = urlutils.joinpath(*args)
245
self.assertEqual(expected, joined)
247
# Test a single element
250
# Test relative path joining
251
test('foo/bar', 'foo', 'bar')
252
test('foo/bar', 'foo', '.', 'bar')
253
test('foo/baz', 'foo', 'bar', '../baz')
254
test('foo/bar/baz', 'foo', 'bar/baz')
255
test('foo/baz', 'foo', 'bar/../baz')
257
# Test joining to an absolute path
259
test('/foo', '/foo', '.')
260
test('/foo/bar', '/foo', 'bar')
261
test('/', '/foo', '..')
263
# Test joining with an absolute path
264
test('/bar', 'foo', '/bar')
266
# Test joining to a path with a trailing slash
267
test('foo/bar', 'foo/', 'bar')
270
# Cannot go above root
271
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '../baz')
272
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '..')
273
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '/..')
275
218
def test_function_type(self):
276
219
if sys.platform == 'win32':
307
250
to_url = urlutils._win32_local_path_to_url
308
251
self.assertEqual('file:///C:/path/to/foo',
309
252
to_url('C:/path/to/foo'))
310
# BOGUS: on win32, ntpath.abspath will strip trailing
311
# whitespace, so this will always fail
312
# Though under linux, it fakes abspath support
313
# and thus will succeed
314
# self.assertEqual('file:///C:/path/to/foo%20',
315
# to_url('C:/path/to/foo '))
316
self.assertEqual('file:///C:/path/to/f%20oo',
317
to_url('C:/path/to/f oo'))
320
255
result = to_url(u'd:/path/to/r\xe4ksm\xf6rg\xe5s')
324
259
self.assertEqual('file:///D:/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
326
def test_win32_unc_path_to_url(self):
327
to_url = urlutils._win32_local_path_to_url
328
self.assertEqual('file://HOST/path',
329
to_url(r'\\HOST\path'))
330
self.assertEqual('file://HOST/path',
331
to_url('//HOST/path'))
334
result = to_url(u'//HOST/path/to/r\xe4ksm\xf6rg\xe5s')
336
raise TestSkipped("local encoding cannot handle unicode")
338
self.assertEqual('file://HOST/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
341
261
def test_win32_local_path_from_url(self):
342
262
from_url = urlutils._win32_local_path_from_url
343
263
self.assertEqual('C:/path/to/foo',
345
265
self.assertEqual(u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
346
266
from_url('file:///d|/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
347
267
self.assertEqual(u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
348
from_url('file:///d:/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
268
from_url('file:///d|/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
350
270
self.assertRaises(InvalidURL, from_url, '/path/to/foo')
351
271
# Not a valid _win32 url, no drive letter
352
272
self.assertRaises(InvalidURL, from_url, 'file:///path/to/foo')
354
def test_win32_unc_path_from_url(self):
355
from_url = urlutils._win32_local_path_from_url
356
self.assertEqual('//HOST/path', from_url('file://HOST/path'))
357
# despite IE allows 2, 4, 5 and 6 slashes in URL to another machine
358
# we want to use only 2 slashes
359
# Firefox understand only 5 slashes in URL, but it's ugly
360
self.assertRaises(InvalidURL, from_url, 'file:////HOST/path')
361
self.assertRaises(InvalidURL, from_url, 'file://///HOST/path')
362
self.assertRaises(InvalidURL, from_url, 'file://////HOST/path')
363
# check for file://C:/ instead of file:///C:/
364
self.assertRaises(InvalidURL, from_url, 'file://C:/path')
366
def test_win32_extract_drive_letter(self):
367
extract = urlutils._win32_extract_drive_letter
368
self.assertEqual(('file:///C:', '/foo'), extract('file://', '/C:/foo'))
369
self.assertEqual(('file:///d|', '/path'), extract('file://', '/d|/path'))
370
self.assertRaises(InvalidURL, extract, 'file://', '/path')
372
274
def test_split(self):
373
275
# Test bzrlib.urlutils.split()
374
276
split = urlutils.split
375
277
if sys.platform == 'win32':
376
278
self.assertRaises(InvalidURL, split, 'file:///path/to/foo')
377
279
self.assertEqual(('file:///C|/', 'foo'), split('file:///C|/foo'))
378
self.assertEqual(('file:///C:/', ''), split('file:///C:/'))
280
self.assertEqual(('file:///C|/', ''), split('file:///C|/'))
380
282
self.assertEqual(('file:///', 'foo'), split('file:///foo'))
381
283
self.assertEqual(('file:///', ''), split('file:///'))
404
306
self.assertEqual(('path/..', 'foo'), split('path/../foo'))
405
307
self.assertEqual(('../path', 'foo'), split('../path/foo'))
407
def test_win32_strip_local_trailing_slash(self):
408
strip = urlutils._win32_strip_local_trailing_slash
409
self.assertEqual('file://', strip('file://'))
410
self.assertEqual('file:///', strip('file:///'))
411
self.assertEqual('file:///C', strip('file:///C'))
412
self.assertEqual('file:///C:', strip('file:///C:'))
413
self.assertEqual('file:///d|', strip('file:///d|'))
414
self.assertEqual('file:///C:/', strip('file:///C:/'))
415
self.assertEqual('file:///C:/a', strip('file:///C:/a/'))
417
309
def test_strip_trailing_slash(self):
418
310
sts = urlutils.strip_trailing_slash
419
311
if sys.platform == 'win32':
420
312
self.assertEqual('file:///C|/', sts('file:///C|/'))
421
self.assertEqual('file:///C:/foo', sts('file:///C:/foo'))
313
self.assertEqual('file:///C|/foo', sts('file:///C|/foo'))
422
314
self.assertEqual('file:///C|/foo', sts('file:///C|/foo/'))
424
316
self.assertEqual('file:///', sts('file:///'))
521
411
'file:///home/jelmer/branch/2b')
522
412
test('../../branch/2b', 'sftp://host/home/jelmer/bar/2b',
523
413
'sftp://host/home/jelmer/branch/2b')
524
test('../../branch/feature/%2b', 'http://host/home/jelmer/bar/%2b',
525
'http://host/home/jelmer/branch/feature/%2b')
414
test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b',
415
'http://host/home/jelmer/branch/feature/2b')
526
416
test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
527
417
'http://host/home/jelmer/branch/feature/2b')
528
418
# relative_url should preserve a trailing slash
540
430
test('http://host/', 'http://host', 'http://host/')
541
431
#test('.', 'http://host/', 'http://host')
542
432
test('http://host', 'http://host/', 'http://host')
545
class TestCwdToURL(TestCaseInTempDir):
546
"""Test that local_path_to_url works base on the cwd"""
549
# This test will fail if getcwd is not ascii
553
url = urlutils.local_path_to_url('.')
554
self.assertEndsWith(url, '/mytest')
556
def test_non_ascii(self):
557
if win32utils.winver == 'Windows 98':
558
raise TestSkipped('Windows 98 cannot handle unicode filenames')
563
raise TestSkipped('cannot create unicode directory')
567
# On Mac OSX this directory is actually:
568
# u'/dode\u0301' => '/dode\xcc\x81
569
# but we should normalize it back to
570
# u'/dod\xe9' => '/dod\xc3\xa9'
571
url = urlutils.local_path_to_url('.')
572
self.assertEndsWith(url, '/dod%C3%A9')
575
class TestDeriveToLocation(TestCase):
576
"""Test that the mapping of FROM_LOCATION to TO_LOCATION works."""
578
def test_to_locations_derived_from_paths(self):
579
derive = urlutils.derive_to_location
580
self.assertEqual("bar", derive("bar"))
581
self.assertEqual("bar", derive("../bar"))
582
self.assertEqual("bar", derive("/foo/bar"))
583
self.assertEqual("bar", derive("c:/foo/bar"))
584
self.assertEqual("bar", derive("c:bar"))
586
def test_to_locations_derived_from_urls(self):
587
derive = urlutils.derive_to_location
588
self.assertEqual("bar", derive("http://foo/bar"))
589
self.assertEqual("bar", derive("bzr+ssh://foo/bar"))
590
self.assertEqual("foo-bar", derive("lp:foo-bar"))