117 lines
3.1 KiB
Python
117 lines
3.1 KiB
Python
"""Test enter"""
|
|
|
|
import os
|
|
|
|
import pytest
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"shell, success",
|
|
[
|
|
("delete", True), # if there is no shell variable, bash creates it
|
|
("", False),
|
|
("/usr/bin/env", True),
|
|
("noexec", False),
|
|
],
|
|
ids=[
|
|
"shell-missing",
|
|
"shell-empty",
|
|
"shell-env",
|
|
"shell-noexec",
|
|
],
|
|
)
|
|
@pytest.mark.usefixtures("ds1_copy")
|
|
def test_enter(runner, yadm_cmd, paths, shell, success):
|
|
"""Enter tests"""
|
|
env = os.environ.copy()
|
|
if shell == "delete":
|
|
# remove shell
|
|
if "SHELL" in env:
|
|
del env["SHELL"]
|
|
elif shell == "noexec":
|
|
# specify a non-executable path
|
|
noexec = paths.root.join("noexec")
|
|
noexec.write("")
|
|
noexec.chmod(0o664)
|
|
env["SHELL"] = str(noexec)
|
|
else:
|
|
env["SHELL"] = shell
|
|
|
|
run = runner(command=yadm_cmd("enter"), env=env)
|
|
assert run.success == success
|
|
prompt = f"yadm shell ({paths.repo})"
|
|
if success:
|
|
assert run.out.startswith("Entering yadm repo")
|
|
assert run.out.rstrip().endswith("Leaving yadm repo")
|
|
assert run.err == ""
|
|
else:
|
|
assert "does not refer to an executable" in run.err
|
|
if "env" in shell:
|
|
assert f"GIT_DIR={paths.repo}" in run.out
|
|
assert f"GIT_WORK_TREE={paths.work}" in run.out
|
|
assert f"PROMPT={prompt}" in run.out
|
|
assert f"PS1={prompt}" in run.out
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"shell, opts, path",
|
|
[
|
|
("bash", "--norc", "\\w"),
|
|
("csh", "-f", "%~"),
|
|
("zsh", "-f", "%~"),
|
|
],
|
|
ids=[
|
|
"bash",
|
|
"csh",
|
|
"zsh",
|
|
],
|
|
)
|
|
@pytest.mark.parametrize(
|
|
"cmd",
|
|
[False, "cmd", "cmd-bad-exit"],
|
|
ids=["no-cmd", "cmd", "cmd-bad-exit"],
|
|
)
|
|
@pytest.mark.parametrize(
|
|
"term",
|
|
["", "dumb"],
|
|
ids=["term-empty", "term-dumb"],
|
|
)
|
|
@pytest.mark.usefixtures("ds1_copy")
|
|
def test_enter_shell_ops(runner, yadm_cmd, paths, shell, opts, path, cmd, term):
|
|
"""Enter tests for specific shell options"""
|
|
|
|
change_exit = "\nfalse" if cmd == "cmd-bad-exit" else ""
|
|
|
|
# Create custom shell to detect options passed
|
|
custom_shell = paths.root.join(shell)
|
|
custom_shell.write(f"#!/bin/sh\necho OPTS=$*\necho PROMPT=$PROMPT{change_exit}")
|
|
custom_shell.chmod(0o775)
|
|
|
|
test_cmd = ["test1", "test2", "test3"]
|
|
|
|
enter_cmd = ["enter"]
|
|
if cmd:
|
|
enter_cmd += test_cmd
|
|
|
|
env = os.environ.copy()
|
|
env["TERM"] = term
|
|
env["SHELL"] = custom_shell
|
|
|
|
if shell == "zsh" and term == "dumb":
|
|
opts += " --no-zle"
|
|
|
|
run = runner(command=yadm_cmd(*enter_cmd), env=env)
|
|
if cmd == "cmd-bad-exit":
|
|
assert run.failure
|
|
else:
|
|
assert run.success
|
|
assert run.err == ""
|
|
assert f"OPTS={opts}" in run.out
|
|
assert f"PROMPT=yadm shell ({paths.repo}) {path} >" in run.out
|
|
if cmd:
|
|
assert "-c " + " ".join(test_cmd) in run.out
|
|
assert "Entering yadm repo" not in run.out
|
|
assert "Leaving yadm repo" not in run.out
|
|
else:
|
|
assert "Entering yadm repo" in run.out
|
|
assert "Leaving yadm repo" in run.out
|