Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ func (g *Generator) generateQueryUnitTestFile(data *genInfo) (err error) {
return err
}

err = render(tmpl.CRUDMethodTest, &buf, data.QueryStructMeta)
err = render(tmpl.GenerateCRUDMethodTest(), &buf, data.QueryStructMeta)
if err != nil {
return err
}
Expand Down
4 changes: 4 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module gorm.io/gen
go 1.18

require (
github.com/stretchr/testify v1.7.0
golang.org/x/tools v0.17.0
gorm.io/datatypes v1.2.4
gorm.io/gorm v1.25.12
Expand All @@ -12,11 +13,14 @@ require (

require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
golang.org/x/mod v0.14.0 // indirect
golang.org/x/text v0.14.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
gorm.io/driver/mysql v1.5.7 // indirect
)
5 changes: 5 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
Expand All @@ -21,8 +22,10 @@ github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/
github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI=
github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
Expand Down Expand Up @@ -62,7 +65,9 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc=
golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
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.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/datatypes v1.2.4 h1:uZmGAcK/QZ0uyfCuVg0VQY1ZmV9h1fuG0tMwKByO1z4=
gorm.io/datatypes v1.2.4/go.mod h1:f4BsLcFAX67szSv8svwLRjklArSHAvHLeE3pXAS5DZI=
Expand Down
276 changes: 163 additions & 113 deletions internal/template/method.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package template

import (
"fmt"
"strings"
)

// DIYMethod DIY method
const DIYMethod = `

Expand Down Expand Up @@ -261,12 +266,78 @@

`

// CRUDMethodTest CRUD method test
const CRUDMethodTest = `
func GenerateCRUDMethodTest() string {

Check failure on line 269 in internal/template/method.go

View workflow job for this annotation

GitHub Actions / runner / golangci-lint

[golangci] reported by reviewdog 🐶 exported: exported function GenerateCRUDMethodTest should have comment or be unexported (revive) Raw Output: internal/template/method.go:269:1: exported: exported function GenerateCRUDMethodTest should have comment or be unexported (revive) func GenerateCRUDMethodTest() string { ^
sections := []string{
"FieldByName", templateTestOperationFieldByName,
"Create", templateTestOperationCreate,
"Save", templateTestOperationSave,
"CreateInBatches", templateTestOperationCreateInBatches,
"Take", templateTestOperationTake,
"First", templatetestOperationFirst,
"Last", templateTestOperationLast,
"FindInBatch", templateTestOperationFindInBatch,
"FindInBatches", templateTestOperationFindInBatches,
"Find", templateTestOperationFind,
"Distinct", templateTestOperationDistinct,
"Omit", templateTestOperationOmit,
"Group", templateTestOperationGroup,
"Scopes", templateTestOperationScopes,
"FindByPage", templateTestOperationFindByPage,
"ScanByPage", templateTestOperationScanByPage,
"FirstOrInit", templateTestOperationFirstOrInit,
"FirstOrCreate", templateTestOperationFirstOrCreate,
}
joinSections := []string{
"Basic Join", templateTestOperationJoin,
"LeftJoin", templateTestOperationLeftJoin,
"NotOrClauses", templateTestOperationNotOrClauses,
}
joinBody := joinTestSections(joinSections, "\t")
joinBody = fmt.Sprintf("%s\n%s", templateTestOperationJoinHeader, joinBody)
sections = append(sections, "Join", joinBody)
body := joinTestSections(sections, "")
return fmt.Sprintf("%s\n%s%s",
templateTestOperationHeader,
body,
templateTestOperationFooter,
)
}

func joinTestSections(kv []string, linePrefix string) string {
result := ""
for x := 0; x < len(kv); x = x + 2 {
name := kv[x]
section := kv[x+1]
if section != "" {
result += fmt.Sprintf(templateTestRunnerFormat, name, section)
}
}
if linePrefix != "" {
delimiter := "\n"
lines := strings.Split(result, delimiter)
result = ""
for _, line := range lines {
if strings.TrimSpace(line) == "" {
result += line + delimiter
} else {
result += linePrefix + line + delimiter
}
}
}
return result
}

const (
templateTestRunnerFormat = `
t.Run("%s", func(t *testing.T) {
%s
})
`
templateTestOperationHeader = `
func init() {
InitializeDB()
err := _gen_test_db.AutoMigrate(&{{.StructInfo.Package}}.{{.ModelStructName}}{})
if err != nil{
if err != nil {
fmt.Printf("Error: AutoMigrate(&{{.StructInfo.Package}}.{{.ModelStructName}}{}) fail: %s", err)
}
}
Expand All @@ -281,117 +352,96 @@
if err != nil {
t.Error("clean table <{{.TableName}}> fail:", err)
return
}

_, ok := {{.QueryStructName}}.GetFieldByName("")
if ok {
t.Error("GetFieldByName(\"\") from {{.QueryStructName}} success")
}

err = _do.Create(&{{.StructInfo.Package}}.{{.ModelStructName}}{})
if err != nil {
t.Error("create item in table <{{.TableName}}> fail:", err)
}

err = _do.Save(&{{.StructInfo.Package}}.{{.ModelStructName}}{})
if err != nil {
t.Error("create item in table <{{.TableName}}> fail:", err)
}

err = _do.CreateInBatches([]*{{.StructInfo.Package}}.{{.ModelStructName}}{ {}, {} }, 10)
if err != nil {
t.Error("create item in table <{{.TableName}}> fail:", err)
}

_, err = _do.Select({{.QueryStructName}}.ALL).Take()
if err != nil {
t.Error("Take() on table <{{.TableName}}> fail:", err)
}

_, err = _do.First()
if err != nil {
t.Error("First() on table <{{.TableName}}> fail:", err)
}

_, err = _do.Last()
if err != nil {
t.Error("First() on table <{{.TableName}}> fail:", err)
}

_, err = _do.Where(primaryKey.IsNotNull()).FindInBatch(10, func(tx gen.Dao, batch int) error { return nil })
if err != nil {
t.Error("FindInBatch() on table <{{.TableName}}> fail:", err)
}

err = _do.Where(primaryKey.IsNotNull()).FindInBatches(&[]*{{.StructInfo.Package}}.{{.ModelStructName}}{}, 10, func(tx gen.Dao, batch int) error { return nil })
if err != nil {
t.Error("FindInBatches() on table <{{.TableName}}> fail:", err)
}

_, err = _do.Select({{.QueryStructName}}.ALL).Where(primaryKey.IsNotNull()).Order(primaryKey.Desc()).Find()
if err != nil {
t.Error("Find() on table <{{.TableName}}> fail:", err)
}

_, err = _do.Distinct(primaryKey).Take()
if err != nil {
t.Error("select Distinct() on table <{{.TableName}}> fail:", err)
}

_, err = _do.Select({{.QueryStructName}}.ALL).Omit(primaryKey).Take()
if err != nil {
t.Error("Omit() on table <{{.TableName}}> fail:", err)
}

_, err = _do.Group(primaryKey).Find()
if err != nil {
t.Error("Group() on table <{{.TableName}}> fail:", err)
}

_, err = _do.Scopes(func(dao gen.Dao) gen.Dao { return dao.Where(primaryKey.IsNotNull()) }).Find()
if err != nil {
t.Error("Scopes() on table <{{.TableName}}> fail:", err)
}

_, _, err = _do.FindByPage(0, 1)
if err != nil {
t.Error("FindByPage() on table <{{.TableName}}> fail:", err)
}

_, err = _do.ScanByPage(&{{.StructInfo.Package}}.{{.ModelStructName}}{}, 0, 1)
if err != nil {
t.Error("ScanByPage() on table <{{.TableName}}> fail:", err)
}

_, err = _do.Attrs(primaryKey).Assign(primaryKey).FirstOrInit()
if err != nil {
t.Error("FirstOrInit() on table <{{.TableName}}> fail:", err)
}

_, err = _do.Attrs(primaryKey).Assign(primaryKey).FirstOrCreate()
if err != nil {
t.Error("FirstOrCreate() on table <{{.TableName}}> fail:", err)
}

var _a _another
var _aPK = field.NewString(_a.TableName(), "id")

err = _do.Join(&_a, primaryKey.EqCol(_aPK)).Scan(map[string]interface{}{})
if err != nil {
t.Error("Join() on table <{{.TableName}}> fail:", err)
}

err = _do.LeftJoin(&_a, primaryKey.EqCol(_aPK)).Scan(map[string]interface{}{})
if err != nil {
t.Error("LeftJoin() on table <{{.TableName}}> fail:", err)
}

_, err = _do.Not().Or().Clauses().Take()
if err != nil {
t.Error("Not/Or/Clauses on table <{{.TableName}}> fail:", err)
}
}
}`
templateTestOperationFooter = `}
`
templateTestOperationFieldByName = `_, ok := {{.QueryStructName}}.GetFieldByName("")
if ok {
t.Error("GetFieldByName(\"\") from {{.QueryStructName}} success")
}`
templateTestOperationCreate = `err := _do.Create(&{{.StructInfo.Package}}.{{.ModelStructName}}{})
if err != nil {
t.Error("create item in table <{{.TableName}}> fail:", err)
}`
templateTestOperationSave = `err := _do.Save(&{{.StructInfo.Package}}.{{.ModelStructName}}{})
if err != nil {
t.Error("create item in table <{{.TableName}}> fail:", err)
}`
templateTestOperationCreateInBatches = `err := _do.CreateInBatches([]*{{.StructInfo.Package}}.{{.ModelStructName}}{ {}, {} }, 10)
if err != nil {
t.Error("create item in table <{{.TableName}}> fail:", err)
}`
templateTestOperationTake = `_, err := _do.Select({{.QueryStructName}}.ALL).Take()
if err != nil {
t.Error("Take() on table <{{.TableName}}> fail:", err)
}`
templatetestOperationFirst = `_, err := _do.First()
if err != nil {
t.Error("First() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationLast = `_, err := _do.Last()
if err != nil {
t.Error("First() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationFindInBatch = `_, err := _do.Where(primaryKey.IsNotNull()).FindInBatch(10, func(tx gen.Dao, batch int) error { return nil })
if err != nil {
t.Error("FindInBatch() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationFindInBatches = `err := _do.Where(primaryKey.IsNotNull()).FindInBatches(&[]*{{.StructInfo.Package}}.{{.ModelStructName}}{}, 10, func(tx gen.Dao, batch int) error { return nil })
if err != nil {
t.Error("FindInBatches() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationFind = `_, err := _do.Select({{.QueryStructName}}.ALL).Where(primaryKey.IsNotNull()).Order(primaryKey.Desc()).Find()
if err != nil {
t.Error("Find() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationDistinct = `_, err := _do.Distinct(primaryKey).Take()
if err != nil {
t.Error("select Distinct() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationOmit = `_, err := _do.Select({{.QueryStructName}}.ALL).Omit(primaryKey).Take()
if err != nil {
t.Error("Omit() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationGroup = `_, err := _do.Group(primaryKey).Find()
if err != nil {
t.Error("Group() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationScopes = `_, err := _do.Scopes(func(dao gen.Dao) gen.Dao { return dao.Where(primaryKey.IsNotNull()) }).Find()
if err != nil {
t.Error("Scopes() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationFindByPage = `_, _, err := _do.FindByPage(0, 1)
if err != nil {
t.Error("FindByPage() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationScanByPage = `_, err := _do.ScanByPage(&{{.StructInfo.Package}}.{{.ModelStructName}}{}, 0, 1)
if err != nil {
t.Error("ScanByPage() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationFirstOrInit = `_, err := _do.Attrs(primaryKey).Assign(primaryKey).FirstOrInit()
if err != nil {
t.Error("FirstOrInit() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationFirstOrCreate = `_, err := _do.Attrs(primaryKey).Assign(primaryKey).FirstOrCreate()
if err != nil {
t.Error("FirstOrCreate() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationJoinHeader = `var _a _another
var _aPK = field.NewString(_a.TableName(), "id")`
templateTestOperationJoin = `err := _do.Join(&_a, primaryKey.EqCol(_aPK)).Scan(map[string]interface{}{})
if err != nil {
t.Error("Join() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationLeftJoin = `err := _do.LeftJoin(&_a, primaryKey.EqCol(_aPK)).Scan(map[string]interface{}{})
if err != nil {
t.Error("LeftJoin() on table <{{.TableName}}> fail:", err)
}`
templateTestOperationNotOrClauses = `_, err := _do.Not().Or().Clauses().Take()
if err != nil {
t.Error("Not/Or/Clauses on table <{{.TableName}}> fail:", err)
}`
)

// DIYMethodTestBasic DIY method test basic
const DIYMethodTestBasic = `
Expand Down
Loading
Loading