|
| 1 | +import unittest |
| 2 | + |
| 3 | +from test.support import warnings_helper |
| 4 | + |
| 5 | + |
| 6 | +nturl2path = warnings_helper.import_deprecated("nturl2path") |
| 7 | + |
| 8 | + |
| 9 | +class NTURL2PathTest(unittest.TestCase): |
| 10 | + """Test pathname2url() and url2pathname()""" |
| 11 | + |
| 12 | + def test_basic(self): |
| 13 | + # Make sure simple tests pass |
| 14 | + expected_path = r"parts\of\a\path" |
| 15 | + expected_url = "parts/of/a/path" |
| 16 | + result = nturl2path.pathname2url(expected_path) |
| 17 | + self.assertEqual(expected_url, result, |
| 18 | + "pathname2url() failed; %s != %s" % |
| 19 | + (result, expected_url)) |
| 20 | + result = nturl2path.url2pathname(expected_url) |
| 21 | + self.assertEqual(expected_path, result, |
| 22 | + "url2pathame() failed; %s != %s" % |
| 23 | + (result, expected_path)) |
| 24 | + |
| 25 | + def test_pathname2url(self): |
| 26 | + # Test special prefixes are correctly handled in pathname2url() |
| 27 | + fn = nturl2path.pathname2url |
| 28 | + self.assertEqual(fn('\\\\?\\C:\\dir'), '///C:/dir') |
| 29 | + self.assertEqual(fn('\\\\?\\unc\\server\\share\\dir'), '//server/share/dir') |
| 30 | + self.assertEqual(fn("C:"), '///C:') |
| 31 | + self.assertEqual(fn("C:\\"), '///C:/') |
| 32 | + self.assertEqual(fn('c:\\a\\b.c'), '///c:/a/b.c') |
| 33 | + self.assertEqual(fn('C:\\a\\b.c'), '///C:/a/b.c') |
| 34 | + self.assertEqual(fn('C:\\a\\b.c\\'), '///C:/a/b.c/') |
| 35 | + self.assertEqual(fn('C:\\a\\\\b.c'), '///C:/a//b.c') |
| 36 | + self.assertEqual(fn('C:\\a\\b%#c'), '///C:/a/b%25%23c') |
| 37 | + self.assertEqual(fn('C:\\a\\b\xe9'), '///C:/a/b%C3%A9') |
| 38 | + self.assertEqual(fn('C:\\foo\\bar\\spam.foo'), "///C:/foo/bar/spam.foo") |
| 39 | + # NTFS alternate data streams |
| 40 | + self.assertEqual(fn('C:\\foo:bar'), '///C:/foo%3Abar') |
| 41 | + self.assertEqual(fn('foo:bar'), 'foo%3Abar') |
| 42 | + # No drive letter |
| 43 | + self.assertEqual(fn("\\folder\\test\\"), '///folder/test/') |
| 44 | + self.assertEqual(fn("\\\\folder\\test\\"), '//folder/test/') |
| 45 | + self.assertEqual(fn("\\\\\\folder\\test\\"), '///folder/test/') |
| 46 | + self.assertEqual(fn('\\\\some\\share\\'), '//some/share/') |
| 47 | + self.assertEqual(fn('\\\\some\\share\\a\\b.c'), '//some/share/a/b.c') |
| 48 | + self.assertEqual(fn('\\\\some\\share\\a\\b%#c\xe9'), '//some/share/a/b%25%23c%C3%A9') |
| 49 | + # Alternate path separator |
| 50 | + self.assertEqual(fn('C:/a/b.c'), '///C:/a/b.c') |
| 51 | + self.assertEqual(fn('//some/share/a/b.c'), '//some/share/a/b.c') |
| 52 | + self.assertEqual(fn('//?/C:/dir'), '///C:/dir') |
| 53 | + self.assertEqual(fn('//?/unc/server/share/dir'), '//server/share/dir') |
| 54 | + # Round-tripping |
| 55 | + urls = ['///C:', |
| 56 | + '///folder/test/', |
| 57 | + '///C:/foo/bar/spam.foo'] |
| 58 | + for url in urls: |
| 59 | + self.assertEqual(fn(nturl2path.url2pathname(url)), url) |
| 60 | + |
| 61 | + def test_url2pathname(self): |
| 62 | + fn = nturl2path.url2pathname |
| 63 | + self.assertEqual(fn('/'), '\\') |
| 64 | + self.assertEqual(fn('/C:/'), 'C:\\') |
| 65 | + self.assertEqual(fn("///C|"), 'C:') |
| 66 | + self.assertEqual(fn("///C:"), 'C:') |
| 67 | + self.assertEqual(fn('///C:/'), 'C:\\') |
| 68 | + self.assertEqual(fn('/C|//'), 'C:\\\\') |
| 69 | + self.assertEqual(fn('///C|/path'), 'C:\\path') |
| 70 | + # No DOS drive |
| 71 | + self.assertEqual(fn("///C/test/"), '\\C\\test\\') |
| 72 | + self.assertEqual(fn("////C/test/"), '\\\\C\\test\\') |
| 73 | + # DOS drive paths |
| 74 | + self.assertEqual(fn('c:/path/to/file'), 'c:\\path\\to\\file') |
| 75 | + self.assertEqual(fn('C:/path/to/file'), 'C:\\path\\to\\file') |
| 76 | + self.assertEqual(fn('C:/path/to/file/'), 'C:\\path\\to\\file\\') |
| 77 | + self.assertEqual(fn('C:/path/to//file'), 'C:\\path\\to\\\\file') |
| 78 | + self.assertEqual(fn('C|/path/to/file'), 'C:\\path\\to\\file') |
| 79 | + self.assertEqual(fn('/C|/path/to/file'), 'C:\\path\\to\\file') |
| 80 | + self.assertEqual(fn('///C|/path/to/file'), 'C:\\path\\to\\file') |
| 81 | + self.assertEqual(fn("///C|/foo/bar/spam.foo"), 'C:\\foo\\bar\\spam.foo') |
| 82 | + # Colons in URI |
| 83 | + self.assertEqual(fn('///\u00e8|/'), '\u00e8:\\') |
| 84 | + self.assertEqual(fn('//host/share/spam.txt:eggs'), '\\\\host\\share\\spam.txt:eggs') |
| 85 | + self.assertEqual(fn('///c:/spam.txt:eggs'), 'c:\\spam.txt:eggs') |
| 86 | + # UNC paths |
| 87 | + self.assertEqual(fn('//server/path/to/file'), '\\\\server\\path\\to\\file') |
| 88 | + self.assertEqual(fn('////server/path/to/file'), '\\\\server\\path\\to\\file') |
| 89 | + self.assertEqual(fn('/////server/path/to/file'), '\\\\server\\path\\to\\file') |
| 90 | + # Localhost paths |
| 91 | + self.assertEqual(fn('//localhost/C:/path/to/file'), 'C:\\path\\to\\file') |
| 92 | + self.assertEqual(fn('//localhost/C|/path/to/file'), 'C:\\path\\to\\file') |
| 93 | + self.assertEqual(fn('//localhost/path/to/file'), '\\path\\to\\file') |
| 94 | + self.assertEqual(fn('//localhost//server/path/to/file'), '\\\\server\\path\\to\\file') |
| 95 | + # Percent-encoded forward slashes are preserved for backwards compatibility |
| 96 | + self.assertEqual(fn('C:/foo%2fbar'), 'C:\\foo/bar') |
| 97 | + self.assertEqual(fn('//server/share/foo%2fbar'), '\\\\server\\share\\foo/bar') |
| 98 | + # Round-tripping |
| 99 | + paths = ['C:', |
| 100 | + r'\C\test\\', |
| 101 | + r'C:\foo\bar\spam.foo'] |
| 102 | + for path in paths: |
| 103 | + self.assertEqual(fn(nturl2path.pathname2url(path)), path) |
| 104 | + |
| 105 | + |
| 106 | +if __name__ == '__main__': |
| 107 | + unittest.main() |
0 commit comments