Coverage for tests / unit / utils / console / test_logger_results.py: 100%

26 statements  

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

1"""Unit tests for ThreadSafeConsoleLogger tool result output methods. 

2 

3Tests cover the print_tool_result method and its handling of various 

4actions and output content. 

5""" 

6 

7from __future__ import annotations 

8 

9from unittest.mock import patch 

10 

11from assertpy import assert_that 

12 

13from lintro.enums.action import Action 

14from lintro.utils.console.logger import ThreadSafeConsoleLogger 

15 

16 

17def test_print_tool_result_outputs_content(logger: ThreadSafeConsoleLogger) -> None: 

18 """Verify print_tool_result displays tool output when provided. 

19 

20 Non-empty output should be displayed to the console, followed by 

21 a blank line for visual separation. 

22 

23 Args: 

24 logger: ThreadSafeConsoleLogger instance fixture. 

25 """ 

26 with patch.object(logger, "console_output") as mock_output: 

27 logger.print_tool_result("ruff", "Some output", 5) 

28 assert_that(mock_output.call_count).is_greater_than(0) 

29 

30 

31def test_print_tool_result_skips_empty_output(logger: ThreadSafeConsoleLogger) -> None: 

32 """Verify print_tool_result does nothing when output is empty. 

33 

34 Empty output indicates no issues or nothing to display, so the 

35 method should produce no console output. 

36 

37 Args: 

38 logger: ThreadSafeConsoleLogger instance fixture. 

39 """ 

40 with patch.object(logger, "console_output") as mock_output: 

41 logger.print_tool_result("ruff", "", 0) 

42 mock_output.assert_not_called() 

43 

44 

45def test_print_tool_result_includes_metadata_for_check_action( 

46 logger: ThreadSafeConsoleLogger, 

47) -> None: 

48 """Verify print_tool_result parses metadata for CHECK action. 

49 

50 When action is CHECK, raw output should be parsed for additional 

51 metadata messages like fixable issue counts. 

52 

53 Args: 

54 logger: ThreadSafeConsoleLogger instance fixture. 

55 """ 

56 with ( 

57 patch.object(logger, "console_output"), 

58 patch.object(logger, "_print_metadata_messages") as mock_meta, 

59 ): 

60 logger.print_tool_result( 

61 "ruff", 

62 "output", 

63 5, 

64 raw_output_for_meta="3 fixable issues", 

65 action=Action.CHECK, 

66 ) 

67 mock_meta.assert_called_once_with("3 fixable issues") 

68 

69 

70def test_print_tool_result_skips_metadata_for_fix_action( 

71 logger: ThreadSafeConsoleLogger, 

72) -> None: 

73 """Verify print_tool_result skips metadata parsing for FIX action. 

74 

75 FIX action already resolves issues, so metadata about fixable issues 

76 is not relevant and should not be displayed. 

77 

78 Args: 

79 logger: ThreadSafeConsoleLogger instance fixture. 

80 """ 

81 with ( 

82 patch.object(logger, "console_output"), 

83 patch.object(logger, "_print_metadata_messages") as mock_meta, 

84 ): 

85 logger.print_tool_result( 

86 "ruff", 

87 "output", 

88 5, 

89 raw_output_for_meta="3 fixable issues", 

90 action=Action.FIX, 

91 ) 

92 mock_meta.assert_not_called() 

93 

94 

95def test_print_tool_result_handles_pytest_for_test_action( 

96 logger: ThreadSafeConsoleLogger, 

97) -> None: 

98 """Verify print_tool_result displays pytest results for TEST action. 

99 

100 When the tool is pytest and action is TEST, special pytest result 

101 formatting should be applied to show pass/fail status clearly. 

102 

103 Args: 

104 logger: ThreadSafeConsoleLogger instance fixture. 

105 """ 

106 with ( 

107 patch.object(logger, "console_output"), 

108 patch.object(logger, "_print_pytest_results") as mock_pytest, 

109 ): 

110 logger.print_tool_result( 

111 "pytest", 

112 "test output", 

113 0, 

114 action=Action.TEST, 

115 success=True, 

116 ) 

117 expected_success = True 

118 mock_pytest.assert_called_once_with("test output", expected_success)