diff --git a/pkg/codegen/modelgenerate/generate_testfile.go b/pkg/codegen/modelgenerate/generate_testfile.go index df6dd97..a3ca2f0 100644 --- a/pkg/codegen/modelgenerate/generate_testfile.go +++ b/pkg/codegen/modelgenerate/generate_testfile.go @@ -101,12 +101,39 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam hasCreatedAt, hasUpdatedAt := tbl.HasAutoTimestamps() updateTestFields := UpdateTestFields(tbl) + 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{} } makeItemFunc := &ast.FuncDecl{ Name: makeHelperName, 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{ List: []*ast.Field{ {Type: ast.NewIdent(tbl.GoTypeName)}, @@ -120,6 +147,13 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam &ast.CompositeLit{ Type: ast.NewIdent(tbl.GoTypeName), Elts: func() (ret []ast.Expr) { + // `UpdateTestFields()` skips foreign keys, so this will not cause duplicates + for i, c := range requiredForeignKeys { + ret = append(ret, &ast.KeyValueExpr{ + Key: ast.NewIdent(c.GoFieldName()), + Value: ast.NewIdent(requiredForeignKeyParamNames[i]), + }) + } for _, c := range updateTestFields { ret = append(ret, &ast.KeyValueExpr{ Key: ast.NewIdent(c.GoFieldName()), @@ -242,7 +276,8 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam Tok: map[bool]token.Token{true: token.DEFINE, false: token.ASSIGN}[isFirst], Rhs: []ast.Expr{ &ast.CallExpr{ - Fun: ast.NewIdent("Make" + tbl.GoTypeName), + Fun: ast.NewIdent("Make" + tbl.GoTypeName), + Args: makeItemArgs, }, }, }, @@ -329,7 +364,7 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam &ast.AssignStmt{ Lhs: []ast.Expr{testObj}, Tok: token.DEFINE, - Rhs: []ast.Expr{&ast.CallExpr{Fun: makeHelperName, Args: nil}}, + Rhs: []ast.Expr{&ast.CallExpr{Fun: makeHelperName, Args: makeItemArgs}}, }, // item.Description = // ...one assignment per updatable field