diff --git a/pkg/codegen/modelgenerate/generate_testfile.go b/pkg/codegen/modelgenerate/generate_testfile.go index f4d839e..a003aba 100644 --- a/pkg/codegen/modelgenerate/generate_testfile.go +++ b/pkg/codegen/modelgenerate/generate_testfile.go @@ -113,6 +113,8 @@ func GenerateModelTestAST(tbl schema.Table, gomodName string) *ast.File { description1 := `"an item"` description2 := `"a big item"` + hasCreatedAt, hasUpdatedAt := tbl.HasAutoTimestamps() + testCreateUpdateDelete := &ast.FuncDecl{ Name: ast.NewIdent("TestCreateUpdateDelete" + tbl.GoTypeName), Type: &ast.FuncType{ @@ -124,119 +126,150 @@ func GenerateModelTestAST(tbl schema.Table, gomodName string) *ast.File { }, }, Body: &ast.BlockStmt{ - List: []ast.Stmt{ - // item := Item{Description: "an item"} - &ast.AssignStmt{ - Lhs: []ast.Expr{testObj}, - Tok: token.DEFINE, - Rhs: []ast.Expr{&ast.CompositeLit{ - Type: ast.NewIdent(tbl.GoTypeName), - Elts: []ast.Expr{ - &ast.KeyValueExpr{ - Key: fieldName, - Value: &ast.BasicLit{Kind: token.STRING, Value: description1}, + List: func() []ast.Stmt { + assertNotZero := func(obj *ast.Ident, field string) *ast.ExprStmt { + return &ast.ExprStmt{X: &ast.CallExpr{ + Fun: ast.NewIdent("assert.NotZero"), + Args: []ast.Expr{ast.NewIdent("t"), &ast.SelectorExpr{X: obj, Sel: ast.NewIdent(field)}}, + }} + } + + stmts := []ast.Stmt{ + // item := Item{Description: "an item"} + &ast.AssignStmt{ + Lhs: []ast.Expr{testObj}, + Tok: token.DEFINE, + Rhs: []ast.Expr{&ast.CompositeLit{ + Type: ast.NewIdent(tbl.GoTypeName), + Elts: []ast.Expr{ + &ast.KeyValueExpr{ + Key: fieldName, + Value: &ast.BasicLit{Kind: token.STRING, Value: description1}, + }, }, + }}, + }, + + // TestDB.SaveItem(&item) + &ast.ExprStmt{X: &ast.CallExpr{ + Fun: ast.NewIdent("TestDB.Save" + tbl.GoTypeName), + Args: []ast.Expr{&ast.UnaryExpr{Op: token.AND, X: testObj}}, + }}, + + // require.NotZero(t, item.ID) + &ast.ExprStmt{X: &ast.CallExpr{ + Fun: ast.NewIdent("require.NotZero"), + Args: []ast.Expr{ast.NewIdent("t"), &ast.SelectorExpr{X: testObj, Sel: ast.NewIdent("ID")}}, + }}, + } + + // After create: assert timestamps are set + if hasCreatedAt { + stmts = append(stmts, assertNotZero(testObj, "CreatedAt")) + } + if hasUpdatedAt { + stmts = append(stmts, assertNotZero(testObj, "UpdatedAt")) + } + + stmts = append(stmts, + // item2 := Must(TestDB.GetItemByID(item.ID)) + &ast.AssignStmt{ + Lhs: []ast.Expr{testObj2}, + Tok: token.DEFINE, + Rhs: []ast.Expr{&ast.CallExpr{ + Fun: ast.NewIdent("Must"), + Args: []ast.Expr{&ast.CallExpr{ + Fun: ast.NewIdent("TestDB.Get" + tbl.GoTypeName + "ByID"), + Args: []ast.Expr{&ast.SelectorExpr{X: testObj, Sel: ast.NewIdent("ID")}}, + }}, + }}, + }, + + // assert.Equal(t, "an item", item2.Description) + &ast.ExprStmt{X: &ast.CallExpr{ + Fun: ast.NewIdent("assert.Equal"), + Args: []ast.Expr{ + ast.NewIdent("t"), + &ast.BasicLit{Kind: token.STRING, Value: description1}, + &ast.SelectorExpr{X: testObj2, Sel: fieldName}, }, }}, - }, - // TestDB.SaveItem(&item) - &ast.ExprStmt{X: &ast.CallExpr{ - Fun: ast.NewIdent("TestDB.Save" + tbl.GoTypeName), - Args: []ast.Expr{&ast.UnaryExpr{Op: token.AND, X: testObj}}, - }}, + // item.Description = "a big item" + &ast.AssignStmt{ + Lhs: []ast.Expr{&ast.SelectorExpr{X: testObj, Sel: fieldName}}, + Tok: token.ASSIGN, + Rhs: []ast.Expr{&ast.BasicLit{Kind: token.STRING, Value: description2}}, + }, - // require.NotZero(t, item.ID) - &ast.ExprStmt{X: &ast.CallExpr{ - Fun: ast.NewIdent("require.NotZero"), - Args: []ast.Expr{ast.NewIdent("t"), &ast.SelectorExpr{X: testObj, Sel: ast.NewIdent("ID")}}, - }}, + // TestDB.SaveItem(&item) + &ast.ExprStmt{X: &ast.CallExpr{ + Fun: ast.NewIdent("TestDB.Save" + tbl.GoTypeName), + Args: []ast.Expr{&ast.UnaryExpr{Op: token.AND, X: testObj}}, + }}, + ) - // item2 := Must(TestDB.GetItemByID(item.ID)) - &ast.AssignStmt{ - Lhs: []ast.Expr{testObj2}, - Tok: token.DEFINE, - Rhs: []ast.Expr{&ast.CallExpr{ - Fun: ast.NewIdent("Must"), - Args: []ast.Expr{&ast.CallExpr{ + // After update: assert timestamps are still set + if hasCreatedAt { + stmts = append(stmts, assertNotZero(testObj, "CreatedAt")) + } + if hasUpdatedAt { + stmts = append(stmts, assertNotZero(testObj, "UpdatedAt")) + } + + stmts = append(stmts, + // item2 = Must(TestDB.GetItemByID(item.ID)) + &ast.AssignStmt{ + Lhs: []ast.Expr{testObj2}, + Tok: token.ASSIGN, + Rhs: []ast.Expr{&ast.CallExpr{ + Fun: ast.NewIdent("Must"), + Args: []ast.Expr{&ast.CallExpr{ + Fun: ast.NewIdent("TestDB.Get" + tbl.GoTypeName + "ByID"), + Args: []ast.Expr{&ast.SelectorExpr{X: testObj, Sel: ast.NewIdent("ID")}}, + }}, + }}, + }, + + // assert.Equal(t, item.Description, item2.Description) + &ast.ExprStmt{X: &ast.CallExpr{ + Fun: ast.NewIdent("assert.Equal"), + Args: []ast.Expr{ + ast.NewIdent("t"), + &ast.SelectorExpr{X: testObj, Sel: fieldName}, + &ast.SelectorExpr{X: testObj2, Sel: fieldName}, + }, + }}, + + // TestDB.DeleteItem(item) + &ast.ExprStmt{X: &ast.CallExpr{ + Fun: ast.NewIdent("TestDB.Delete" + tbl.GoTypeName), + Args: []ast.Expr{testObj}, + }}, + + // _, err := TestDB.GetItemByID(item.ID) + &ast.AssignStmt{ + Lhs: []ast.Expr{ast.NewIdent("_"), ast.NewIdent("err")}, + Tok: token.DEFINE, + Rhs: []ast.Expr{&ast.CallExpr{ Fun: ast.NewIdent("TestDB.Get" + tbl.GoTypeName + "ByID"), Args: []ast.Expr{&ast.SelectorExpr{X: testObj, Sel: ast.NewIdent("ID")}}, }}, - }}, - }, - - // assert.Equal(t, "an item", item2.Description) - &ast.ExprStmt{X: &ast.CallExpr{ - Fun: ast.NewIdent("assert.Equal"), - Args: []ast.Expr{ - ast.NewIdent("t"), - &ast.BasicLit{Kind: token.STRING, Value: description1}, - &ast.SelectorExpr{X: testObj2, Sel: fieldName}, }, - }}, - // item.Description = "a big item" - &ast.AssignStmt{ - Lhs: []ast.Expr{&ast.SelectorExpr{X: testObj, Sel: fieldName}}, - Tok: token.ASSIGN, - Rhs: []ast.Expr{&ast.BasicLit{Kind: token.STRING, Value: description2}}, - }, - - // TestDB.SaveItem(&item) - &ast.ExprStmt{X: &ast.CallExpr{ - Fun: ast.NewIdent("TestDB.Save" + tbl.GoTypeName), - Args: []ast.Expr{&ast.UnaryExpr{Op: token.AND, X: testObj}}, - }}, - - // item2 = Must(TestDB.GetItemByID(item.ID)) - &ast.AssignStmt{ - Lhs: []ast.Expr{testObj2}, - Tok: token.ASSIGN, - Rhs: []ast.Expr{&ast.CallExpr{ - Fun: ast.NewIdent("Must"), - Args: []ast.Expr{&ast.CallExpr{ - Fun: ast.NewIdent("TestDB.Get" + tbl.GoTypeName + "ByID"), - Args: []ast.Expr{&ast.SelectorExpr{X: testObj, Sel: ast.NewIdent("ID")}}, - }}, + // assert.ErrorIs(t, err, db.ErrNotInDB) + &ast.ExprStmt{X: &ast.CallExpr{ + Fun: ast.NewIdent("assert.ErrorIs"), + Args: []ast.Expr{ + ast.NewIdent("t"), + ast.NewIdent("err"), + ast.NewIdent("ErrNotInDB"), + }, }}, - }, + ) - // assert.Equal(t, item.Description, item2.Description) - &ast.ExprStmt{X: &ast.CallExpr{ - Fun: ast.NewIdent("assert.Equal"), - Args: []ast.Expr{ - ast.NewIdent("t"), - &ast.SelectorExpr{X: testObj, Sel: fieldName}, - &ast.SelectorExpr{X: testObj2, Sel: fieldName}, - }, - }}, - - // TestDB.DeleteItem(item) - &ast.ExprStmt{X: &ast.CallExpr{ - Fun: ast.NewIdent("TestDB.Delete" + tbl.GoTypeName), - Args: []ast.Expr{testObj}, - }}, - - // _, err := TestDB.GetItemByID(item.ID) - &ast.AssignStmt{ - Lhs: []ast.Expr{ast.NewIdent("_"), ast.NewIdent("err")}, - Tok: token.DEFINE, - Rhs: []ast.Expr{&ast.CallExpr{ - Fun: ast.NewIdent("TestDB.Get" + tbl.GoTypeName + "ByID"), - Args: []ast.Expr{&ast.SelectorExpr{X: testObj, Sel: ast.NewIdent("ID")}}, - }}, - }, - - // assert.ErrorIs(t, err, db.ErrNotInDB) - &ast.ExprStmt{X: &ast.CallExpr{ - Fun: ast.NewIdent("assert.ErrorIs"), - Args: []ast.Expr{ - ast.NewIdent("t"), - ast.NewIdent("err"), - ast.NewIdent("ErrNotInDB"), - }, - }}, - }, + return stmts + }(), }, }