Coverage for tests / unit / pytest / test_pytest_cli_commands.py: 100%

109 statements  

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

1"""Unit tests for pytest CLI command options.""" 

2 

3from __future__ import annotations 

4 

5from unittest.mock import patch 

6 

7from assertpy import assert_that 

8from click.testing import CliRunner 

9 

10from lintro.cli_utils.commands.test import test_command 

11 

12 

13def test_test_command_collect_only() -> None: 

14 """Test test command with --collect-only flag.""" 

15 runner = CliRunner() 

16 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

17 mock_run.return_value = 0 

18 runner.invoke(test_command, ["--collect-only"]) 

19 call_args = mock_run.call_args 

20 assert_that(call_args.kwargs["tool_options"]).contains( 

21 "pytest:collect_only=True", 

22 ) 

23 

24 

25def test_test_command_fixtures() -> None: 

26 """Test test command with --fixtures flag.""" 

27 runner = CliRunner() 

28 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

29 mock_run.return_value = 0 

30 runner.invoke(test_command, ["--fixtures"]) 

31 call_args = mock_run.call_args 

32 assert_that(call_args.kwargs["tool_options"]).contains( 

33 "pytest:list_fixtures=True", 

34 ) 

35 

36 

37def test_test_command_fixture_info() -> None: 

38 """Test test command with --fixture-info flag.""" 

39 runner = CliRunner() 

40 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

41 mock_run.return_value = 0 

42 runner.invoke(test_command, ["--fixture-info", "sample_data"]) 

43 call_args = mock_run.call_args 

44 assert_that(call_args.kwargs["tool_options"]).contains( 

45 "pytest:fixture_info=sample_data", 

46 ) 

47 

48 

49def test_test_command_markers() -> None: 

50 """Test test command with --markers flag.""" 

51 runner = CliRunner() 

52 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

53 mock_run.return_value = 0 

54 runner.invoke(test_command, ["--markers"]) 

55 call_args = mock_run.call_args 

56 assert_that(call_args.kwargs["tool_options"]).contains( 

57 "pytest:list_markers=True", 

58 ) 

59 

60 

61def test_test_command_parametrize_help() -> None: 

62 """Test test command with --parametrize-help flag.""" 

63 runner = CliRunner() 

64 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

65 mock_run.return_value = 0 

66 runner.invoke(test_command, ["--parametrize-help"]) 

67 call_args = mock_run.call_args 

68 assert_that(call_args.kwargs["tool_options"]).contains( 

69 "pytest:parametrize_help=True", 

70 ) 

71 

72 

73def test_test_command_coverage_options() -> None: 

74 """Test test command with coverage report options.""" 

75 runner = CliRunner() 

76 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

77 mock_run.return_value = 0 

78 runner.invoke( 

79 test_command, 

80 [ 

81 "--tool-options", 

82 "pytest:coverage_html=htmlcov,pytest:coverage_xml=coverage.xml", 

83 ], 

84 ) 

85 call_args = mock_run.call_args 

86 assert_that(call_args.kwargs["tool_options"]).contains( 

87 "pytest:coverage_html=htmlcov", 

88 ) 

89 assert_that(call_args.kwargs["tool_options"]).contains( 

90 "pytest:coverage_xml=coverage.xml", 

91 ) 

92 

93 

94def test_test_command_multiple_new_flags() -> None: 

95 """Test test command with multiple new flags.""" 

96 runner = CliRunner() 

97 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

98 mock_run.return_value = 0 

99 runner.invoke( 

100 test_command, 

101 [ 

102 "--list-plugins", 

103 "--markers", 

104 "--collect-only", 

105 ], 

106 ) 

107 call_args = mock_run.call_args 

108 tool_options = call_args.kwargs["tool_options"] 

109 assert_that(tool_options).contains("pytest:list_plugins=True") 

110 assert_that(tool_options).contains("pytest:list_markers=True") 

111 assert_that(tool_options).contains("pytest:collect_only=True") 

112 

113 

114def test_test_command_tool_options_without_prefix() -> None: 

115 """Test test command with tool options without pytest: prefix.""" 

116 runner = CliRunner() 

117 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

118 mock_run.return_value = 0 

119 runner.invoke( 

120 test_command, 

121 ["--tool-options", "verbose=true,tb=long"], 

122 ) 

123 call_args = mock_run.call_args 

124 tool_opts = call_args.kwargs["tool_options"] 

125 assert_that(tool_opts).contains("pytest:verbose=true") 

126 assert_that(tool_opts).contains("pytest:tb=long") 

127 

128 

129def test_test_command_tool_options_with_prefix() -> None: 

130 """Test test command with tool options already prefixed.""" 

131 runner = CliRunner() 

132 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

133 mock_run.return_value = 0 

134 runner.invoke( 

135 test_command, 

136 ["--tool-options", "pytest:verbose=true"], 

137 ) 

138 call_args = mock_run.call_args 

139 tool_opts = call_args.kwargs["tool_options"] 

140 assert_that(tool_opts).is_equal_to("pytest:verbose=true") 

141 

142 

143def test_test_command_tool_options_mixed() -> None: 

144 """Test test command with mixed prefixed and unprefixed tool options.""" 

145 runner = CliRunner() 

146 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

147 mock_run.return_value = 0 

148 runner.invoke( 

149 test_command, 

150 ["--tool-options", "verbose=true,pytest:tb=long"], 

151 ) 

152 call_args = mock_run.call_args 

153 tool_opts = call_args.kwargs["tool_options"] 

154 assert_that(tool_opts).contains("pytest:verbose=true") 

155 assert_that(tool_opts).contains("pytest:tb=long") 

156 

157 

158def test_test_command_exit_code_success() -> None: 

159 """Test test command propagates success exit code.""" 

160 runner = CliRunner() 

161 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

162 mock_run.return_value = 0 

163 result = runner.invoke(test_command, []) 

164 assert_that(result.exit_code).is_equal_to(0) 

165 

166 

167def test_test_command_exit_code_failure() -> None: 

168 """Test test command propagates failure exit code.""" 

169 runner = CliRunner() 

170 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

171 mock_run.return_value = 1 

172 result = runner.invoke(test_command, []) 

173 assert_that(result.exit_code).is_equal_to(1) 

174 

175 

176def test_test_command_combined_options() -> None: 

177 """Test test command with multiple options combined.""" 

178 runner = CliRunner() 

179 with patch("lintro.cli_utils.commands.test.run_lint_tools_simple") as mock_run: 

180 mock_run.return_value = 0 

181 runner.invoke( 

182 test_command, 

183 [ 

184 ".", 

185 "--exclude", 

186 "*.venv", 

187 "--include-venv", 

188 "--output-format", 

189 "markdown", 

190 "--group-by", 

191 "file", 

192 "--verbose", 

193 "--raw-output", 

194 "--tool-options", 

195 "maxfail=5", 

196 ], 

197 ) 

198 call_args = mock_run.call_args 

199 assert_that(call_args.kwargs["exclude"]).is_equal_to("*.venv") 

200 assert_that(call_args.kwargs["include_venv"]).is_true() 

201 assert_that(call_args.kwargs["output_format"]).is_equal_to("markdown") 

202 assert_that(call_args.kwargs["group_by"]).is_equal_to("file") 

203 assert_that(call_args.kwargs["verbose"]).is_true() 

204 assert_that(call_args.kwargs["raw_output"]).is_true() 

205 assert_that(call_args.kwargs["tool_options"]).contains("pytest:maxfail=5")