xonsh/tests/completers/test_dir_completers.py
2022-03-24 19:49:30 +05:30

84 lines
2.4 KiB
Python

import tempfile
from os import sep
import pytest
from xonsh.completers.tools import RichCompletion
from xonsh.pytest.tools import ON_WINDOWS
CUR_DIR = "." if ON_WINDOWS else "./"
PARENT_DIR = ".." if ON_WINDOWS else "../"
@pytest.fixture(autouse=True)
def setup(xession, xonsh_execer):
with tempfile.TemporaryDirectory() as tmp:
xession.env["XONSH_DATA_DIR"] = tmp
xession.env["CDPATH"] = set()
@pytest.fixture(params=["cd", "rmdir"])
def cmd(request):
return request.param
def test_non_dir(cmd, check_completer):
with tempfile.NamedTemporaryFile(dir=".", suffix="_dummySuffix") as tmp:
assert not check_completer(cmd, prefix=tmp.name[:-2])
@pytest.fixture(scope="module")
def dir_path():
with tempfile.TemporaryDirectory(dir=".", suffix="_dummyDir") as tmp_path:
yield tmp_path
def test_dirs_only(cmd, dir_path, check_completer):
completions = check_completer(cmd, dir_path[:-2])
assert completions == {dir_path + sep}
def test_opening_quotes(cmd, dir_path, check_completer):
assert check_completer(cmd, "r'" + dir_path) == {f"r'{dir_path}{sep}'"}
def test_closing_quotes(cmd, dir_path, check_completer):
prefix = dir_path
exp = f"'''{dir_path}{sep}'''"
if ON_WINDOWS:
prefix = prefix.replace("\\", "\\\\")
# the path completer converts to a raw string if there's a backslash
exp = "r" + exp
values, completions = check_completer(
cmd, "'''" + prefix + "'''", send_original=True
)
assert values == {exp}
completion = list(completions).pop()
assert isinstance(completion, RichCompletion)
assert completion.append_closing_quote is False
def test_complete_dots(xession, check_completer):
with xession.env.swap(COMPLETE_DOTS="never"):
dirs = check_completer("cd")
assert CUR_DIR not in dirs and PARENT_DIR not in dirs
dirs = check_completer("cd", ".")
assert CUR_DIR not in dirs and PARENT_DIR not in dirs
with xession.env.swap(COMPLETE_DOTS="matching"):
dirs = check_completer("cd", "")
assert CUR_DIR not in dirs and PARENT_DIR not in dirs
dirs = check_completer("cd", ".")
assert CUR_DIR in dirs and PARENT_DIR in dirs
with xession.env.swap(COMPLETE_DOTS="always"):
dirs = check_completer("cd", "")
assert CUR_DIR in dirs and PARENT_DIR in dirs
dirs = check_completer("cd", ".")
assert CUR_DIR in dirs and PARENT_DIR in dirs