test: cover cli parser and main flow

This commit is contained in:
2025-12-23 04:48:07 +01:00
parent 4e04a9d7b7
commit 769a1af58c

96
tests/test_cli.py Normal file
View File

@@ -0,0 +1,96 @@
import logging
import sys
import pytest
import skywipe.cli as cli
def test_create_parser_includes_commands(monkeypatch):
monkeypatch.setattr(cli.registry, "get_all_commands",
lambda: {"posts": "only posts"})
parser = cli.create_parser()
args = parser.parse_args(["posts"])
assert args.command == "posts"
def test_require_config_exits_when_missing(monkeypatch):
monkeypatch.setattr(cli.Configuration, "exists", lambda self: False)
logger = logging.getLogger("test.cli")
with pytest.raises(SystemExit) as excinfo:
cli.require_config(logger)
assert excinfo.value.code == 1
def test_main_executes_without_config(monkeypatch):
calls = {"execute": None, "setup": []}
monkeypatch.setattr(cli.registry, "get_all_commands",
lambda: {"posts": "only posts"})
monkeypatch.setattr(cli.registry, "requires_config", lambda name: False)
monkeypatch.setattr(cli.registry, "execute", lambda name, skip_confirmation=False: calls.update(
{"execute": (name, skip_confirmation)}
))
monkeypatch.setattr(cli, "setup_logger", lambda verbose,
log_file: calls["setup"].append((verbose, log_file)))
monkeypatch.setattr(cli, "get_logger",
lambda: logging.getLogger("test.cli"))
monkeypatch.setattr(sys, "argv", ["skywipe", "--yes", "posts"])
cli.main()
assert calls["setup"] == [(False, cli.LOG_FILE)]
assert calls["execute"] == ("posts", True)
def test_main_loads_config_and_sets_verbose(monkeypatch):
calls = {"setup": [], "execute": None, "require_config": 0}
monkeypatch.setattr(cli.registry, "get_all_commands",
lambda: {"posts": "only posts"})
monkeypatch.setattr(cli.registry, "requires_config", lambda name: True)
monkeypatch.setattr(cli.registry, "execute", lambda name, skip_confirmation=False: calls.update(
{"execute": (name, skip_confirmation)}
))
monkeypatch.setattr(cli, "require_config", lambda logger: calls.update(
{"require_config": calls["require_config"] + 1}
))
monkeypatch.setattr(cli.Configuration, "load",
lambda self: {"verbose": True})
monkeypatch.setattr(cli, "setup_logger", lambda verbose,
log_file: calls["setup"].append((verbose, log_file)))
monkeypatch.setattr(cli, "get_logger",
lambda: logging.getLogger("test.cli"))
monkeypatch.setattr(sys, "argv", ["skywipe", "posts"])
cli.main()
assert calls["require_config"] == 1
assert calls["setup"] == [(False, cli.LOG_FILE), (True, cli.LOG_FILE)]
assert calls["execute"] == ("posts", False)
def test_main_handles_execute_error(monkeypatch):
calls = {"handle_error": None}
monkeypatch.setattr(cli.registry, "get_all_commands",
lambda: {"posts": "only posts"})
monkeypatch.setattr(cli.registry, "requires_config", lambda name: False)
def raise_error(*_args, **_kwargs):
raise ValueError("boom")
monkeypatch.setattr(cli.registry, "execute", raise_error)
monkeypatch.setattr(cli, "setup_logger", lambda verbose, log_file: None)
monkeypatch.setattr(cli, "get_logger",
lambda: logging.getLogger("test.cli"))
def fake_handle_error(error, logger, exit_on_error=False):
calls["handle_error"] = (str(error), exit_on_error)
monkeypatch.setattr(cli, "handle_error", fake_handle_error)
monkeypatch.setattr(sys, "argv", ["skywipe", "posts"])
cli.main()
assert calls["handle_error"] == ("boom", True)