Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f98f8416e8 | |||
| 1592c7d1fc |
@@ -101,12 +101,55 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam
|
|||||||
|
|
||||||
hasCreatedAt, hasUpdatedAt := tbl.HasAutoTimestamps()
|
hasCreatedAt, hasUpdatedAt := tbl.HasAutoTimestamps()
|
||||||
updateTestFields := UpdateTestFields(tbl)
|
updateTestFields := UpdateTestFields(tbl)
|
||||||
|
uniqueColumns := map[string]bool{}
|
||||||
|
for _, index := range schema.Indexes {
|
||||||
|
if index.TableName != tbl.TableName || !index.IsUnique {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, columnName := range index.Columns {
|
||||||
|
uniqueColumns[columnName] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hasRandomUniqueField := false
|
||||||
|
for _, c := range updateTestFields {
|
||||||
|
if uniqueColumns[c.Name] {
|
||||||
|
hasRandomUniqueField = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
requiredForeignKeys := []pkgschema.Column{}
|
||||||
|
for _, c := range tbl.Columns {
|
||||||
|
// Only ordinary object foreign keys use a distinct TargetObjectID Go type;
|
||||||
|
// code-table foreign keys retain their underlying SQLite type in the generated model.
|
||||||
|
if c.IsNotNull && c.IsNonCodeTableForeignKey() {
|
||||||
|
requiredForeignKeys = append(requiredForeignKeys, c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
requiredForeignKeyParamNames := paramNamesFor(requiredForeignKeys)
|
||||||
|
|
||||||
|
// Calls made by this generated test do not create related objects themselves. Pass a
|
||||||
|
// zero ID so the generated test remains syntactically valid; callers of MakeXyz provide
|
||||||
|
// IDs of the related objects they create.
|
||||||
|
makeItemArgs := func() (ret []ast.Expr) {
|
||||||
|
for range requiredForeignKeys {
|
||||||
|
ret = append(ret, &ast.BasicLit{Kind: token.INT, Value: "0"})
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}()
|
||||||
|
|
||||||
// func MakeItem() Item { return Item{} }
|
// func MakeItem() Item { return Item{} }
|
||||||
makeItemFunc := &ast.FuncDecl{
|
makeItemFunc := &ast.FuncDecl{
|
||||||
Name: makeHelperName,
|
Name: makeHelperName,
|
||||||
Type: &ast.FuncType{
|
Type: &ast.FuncType{
|
||||||
Params: &ast.FieldList{},
|
Params: &ast.FieldList{List: func() (ret []*ast.Field) {
|
||||||
|
for i, c := range requiredForeignKeys {
|
||||||
|
ret = append(ret, &ast.Field{
|
||||||
|
Names: []*ast.Ident{ast.NewIdent(requiredForeignKeyParamNames[i])},
|
||||||
|
Type: GoTypeForColumn(c),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}()},
|
||||||
Results: &ast.FieldList{
|
Results: &ast.FieldList{
|
||||||
List: []*ast.Field{
|
List: []*ast.Field{
|
||||||
{Type: ast.NewIdent(tbl.GoTypeName)},
|
{Type: ast.NewIdent(tbl.GoTypeName)},
|
||||||
@@ -114,16 +157,62 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
Body: &ast.BlockStmt{
|
Body: &ast.BlockStmt{
|
||||||
List: []ast.Stmt{
|
List: append(
|
||||||
|
func() []ast.Stmt {
|
||||||
|
if !hasRandomUniqueField {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return []ast.Stmt{&ast.AssignStmt{
|
||||||
|
Lhs: []ast.Expr{ast.NewIdent("id")},
|
||||||
|
Tok: token.DEFINE,
|
||||||
|
Rhs: []ast.Expr{&ast.CallExpr{Fun: &ast.SelectorExpr{X: ast.NewIdent("rand"), Sel: ast.NewIdent("Int")}}},
|
||||||
|
}}
|
||||||
|
}(),
|
||||||
|
[]ast.Stmt{
|
||||||
&ast.ReturnStmt{
|
&ast.ReturnStmt{
|
||||||
Results: []ast.Expr{
|
Results: []ast.Expr{
|
||||||
&ast.CompositeLit{
|
&ast.CompositeLit{
|
||||||
Type: ast.NewIdent(tbl.GoTypeName),
|
Type: ast.NewIdent(tbl.GoTypeName),
|
||||||
Elts: func() (ret []ast.Expr) {
|
Elts: func() (ret []ast.Expr) {
|
||||||
for _, c := range updateTestFields {
|
// `UpdateTestFields()` skips foreign keys, so this will not cause duplicates
|
||||||
|
for i, c := range requiredForeignKeys {
|
||||||
ret = append(ret, &ast.KeyValueExpr{
|
ret = append(ret, &ast.KeyValueExpr{
|
||||||
Key: ast.NewIdent(c.GoFieldName()),
|
Key: ast.NewIdent(c.GoFieldName()),
|
||||||
Value: SampleValue(c, 0),
|
Value: ast.NewIdent(requiredForeignKeyParamNames[i]),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
for _, c := range updateTestFields {
|
||||||
|
value := SampleValue(c, 0)
|
||||||
|
if uniqueColumns[c.Name] {
|
||||||
|
switch c.Type {
|
||||||
|
case "integer", "int":
|
||||||
|
value = ast.NewIdent("id")
|
||||||
|
case "text":
|
||||||
|
value = &ast.CallExpr{
|
||||||
|
Fun: &ast.SelectorExpr{X: ast.NewIdent("fmt"), Sel: ast.NewIdent("Sprintf")},
|
||||||
|
Args: []ast.Expr{
|
||||||
|
&ast.BasicLit{Kind: token.STRING, Value: `"%s-%d"`},
|
||||||
|
SampleValue(c, 0),
|
||||||
|
ast.NewIdent("id"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
case "blob":
|
||||||
|
value = &ast.CallExpr{
|
||||||
|
Fun: &ast.ArrayType{Elt: ast.NewIdent("byte")},
|
||||||
|
Args: []ast.Expr{&ast.CallExpr{
|
||||||
|
Fun: &ast.SelectorExpr{X: ast.NewIdent("fmt"), Sel: ast.NewIdent("Sprintf")},
|
||||||
|
Args: []ast.Expr{
|
||||||
|
&ast.BasicLit{Kind: token.STRING, Value: `"%s-%d"`},
|
||||||
|
&ast.CallExpr{Fun: ast.NewIdent("string"), Args: []ast.Expr{SampleValue(c, 0)}},
|
||||||
|
ast.NewIdent("id"),
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = append(ret, &ast.KeyValueExpr{
|
||||||
|
Key: ast.NewIdent(c.GoFieldName()),
|
||||||
|
Value: value,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@@ -131,7 +220,8 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
}...,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,6 +333,7 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam
|
|||||||
Rhs: []ast.Expr{
|
Rhs: []ast.Expr{
|
||||||
&ast.CallExpr{
|
&ast.CallExpr{
|
||||||
Fun: ast.NewIdent("Make" + tbl.GoTypeName),
|
Fun: ast.NewIdent("Make" + tbl.GoTypeName),
|
||||||
|
Args: makeItemArgs,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -329,7 +420,7 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam
|
|||||||
&ast.AssignStmt{
|
&ast.AssignStmt{
|
||||||
Lhs: []ast.Expr{testObj},
|
Lhs: []ast.Expr{testObj},
|
||||||
Tok: token.DEFINE,
|
Tok: token.DEFINE,
|
||||||
Rhs: []ast.Expr{&ast.CallExpr{Fun: makeHelperName, Args: nil}},
|
Rhs: []ast.Expr{&ast.CallExpr{Fun: makeHelperName, Args: makeItemArgs}},
|
||||||
},
|
},
|
||||||
// item.Description = <sample value, offset 1>
|
// item.Description = <sample value, offset 1>
|
||||||
// ...one assignment per updatable field
|
// ...one assignment per updatable field
|
||||||
@@ -560,7 +651,15 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam
|
|||||||
Decls: append([]ast.Decl{
|
Decls: append([]ast.Decl{
|
||||||
&ast.GenDecl{
|
&ast.GenDecl{
|
||||||
Tok: token.IMPORT,
|
Tok: token.IMPORT,
|
||||||
Specs: []ast.Spec{
|
Specs: func() []ast.Spec {
|
||||||
|
specs := []ast.Spec{}
|
||||||
|
if hasRandomUniqueField {
|
||||||
|
specs = append(specs,
|
||||||
|
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"fmt"`}},
|
||||||
|
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"math/rand"`}},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
specs = append(specs, []ast.Spec{
|
||||||
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"testing"`}},
|
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"testing"`}},
|
||||||
&ast.ImportSpec{
|
&ast.ImportSpec{
|
||||||
Path: &ast.BasicLit{Kind: token.STRING, Value: `"git.offline-twitter.com/offline-labs/gas-stack/pkg/db"`},
|
Path: &ast.BasicLit{Kind: token.STRING, Value: `"git.offline-twitter.com/offline-labs/gas-stack/pkg/db"`},
|
||||||
@@ -576,7 +675,9 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam
|
|||||||
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"github.com/go-test/deep"`}},
|
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"github.com/go-test/deep"`}},
|
||||||
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"github.com/stretchr/testify/assert"`}},
|
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"github.com/stretchr/testify/assert"`}},
|
||||||
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"github.com/stretchr/testify/require"`}},
|
&ast.ImportSpec{Path: &ast.BasicLit{Kind: token.STRING, Value: `"github.com/stretchr/testify/require"`}},
|
||||||
},
|
}...)
|
||||||
|
return specs
|
||||||
|
}(),
|
||||||
},
|
},
|
||||||
}, testList...),
|
}, testList...),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user