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  }