diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..fd41bc1 --- /dev/null +++ b/tests/test_cli.py @@ -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)