Migrate CLI argument tests to Python
This commit is contained in:
parent
68246ba33e
commit
a8dd89f48f
3 changed files with 201 additions and 0 deletions
24
tests/dotbot_plugin_directory.py
Normal file
24
tests/dotbot_plugin_directory.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
"""Test that a plugin can be loaded by directory.
|
||||||
|
|
||||||
|
This file is copied to a location with the name "directory.py",
|
||||||
|
and is then loaded from within the `test_cli.py` code.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import dotbot
|
||||||
|
import os.path
|
||||||
|
|
||||||
|
|
||||||
|
class Directory(dotbot.Plugin):
|
||||||
|
def can_handle(self, directive):
|
||||||
|
return directive == "plugin_directory"
|
||||||
|
|
||||||
|
def handle(self, directive, data):
|
||||||
|
self._log.debug("Attempting to get options from Context")
|
||||||
|
options = self._context.options()
|
||||||
|
if len(options.plugin_dirs) != 1:
|
||||||
|
self._log.debug("Context.options.plugins length is %i, expected 1" % len(options.plugins))
|
||||||
|
return False
|
||||||
|
|
||||||
|
with open(os.path.abspath(os.path.expanduser("~/flag")), "w") as file:
|
||||||
|
file.write("directory plugin loading works")
|
||||||
|
return True
|
27
tests/dotbot_plugin_file.py
Normal file
27
tests/dotbot_plugin_file.py
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
"""Test that a plugin can be loaded by filename.
|
||||||
|
|
||||||
|
This file is copied to a location with the name "file.py",
|
||||||
|
and is then loaded from within the `test_cli.py` code.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import dotbot
|
||||||
|
import os.path
|
||||||
|
|
||||||
|
|
||||||
|
class File(dotbot.Plugin):
|
||||||
|
def can_handle(self, directive):
|
||||||
|
return directive == "plugin_file"
|
||||||
|
|
||||||
|
def handle(self, directive, data):
|
||||||
|
self._log.debug("Attempting to get options from Context")
|
||||||
|
options = self._context.options()
|
||||||
|
if len(options.plugins) != 1:
|
||||||
|
self._log.debug("Context.options.plugins length is %i, expected 1" % len(options.plugins))
|
||||||
|
return False
|
||||||
|
if not options.plugins[0].endswith("file.py"):
|
||||||
|
self._log.debug("Context.options.plugins[0] is %s, expected end with file.py" % options.plugins[0])
|
||||||
|
return False
|
||||||
|
|
||||||
|
with open(os.path.abspath(os.path.expanduser("~/flag")), "w") as file:
|
||||||
|
file.write("file plugin loading works")
|
||||||
|
return True
|
150
tests/test_cli.py
Normal file
150
tests/test_cli.py
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
def test_except_create(capfd, home, dotfiles, run_dotbot):
|
||||||
|
"""Verify that `--except` works as intended."""
|
||||||
|
|
||||||
|
dotfiles.write_config([
|
||||||
|
{"create": ["~/a"]},
|
||||||
|
{"shell": [
|
||||||
|
{"command": "echo success", "stdout": True},
|
||||||
|
]},
|
||||||
|
])
|
||||||
|
run_dotbot("--except", "create")
|
||||||
|
|
||||||
|
assert not os.path.exists(os.path.join(home, "a"))
|
||||||
|
stdout = capfd.readouterr().out.splitlines()
|
||||||
|
assert any(line.startswith("success") for line in stdout)
|
||||||
|
|
||||||
|
|
||||||
|
def test_except_shell(capfd, home, dotfiles, run_dotbot):
|
||||||
|
"""Verify that `--except` works as intended."""
|
||||||
|
|
||||||
|
dotfiles.write_config([
|
||||||
|
{"create": ["~/a"]},
|
||||||
|
{"shell": [
|
||||||
|
{"command": "echo failure", "stdout": True},
|
||||||
|
]},
|
||||||
|
])
|
||||||
|
run_dotbot("--except", "shell")
|
||||||
|
|
||||||
|
assert os.path.exists(os.path.join(home, "a"))
|
||||||
|
stdout = capfd.readouterr().out.splitlines()
|
||||||
|
assert not any(line.startswith("failure") for line in stdout)
|
||||||
|
|
||||||
|
|
||||||
|
def test_except_multiples(capfd, home, dotfiles, run_dotbot):
|
||||||
|
"""Verify that `--except` works with multiple exceptions."""
|
||||||
|
|
||||||
|
dotfiles.write_config([
|
||||||
|
{"create": ["~/a"]},
|
||||||
|
{"shell": [
|
||||||
|
{"command": "echo failure", "stdout": True},
|
||||||
|
]},
|
||||||
|
])
|
||||||
|
run_dotbot("--except", "create", "shell")
|
||||||
|
|
||||||
|
assert not os.path.exists(os.path.join(home, "a"))
|
||||||
|
stdout = capfd.readouterr().out.splitlines()
|
||||||
|
assert not any(line.startswith("failure") for line in stdout)
|
||||||
|
|
||||||
|
|
||||||
|
def test_exit_on_failure(capfd, home, dotfiles, run_dotbot):
|
||||||
|
"""Verify that processing can halt immediately on failures."""
|
||||||
|
|
||||||
|
dotfiles.write_config([
|
||||||
|
{"create": ["~/a"]},
|
||||||
|
{"shell": ["this_is_not_a_command"]},
|
||||||
|
{"create": ["~/b"]},
|
||||||
|
])
|
||||||
|
with pytest.raises(SystemExit):
|
||||||
|
run_dotbot("-x")
|
||||||
|
|
||||||
|
assert os.path.isdir(os.path.join(home, "a"))
|
||||||
|
assert not os.path.isdir(os.path.join(home, "b"))
|
||||||
|
|
||||||
|
|
||||||
|
def test_only(capfd, home, dotfiles, run_dotbot):
|
||||||
|
"""Verify that `--only` works as intended."""
|
||||||
|
|
||||||
|
dotfiles.write_config([
|
||||||
|
{"create": ["~/a"]},
|
||||||
|
{"shell": [{"command": "echo success", "stdout": True}]},
|
||||||
|
])
|
||||||
|
run_dotbot("--only", "shell")
|
||||||
|
|
||||||
|
assert not os.path.exists(os.path.join(home, "a"))
|
||||||
|
stdout = capfd.readouterr().out.splitlines()
|
||||||
|
assert any(line.startswith("success") for line in stdout)
|
||||||
|
|
||||||
|
|
||||||
|
def test_only_with_defaults(capfd, home, dotfiles, run_dotbot):
|
||||||
|
"""Verify that `--only` does not suppress defaults."""
|
||||||
|
|
||||||
|
dotfiles.write_config([
|
||||||
|
{"defaults": {"shell": {"stdout": True}}},
|
||||||
|
{"create": ["~/a"]},
|
||||||
|
{"shell": [{"command": "echo success"}]},
|
||||||
|
])
|
||||||
|
run_dotbot("--only", "shell")
|
||||||
|
|
||||||
|
assert not os.path.exists(os.path.join(home, "a"))
|
||||||
|
stdout = capfd.readouterr().out.splitlines()
|
||||||
|
assert any(line.startswith("success") for line in stdout)
|
||||||
|
|
||||||
|
|
||||||
|
def test_only_with_multiples(capfd, home, dotfiles, run_dotbot):
|
||||||
|
"""Verify that `--only` works as intended."""
|
||||||
|
|
||||||
|
dotfiles.write_config([
|
||||||
|
{"create": ["~/a"]},
|
||||||
|
{"shell": [{"command": "echo success", "stdout": True}]},
|
||||||
|
{"link": ["~/.f"]}
|
||||||
|
])
|
||||||
|
run_dotbot("--only", "create", "shell")
|
||||||
|
|
||||||
|
assert os.path.isdir(os.path.join(home, "a"))
|
||||||
|
stdout = capfd.readouterr().out.splitlines()
|
||||||
|
assert any(line.startswith("success") for line in stdout)
|
||||||
|
assert not os.path.exists(os.path.join(home, ".f"))
|
||||||
|
|
||||||
|
|
||||||
|
def test_plugin_loading_file(home, dotfiles, run_dotbot):
|
||||||
|
"""Verify that plugins can be loaded by file."""
|
||||||
|
|
||||||
|
plugin_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), "dotbot_plugin_file.py")
|
||||||
|
shutil.copy(plugin_file, os.path.join(dotfiles.directory, "file.py"))
|
||||||
|
dotfiles.write_config([{"plugin_file": "~"}])
|
||||||
|
run_dotbot("--plugin", os.path.join(dotfiles.directory, "file.py"))
|
||||||
|
|
||||||
|
with open(os.path.join(home, "flag"), "r") as file:
|
||||||
|
assert file.read() == "file plugin loading works"
|
||||||
|
|
||||||
|
|
||||||
|
def test_plugin_loading_directory(home, dotfiles, run_dotbot):
|
||||||
|
"""Verify that plugins can be loaded from a directory."""
|
||||||
|
|
||||||
|
dotfiles.makedirs("plugins")
|
||||||
|
plugin_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), "dotbot_plugin_directory.py")
|
||||||
|
shutil.copy(plugin_file, os.path.join(dotfiles.directory, "plugins", "directory.py"))
|
||||||
|
dotfiles.write_config([{"plugin_directory": "~"}])
|
||||||
|
run_dotbot("--plugin-dir", os.path.join(dotfiles.directory, "plugins"))
|
||||||
|
|
||||||
|
with open(os.path.join(home, "flag"), "r") as file:
|
||||||
|
assert file.read() == "directory plugin loading works"
|
||||||
|
|
||||||
|
|
||||||
|
def test_disable_builtin_plugins(home, dotfiles, run_dotbot):
|
||||||
|
"""Verify that builtin plugins can be disabled."""
|
||||||
|
|
||||||
|
dotfiles.write("f", "apple")
|
||||||
|
dotfiles.write_config([{"link": {"~/.f": "f"}}])
|
||||||
|
|
||||||
|
# The link directive will be unhandled so dotbot will raise SystemExit.
|
||||||
|
with pytest.raises(SystemExit):
|
||||||
|
run_dotbot("--disable-built-in-plugins")
|
||||||
|
|
||||||
|
assert not os.path.exists(os.path.join(home, ".f"))
|
Loading…
Reference in a new issue