test_paths.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import pathlib
  2. import platform
  3. import sys
  4. import pytest
  5. from ..paths import file_uri_to_path, is_relative, normalized_uri
  6. WIN = platform.system() == "Windows"
  7. HOME = pathlib.Path("~").expanduser()
  8. PY35 = sys.version_info[:2] == (3, 5)
  9. @pytest.mark.skipif(WIN, reason="can't test POSIX paths on Windows")
  10. @pytest.mark.parametrize("root_dir, expected_root_uri", [["~", HOME.as_uri()]])
  11. def test_normalize_posix_path_home(root_dir, expected_root_uri): # pragma: no cover
  12. assert normalized_uri(root_dir) == expected_root_uri
  13. @pytest.mark.skipif(WIN, reason="can't test POSIX paths on Windows")
  14. @pytest.mark.parametrize(
  15. "root, path",
  16. [["~", "~/a"], ["~", "~/a/../b/"], ["/", "/"], ["/a", "/a/b"], ["/a", "/a/b/../c"]],
  17. )
  18. def test_is_relative_ok(root, path):
  19. assert is_relative(root, path)
  20. @pytest.mark.skipif(WIN, reason="can't test POSIX paths on Windows")
  21. @pytest.mark.parametrize(
  22. "root, path",
  23. [
  24. ["~", "~/.."],
  25. ["~", "/"],
  26. ["/a", "/"],
  27. ["/a/b", "/a"],
  28. ["/a/b", "/a/b/.."],
  29. ["/a", "/a/../b"],
  30. ["/a", "a//"],
  31. ],
  32. )
  33. def test_is_relative_not_ok(root, path):
  34. assert not is_relative(root, path)
  35. @pytest.mark.skipif(not WIN, reason="can't test Windows paths on POSIX")
  36. @pytest.mark.parametrize(
  37. "root, path",
  38. [
  39. ["c:\\Users\\user1", "c:\\Users\\"],
  40. ["c:\\Users\\user1", "d:\\"],
  41. ["c:\\Users", "c:\\Users\\.."],
  42. ],
  43. )
  44. def test_is_relative_not_ok_win(root, path):
  45. assert not is_relative(root, path)
  46. @pytest.mark.skipif(PY35, reason="can't test non-existent paths on py35")
  47. @pytest.mark.skipif(WIN, reason="can't test POSIX paths on Windows")
  48. @pytest.mark.parametrize(
  49. "root_dir, expected_root_uri",
  50. [
  51. # probably need to try some other things
  52. [str(HOME / "foo"), (HOME / "foo").as_uri()]
  53. ],
  54. )
  55. def test_normalize_posix_path_home_subdir(
  56. root_dir, expected_root_uri
  57. ): # pragma: no cover
  58. assert normalized_uri(root_dir) == expected_root_uri
  59. @pytest.mark.skipif(not WIN, reason="can't test Windows paths on POSIX")
  60. @pytest.mark.parametrize(
  61. "root_dir, expected_root_uri",
  62. [
  63. ["c:\\Users\\user1", "file:///c:/Users/user1"],
  64. ["C:\\Users\\user1", "file:///c:/Users/user1"],
  65. ["//VBOXSVR/shared-folder", "file://vboxsvr/shared-folder/"],
  66. ],
  67. )
  68. def test_normalize_windows_path_case(root_dir, expected_root_uri): # pragma: no cover
  69. try:
  70. normalized = normalized_uri(root_dir)
  71. except FileNotFoundError as err:
  72. if sys.version_info < (3, 12) and root_dir == "//VBOXSVR/shared-folder":
  73. # see https://github.com/python/cpython/issues/136755
  74. return
  75. raise err
  76. assert normalized == expected_root_uri
  77. @pytest.mark.skipif(WIN, reason="can't test POSIX paths on Windows")
  78. @pytest.mark.parametrize(
  79. "file_uri, expected_posix_path",
  80. [
  81. ["file:///C:/Windows/System32/Drivers/etc", "/C:/Windows/System32/Drivers/etc"],
  82. ["file:///C:/some%20dir/some%20file.txt", "/C:/some dir/some file.txt"],
  83. ["file:///home/user/some%20file.txt", "/home/user/some file.txt"],
  84. ],
  85. )
  86. def test_file_uri_to_path_posix(file_uri, expected_posix_path): # pragma: no cover
  87. assert file_uri_to_path(file_uri) == expected_posix_path
  88. @pytest.mark.skipif(not WIN, reason="can't test Windows paths on POSIX")
  89. @pytest.mark.parametrize(
  90. "file_uri, expected_windows_path",
  91. [
  92. # https://github.com/jupyter-lsp/jupyterlab-lsp/pull/305#issuecomment-665996145
  93. ["file:///C:/Windows/System32/Drivers/etc", "C:/Windows/System32/Drivers/etc"],
  94. ["file:///C:/some%20dir/some%20file.txt", "C:/some dir/some file.txt"],
  95. ],
  96. )
  97. def test_file_uri_to_path_windows(file_uri, expected_windows_path): # pragma: no cover
  98. assert file_uri_to_path(file_uri) == expected_windows_path