Coverage for tests / unit / tools / rustfmt / test_options.py: 100%

30 statements  

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

1"""Unit tests for rustfmt plugin options and definition.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING 

6 

7import pytest 

8from assertpy import assert_that 

9 

10from lintro.enums.tool_type import ToolType 

11from lintro.tools.definitions.rustfmt import ( 

12 RUSTFMT_DEFAULT_PRIORITY, 

13 RUSTFMT_DEFAULT_TIMEOUT, 

14 RustfmtPlugin, 

15) 

16 

17if TYPE_CHECKING: 

18 pass 

19 

20 

21# ============================================================================= 

22# Tests for ToolDefinition attributes 

23# ============================================================================= 

24 

25 

26@pytest.mark.parametrize( 

27 ("attr", "expected"), 

28 [ 

29 ("name", "rustfmt"), 

30 ("description", "Rust's official code formatter"), 

31 ("can_fix", True), 

32 ("tool_type", ToolType.FORMATTER), 

33 ("priority", RUSTFMT_DEFAULT_PRIORITY), 

34 ("default_timeout", RUSTFMT_DEFAULT_TIMEOUT), 

35 ("min_version", "1.8.0"), 

36 ], 

37 ids=[ 

38 "name_equals_rustfmt", 

39 "description_is_set", 

40 "can_fix_is_true", 

41 "tool_type_is_formatter", 

42 "priority_equals_80", 

43 "default_timeout_equals_60", 

44 "min_version_is_1.8.0", 

45 ], 

46) 

47def test_definition_attributes( 

48 rustfmt_plugin: RustfmtPlugin, 

49 attr: str, 

50 expected: object, 

51) -> None: 

52 """Definition attributes have correct values. 

53 

54 Args: 

55 rustfmt_plugin: The RustfmtPlugin instance to test. 

56 attr: The attribute name to check. 

57 expected: The expected value for the attribute. 

58 """ 

59 assert_that(getattr(rustfmt_plugin.definition, attr)).is_equal_to(expected) 

60 

61 

62def test_definition_file_patterns(rustfmt_plugin: RustfmtPlugin) -> None: 

63 """Definition includes Rust file patterns. 

64 

65 Args: 

66 rustfmt_plugin: The RustfmtPlugin instance to test. 

67 """ 

68 patterns = rustfmt_plugin.definition.file_patterns 

69 assert_that(patterns).contains("*.rs") 

70 

71 

72def test_definition_native_configs(rustfmt_plugin: RustfmtPlugin) -> None: 

73 """Definition includes native config files. 

74 

75 Args: 

76 rustfmt_plugin: The RustfmtPlugin instance to test. 

77 """ 

78 configs = rustfmt_plugin.definition.native_configs 

79 assert_that(configs).contains("rustfmt.toml") 

80 assert_that(configs).contains(".rustfmt.toml") 

81 

82 

83def test_definition_version_command(rustfmt_plugin: RustfmtPlugin) -> None: 

84 """Definition has a version command. 

85 

86 Args: 

87 rustfmt_plugin: The RustfmtPlugin instance to test. 

88 """ 

89 assert_that(rustfmt_plugin.definition.version_command).is_not_none() 

90 assert_that(rustfmt_plugin.definition.version_command).contains("rustfmt") 

91 assert_that(rustfmt_plugin.definition.version_command).contains("--version") 

92 

93 

94# ============================================================================= 

95# Tests for default options 

96# ============================================================================= 

97 

98 

99def test_default_options_timeout(rustfmt_plugin: RustfmtPlugin) -> None: 

100 """Default timeout option has correct value. 

101 

102 Args: 

103 rustfmt_plugin: The RustfmtPlugin instance to test. 

104 """ 

105 assert_that( 

106 rustfmt_plugin.definition.default_options["timeout"], 

107 ).is_equal_to(RUSTFMT_DEFAULT_TIMEOUT) 

108 

109 

110# ============================================================================= 

111# Tests for RustfmtPlugin.set_options method - valid options 

112# ============================================================================= 

113 

114 

115@pytest.mark.parametrize( 

116 ("timeout_value",), 

117 [ 

118 (30,), 

119 (60,), 

120 (120,), 

121 (300,), 

122 ], 

123 ids=[ 

124 "timeout_30", 

125 "timeout_60", 

126 "timeout_120", 

127 "timeout_300", 

128 ], 

129) 

130def test_set_options_valid_timeout( 

131 rustfmt_plugin: RustfmtPlugin, 

132 timeout_value: int, 

133) -> None: 

134 """Set valid timeout options correctly. 

135 

136 Args: 

137 rustfmt_plugin: The RustfmtPlugin instance to test. 

138 timeout_value: The timeout value to set. 

139 """ 

140 rustfmt_plugin.set_options(timeout=timeout_value) 

141 assert_that(rustfmt_plugin.options.get("timeout")).is_equal_to(timeout_value) 

142 

143 

144# ============================================================================= 

145# Tests for RustfmtPlugin.set_options method - invalid options 

146# ============================================================================= 

147 

148 

149@pytest.mark.parametrize( 

150 ("timeout_value", "error_match"), 

151 [ 

152 (-1, "must be positive"), 

153 (0, "must be positive"), 

154 (-100, "must be positive"), 

155 ], 

156 ids=[ 

157 "negative_timeout", 

158 "zero_timeout", 

159 "large_negative_timeout", 

160 ], 

161) 

162def test_set_options_invalid_timeout( 

163 rustfmt_plugin: RustfmtPlugin, 

164 timeout_value: int, 

165 error_match: str, 

166) -> None: 

167 """Raise ValueError for invalid timeout values. 

168 

169 Args: 

170 rustfmt_plugin: The RustfmtPlugin instance to test. 

171 timeout_value: The invalid timeout value to test. 

172 error_match: Pattern expected in the error message. 

173 """ 

174 with pytest.raises(ValueError, match=error_match): 

175 rustfmt_plugin.set_options(timeout=timeout_value)