497 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			497 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package processors
 | |
| 
 | |
| import (
 | |
| 	"path"
 | |
| 	"path/filepath"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 
 | |
| 	"github.com/golangci/golangci-lint/pkg/fsutils"
 | |
| 	"github.com/golangci/golangci-lint/pkg/logutils"
 | |
| 	"github.com/golangci/golangci-lint/pkg/result"
 | |
| )
 | |
| 
 | |
| func TestSeverity_multiple(t *testing.T) {
 | |
| 	lineCache := fsutils.NewLineCache(fsutils.NewFileCache())
 | |
| 	files := fsutils.NewFiles(lineCache, "")
 | |
| 	log := logutils.NewStderrLog(logutils.DebugKeyEmpty)
 | |
| 
 | |
| 	opts := SeverityOptions{
 | |
| 		Default: "error",
 | |
| 		Rules: []SeverityRule{
 | |
| 			{
 | |
| 				Severity: "info",
 | |
| 				BaseRule: BaseRule{
 | |
| 					Text:    "^ssl$",
 | |
| 					Linters: []string{"gosec"},
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				Severity: "info",
 | |
| 				BaseRule: BaseRule{
 | |
| 					Linters: []string{"linter"},
 | |
| 					Path:    "e.go",
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				Severity: "info",
 | |
| 				BaseRule: BaseRule{
 | |
| 					Text: "^testonly$",
 | |
| 					Path: `_test\.go`,
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				Severity: "info",
 | |
| 				BaseRule: BaseRule{
 | |
| 					Text:       "^nontestonly$",
 | |
| 					PathExcept: `_test\.go`,
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				BaseRule: BaseRule{
 | |
| 					Source:  "^//go:generate ",
 | |
| 					Linters: []string{"lll"},
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				Severity: "info",
 | |
| 				BaseRule: BaseRule{
 | |
| 					Source: "^//go:dosomething",
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				Severity: "info",
 | |
| 				BaseRule: BaseRule{
 | |
| 					Linters: []string{"someotherlinter"},
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				Severity: "info",
 | |
| 				BaseRule: BaseRule{
 | |
| 					Linters: []string{"somelinter"},
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				Severity: "info",
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	p := NewSeverity(log, files, opts)
 | |
| 
 | |
| 	cases := []issueTestCase{
 | |
| 		{Path: "ssl.go", Text: "ssl", Linter: "gosec"},
 | |
| 		{Path: "e.go", Text: "some", Linter: "linter"},
 | |
| 		{Path: "e_test.go", Text: "testonly", Linter: "testlinter"},
 | |
| 		{Path: "e.go", Text: "nontestonly", Linter: "testlinter"},
 | |
| 		{Path: "e_test.go", Text: "nontestonly", Linter: "testlinter"},
 | |
| 		{Path: filepath.Join("testdata", "exclude_rules.go"), Line: 3, Linter: "lll"},
 | |
| 		{Path: filepath.Join("testdata", "severity_rules.go"), Line: 3, Linter: "invalidgo"},
 | |
| 		{Path: "someotherlinter.go", Text: "someotherlinter", Linter: "someotherlinter"},
 | |
| 		{Path: "somenotmatchlinter.go", Text: "somenotmatchlinter", Linter: "somenotmatchlinter"},
 | |
| 		{Path: "empty.go", Text: "empty", Linter: "empty"},
 | |
| 	}
 | |
| 
 | |
| 	var issues []result.Issue
 | |
| 	for _, c := range cases {
 | |
| 		issues = append(issues, newIssueFromIssueTestCase(c))
 | |
| 	}
 | |
| 
 | |
| 	processedIssues := process(t, p, issues...)
 | |
| 
 | |
| 	var resultingCases []issueTestCase
 | |
| 	for _, i := range processedIssues {
 | |
| 		resultingCases = append(resultingCases, issueTestCase{
 | |
| 			Path:     i.FilePath(),
 | |
| 			Linter:   i.FromLinter,
 | |
| 			Text:     i.Text,
 | |
| 			Line:     i.Line(),
 | |
| 			Severity: i.Severity,
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	expectedCases := []issueTestCase{
 | |
| 		{Path: "ssl.go", Text: "ssl", Linter: "gosec", Severity: "info"},
 | |
| 		{Path: "e.go", Text: "some", Linter: "linter", Severity: "info"},
 | |
| 		{Path: "e_test.go", Text: "testonly", Linter: "testlinter", Severity: "info"},
 | |
| 		{Path: "e.go", Text: "nontestonly", Linter: "testlinter", Severity: "info"},       // matched
 | |
| 		{Path: "e_test.go", Text: "nontestonly", Linter: "testlinter", Severity: "error"}, // not matched
 | |
| 		{Path: filepath.Join("testdata", "exclude_rules.go"), Line: 3, Linter: "lll", Severity: "error"},
 | |
| 		{Path: filepath.Join("testdata", "severity_rules.go"), Line: 3, Linter: "invalidgo", Severity: "info"},
 | |
| 		{Path: "someotherlinter.go", Text: "someotherlinter", Linter: "someotherlinter", Severity: "info"},
 | |
| 		{Path: "somenotmatchlinter.go", Text: "somenotmatchlinter", Linter: "somenotmatchlinter", Severity: "error"},
 | |
| 		{Path: "empty.go", Text: "empty", Linter: "empty", Severity: "error"},
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, expectedCases, resultingCases)
 | |
| }
 | |
| 
 | |
| func TestSeverity_pathPrefix(t *testing.T) {
 | |
| 	lineCache := fsutils.NewLineCache(fsutils.NewFileCache())
 | |
| 	pathPrefix := path.Join("some", "dir")
 | |
| 	files := fsutils.NewFiles(lineCache, pathPrefix)
 | |
| 	log := logutils.NewStderrLog(logutils.DebugKeyEmpty)
 | |
| 
 | |
| 	opts := SeverityOptions{
 | |
| 		Default: "error",
 | |
| 		Rules: []SeverityRule{
 | |
| 			{
 | |
| 				Severity: "info",
 | |
| 				BaseRule: BaseRule{
 | |
| 					Text: "some",
 | |
| 					Path: `some/dir/e\.go`,
 | |
| 				},
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	p := NewSeverity(log, files, opts)
 | |
| 
 | |
| 	cases := []issueTestCase{
 | |
| 		{Path: "e.go", Text: "some", Linter: "linter"},
 | |
| 		{Path: "other.go", Text: "some", Linter: "linter"},
 | |
| 	}
 | |
| 
 | |
| 	var issues []result.Issue
 | |
| 	for _, c := range cases {
 | |
| 		issues = append(issues, newIssueFromIssueTestCase(c))
 | |
| 	}
 | |
| 
 | |
| 	processedIssues := process(t, p, issues...)
 | |
| 
 | |
| 	var resultingCases []issueTestCase
 | |
| 	for _, i := range processedIssues {
 | |
| 		resultingCases = append(resultingCases, issueTestCase{
 | |
| 			Path:     i.FilePath(),
 | |
| 			Linter:   i.FromLinter,
 | |
| 			Text:     i.Text,
 | |
| 			Line:     i.Line(),
 | |
| 			Severity: i.Severity,
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	expectedCases := []issueTestCase{
 | |
| 		{Path: "e.go", Text: "some", Linter: "linter", Severity: "info"},
 | |
| 		{Path: "other.go", Text: "some", Linter: "linter", Severity: "error"},
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, expectedCases, resultingCases)
 | |
| }
 | |
| 
 | |
| func TestSeverity_text(t *testing.T) {
 | |
| 	opts := SeverityOptions{
 | |
| 		Rules: []SeverityRule{
 | |
| 			{
 | |
| 				BaseRule: BaseRule{
 | |
| 					Text:    "^severity$",
 | |
| 					Linters: []string{"linter"},
 | |
| 				},
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	p := NewSeverity(nil, nil, opts)
 | |
| 
 | |
| 	texts := []string{"seveRity", "1", "", "serverit", "notseverity"}
 | |
| 	var issues []result.Issue
 | |
| 	for _, t := range texts {
 | |
| 		issues = append(issues, result.Issue{
 | |
| 			Text:       t,
 | |
| 			FromLinter: "linter",
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	processedIssues := process(t, p, issues...)
 | |
| 	assert.Len(t, processedIssues, len(issues))
 | |
| 
 | |
| 	var processedTexts []string
 | |
| 	for _, i := range processedIssues {
 | |
| 		processedTexts = append(processedTexts, i.Text)
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, texts, processedTexts)
 | |
| }
 | |
| 
 | |
| func TestSeverity_onlyDefault(t *testing.T) {
 | |
| 	lineCache := fsutils.NewLineCache(fsutils.NewFileCache())
 | |
| 	files := fsutils.NewFiles(lineCache, "")
 | |
| 	log := logutils.NewStderrLog(logutils.DebugKeyEmpty)
 | |
| 
 | |
| 	opts := SeverityOptions{
 | |
| 		Default: "info",
 | |
| 		Rules:   []SeverityRule{},
 | |
| 	}
 | |
| 
 | |
| 	p := NewSeverity(log, files, opts)
 | |
| 
 | |
| 	cases := []issueTestCase{
 | |
| 		{Path: "ssl.go", Text: "ssl", Linter: "gosec"},
 | |
| 		{Path: "empty.go", Text: "empty", Linter: "empty"},
 | |
| 	}
 | |
| 
 | |
| 	var issues []result.Issue
 | |
| 	for _, c := range cases {
 | |
| 		issues = append(issues, newIssueFromIssueTestCase(c))
 | |
| 	}
 | |
| 
 | |
| 	processedIssues := process(t, p, issues...)
 | |
| 
 | |
| 	var resultingCases []issueTestCase
 | |
| 	for _, i := range processedIssues {
 | |
| 		resultingCases = append(resultingCases, issueTestCase{
 | |
| 			Path:     i.FilePath(),
 | |
| 			Linter:   i.FromLinter,
 | |
| 			Text:     i.Text,
 | |
| 			Line:     i.Line(),
 | |
| 			Severity: i.Severity,
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	expectedCases := []issueTestCase{
 | |
| 		{Path: "ssl.go", Text: "ssl", Linter: "gosec", Severity: "info"},
 | |
| 		{Path: "empty.go", Text: "empty", Linter: "empty", Severity: "info"},
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, expectedCases, resultingCases)
 | |
| }
 | |
| 
 | |
| func TestSeverity_empty(t *testing.T) {
 | |
| 	p := NewSeverity(nil, nil, SeverityOptions{})
 | |
| 
 | |
| 	processAssertSame(t, p, newIssueFromTextTestCase("test"))
 | |
| }
 | |
| 
 | |
| func TestSeverity_caseSensitive(t *testing.T) {
 | |
| 	lineCache := fsutils.NewLineCache(fsutils.NewFileCache())
 | |
| 	files := fsutils.NewFiles(lineCache, "")
 | |
| 
 | |
| 	opts := SeverityOptions{
 | |
| 		Default: "error",
 | |
| 		Rules: []SeverityRule{
 | |
| 			{
 | |
| 				Severity: "info",
 | |
| 				BaseRule: BaseRule{
 | |
| 					Text:    "^ssl$",
 | |
| 					Linters: []string{"gosec", "someotherlinter"},
 | |
| 				},
 | |
| 			},
 | |
| 		},
 | |
| 		CaseSensitive: true,
 | |
| 	}
 | |
| 
 | |
| 	p := NewSeverity(nil, files, opts)
 | |
| 
 | |
| 	cases := []issueTestCase{
 | |
| 		{Path: "e.go", Text: "ssL", Linter: "gosec"},
 | |
| 	}
 | |
| 
 | |
| 	var issues []result.Issue
 | |
| 	for _, c := range cases {
 | |
| 		issues = append(issues, newIssueFromIssueTestCase(c))
 | |
| 	}
 | |
| 
 | |
| 	processedIssues := process(t, p, issues...)
 | |
| 
 | |
| 	var resultingCases []issueTestCase
 | |
| 	for _, i := range processedIssues {
 | |
| 		resultingCases = append(resultingCases, issueTestCase{
 | |
| 			Path:     i.FilePath(),
 | |
| 			Linter:   i.FromLinter,
 | |
| 			Text:     i.Text,
 | |
| 			Line:     i.Line(),
 | |
| 			Severity: i.Severity,
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	expectedCases := []issueTestCase{
 | |
| 		{Path: "e.go", Text: "ssL", Linter: "gosec", Severity: "error"},
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, expectedCases, resultingCases)
 | |
| }
 | |
| 
 | |
| func TestSeverity_transform(t *testing.T) {
 | |
| 	lineCache := fsutils.NewLineCache(fsutils.NewFileCache())
 | |
| 	files := fsutils.NewFiles(lineCache, "")
 | |
| 
 | |
| 	testCases := []struct {
 | |
| 		desc     string
 | |
| 		opts     SeverityOptions
 | |
| 		issue    *result.Issue
 | |
| 		expected *result.Issue
 | |
| 	}{
 | |
| 		{
 | |
| 			desc: "apply severity from rule",
 | |
| 			opts: SeverityOptions{
 | |
| 				Default: "error",
 | |
| 				Rules: []SeverityRule{
 | |
| 					{
 | |
| 						Severity: "info",
 | |
| 						BaseRule: BaseRule{
 | |
| 							Linters: []string{"linter1"},
 | |
| 						},
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			issue: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter1",
 | |
| 			},
 | |
| 			expected: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter1",
 | |
| 				Severity:   "info",
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			desc: "apply severity from default",
 | |
| 			opts: SeverityOptions{
 | |
| 				Default: "error",
 | |
| 				Rules: []SeverityRule{
 | |
| 					{
 | |
| 						Severity: "info",
 | |
| 						BaseRule: BaseRule{
 | |
| 							Linters: []string{"linter1"},
 | |
| 						},
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			issue: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter2",
 | |
| 			},
 | |
| 			expected: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter2",
 | |
| 				Severity:   "error",
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			desc: "severity from rule override severity from linter",
 | |
| 			opts: SeverityOptions{
 | |
| 				Default: "error",
 | |
| 				Rules: []SeverityRule{
 | |
| 					{
 | |
| 						Severity: "info",
 | |
| 						BaseRule: BaseRule{
 | |
| 							Linters: []string{"linter1"},
 | |
| 						},
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			issue: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter1",
 | |
| 				Severity:   "huge",
 | |
| 			},
 | |
| 			expected: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter1",
 | |
| 				Severity:   "info",
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			desc: "severity from default override severity from linter",
 | |
| 			opts: SeverityOptions{
 | |
| 				Default: "error",
 | |
| 				Rules: []SeverityRule{
 | |
| 					{
 | |
| 						Severity: "info",
 | |
| 						BaseRule: BaseRule{
 | |
| 							Linters: []string{"linter1"},
 | |
| 						},
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			issue: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter2",
 | |
| 				Severity:   "huge",
 | |
| 			},
 | |
| 			expected: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter2",
 | |
| 				Severity:   "error",
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			desc: "keep severity from linter as rule",
 | |
| 			opts: SeverityOptions{
 | |
| 				Default: "error",
 | |
| 				Rules: []SeverityRule{
 | |
| 					{
 | |
| 						Severity: severityFromLinter,
 | |
| 						BaseRule: BaseRule{
 | |
| 							Linters: []string{"linter1"},
 | |
| 						},
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			issue: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter1",
 | |
| 				Severity:   "huge",
 | |
| 			},
 | |
| 			expected: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter1",
 | |
| 				Severity:   "huge",
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			desc: "keep severity from linter as default",
 | |
| 			opts: SeverityOptions{
 | |
| 				Default: severityFromLinter,
 | |
| 				Rules: []SeverityRule{
 | |
| 					{
 | |
| 						Severity: "info",
 | |
| 						BaseRule: BaseRule{
 | |
| 							Linters: []string{"linter1"},
 | |
| 						},
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			issue: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter2",
 | |
| 				Severity:   "huge",
 | |
| 			},
 | |
| 			expected: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter2",
 | |
| 				Severity:   "huge",
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			desc: "keep severity from linter as default (without rule)",
 | |
| 			opts: SeverityOptions{
 | |
| 				Default: severityFromLinter,
 | |
| 			},
 | |
| 			issue: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter2",
 | |
| 				Severity:   "huge",
 | |
| 			},
 | |
| 			expected: &result.Issue{
 | |
| 				Text:       "This is a report",
 | |
| 				FromLinter: "linter2",
 | |
| 				Severity:   "huge",
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for _, test := range testCases {
 | |
| 		test := test
 | |
| 		t.Run(test.desc, func(t *testing.T) {
 | |
| 			t.Parallel()
 | |
| 
 | |
| 			p := NewSeverity(nil, files, test.opts)
 | |
| 
 | |
| 			newIssue := p.transform(test.issue)
 | |
| 
 | |
| 			assert.Equal(t, test.expected, newIssue)
 | |
| 		})
 | |
| 	}
 | |
| }
 | 
