From 9d22df3d9c67e0f9b846c834769f8cdc10f0c78d Mon Sep 17 00:00:00 2001 From: Wytse Vellema Date: Fri, 29 Sep 2023 12:34:21 +0200 Subject: [PATCH 1/2] Add support to export the mock struct --- mocktail.go | 25 +- mocktail_test.go | 59 + readme.md | 6 + syrup.go | 86 +- testdata/exported_types/a/a.go | 43 + testdata/exported_types/a/b/b.go | 14 + testdata/exported_types/a/c/c.go | 5 + testdata/exported_types/a/go.mod | 16 + testdata/exported_types/a/go.sum | 20 + testdata/exported_types/a/mock_gen.go | 3397 +++++++++++++++++ .../exported_types/a/mock_gen_test.go.golden | 2923 ++++++++++++++ testdata/exported_types/a/mock_test.go | 52 + 12 files changed, 6590 insertions(+), 56 deletions(-) create mode 100644 testdata/exported_types/a/a.go create mode 100644 testdata/exported_types/a/b/b.go create mode 100644 testdata/exported_types/a/c/c.go create mode 100644 testdata/exported_types/a/go.mod create mode 100644 testdata/exported_types/a/go.sum create mode 100644 testdata/exported_types/a/mock_gen.go create mode 100644 testdata/exported_types/a/mock_gen_test.go.golden create mode 100644 testdata/exported_types/a/mock_test.go diff --git a/mocktail.go b/mocktail.go index fc9ef38..d51bc3d 100644 --- a/mocktail.go +++ b/mocktail.go @@ -16,6 +16,8 @@ import ( "path" "path/filepath" "strings" + + "github.com/ettle/strcase" ) const ( @@ -47,8 +49,9 @@ func main() { log.Fatal("get module path", err) } - var exported bool + var exported, exportMockTypes bool flag.BoolVar(&exported, "e", false, "generate exported mocks") + flag.BoolVar(&exportMockTypes, "t", false, "generate exported mock types") flag.Parse() root := info.Dir @@ -67,7 +70,7 @@ func main() { return } - err = generate(model, exported) + err = generate(model, exported, exportMockTypes) if err != nil { log.Fatalf("generate: %v", err) } @@ -242,7 +245,7 @@ func getTypeImports(t types.Type) []string { } } -func generate(model map[string]PackageDesc, exported bool) error { +func generate(model map[string]PackageDesc, exported bool, exportMockTypes bool) error { for fp, pkgDesc := range model { buffer := bytes.NewBufferString("") @@ -252,7 +255,12 @@ func generate(model map[string]PackageDesc, exported bool) error { } for _, interfaceDesc := range pkgDesc.Interfaces { - err = writeMockBase(buffer, interfaceDesc.Name, exported) + interfaceName := strcase.ToGoCamel(interfaceDesc.Name) + if exportMockTypes { + interfaceName = strcase.ToGoPascal(interfaceDesc.Name) + } + + err = writeMockBase(buffer, interfaceDesc.Name, interfaceName, exported) if err != nil { return err } @@ -263,10 +271,11 @@ func generate(model map[string]PackageDesc, exported bool) error { signature := method.Type().(*types.Signature) syrup := Syrup{ - PkgPath: pkgDesc.Pkg.Path(), - InterfaceName: interfaceDesc.Name, - Method: method, - Signature: signature, + PkgPath: pkgDesc.Pkg.Path(), + OriginalInterfaceName: interfaceDesc.Name, + Method: method, + Signature: signature, + InterfaceName: interfaceName, } err = syrup.MockMethod(buffer) diff --git a/mocktail_test.go b/mocktail_test.go index c6968bc..a6445d6 100644 --- a/mocktail_test.go +++ b/mocktail_test.go @@ -129,3 +129,62 @@ func TestMocktail_exported(t *testing.T) { require.NoError(t, err) } } + +func TestMocktail_exported_types(t *testing.T) { + const testRoot = "./testdata/exported_types" + + if runtime.GOOS == "windows" { + t.Skip(runtime.GOOS) + } + + dir, errR := os.ReadDir(testRoot) + require.NoError(t, errR) + + for _, entry := range dir { + if !entry.IsDir() { + continue + } + + t.Setenv("MOCKTAIL_TEST_PATH", filepath.Join(testRoot, entry.Name())) + + output, err := exec.Command("go", "run", ".", "-e", "-t").CombinedOutput() + t.Log(string(output)) + + require.NoError(t, err) + } + + errW := filepath.WalkDir(testRoot, func(path string, d fs.DirEntry, errW error) error { + if errW != nil { + return errW + } + + if d.IsDir() || d.Name() != outputMockFile { + return nil + } + + genBytes, err := os.ReadFile(path) + require.NoError(t, err) + + goldenBytes, err := os.ReadFile(path + ".golden") + require.NoError(t, err) + + assert.Equal(t, string(goldenBytes), string(genBytes)) + + return nil + }) + require.NoError(t, errW) + + for _, entry := range dir { + if !entry.IsDir() { + continue + } + + cmd := exec.Command("go", "test", "-v", "./...") + cmd.Dir = filepath.Join(testRoot, entry.Name()) + + output, err := cmd.CombinedOutput() + t.Log(string(output)) + + require.NoError(t, err) + } +} diff --git a/readme.md b/readme.md index 4ebe006..17e8387 100644 --- a/readme.md +++ b/readme.md @@ -110,6 +110,12 @@ mocktail -e In this case, mock will be created in the same package but in the file `mock_gen.go`. +If you need to exported mock types add flag `-t`: + +```shell +mocktail -t +``` +