codegen: improve the "TestFkChecking" generated function
All checks were successful
CI / build-docker (push) Successful in 6s
CI / build-docker-bootstrap (push) Has been skipped
CI / release-test (push) Successful in 3m22s

This commit is contained in:
~wispem-wantex 2026-02-14 18:33:41 -08:00
parent 8c29d455ff
commit 9a11f3986c

View File

@ -297,82 +297,91 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam
Name: ast.NewIdent("Test" + tbl.GoTypeName + "FkChecking"), Name: ast.NewIdent("Test" + tbl.GoTypeName + "FkChecking"),
Type: testFuncType, Type: testFuncType,
Body: &ast.BlockStmt{ Body: &ast.BlockStmt{
List: func() []ast.Stmt { List: func() (stmts []ast.Stmt) {
// post := MakePost() isFirst := true
stmts := []ast.Stmt{ for _, col := range tbl.Columns {
&ast.AssignStmt{ if !col.IsForeignKey {
Lhs: []ast.Expr{ast.NewIdent(tbl.VarName)}, continue
Tok: token.DEFINE, }
Rhs: []ast.Expr{ shouldIncludeTestFkCheck = true
&ast.CallExpr{
Fun: ast.NewIdent("Make" + tbl.GoTypeName), // post := MakePost()
if !isFirst {
stmts = append(stmts, BlankLine())
}
stmts = append(stmts, []ast.Stmt{
// Comment header
Comment(fmt.Sprintf("Invalid %s", col.GoFieldName())),
// `Invalid BlahBlahID`
&ast.AssignStmt{
Lhs: []ast.Expr{ast.NewIdent(tbl.VarName)},
Tok: map[bool]token.Token{true: token.DEFINE, false: token.ASSIGN}[isFirst],
Rhs: []ast.Expr{
&ast.CallExpr{
Fun: ast.NewIdent("Make" + tbl.GoTypeName),
},
}, },
}, },
},
} // `post.QuotedPostID = 94354538969386985`
shouldDefineErr := true &ast.AssignStmt{
for _, col := range tbl.Columns { Lhs: []ast.Expr{
if col.IsForeignKey { &ast.SelectorExpr{
shouldIncludeTestFkCheck = true X: ast.NewIdent(tbl.VarName),
stmts = append(stmts, []ast.Stmt{ Sel: ast.NewIdent(col.GoFieldName()),
// post.QuotedPostID = 94354538969386985 },
&ast.AssignStmt{ },
Lhs: []ast.Expr{ Tok: token.ASSIGN,
Rhs: []ast.Expr{
&ast.BasicLit{
Kind: token.INT,
Value: "94354538969386985",
},
},
},
// `err := db.SavePost(&post)`
&ast.AssignStmt{
Lhs: []ast.Expr{ast.NewIdent("err")},
Tok: map[bool]token.Token{true: token.DEFINE, false: token.ASSIGN}[isFirst],
Rhs: []ast.Expr{
&ast.CallExpr{
Fun: &ast.SelectorExpr{
X: testDB,
Sel: ast.NewIdent("Save" + tbl.GoTypeName),
},
Args: []ast.Expr{
&ast.UnaryExpr{
Op: token.AND,
X: ast.NewIdent(tbl.VarName),
},
},
},
},
},
// `assertForeignKeyError(t, err, "QuotedPostID", post.QuotedPostID)`
&ast.ExprStmt{
X: &ast.CallExpr{
Fun: ast.NewIdent("AssertForeignKeyError"),
Args: []ast.Expr{
ast.NewIdent("t"),
ast.NewIdent("err"),
&ast.BasicLit{
Kind: token.STRING,
Value: fmt.Sprintf("%q", col.GoFieldName()),
},
&ast.SelectorExpr{ &ast.SelectorExpr{
X: ast.NewIdent(tbl.VarName), X: ast.NewIdent(tbl.VarName),
Sel: ast.NewIdent(col.GoFieldName()), Sel: ast.NewIdent(col.GoFieldName()),
}, },
}, },
Tok: token.ASSIGN,
Rhs: []ast.Expr{
&ast.BasicLit{
Kind: token.INT,
Value: "94354538969386985",
},
},
}, },
},
// err := db.SavePost(&post) }...)
&ast.AssignStmt{ isFirst = false
Lhs: []ast.Expr{ast.NewIdent("err")},
Tok: map[bool]token.Token{true: token.DEFINE, false: token.ASSIGN}[shouldDefineErr],
Rhs: []ast.Expr{
&ast.CallExpr{
Fun: &ast.SelectorExpr{
X: testDB,
Sel: ast.NewIdent("Save" + tbl.GoTypeName),
},
Args: []ast.Expr{
&ast.UnaryExpr{
Op: token.AND,
X: ast.NewIdent(tbl.VarName),
},
},
},
},
},
// assertForeignKeyError(t, err, "QuotedPostID", post.QuotedPostID)
&ast.ExprStmt{
X: &ast.CallExpr{
Fun: ast.NewIdent("AssertForeignKeyError"),
Args: []ast.Expr{
ast.NewIdent("t"),
ast.NewIdent("err"),
&ast.BasicLit{
Kind: token.STRING,
Value: fmt.Sprintf("%q", col.GoFieldName()),
},
&ast.SelectorExpr{
X: ast.NewIdent(tbl.VarName),
Sel: ast.NewIdent(col.GoFieldName()),
},
},
},
},
}...)
shouldDefineErr = false
}
} }
return stmts return stmts
}(), }(),