- Create ui.py with say() helper that routes messages to both click.echo()
(console/stdout, user-facing) and logging.getLogger('grm') (file audit trail)
- Update executor.py: replace logger.info() with say() for start, status, done
messages; use say(level=ERROR, err=True) before raising AnsibleError
- Update report.py: replace logger.info() with say() for operation report lines
- Update all unit tests to patch say() instead of using capsys or get_logger
- Add test_ui.py with coverage for say() calling both click.echo and logging
- 117 tests, 100% coverage, pyright clean, ruff clean
38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
"""Unit tests for user-facing output utilities."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from unittest.mock import patch
|
|
|
|
from gitea_runner_manager.ui import say
|
|
|
|
|
|
class TestSay:
|
|
def test_echoes_to_console(self) -> None:
|
|
with patch("gitea_runner_manager.ui.click.echo") as mock_echo:
|
|
say("hello")
|
|
|
|
mock_echo.assert_called_once_with("hello", err=False)
|
|
|
|
def test_logs_at_info_level(self) -> None:
|
|
with (
|
|
patch("gitea_runner_manager.ui.click.echo"),
|
|
patch("gitea_runner_manager.ui.logging.getLogger") as mock_get_logger,
|
|
):
|
|
mock_logger = mock_get_logger.return_value
|
|
say("hello")
|
|
|
|
mock_logger.log.assert_called_once_with(logging.INFO, "hello")
|
|
|
|
def test_passes_level_and_err(self) -> None:
|
|
with (
|
|
patch("gitea_runner_manager.ui.click.echo") as mock_echo,
|
|
patch("gitea_runner_manager.ui.logging.getLogger") as mock_get_logger,
|
|
):
|
|
mock_logger = mock_get_logger.return_value
|
|
say("error msg", level=logging.ERROR, err=True)
|
|
|
|
mock_echo.assert_called_once_with("error msg", err=True)
|
|
mock_logger.log.assert_called_once_with(logging.ERROR, "error msg")
|