1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
import os
import socket
import subprocess
import sys
import uuid
import warnings
from pathlib import Path
from unittest.mock import patch
import pytest
from traitlets.tests.utils import check_help_all_output
from jupyter_server.utils import (
check_pid,
check_version,
filefind,
is_namespace_package,
path2url,
run_sync_in_loop,
samefile_simple,
to_api_path,
unix_socket_in_use,
url2path,
url_escape,
url_unescape,
)
def test_help_output():
check_help_all_output("jupyter_server")
@pytest.mark.parametrize(
"unescaped,escaped",
[
("/this is a test/for spaces/", "/this%20is%20a%20test/for%20spaces/"),
("notebook with space.ipynb", "notebook%20with%20space.ipynb"),
(
"/path with a/notebook and space.ipynb",
"/path%20with%20a/notebook%20and%20space.ipynb",
),
(
"/ !@$#%^&* / test %^ notebook @#$ name.ipynb",
"/%20%21%40%24%23%25%5E%26%2A%20/%20test%20%25%5E%20notebook%20%40%23%24%20name.ipynb",
),
],
)
def test_url_escaping(unescaped, escaped):
# Test escaping.
path = url_escape(unescaped)
assert path == escaped
# Test unescaping.
path = url_unescape(escaped)
assert path == unescaped
@pytest.mark.parametrize(
"name, expected",
[
# returns True if it is a namespace package
("test_namespace", True),
# returns False if it isn't a namespace package
("sys", False),
("jupyter_server", False),
# returns None if it isn't importable
("not_a_python_namespace", None),
],
)
def test_is_namespace_package(monkeypatch, name, expected):
monkeypatch.syspath_prepend(Path(__file__).parent / "namespace-package-test")
assert is_namespace_package(name) is expected
def test_is_namespace_package_no_spec():
with patch("importlib.util.find_spec") as mocked_spec:
mocked_spec.side_effect = ValueError()
assert is_namespace_package("dummy") is None
mocked_spec.assert_called_once_with("dummy")
@pytest.mark.skipif(os.name == "nt", reason="Paths are annoying on Windows")
def test_path_utils(tmp_path):
path = str(tmp_path)
assert os.path.basename(path2url(path)) == os.path.basename(path)
url = path2url(path)
assert path.endswith(url2path(url))
assert samefile_simple(path, path)
assert to_api_path(path, os.path.dirname(path)) == os.path.basename(path)
def test_check_version():
assert check_version("1.0.2", "1.0.1")
assert not check_version("1.0.0", "1.0.1")
assert check_version(1.0, "1.0.1") # type:ignore[arg-type]
def test_check_pid():
proc = subprocess.Popen([sys.executable])
proc.kill()
proc.wait()
check_pid(proc.pid)
async def test_run_sync_in_loop():
async def foo():
pass
with warnings.catch_warnings():
warnings.simplefilter("ignore")
await run_sync_in_loop(foo())
@pytest.mark.skipif(os.name != "posix", reason="Requires unix sockets")
def test_unix_socket_in_use(tmp_path):
root_tmp_dir = Path("/tmp").resolve()
server_address = os.path.join(root_tmp_dir, uuid.uuid4().hex)
if os.path.exists(server_address):
os.remove(server_address)
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind(server_address)
sock.listen(0)
assert unix_socket_in_use(server_address)
sock.close()
@pytest.mark.parametrize(
"filename, result",
[
("/foo", OSError),
("../c/in-c", OSError),
("in-a", "a/in-a"),
("in-b", "b/in-b"),
("in-both", "a/in-both"),
(r"\in-a", OSError),
("not-found", OSError),
],
)
def test_filefind(tmp_path, filename, result):
a = tmp_path / "a"
a.mkdir()
b = tmp_path / "b"
b.mkdir()
c = tmp_path / "c"
c.mkdir()
for parent in (a, b):
with parent.joinpath("in-both").open("w"):
pass
with a.joinpath("in-a").open("w"):
pass
with b.joinpath("in-b").open("w"):
pass
with c.joinpath("in-c").open("w"):
pass
if isinstance(result, str):
found = filefind(filename, [str(a), str(b)])
found_relative = Path(found).relative_to(tmp_path)
assert str(found_relative).replace(os.sep, "/") == result
else:
with pytest.raises(result):
filefind(filename, [str(a), str(b)])
|