From 657da635d9cee263ac56f441d462c8e471c6cb2b Mon Sep 17 00:00:00 2001 From: Nahshon Unna-Tsameret Date: Sun, 20 Nov 2022 18:19:36 +0200 Subject: [PATCH] Add the ginkgolinter linter The ginkgolinter checks the ginkgo assersions in go tests. See here for additional details: https://github.com/nunnatsa/ginkgolinter --- .golangci.reference.yml | 17 +++++- go.mod | 1 + go.sum | 2 + pkg/config/linters_settings.go | 7 +++ pkg/golinters/ginkgolinter.go | 29 +++++++++++ pkg/lint/lintersdb/manager.go | 8 +++ test/linters_test.go | 1 + .../configs/ginkgolinter_default.yml | 2 + .../configs/ginkgolinter_suppress_err.yml | 3 ++ .../configs/ginkgolinter_suppress_len.yml | 3 ++ .../configs/ginkgolinter_suppress_nil.yml | 3 ++ test/testdata/ginkgolinter/ginkgolinter.go | 51 ++++++++++++++++++ .../ginkgolinter/ginkgolinter_suppress_err.go | 52 +++++++++++++++++++ .../ginkgolinter/ginkgolinter_suppress_len.go | 52 +++++++++++++++++++ .../ginkgolinter/ginkgolinter_suppress_nil.go | 52 +++++++++++++++++++ test/testdata/ginkgolinter/go.mod | 12 +++++ test/testdata/ginkgolinter/go.sum | 15 ++++++ 17 files changed, 309 insertions(+), 1 deletion(-) create mode 100644 pkg/golinters/ginkgolinter.go create mode 100644 test/testdata/ginkgolinter/configs/ginkgolinter_default.yml create mode 100644 test/testdata/ginkgolinter/configs/ginkgolinter_suppress_err.yml create mode 100644 test/testdata/ginkgolinter/configs/ginkgolinter_suppress_len.yml create mode 100644 test/testdata/ginkgolinter/configs/ginkgolinter_suppress_nil.yml create mode 100644 test/testdata/ginkgolinter/ginkgolinter.go create mode 100644 test/testdata/ginkgolinter/ginkgolinter_suppress_err.go create mode 100644 test/testdata/ginkgolinter/ginkgolinter_suppress_len.go create mode 100644 test/testdata/ginkgolinter/ginkgolinter_suppress_nil.go create mode 100644 test/testdata/ginkgolinter/go.mod create mode 100644 test/testdata/ginkgolinter/go.sum diff --git a/.golangci.reference.yml b/.golangci.reference.yml index ae23791996bc..9a4fe43e8d68 100644 --- a/.golangci.reference.yml +++ b/.golangci.reference.yml @@ -402,8 +402,21 @@ linters-settings: # Default: false custom-order: true + ginkgolinter: + # Suppress the wrong length assertion warning. + # Default: false + suppress-len-assertion: true + + # Suppress the wrong nil assertion warning. + # Default: false + suppress-nil-assertion: true + + # Suppress the wrong error assertion warning. + # Default: false + suppress-err-assertion: true + gocognit: - # Minimal code complexity to report + # Minimal code complexity to report. # Default: 30 (but we recommend 10-20) min-complexity: 10 @@ -1989,6 +2002,7 @@ linters: - forcetypeassert - funlen - gci + - ginkgolinter - gochecknoglobals - gochecknoinits - gocognit @@ -2096,6 +2110,7 @@ linters: - forcetypeassert - funlen - gci + - ginkgolinter - gochecknoglobals - gochecknoinits - gocognit diff --git a/go.mod b/go.mod index 249921cba550..660b3b3a4b86 100644 --- a/go.mod +++ b/go.mod @@ -72,6 +72,7 @@ require ( github.com/nakabonne/nestif v0.3.1 github.com/nishanths/exhaustive v0.9.3 github.com/nishanths/predeclared v0.2.2 + github.com/nunnatsa/ginkgolinter v0.6.0 github.com/pkg/errors v0.9.1 github.com/polyfloyd/go-errorlint v1.0.6 github.com/quasilyte/go-ruleguard/dsl v0.3.21 diff --git a/go.sum b/go.sum index a30078fa8b75..fb4276f2b51c 100644 --- a/go.sum +++ b/go.sum @@ -394,6 +394,8 @@ github.com/nishanths/exhaustive v0.9.3 h1:NPZibdWqnUfp24jTNYS9ncxvJ1Cniot9kP5agz github.com/nishanths/exhaustive v0.9.3/go.mod h1:VjHsn6MdEX4ydfLwt658YcdPxSDKOlqSjpkeGJPCamo= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nunnatsa/ginkgolinter v0.6.0 h1:r5C8RxtM8KTUJlgKOTFZQK3oG8blCQtHslDRl5YWiHA= +github.com/nunnatsa/ginkgolinter v0.6.0/go.mod h1:jTgd60EAdXDmmIPZi+xoMDqAYo/4AakhWNmnPisd7Rc= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo/v2 v2.3.1 h1:8SbseP7qM32WcvE6VaN6vfXxv698izmsJ1UQX9ve7T8= diff --git a/pkg/config/linters_settings.go b/pkg/config/linters_settings.go index 412a6cc5d19b..dfc0dc8b550d 100644 --- a/pkg/config/linters_settings.go +++ b/pkg/config/linters_settings.go @@ -150,6 +150,7 @@ type LintersSettings struct { Forbidigo ForbidigoSettings Funlen FunlenSettings Gci GciSettings + GinkgoLinter GinkgoLinterSettings Gocognit GocognitSettings Goconst GoConstSettings Gocritic GoCriticSettings @@ -321,6 +322,12 @@ type GciSettings struct { CustomOrder bool `mapstructure:"custom-order"` } +type GinkgoLinterSettings struct { + SuppressLenAssertion bool `mapstructure:"suppress-len-assertion"` + SuppressNilAssertion bool `mapstructure:"suppress-nil-assertion"` + SuppressErrAssertion bool `mapstructure:"suppress-err-assertion"` +} + type GocognitSettings struct { MinComplexity int `mapstructure:"min-complexity"` } diff --git a/pkg/golinters/ginkgolinter.go b/pkg/golinters/ginkgolinter.go new file mode 100644 index 000000000000..d97050c2ee42 --- /dev/null +++ b/pkg/golinters/ginkgolinter.go @@ -0,0 +1,29 @@ +package golinters + +import ( + "github.com/nunnatsa/ginkgolinter" + "golang.org/x/tools/go/analysis" + + "github.com/golangci/golangci-lint/pkg/config" + "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" +) + +func NewGinkgoLinter(cfg *config.GinkgoLinterSettings) *goanalysis.Linter { + a := ginkgolinter.NewAnalyzer() + + cfgMap := make(map[string]map[string]interface{}) + if cfg != nil { + cfgMap[a.Name] = map[string]interface{}{ + "suppress-len-assertion": cfg.SuppressLenAssertion, + "suppress-nil-assertion": cfg.SuppressNilAssertion, + "suppress-err-assertion": cfg.SuppressErrAssertion, + } + } + + return goanalysis.NewLinter( + a.Name, + a.Doc, + []*analysis.Analyzer{a}, + cfgMap, + ).WithLoadMode(goanalysis.LoadModeTypesInfo) +} diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go index 353ca88dcd7b..ab8f1835bd41 100644 --- a/pkg/lint/lintersdb/manager.go +++ b/pkg/lint/lintersdb/manager.go @@ -118,6 +118,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { forbidigoCfg *config.ForbidigoSettings funlenCfg *config.FunlenSettings gciCfg *config.GciSettings + ginkgolinterCfg *config.GinkgoLinterSettings gocognitCfg *config.GocognitSettings goconstCfg *config.GoConstSettings gocriticCfg *config.GoCriticSettings @@ -194,6 +195,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { forbidigoCfg = &m.cfg.LintersSettings.Forbidigo funlenCfg = &m.cfg.LintersSettings.Funlen gciCfg = &m.cfg.LintersSettings.Gci + ginkgolinterCfg = &m.cfg.LintersSettings.GinkgoLinter gocognitCfg = &m.cfg.LintersSettings.Gocognit goconstCfg = &m.cfg.LintersSettings.Goconst gocriticCfg = &m.cfg.LintersSettings.Gocritic @@ -430,6 +432,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { WithPresets(linter.PresetFormatting, linter.PresetImport). WithURL("https://github.com/daixiang0/gci"), + linter.NewConfig(golinters.NewGinkgoLinter(ginkgolinterCfg)). + WithSince("v1.51.0"). + WithLoadForGoAnalysis(). + WithPresets(linter.PresetStyle). + WithURL("https://github.com/nunnatsa/ginkgolinter"), + linter.NewConfig(golinters.NewGochecknoglobals()). WithSince("v1.12.0"). WithPresets(linter.PresetStyle). diff --git a/test/linters_test.go b/test/linters_test.go index 159e76c8bb56..58af3e1c6cb2 100644 --- a/test/linters_test.go +++ b/test/linters_test.go @@ -30,6 +30,7 @@ func TestTypecheck(t *testing.T) { func TestSourcesFromTestdataSubDir(t *testing.T) { subDirs := []string{ "loggercheck", + "ginkgolinter", } for _, dir := range subDirs { diff --git a/test/testdata/ginkgolinter/configs/ginkgolinter_default.yml b/test/testdata/ginkgolinter/configs/ginkgolinter_default.yml new file mode 100644 index 000000000000..5c8b6a8f3a15 --- /dev/null +++ b/test/testdata/ginkgolinter/configs/ginkgolinter_default.yml @@ -0,0 +1,2 @@ +linters-settings: + ginkgolinter: {} diff --git a/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_err.yml b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_err.yml new file mode 100644 index 000000000000..080942d0c802 --- /dev/null +++ b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_err.yml @@ -0,0 +1,3 @@ +linters-settings: + ginkgolinter: + suppress-err-assertion: true diff --git a/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_len.yml b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_len.yml new file mode 100644 index 000000000000..db9e0a285d7f --- /dev/null +++ b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_len.yml @@ -0,0 +1,3 @@ +linters-settings: + ginkgolinter: + suppress-len-assertion: true diff --git a/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_nil.yml b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_nil.yml new file mode 100644 index 000000000000..d15ab8c3edd7 --- /dev/null +++ b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_nil.yml @@ -0,0 +1,3 @@ +linters-settings: + ginkgolinter: + suppress-nil-assertion: true diff --git a/test/testdata/ginkgolinter/ginkgolinter.go b/test/testdata/ginkgolinter/ginkgolinter.go new file mode 100644 index 000000000000..8af228a41aed --- /dev/null +++ b/test/testdata/ginkgolinter/ginkgolinter.go @@ -0,0 +1,51 @@ +//golangcitest:args --disable-all -Eginkgolinter +package ginkgolinter + +import ( + "errors" + . "github.com/onsi/gomega" +) + +func LenUsecase() { + var fakeVarUnderTest []int + Expect(fakeVarUnderTest).Should(BeEmpty()) // valid + Expect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid + + Expect(len(fakeVarUnderTest)).Should(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(2)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(HaveLen\\(2\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("==", 0)) // // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.To\\(BeEmpty\\(\\)\\). instead" + + fakeVarUnderTest = append(fakeVarUnderTest, 3) + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).Should(Equal(1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(HaveLen\\(1\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">=", 1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("!=", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" +} + +func NilUsecase() { + y := 5 + x := &y + Expect(x == nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(nil == x).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x != nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeTrue()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeFalse()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" +} +func BooleanUsecase() { + x := true + Expect(x).To(Equal(true)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeTrue\\(\\)\\). instead" + x = false + Expect(x).To(Equal(false)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeFalse\\(\\)\\). instead" +} + +func ErrorUsecase() { + err := errors.New("fake error") + funcReturnsErr := func() error { return err } + + Expect(err).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(Equal(true)) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(BeFalse()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(err != nil).To(BeTrue()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(funcReturnsErr()).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(funcReturnsErr\\(\\)\\)\\.To\\(Succeed\\(\\)\\). instead" +} diff --git a/test/testdata/ginkgolinter/ginkgolinter_suppress_err.go b/test/testdata/ginkgolinter/ginkgolinter_suppress_err.go new file mode 100644 index 000000000000..7663e2cb2290 --- /dev/null +++ b/test/testdata/ginkgolinter/ginkgolinter_suppress_err.go @@ -0,0 +1,52 @@ +//golangcitest:config_path configs/ginkgolinter_suppress_err.yml +//golangcitest:args --disable-all -Eginkgolinter +package ginkgolinter + +import ( + "errors" + . "github.com/onsi/gomega" +) + +func LenUsecase_err() { + var fakeVarUnderTest []int + Expect(fakeVarUnderTest).Should(BeEmpty()) // valid + Expect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid + + Expect(len(fakeVarUnderTest)).Should(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(2)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(HaveLen\\(2\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("==", 0)) // // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.To\\(BeEmpty\\(\\)\\). instead" + + fakeVarUnderTest = append(fakeVarUnderTest, 3) + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).Should(Equal(1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(HaveLen\\(1\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">=", 1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("!=", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" +} + +func NilUsecase_err() { + y := 5 + x := &y + Expect(x == nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(nil == x).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x != nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeTrue()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeFalse()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" +} +func BooleanUsecase_err() { + x := true + Expect(x).To(Equal(true)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeTrue\\(\\)\\). instead" + x = false + Expect(x).To(Equal(false)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeFalse\\(\\)\\). instead" +} + +func ErrorUsecase_err() { + err := errors.New("fake error") + funcReturnsErr := func() error { return err } + + Expect(err).To(BeNil()) + Expect(err == nil).To(Equal(true)) + Expect(err == nil).To(BeFalse()) + Expect(err != nil).To(BeTrue()) + Expect(funcReturnsErr()).To(BeNil()) +} diff --git a/test/testdata/ginkgolinter/ginkgolinter_suppress_len.go b/test/testdata/ginkgolinter/ginkgolinter_suppress_len.go new file mode 100644 index 000000000000..0d1e33eae13c --- /dev/null +++ b/test/testdata/ginkgolinter/ginkgolinter_suppress_len.go @@ -0,0 +1,52 @@ +//golangcitest:config_path configs/ginkgolinter_suppress_len.yml +//golangcitest:args --disable-all -Eginkgolinter +package ginkgolinter + +import ( + "errors" + . "github.com/onsi/gomega" +) + +func LenUsecase_len() { + var fakeVarUnderTest []int + Expect(fakeVarUnderTest).Should(BeEmpty()) // valid + Expect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid + + Expect(len(fakeVarUnderTest)).Should(Equal(0)) + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(2)) + Expect(len(fakeVarUnderTest)).To(BeNumerically("==", 0)) + + fakeVarUnderTest = append(fakeVarUnderTest, 3) + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(0)) + Expect(len(fakeVarUnderTest)).Should(Equal(1)) + Expect(len(fakeVarUnderTest)).To(BeNumerically(">", 0)) + Expect(len(fakeVarUnderTest)).To(BeNumerically(">=", 1)) + Expect(len(fakeVarUnderTest)).To(BeNumerically("!=", 0)) +} + +func NilUsecase_len() { + y := 5 + x := &y + Expect(x == nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(nil == x).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x != nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeTrue()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeFalse()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" +} +func BooleanUsecase_len() { + x := true + Expect(x).To(Equal(true)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeTrue\\(\\)\\). instead" + x = false + Expect(x).To(Equal(false)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeFalse\\(\\)\\). instead" +} + +func ErrorUsecase_len() { + err := errors.New("fake error") + funcReturnsErr := func() error { return err } + + Expect(err).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(Equal(true)) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(BeFalse()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(err != nil).To(BeTrue()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(funcReturnsErr()).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(funcReturnsErr\\(\\)\\)\\.To\\(Succeed\\(\\)\\). instead" +} diff --git a/test/testdata/ginkgolinter/ginkgolinter_suppress_nil.go b/test/testdata/ginkgolinter/ginkgolinter_suppress_nil.go new file mode 100644 index 000000000000..f1a30473e5ec --- /dev/null +++ b/test/testdata/ginkgolinter/ginkgolinter_suppress_nil.go @@ -0,0 +1,52 @@ +//golangcitest:args --disable-all -Eginkgolinter +//golangcitest:config_path configs/ginkgolinter_suppress_nil.yml +package ginkgolinter + +import ( + "errors" + . "github.com/onsi/gomega" +) + +func LenUsecase_nil() { + var fakeVarUnderTest []int + Expect(fakeVarUnderTest).Should(BeEmpty()) // valid + Expect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid + + Expect(len(fakeVarUnderTest)).Should(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(2)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(HaveLen\\(2\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("==", 0)) // // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.To\\(BeEmpty\\(\\)\\). instead" + + fakeVarUnderTest = append(fakeVarUnderTest, 3) + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).Should(Equal(1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(HaveLen\\(1\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">=", 1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("!=", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" +} + +func NilUsecase_nil() { + y := 5 + x := &y + Expect(x == nil).To(Equal(true)) + Expect(nil == x).To(Equal(true)) + Expect(x != nil).To(Equal(true)) + Expect(x == nil).To(BeTrue()) + Expect(x == nil).To(BeFalse()) +} +func BooleanUsecase_nil() { + x := true + Expect(x).To(Equal(true)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeTrue\\(\\)\\). instead" + x = false + Expect(x).To(Equal(false)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeFalse\\(\\)\\). instead" +} + +func ErrorUsecase_nil() { + err := errors.New("fake error") + funcReturnsErr := func() error { return err } + + Expect(err).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(Equal(true)) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(BeFalse()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(err != nil).To(BeTrue()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(funcReturnsErr()).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(funcReturnsErr\\(\\)\\)\\.To\\(Succeed\\(\\)\\). instead" +} diff --git a/test/testdata/ginkgolinter/go.mod b/test/testdata/ginkgolinter/go.mod new file mode 100644 index 000000000000..48dca07b5779 --- /dev/null +++ b/test/testdata/ginkgolinter/go.mod @@ -0,0 +1,12 @@ +module ginkgolinter + +go 1.19 + +require github.com/onsi/gomega v1.24.1 + +require ( + github.com/google/go-cmp v0.5.9 // indirect + golang.org/x/net v0.2.0 // indirect + golang.org/x/text v0.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/test/testdata/ginkgolinter/go.sum b/test/testdata/ginkgolinter/go.sum new file mode 100644 index 000000000000..a3d1dba1a6c3 --- /dev/null +++ b/test/testdata/ginkgolinter/go.sum @@ -0,0 +1,15 @@ +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/onsi/ginkgo/v2 v2.5.0 h1:TRtrvv2vdQqzkwrQ1ke6vtXf7IK34RBUJafIy1wMwls= +github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= +github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= +golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=