github.com/chenfeining/golangci-lint@v1.0.2-0.20230730162517-14c6c67868df/pkg/result/processors/severity_rules_test.go (about) 1 package processors 2 3 import ( 4 "path" 5 "path/filepath" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 10 "github.com/chenfeining/golangci-lint/pkg/fsutils" 11 "github.com/chenfeining/golangci-lint/pkg/logutils" 12 "github.com/chenfeining/golangci-lint/pkg/report" 13 "github.com/chenfeining/golangci-lint/pkg/result" 14 ) 15 16 func TestSeverityRulesMultiple(t *testing.T) { 17 lineCache := fsutils.NewLineCache(fsutils.NewFileCache()) 18 files := fsutils.NewFiles(lineCache, "") 19 log := report.NewLogWrapper(logutils.NewStderrLog(logutils.DebugKeyEmpty), &report.Data{}) 20 p := NewSeverityRules("error", []SeverityRule{ 21 { 22 Severity: "info", 23 BaseRule: BaseRule{ 24 Text: "^ssl$", 25 Linters: []string{"gosec"}, 26 }, 27 }, 28 { 29 Severity: "info", 30 BaseRule: BaseRule{ 31 Linters: []string{"linter"}, 32 Path: "e.go", 33 }, 34 }, 35 { 36 Severity: "info", 37 BaseRule: BaseRule{ 38 Text: "^testonly$", 39 Path: `_test\.go`, 40 }, 41 }, 42 { 43 Severity: "info", 44 BaseRule: BaseRule{ 45 Text: "^nontestonly$", 46 PathExcept: `_test\.go`, 47 }, 48 }, 49 { 50 BaseRule: BaseRule{ 51 Source: "^//go:generate ", 52 Linters: []string{"lll"}, 53 }, 54 }, 55 { 56 Severity: "info", 57 BaseRule: BaseRule{ 58 Source: "^//go:dosomething", 59 }, 60 }, 61 { 62 Severity: "info", 63 BaseRule: BaseRule{ 64 Linters: []string{"someotherlinter"}, 65 }, 66 }, 67 { 68 Severity: "info", 69 BaseRule: BaseRule{ 70 Linters: []string{"somelinter"}, 71 }, 72 }, 73 { 74 Severity: "info", 75 }, 76 }, files, log) 77 78 cases := []issueTestCase{ 79 {Path: "ssl.go", Text: "ssl", Linter: "gosec"}, 80 {Path: "e.go", Text: "some", Linter: "linter"}, 81 {Path: "e_test.go", Text: "testonly", Linter: "testlinter"}, 82 {Path: "e.go", Text: "nontestonly", Linter: "testlinter"}, 83 {Path: "e_test.go", Text: "nontestonly", Linter: "testlinter"}, 84 {Path: filepath.Join("testdata", "exclude_rules.go"), Line: 3, Linter: "lll"}, 85 {Path: filepath.Join("testdata", "severity_rules.go"), Line: 3, Linter: "invalidgo"}, 86 {Path: "someotherlinter.go", Text: "someotherlinter", Linter: "someotherlinter"}, 87 {Path: "somenotmatchlinter.go", Text: "somenotmatchlinter", Linter: "somenotmatchlinter"}, 88 {Path: "empty.go", Text: "empty", Linter: "empty"}, 89 } 90 var issues []result.Issue 91 for _, c := range cases { 92 issues = append(issues, newIssueFromIssueTestCase(c)) 93 } 94 processedIssues := process(t, p, issues...) 95 var resultingCases []issueTestCase 96 for _, i := range processedIssues { 97 resultingCases = append(resultingCases, issueTestCase{ 98 Path: i.FilePath(), 99 Linter: i.FromLinter, 100 Text: i.Text, 101 Line: i.Line(), 102 Severity: i.Severity, 103 }) 104 } 105 expectedCases := []issueTestCase{ 106 {Path: "ssl.go", Text: "ssl", Linter: "gosec", Severity: "info"}, 107 {Path: "e.go", Text: "some", Linter: "linter", Severity: "info"}, 108 {Path: "e_test.go", Text: "testonly", Linter: "testlinter", Severity: "info"}, 109 {Path: "e.go", Text: "nontestonly", Linter: "testlinter", Severity: "info"}, // matched 110 {Path: "e_test.go", Text: "nontestonly", Linter: "testlinter", Severity: "error"}, // not matched 111 {Path: filepath.Join("testdata", "exclude_rules.go"), Line: 3, Linter: "lll", Severity: "error"}, 112 {Path: filepath.Join("testdata", "severity_rules.go"), Line: 3, Linter: "invalidgo", Severity: "info"}, 113 {Path: "someotherlinter.go", Text: "someotherlinter", Linter: "someotherlinter", Severity: "info"}, 114 {Path: "somenotmatchlinter.go", Text: "somenotmatchlinter", Linter: "somenotmatchlinter", Severity: "error"}, 115 {Path: "empty.go", Text: "empty", Linter: "empty", Severity: "error"}, 116 } 117 assert.Equal(t, expectedCases, resultingCases) 118 } 119 120 func TestSeverityRulesPathPrefix(t *testing.T) { 121 lineCache := fsutils.NewLineCache(fsutils.NewFileCache()) 122 pathPrefix := path.Join("some", "dir") 123 files := fsutils.NewFiles(lineCache, pathPrefix) 124 log := report.NewLogWrapper(logutils.NewStderrLog(logutils.DebugKeyEmpty), &report.Data{}) 125 p := NewSeverityRules("error", []SeverityRule{ 126 { 127 Severity: "info", 128 BaseRule: BaseRule{ 129 Text: "some", 130 Path: `some/dir/e\.go`, 131 }, 132 }, 133 }, files, log) 134 135 cases := []issueTestCase{ 136 {Path: "e.go", Text: "some", Linter: "linter"}, 137 {Path: "other.go", Text: "some", Linter: "linter"}, 138 } 139 var issues []result.Issue 140 for _, c := range cases { 141 issues = append(issues, newIssueFromIssueTestCase(c)) 142 } 143 processedIssues := process(t, p, issues...) 144 var resultingCases []issueTestCase 145 for _, i := range processedIssues { 146 resultingCases = append(resultingCases, issueTestCase{ 147 Path: i.FilePath(), 148 Linter: i.FromLinter, 149 Text: i.Text, 150 Line: i.Line(), 151 Severity: i.Severity, 152 }) 153 } 154 expectedCases := []issueTestCase{ 155 {Path: "e.go", Text: "some", Linter: "linter", Severity: "info"}, 156 {Path: "other.go", Text: "some", Linter: "linter", Severity: "error"}, 157 } 158 assert.Equal(t, expectedCases, resultingCases) 159 } 160 161 func TestSeverityRulesText(t *testing.T) { 162 p := NewSeverityRules("", []SeverityRule{ 163 { 164 BaseRule: BaseRule{ 165 Text: "^severity$", 166 Linters: []string{"linter"}, 167 }, 168 }, 169 }, nil, nil) 170 texts := []string{"seveRity", "1", "", "serverit", "notseverity"} 171 var issues []result.Issue 172 for _, t := range texts { 173 issues = append(issues, result.Issue{ 174 Text: t, 175 FromLinter: "linter", 176 }) 177 } 178 179 processedIssues := process(t, p, issues...) 180 assert.Len(t, processedIssues, len(issues)) 181 182 var processedTexts []string 183 for _, i := range processedIssues { 184 processedTexts = append(processedTexts, i.Text) 185 } 186 assert.Equal(t, texts, processedTexts) 187 } 188 189 func TestSeverityRulesOnlyDefault(t *testing.T) { 190 lineCache := fsutils.NewLineCache(fsutils.NewFileCache()) 191 files := fsutils.NewFiles(lineCache, "") 192 log := report.NewLogWrapper(logutils.NewStderrLog(logutils.DebugKeyEmpty), &report.Data{}) 193 p := NewSeverityRules("info", []SeverityRule{}, files, log) 194 195 cases := []issueTestCase{ 196 {Path: "ssl.go", Text: "ssl", Linter: "gosec"}, 197 {Path: "empty.go", Text: "empty", Linter: "empty"}, 198 } 199 var issues []result.Issue 200 for _, c := range cases { 201 issues = append(issues, newIssueFromIssueTestCase(c)) 202 } 203 processedIssues := process(t, p, issues...) 204 var resultingCases []issueTestCase 205 for _, i := range processedIssues { 206 resultingCases = append(resultingCases, issueTestCase{ 207 Path: i.FilePath(), 208 Linter: i.FromLinter, 209 Text: i.Text, 210 Line: i.Line(), 211 Severity: i.Severity, 212 }) 213 } 214 expectedCases := []issueTestCase{ 215 {Path: "ssl.go", Text: "ssl", Linter: "gosec", Severity: "info"}, 216 {Path: "empty.go", Text: "empty", Linter: "empty", Severity: "info"}, 217 } 218 assert.Equal(t, expectedCases, resultingCases) 219 } 220 221 func TestSeverityRulesEmpty(t *testing.T) { 222 processAssertSame(t, NewSeverityRules("", nil, nil, nil), newIssueFromTextTestCase("test")) 223 } 224 225 func TestSeverityRulesCaseSensitive(t *testing.T) { 226 lineCache := fsutils.NewLineCache(fsutils.NewFileCache()) 227 files := fsutils.NewFiles(lineCache, "") 228 p := NewSeverityRulesCaseSensitive("error", []SeverityRule{ 229 { 230 Severity: "info", 231 BaseRule: BaseRule{ 232 Text: "^ssl$", 233 Linters: []string{"gosec", "someotherlinter"}, 234 }, 235 }, 236 }, files, nil) 237 238 cases := []issueTestCase{ 239 {Path: "e.go", Text: "ssL", Linter: "gosec"}, 240 } 241 var issues []result.Issue 242 for _, c := range cases { 243 issues = append(issues, newIssueFromIssueTestCase(c)) 244 } 245 processedIssues := process(t, p, issues...) 246 var resultingCases []issueTestCase 247 for _, i := range processedIssues { 248 resultingCases = append(resultingCases, issueTestCase{ 249 Path: i.FilePath(), 250 Linter: i.FromLinter, 251 Text: i.Text, 252 Line: i.Line(), 253 Severity: i.Severity, 254 }) 255 } 256 expectedCases := []issueTestCase{ 257 {Path: "e.go", Text: "ssL", Linter: "gosec", Severity: "error"}, 258 } 259 assert.Equal(t, expectedCases, resultingCases) 260 }