1
# Copyright (C) 2005 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
"""Tests for the urlutils wrapper."""
23
from bzrlib import osutils, urlutils, win32utils
25
from bzrlib.errors import InvalidURL, InvalidURLJoin
26
from bzrlib.tests import TestCaseInTempDir, TestCase, TestSkipped
29
class TestUrlToPath(TestCase):
31
def test_basename(self):
32
# bzrlib.urlutils.basename
33
# Test bzrlib.urlutils.split()
34
basename = urlutils.basename
35
if sys.platform == 'win32':
36
self.assertRaises(InvalidURL, basename, 'file:///path/to/foo')
37
self.assertEqual('foo', basename('file:///C|/foo'))
38
self.assertEqual('foo', basename('file:///C:/foo'))
39
self.assertEqual('', basename('file:///C:/'))
41
self.assertEqual('foo', basename('file:///foo'))
42
self.assertEqual('', basename('file:///'))
44
self.assertEqual('foo', basename('http://host/path/to/foo'))
45
self.assertEqual('foo', basename('http://host/path/to/foo/'))
47
basename('http://host/path/to/foo/', exclude_trailing_slash=False))
48
self.assertEqual('path', basename('http://host/path'))
49
self.assertEqual('', basename('http://host/'))
50
self.assertEqual('', basename('http://host'))
51
self.assertEqual('path', basename('http:///nohost/path'))
53
self.assertEqual('path', basename('random+scheme://user:pass@ahost:port/path'))
54
self.assertEqual('path', basename('random+scheme://user:pass@ahost:port/path/'))
55
self.assertEqual('', basename('random+scheme://user:pass@ahost:port/'))
58
self.assertEqual('foo', basename('path/to/foo'))
59
self.assertEqual('foo', basename('path/to/foo/'))
60
self.assertEqual('', basename('path/to/foo/',
61
exclude_trailing_slash=False))
62
self.assertEqual('foo', basename('path/../foo'))
63
self.assertEqual('foo', basename('../path/foo'))
65
def test_normalize_url_files(self):
66
# Test that local paths are properly normalized
67
normalize_url = urlutils.normalize_url
69
def norm_file(expected, path):
70
url = normalize_url(path)
71
self.assertStartsWith(url, 'file:///')
72
if sys.platform == 'win32':
73
url = url[len('file:///C:'):]
75
url = url[len('file://'):]
77
self.assertEndsWith(url, expected)
79
norm_file('path/to/foo', 'path/to/foo')
80
norm_file('/path/to/foo', '/path/to/foo')
81
norm_file('path/to/foo', '../path/to/foo')
83
# Local paths are assumed to *not* be escaped at all
85
u'uni/\xb5'.encode(bzrlib.user_encoding)
87
# locale cannot handle unicode
90
norm_file('uni/%C2%B5', u'uni/\xb5')
92
norm_file('uni/%25C2%25B5', u'uni/%C2%B5')
93
norm_file('uni/%20b', u'uni/ b')
94
# All the crazy characters get escaped in local paths => file:/// urls
95
# The ' ' character must not be at the end, because on win32
96
# it gets stripped off by ntpath.abspath
97
norm_file('%27%20%3B/%3F%3A%40%26%3D%2B%24%2C%23', "' ;/?:@&=+$,#")
99
def test_normalize_url_hybrid(self):
100
# Anything with a scheme:// should be treated as a hybrid url
101
# which changes what characters get escaped.
102
normalize_url = urlutils.normalize_url
104
eq = self.assertEqual
105
eq('file:///foo/', normalize_url(u'file:///foo/'))
106
eq('file:///foo/%20', normalize_url(u'file:///foo/ '))
107
eq('file:///foo/%20', normalize_url(u'file:///foo/%20'))
108
# Don't escape reserved characters
109
eq('file:///ab_c.d-e/%f:?g&h=i+j;k,L#M$',
110
normalize_url('file:///ab_c.d-e/%f:?g&h=i+j;k,L#M$'))
111
eq('http://ab_c.d-e/%f:?g&h=i+j;k,L#M$',
112
normalize_url('http://ab_c.d-e/%f:?g&h=i+j;k,L#M$'))
114
# Escape unicode characters, but not already escaped chars
115
eq('http://host/ab/%C2%B5/%C2%B5',
116
normalize_url(u'http://host/ab/%C2%B5/\xb5'))
118
# Normalize verifies URLs when they are not unicode
119
# (indicating they did not come from the user)
120
self.assertRaises(InvalidURL, normalize_url, 'http://host/\xb5')
121
self.assertRaises(InvalidURL, normalize_url, 'http://host/ ')
123
def test_url_scheme_re(self):
124
# Test paths that may be URLs
125
def test_one(url, scheme_and_path):
126
"""Assert that _url_scheme_re correctly matches
128
:param scheme_and_path: The (scheme, path) that should be matched
129
can be None, to indicate it should not match
131
m = urlutils._url_scheme_re.match(url)
132
if scheme_and_path is None:
133
self.assertEqual(None, m)
135
self.assertEqual(scheme_and_path[0], m.group('scheme'))
136
self.assertEqual(scheme_and_path[1], m.group('path'))
139
test_one('/path', None)
140
test_one('C:/path', None)
141
test_one('../path/to/foo', None)
142
test_one(u'../path/to/fo\xe5', None)
145
test_one('http://host/path/', ('http', 'host/path/'))
146
test_one('sftp://host/path/to/foo', ('sftp', 'host/path/to/foo'))
147
test_one('file:///usr/bin', ('file', '/usr/bin'))
148
test_one('file:///C:/Windows', ('file', '/C:/Windows'))
149
test_one('file:///C|/Windows', ('file', '/C|/Windows'))
150
test_one(u'readonly+sftp://host/path/\xe5', ('readonly+sftp', u'host/path/\xe5'))
153
# Can't have slashes or colons in the scheme
154
test_one('/path/to/://foo', None)
155
test_one('path:path://foo', None)
156
# Must have more than one character for scheme
157
test_one('C://foo', None)
158
test_one('ab://foo', ('ab', 'foo'))
160
def test_dirname(self):
161
# Test bzrlib.urlutils.dirname()
162
dirname = urlutils.dirname
163
if sys.platform == 'win32':
164
self.assertRaises(InvalidURL, dirname, 'file:///path/to/foo')
165
self.assertEqual('file:///C|/', dirname('file:///C|/foo'))
166
self.assertEqual('file:///C|/', dirname('file:///C|/'))
168
self.assertEqual('file:///', dirname('file:///foo'))
169
self.assertEqual('file:///', dirname('file:///'))
171
self.assertEqual('http://host/path/to', dirname('http://host/path/to/foo'))
172
self.assertEqual('http://host/path/to', dirname('http://host/path/to/foo/'))
173
self.assertEqual('http://host/path/to/foo',
174
dirname('http://host/path/to/foo/', exclude_trailing_slash=False))
175
self.assertEqual('http://host/', dirname('http://host/path'))
176
self.assertEqual('http://host/', dirname('http://host/'))
177
self.assertEqual('http://host', dirname('http://host'))
178
self.assertEqual('http:///nohost', dirname('http:///nohost/path'))
180
self.assertEqual('random+scheme://user:pass@ahost:port/',
181
dirname('random+scheme://user:pass@ahost:port/path'))
182
self.assertEqual('random+scheme://user:pass@ahost:port/',
183
dirname('random+scheme://user:pass@ahost:port/path/'))
184
self.assertEqual('random+scheme://user:pass@ahost:port/',
185
dirname('random+scheme://user:pass@ahost:port/'))
188
self.assertEqual('path/to', dirname('path/to/foo'))
189
self.assertEqual('path/to', dirname('path/to/foo/'))
190
self.assertEqual('path/to/foo',
191
dirname('path/to/foo/', exclude_trailing_slash=False))
192
self.assertEqual('path/..', dirname('path/../foo'))
193
self.assertEqual('../path', dirname('../path/foo'))
196
def test(expected, *args):
197
joined = urlutils.join(*args)
198
self.assertEqual(expected, joined)
200
# Test a single element
203
# Test relative path joining
204
test('foo/bar', 'foo', 'bar')
205
test('http://foo/bar', 'http://foo', 'bar')
206
test('http://foo/bar', 'http://foo', '.', 'bar')
207
test('http://foo/baz', 'http://foo', 'bar', '../baz')
208
test('http://foo/bar/baz', 'http://foo', 'bar/baz')
209
test('http://foo/baz', 'http://foo', 'bar/../baz')
210
test('http://foo/baz', 'http://foo/bar/', '../baz')
213
test('http://bar', 'http://foo', 'http://bar')
214
test('sftp://bzr/foo', 'http://foo', 'bar', 'sftp://bzr/foo')
215
test('file:///bar', 'foo', 'file:///bar')
216
test('http://bar/', 'http://foo', 'http://bar/')
217
test('http://bar/a', 'http://foo', 'http://bar/a')
218
test('http://bar/a/', 'http://foo', 'http://bar/a/')
221
test('file:///foo', 'file:///', 'foo')
222
test('file:///bar/foo', 'file:///bar/', 'foo')
223
test('http://host/foo', 'http://host/', 'foo')
224
test('http://host/', 'http://host', '')
227
# Cannot go above root
228
self.assertRaises(InvalidURLJoin, urlutils.join,
229
'http://foo', '../baz')
230
self.assertRaises(InvalidURLJoin, urlutils.join,
233
def test_joinpath(self):
234
def test(expected, *args):
235
joined = urlutils.joinpath(*args)
236
self.assertEqual(expected, joined)
238
# Test a single element
241
# Test relative path joining
242
test('foo/bar', 'foo', 'bar')
243
test('foo/bar', 'foo', '.', 'bar')
244
test('foo/baz', 'foo', 'bar', '../baz')
245
test('foo/bar/baz', 'foo', 'bar/baz')
246
test('foo/baz', 'foo', 'bar/../baz')
248
# Test joining to an absolute path
250
test('/foo', '/foo', '.')
251
test('/foo/bar', '/foo', 'bar')
252
test('/', '/foo', '..')
254
# Test joining with an absolute path
255
test('/bar', 'foo', '/bar')
257
# Test joining to a path with a trailing slash
258
test('foo/bar', 'foo/', 'bar')
261
# Cannot go above root
262
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '../baz')
263
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '..')
264
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '/..')
266
def test_function_type(self):
267
if sys.platform == 'win32':
268
self.assertEqual(urlutils._win32_local_path_to_url, urlutils.local_path_to_url)
269
self.assertEqual(urlutils._win32_local_path_from_url, urlutils.local_path_from_url)
271
self.assertEqual(urlutils._posix_local_path_to_url, urlutils.local_path_to_url)
272
self.assertEqual(urlutils._posix_local_path_from_url, urlutils.local_path_from_url)
274
def test_posix_local_path_to_url(self):
275
to_url = urlutils._posix_local_path_to_url
276
self.assertEqual('file:///path/to/foo',
277
to_url('/path/to/foo'))
280
result = to_url(u'/path/to/r\xe4ksm\xf6rg\xe5s')
282
raise TestSkipped("local encoding cannot handle unicode")
284
self.assertEqual('file:///path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
286
def test_posix_local_path_from_url(self):
287
from_url = urlutils._posix_local_path_from_url
288
self.assertEqual('/path/to/foo',
289
from_url('file:///path/to/foo'))
290
self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
291
from_url('file:///path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
292
self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
293
from_url('file:///path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
295
self.assertRaises(InvalidURL, from_url, '/path/to/foo')
297
def test_win32_local_path_to_url(self):
298
to_url = urlutils._win32_local_path_to_url
299
self.assertEqual('file:///C:/path/to/foo',
300
to_url('C:/path/to/foo'))
301
# BOGUS: on win32, ntpath.abspath will strip trailing
302
# whitespace, so this will always fail
303
# Though under linux, it fakes abspath support
304
# and thus will succeed
305
# self.assertEqual('file:///C:/path/to/foo%20',
306
# to_url('C:/path/to/foo '))
307
self.assertEqual('file:///C:/path/to/f%20oo',
308
to_url('C:/path/to/f oo'))
311
result = to_url(u'd:/path/to/r\xe4ksm\xf6rg\xe5s')
313
raise TestSkipped("local encoding cannot handle unicode")
315
self.assertEqual('file:///D:/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
317
def test_win32_unc_path_to_url(self):
318
to_url = urlutils._win32_local_path_to_url
319
self.assertEqual('file://HOST/path',
320
to_url(r'\\HOST\path'))
321
self.assertEqual('file://HOST/path',
322
to_url('//HOST/path'))
325
result = to_url(u'//HOST/path/to/r\xe4ksm\xf6rg\xe5s')
327
raise TestSkipped("local encoding cannot handle unicode")
329
self.assertEqual('file://HOST/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
332
def test_win32_local_path_from_url(self):
333
from_url = urlutils._win32_local_path_from_url
334
self.assertEqual('C:/path/to/foo',
335
from_url('file:///C|/path/to/foo'))
336
self.assertEqual(u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
337
from_url('file:///d|/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
338
self.assertEqual(u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
339
from_url('file:///d:/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
341
self.assertRaises(InvalidURL, from_url, '/path/to/foo')
342
# Not a valid _win32 url, no drive letter
343
self.assertRaises(InvalidURL, from_url, 'file:///path/to/foo')
345
def test_win32_unc_path_from_url(self):
346
from_url = urlutils._win32_local_path_from_url
347
self.assertEqual('//HOST/path', from_url('file://HOST/path'))
348
# despite IE allows 2, 4, 5 and 6 slashes in URL to another machine
349
# we want to use only 2 slashes
350
# Firefox understand only 5 slashes in URL, but it's ugly
351
self.assertRaises(InvalidURL, from_url, 'file:////HOST/path')
352
self.assertRaises(InvalidURL, from_url, 'file://///HOST/path')
353
self.assertRaises(InvalidURL, from_url, 'file://////HOST/path')
354
# check for file://C:/ instead of file:///C:/
355
self.assertRaises(InvalidURL, from_url, 'file://C:/path')
357
def test_win32_extract_drive_letter(self):
358
extract = urlutils._win32_extract_drive_letter
359
self.assertEqual(('file:///C:', '/foo'), extract('file://', '/C:/foo'))
360
self.assertEqual(('file:///d|', '/path'), extract('file://', '/d|/path'))
361
self.assertRaises(InvalidURL, extract, 'file://', '/path')
363
def test_split(self):
364
# Test bzrlib.urlutils.split()
365
split = urlutils.split
366
if sys.platform == 'win32':
367
self.assertRaises(InvalidURL, split, 'file:///path/to/foo')
368
self.assertEqual(('file:///C|/', 'foo'), split('file:///C|/foo'))
369
self.assertEqual(('file:///C:/', ''), split('file:///C:/'))
371
self.assertEqual(('file:///', 'foo'), split('file:///foo'))
372
self.assertEqual(('file:///', ''), split('file:///'))
374
self.assertEqual(('http://host/path/to', 'foo'), split('http://host/path/to/foo'))
375
self.assertEqual(('http://host/path/to', 'foo'), split('http://host/path/to/foo/'))
376
self.assertEqual(('http://host/path/to/foo', ''),
377
split('http://host/path/to/foo/', exclude_trailing_slash=False))
378
self.assertEqual(('http://host/', 'path'), split('http://host/path'))
379
self.assertEqual(('http://host/', ''), split('http://host/'))
380
self.assertEqual(('http://host', ''), split('http://host'))
381
self.assertEqual(('http:///nohost', 'path'), split('http:///nohost/path'))
383
self.assertEqual(('random+scheme://user:pass@ahost:port/', 'path'),
384
split('random+scheme://user:pass@ahost:port/path'))
385
self.assertEqual(('random+scheme://user:pass@ahost:port/', 'path'),
386
split('random+scheme://user:pass@ahost:port/path/'))
387
self.assertEqual(('random+scheme://user:pass@ahost:port/', ''),
388
split('random+scheme://user:pass@ahost:port/'))
391
self.assertEqual(('path/to', 'foo'), split('path/to/foo'))
392
self.assertEqual(('path/to', 'foo'), split('path/to/foo/'))
393
self.assertEqual(('path/to/foo', ''),
394
split('path/to/foo/', exclude_trailing_slash=False))
395
self.assertEqual(('path/..', 'foo'), split('path/../foo'))
396
self.assertEqual(('../path', 'foo'), split('../path/foo'))
398
def test_win32_strip_local_trailing_slash(self):
399
strip = urlutils._win32_strip_local_trailing_slash
400
self.assertEqual('file://', strip('file://'))
401
self.assertEqual('file:///', strip('file:///'))
402
self.assertEqual('file:///C', strip('file:///C'))
403
self.assertEqual('file:///C:', strip('file:///C:'))
404
self.assertEqual('file:///d|', strip('file:///d|'))
405
self.assertEqual('file:///C:/', strip('file:///C:/'))
406
self.assertEqual('file:///C:/a', strip('file:///C:/a/'))
408
def test_strip_trailing_slash(self):
409
sts = urlutils.strip_trailing_slash
410
if sys.platform == 'win32':
411
self.assertEqual('file:///C|/', sts('file:///C|/'))
412
self.assertEqual('file:///C:/foo', sts('file:///C:/foo'))
413
self.assertEqual('file:///C|/foo', sts('file:///C|/foo/'))
415
self.assertEqual('file:///', sts('file:///'))
416
self.assertEqual('file:///foo', sts('file:///foo'))
417
self.assertEqual('file:///foo', sts('file:///foo/'))
419
self.assertEqual('http://host/', sts('http://host/'))
420
self.assertEqual('http://host/foo', sts('http://host/foo'))
421
self.assertEqual('http://host/foo', sts('http://host/foo/'))
423
# No need to fail just because the slash is missing
424
self.assertEqual('http://host', sts('http://host'))
425
# TODO: jam 20060502 Should this raise InvalidURL?
426
self.assertEqual('file://', sts('file://'))
428
self.assertEqual('random+scheme://user:pass@ahost:port/path',
429
sts('random+scheme://user:pass@ahost:port/path'))
430
self.assertEqual('random+scheme://user:pass@ahost:port/path',
431
sts('random+scheme://user:pass@ahost:port/path/'))
432
self.assertEqual('random+scheme://user:pass@ahost:port/',
433
sts('random+scheme://user:pass@ahost:port/'))
435
# Make sure relative paths work too
436
self.assertEqual('path/to/foo', sts('path/to/foo'))
437
self.assertEqual('path/to/foo', sts('path/to/foo/'))
438
self.assertEqual('../to/foo', sts('../to/foo/'))
439
self.assertEqual('path/../foo', sts('path/../foo/'))
441
def test_unescape_for_display_utf8(self):
442
# Test that URLs are converted to nice unicode strings for display
443
def test(expected, url, encoding='utf-8'):
444
disp_url = urlutils.unescape_for_display(url, encoding=encoding)
445
self.assertIsInstance(disp_url, unicode)
446
self.assertEqual(expected, disp_url)
448
test('http://foo', 'http://foo')
449
if sys.platform == 'win32':
450
test('C:/foo/path', 'file:///C|/foo/path')
451
test('C:/foo/path', 'file:///C:/foo/path')
453
test('/foo/path', 'file:///foo/path')
455
test('http://foo/%2Fbaz', 'http://foo/%2Fbaz')
456
test(u'http://host/r\xe4ksm\xf6rg\xe5s',
457
'http://host/r%C3%A4ksm%C3%B6rg%C3%A5s')
459
# Make sure special escaped characters stay escaped
460
test(u'http://host/%3B%2F%3F%3A%40%26%3D%2B%24%2C%23',
461
'http://host/%3B%2F%3F%3A%40%26%3D%2B%24%2C%23')
463
# Can we handle sections that don't have utf-8 encoding?
464
test(u'http://host/%EE%EE%EE/r\xe4ksm\xf6rg\xe5s',
465
'http://host/%EE%EE%EE/r%C3%A4ksm%C3%B6rg%C3%A5s')
467
# Test encoding into output that can handle some characters
468
test(u'http://host/%EE%EE%EE/r\xe4ksm\xf6rg\xe5s',
469
'http://host/%EE%EE%EE/r%C3%A4ksm%C3%B6rg%C3%A5s',
470
encoding='iso-8859-1')
472
# This one can be encoded into utf8
473
test(u'http://host/\u062c\u0648\u062c\u0648',
474
'http://host/%d8%ac%d9%88%d8%ac%d9%88',
477
# This can't be put into 8859-1 and so stays as escapes
478
test(u'http://host/%d8%ac%d9%88%d8%ac%d9%88',
479
'http://host/%d8%ac%d9%88%d8%ac%d9%88',
480
encoding='iso-8859-1')
482
def test_escape(self):
483
self.assertEqual('%25', urlutils.escape('%'))
484
self.assertEqual('%C3%A5', urlutils.escape(u'\xe5'))
486
def test_unescape(self):
487
self.assertEqual('%', urlutils.unescape('%25'))
488
self.assertEqual(u'\xe5', urlutils.unescape('%C3%A5'))
490
self.assertRaises(InvalidURL, urlutils.unescape, u'\xe5')
491
self.assertRaises(InvalidURL, urlutils.unescape, '\xe5')
492
self.assertRaises(InvalidURL, urlutils.unescape, '%E5')
494
def test_escape_unescape(self):
495
self.assertEqual(u'\xe5', urlutils.unescape(urlutils.escape(u'\xe5')))
496
self.assertEqual('%', urlutils.unescape(urlutils.escape('%')))
498
def test_relative_url(self):
499
def test(expected, base, other):
500
result = urlutils.relative_url(base, other)
501
self.assertEqual(expected, result)
503
test('a', 'http://host/', 'http://host/a')
504
test('http://entirely/different', 'sftp://host/branch',
505
'http://entirely/different')
506
test('../person/feature', 'http://host/branch/mainline',
507
'http://host/branch/person/feature')
508
test('..', 'http://host/branch', 'http://host/')
509
test('http://host2/branch', 'http://host1/branch', 'http://host2/branch')
510
test('.', 'http://host1/branch', 'http://host1/branch')
511
test('../../../branch/2b', 'file:///home/jelmer/foo/bar/2b',
512
'file:///home/jelmer/branch/2b')
513
test('../../branch/2b', 'sftp://host/home/jelmer/bar/2b',
514
'sftp://host/home/jelmer/branch/2b')
515
test('../../branch/feature/%2b', 'http://host/home/jelmer/bar/%2b',
516
'http://host/home/jelmer/branch/feature/%2b')
517
test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
518
'http://host/home/jelmer/branch/feature/2b')
519
# relative_url should preserve a trailing slash
520
test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b/',
521
'http://host/home/jelmer/branch/feature/2b/')
522
test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b',
523
'http://host/home/jelmer/branch/feature/2b/')
525
# TODO: treat http://host as http://host/
526
# relative_url is typically called from a branch.base or
527
# transport.base which always ends with a /
528
#test('a', 'http://host', 'http://host/a')
529
test('http://host/a', 'http://host', 'http://host/a')
530
#test('.', 'http://host', 'http://host/')
531
test('http://host/', 'http://host', 'http://host/')
532
#test('.', 'http://host/', 'http://host')
533
test('http://host', 'http://host/', 'http://host')
536
class TestCwdToURL(TestCaseInTempDir):
537
"""Test that local_path_to_url works base on the cwd"""
540
# This test will fail if getcwd is not ascii
544
url = urlutils.local_path_to_url('.')
545
self.assertEndsWith(url, '/mytest')
547
def test_non_ascii(self):
548
if win32utils.winver == 'Windows 98':
549
raise TestSkipped('Windows 98 cannot handle unicode filenames')
554
raise TestSkipped('cannot create unicode directory')
558
# On Mac OSX this directory is actually:
559
# u'/dode\u0301' => '/dode\xcc\x81
560
# but we should normalize it back to
561
# u'/dod\xe9' => '/dod\xc3\xa9'
562
url = urlutils.local_path_to_url('.')
563
self.assertEndsWith(url, '/dod%C3%A9')