test(cli): ✅ add tests for prune command

add tests for prune command and some code optimization and formatting.
This commit is contained in:
2026-09-25 17:59:27 +02:00
parent 48503cdd42
commit e50797bba6
4 changed files with 91 additions and 22 deletions
+79 -6
View File
@@ -9,6 +9,8 @@ from unittest.mock import MagicMock
from logwatcher import __version__
from logwatcher.cli import _get_files_from_dir, app
from logwatcher.config import RESULT_PATH
from logwatcher.utils import is_log_file
runner = CliRunner()
@@ -35,9 +37,7 @@ def get_argument_from_files(log_dir: Path, output_path: Path) -> list[str]:
List of arguments in string format
"""
files = [
str(file) for file in log_dir.iterdir() if file.suffix in ("", ".txt", ".log")
]
files = [str(file) for file in log_dir.iterdir() if is_log_file(file)]
arguments = ["from-files", "--output-dir", str(output_path)]
for file in files:
@@ -384,24 +384,28 @@ def test_cli_from_files_valid_logs(output_path: Path, valid_log_dir: Path):
def test_cli_from_mails_no_output_dir(monkeypatch, make_mock_account):
"""Assert everything works when no output_path is provided.
Must use "output/" directory, located in project root.
Must use `RESULT_PATH` as the default output directory.
"""
messages = [
Message(subject="subject test 1", text_body="body test 1"),
Message(subject="subject test 2", text_body="body test 2"),
Message(subject="subject test 3", text_body="body test 3"),
]
write_log_report_mock = MagicMock()
with monkeypatch.context() as m:
m.setattr(
"logwatcher.cli.connect_to_mailbox",
lambda: make_mock_account(messages=messages, analyzed_folder="Analyzed"),
)
m.setattr("logwatcher.notifier.Message.send", MagicMock(return_value=None))
m.setattr("logwatcher.cli.write_log_report", write_log_report_mock)
m.setattr("logwatcher.cli.send_n2_report", MagicMock())
arguments = ["from-mails"]
results = runner.invoke(app, arguments)
assert results.exit_code == 0
assert results.exit_code == 0
assert write_log_report_mock.call_args.kwargs["output_dir"] == RESULT_PATH
def test_cli_from_mails_invalid_output_dir(tmp_path, monkeypatch):
@@ -465,3 +469,72 @@ def test_cli_from_mails_valid_output_dir(tmp_path, monkeypatch, make_mock_accoun
assert len(output_children) == len(expected)
for name in expected:
assert name in file_names
def test_prune_help_lists_targets():
"""Assert the prune command lists both of its targets."""
results = runner.invoke(app, ["prune", "--help"])
assert results.exit_code == 0
assert "--mails" in results.output
assert "--logs" in results.output
def test_prune_without_target_raises():
"""Assert that prune without any target is rejected."""
results = runner.invoke(app, ["prune"])
assert results.exit_code == 2
assert "At least one of --mails or --logs must be provided." in results.output
def test_prune_logs_only(monkeypatch):
"""Assert `--logs` prunes logs only, without connecting to the mailbox."""
connect_mock = MagicMock()
prune_mails_mock = MagicMock()
get_logs_mock = MagicMock(return_value=[MagicMock()])
archive_logs_mock = MagicMock()
prune_logs_mock = MagicMock()
with monkeypatch.context() as m:
m.setattr("logwatcher.cli.connect_to_mailbox", connect_mock)
m.setattr("logwatcher.cli.prune_mails", prune_mails_mock)
m.setattr("logwatcher.cli.get_logs_to_archive", get_logs_mock)
m.setattr("logwatcher.cli.archive_logs", archive_logs_mock)
m.setattr("logwatcher.cli.prune_logs", prune_logs_mock)
results = runner.invoke(app, ["prune", "--logs"])
assert results.exit_code == 0
get_logs_mock.assert_called_once()
archive_logs_mock.assert_called_once()
prune_logs_mock.assert_called_once()
connect_mock.assert_not_called()
prune_mails_mock.assert_not_called()
def test_prune_mails_only(monkeypatch):
"""Assert `--mails` prunes mails only, without touching log archives."""
fake_account = MagicMock()
connect_mock = MagicMock(return_value=fake_account)
prune_mails_mock = MagicMock()
get_logs_mock = MagicMock()
archive_logs_mock = MagicMock()
prune_logs_mock = MagicMock()
with monkeypatch.context() as m:
m.setattr("logwatcher.cli.connect_to_mailbox", connect_mock)
m.setattr("logwatcher.cli.prune_mails", prune_mails_mock)
m.setattr("logwatcher.cli.get_logs_to_archive", get_logs_mock)
m.setattr("logwatcher.cli.archive_logs", archive_logs_mock)
m.setattr("logwatcher.cli.prune_logs", prune_logs_mock)
results = runner.invoke(app, ["prune", "--mails"])
assert results.exit_code == 0
connect_mock.assert_called_once()
prune_mails_mock.assert_called_once()
assert prune_mails_mock.call_args.args[1] is fake_account
get_logs_mock.assert_not_called()
archive_logs_mock.assert_not_called()
prune_logs_mock.assert_not_called()