Skip to content

Commit 14a9cc6

Browse files
authored
feat: Error message for nonexistent mocks (#907)
feat: warn message for nonexistent mocks
1 parent 25182ae commit 14a9cc6

File tree

6 files changed

+55
-8
lines changed

6 files changed

+55
-8
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ coverage.txt
88
site/
99
.task/
1010
tools/tools
11+
*.lua

.mockery.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,6 @@ packages:
127127
mockname: Interface2WithUnresolvedAlias
128128
- resolve-type-alias: True
129129
mockname: Interface2WithResolvedAlias
130+
github.com/vektra/mockery/v2/pkg/:
131+
interfaces:
132+
InterfaceDoesntExist:

cmd/mockery.go

+25-4
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,16 @@ import (
1010
"runtime/pprof"
1111
"strings"
1212

13+
"github.com/vektra/mockery/v2/pkg"
14+
"github.com/vektra/mockery/v2/pkg/config"
15+
"github.com/vektra/mockery/v2/pkg/logging"
16+
"github.com/vektra/mockery/v2/pkg/stackerr"
17+
1318
"github.com/chigopher/pathlib"
1419
"github.com/mitchellh/go-homedir"
1520
"github.com/rs/zerolog/log"
1621
"github.com/spf13/cobra"
1722
"github.com/spf13/viper"
18-
"github.com/vektra/mockery/v2/pkg"
19-
"github.com/vektra/mockery/v2/pkg/config"
20-
"github.com/vektra/mockery/v2/pkg/logging"
21-
"github.com/vektra/mockery/v2/pkg/stackerr"
2223
"golang.org/x/tools/go/packages"
2324
)
2425

@@ -258,6 +259,7 @@ func (r *RootApp) Run() error {
258259
log.Error().Err(err).Msg("unable to parse packages")
259260
return err
260261
}
262+
261263
log.Info().Msg("done loading, visiting interface nodes")
262264
for _, iface := range parser.Interfaces() {
263265
ifaceLog := log.
@@ -284,6 +286,25 @@ func (r *RootApp) Run() error {
284286
}
285287
}
286288

289+
// Output interfaces that were specified but not found.
290+
// We do that here and not before the loop because it's easier to
291+
// see for the user.
292+
for _, p := range configuredPackages {
293+
ifaceList, err := r.Config.GetInterfacesForPackage(ctx, p)
294+
if err != nil {
295+
log.Error().Msgf("Failed to get interfaces for package %s: %v", p, err)
296+
}
297+
298+
for _, name := range ifaceList {
299+
if !parser.Has(p, name) {
300+
log.Warn().Ctx(ctx).
301+
Str(logging.LogKeyInterface, name).
302+
Str(logging.LogKeyQualifiedName, p).
303+
Msg("no such interface")
304+
}
305+
}
306+
}
307+
287308
return nil
288309
}
289310

go.work.sum

+4
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,7 @@ github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=
693693
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
694694
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
695695
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
696+
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
696697
github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk=
697698
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
698699
github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g=
@@ -1163,6 +1164,7 @@ golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
11631164
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
11641165
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
11651166
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
1167+
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
11661168
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
11671169
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
11681170
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
@@ -1191,6 +1193,7 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ
11911193
golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
11921194
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
11931195
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
1196+
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
11941197
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
11951198
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
11961199
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1229,6 +1232,7 @@ golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
12291232
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
12301233
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
12311234
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
1235+
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
12321236
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk=
12331237
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
12341238
golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=

pkg/config/config.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ func NewConfigFromViper(v *viper.Viper) (*Config, error) {
103103
v.SetDefault("case", "camel")
104104
v.SetDefault("dir", ".")
105105
v.SetDefault("output", "./mocks")
106-
107106
} else {
108107
v.SetDefault("dir", "mocks/{{.PackagePath}}")
109108
v.SetDefault("filename", "mock_{{.InterfaceName}}.go")
@@ -734,7 +733,7 @@ func (c *Config) mergeInConfig(ctx context.Context) error {
734733
configSectionTyped[key] = value
735734
}
736735
}
737-
interfaces, err := c.getInterfacesForPackage(pkgCtx, pkgPath)
736+
interfaces, err := c.GetInterfacesForPackage(pkgCtx, pkgPath)
738737
if err != nil {
739738
return fmt.Errorf("failed to get interfaces for package: %w", err)
740739
}
@@ -777,7 +776,7 @@ func (c *Config) mergeInConfig(ctx context.Context) error {
777776
return nil
778777
}
779778

780-
func (c *Config) getInterfacesForPackage(ctx context.Context, pkgPath string) ([]string, error) {
779+
func (c *Config) GetInterfacesForPackage(ctx context.Context, pkgPath string) ([]string, error) {
781780
interfaces := []string{}
782781
packageMap, err := c.getPackageConfigMap(ctx, pkgPath)
783782
if err != nil {

pkg/parse.go

+20-1
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import (
1111
"sort"
1212
"strings"
1313

14-
"github.com/rs/zerolog"
1514
"github.com/vektra/mockery/v2/pkg/logging"
15+
16+
"github.com/rs/zerolog"
1617
"golang.org/x/tools/go/packages"
1718
)
1819

@@ -223,6 +224,24 @@ func (p *Parser) Find(name string) (*Interface, error) {
223224
return nil, ErrNotInterface
224225
}
225226

227+
func (p *Parser) Has(packageName, interfaceName string) bool {
228+
for _, entry := range p.files {
229+
if entry.pkg.PkgPath != packageName {
230+
continue
231+
}
232+
233+
for _, ifaceName := range entry.interfaces {
234+
if ifaceName != interfaceName {
235+
continue
236+
}
237+
238+
return true
239+
}
240+
}
241+
242+
return false
243+
}
244+
226245
func (p *Parser) Interfaces() []*Interface {
227246
ifaces := make(sortableIFaceList, 0)
228247
for _, entry := range p.files {

0 commit comments

Comments
 (0)