test(cli): ✅ add tests for prune command
add tests for prune command and some code optimization and formatting.
This commit is contained in:
+79
-6
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user