Coverage for tests / unit / utils / test_logger_setup.py: 100%

45 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2026-04-03 18:53 +0000

1"""Tests for lintro.utils.logger_setup module.""" 

2 

3from __future__ import annotations 

4 

5from pathlib import Path 

6from unittest.mock import MagicMock, patch 

7 

8from assertpy import assert_that 

9 

10from lintro.utils.logger_setup import setup_cli_logging, setup_execution_logging 

11 

12# ============================================================================= 

13# setup_cli_logging tests 

14# ============================================================================= 

15 

16 

17@patch("lintro.utils.logger_setup.logger") 

18def test_setup_cli_logging_removes_handlers(mock_logger: MagicMock) -> None: 

19 """setup_cli_logging removes existing handlers. 

20 

21 Args: 

22 mock_logger: Mock logger object. 

23 """ 

24 setup_cli_logging() 

25 

26 mock_logger.remove.assert_called_once() 

27 

28 

29@patch("lintro.utils.logger_setup.logger") 

30def test_setup_cli_logging_adds_stderr_handler(mock_logger: MagicMock) -> None: 

31 """setup_cli_logging adds stderr handler. 

32 

33 Args: 

34 mock_logger: Mock logger object. 

35 """ 

36 setup_cli_logging() 

37 

38 mock_logger.add.assert_called_once() 

39 call_args = mock_logger.add.call_args 

40 assert_that(call_args.kwargs["level"]).is_equal_to("WARNING") 

41 assert_that(call_args.kwargs["colorize"]).is_true() 

42 

43 

44# ============================================================================= 

45# setup_execution_logging tests 

46# ============================================================================= 

47 

48 

49@patch("lintro.utils.logger_setup.logger") 

50def test_setup_execution_logging_removes_handlers( 

51 mock_logger: MagicMock, 

52 tmp_path: Path, 

53) -> None: 

54 """setup_execution_logging removes existing handlers. 

55 

56 Args: 

57 mock_logger: Mock logger object. 

58 tmp_path: Temporary directory fixture. 

59 """ 

60 setup_execution_logging(run_dir=tmp_path) 

61 

62 mock_logger.remove.assert_called_once() 

63 

64 

65@patch("lintro.utils.logger_setup.logger") 

66def test_setup_execution_logging_adds_console_and_file_handlers( 

67 mock_logger: MagicMock, 

68 tmp_path: Path, 

69) -> None: 

70 """setup_execution_logging adds console and file handlers. 

71 

72 Args: 

73 mock_logger: Mock logger object. 

74 tmp_path: Temporary directory fixture. 

75 """ 

76 setup_execution_logging(run_dir=tmp_path) 

77 

78 # Should add two handlers: console + file 

79 assert_that(mock_logger.add.call_count).is_equal_to(2) 

80 

81 

82@patch("lintro.utils.logger_setup.logger") 

83def test_setup_execution_logging_debug_false_uses_warning( 

84 mock_logger: MagicMock, 

85 tmp_path: Path, 

86) -> None: 

87 """setup_execution_logging uses WARNING level when debug=False. 

88 

89 Args: 

90 mock_logger: Mock logger object. 

91 tmp_path: Temporary directory fixture. 

92 """ 

93 setup_execution_logging(run_dir=tmp_path, debug=False) 

94 

95 # First call is console handler 

96 first_call = mock_logger.add.call_args_list[0] 

97 assert_that(first_call.kwargs["level"]).is_equal_to("WARNING") 

98 

99 

100@patch("lintro.utils.logger_setup.logger") 

101def test_setup_execution_logging_debug_true_uses_debug( 

102 mock_logger: MagicMock, 

103 tmp_path: Path, 

104) -> None: 

105 """setup_execution_logging uses DEBUG level when debug=True. 

106 

107 Args: 

108 mock_logger: Mock logger object. 

109 tmp_path: Temporary directory fixture. 

110 """ 

111 setup_execution_logging(run_dir=tmp_path, debug=True) 

112 

113 # First call is console handler 

114 first_call = mock_logger.add.call_args_list[0] 

115 assert_that(first_call.kwargs["level"]).is_equal_to("DEBUG") 

116 

117 

118@patch("lintro.utils.logger_setup.logger") 

119def test_setup_execution_logging_file_handler_uses_debug( 

120 mock_logger: MagicMock, 

121 tmp_path: Path, 

122) -> None: 

123 """setup_execution_logging file handler always uses DEBUG level. 

124 

125 Args: 

126 mock_logger: Mock logger object. 

127 tmp_path: Temporary directory fixture. 

128 """ 

129 setup_execution_logging(run_dir=tmp_path, debug=False) 

130 

131 # Second call is file handler 

132 second_call = mock_logger.add.call_args_list[1] 

133 assert_that(second_call.kwargs["level"]).is_equal_to("DEBUG") 

134 

135 

136@patch("lintro.utils.logger_setup.logger") 

137def test_setup_execution_logging_creates_run_dir( 

138 mock_logger: MagicMock, 

139 tmp_path: Path, 

140) -> None: 

141 """setup_execution_logging creates run directory if needed. 

142 

143 Args: 

144 mock_logger: Mock logger object. 

145 tmp_path: Temporary directory fixture. 

146 """ 

147 run_dir = tmp_path / "logs" / "run1" 

148 assert_that(run_dir.exists()).is_false() 

149 

150 setup_execution_logging(run_dir=run_dir) 

151 

152 assert_that(run_dir.exists()).is_true()