From 49d2a7748fbb73a9009b950fa37fcef2979fea34 Mon Sep 17 00:00:00 2001 From: ~wispem-wantex Date: Tue, 8 Sep 2026 17:19:57 -0700 Subject: [PATCH] codegen: make generated tests support 'without rowid' tables --- .../modelgenerate/generate_testfile.go | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/pkg/codegen/modelgenerate/generate_testfile.go b/pkg/codegen/modelgenerate/generate_testfile.go index db5a825..93ccf9a 100644 --- a/pkg/codegen/modelgenerate/generate_testfile.go +++ b/pkg/codegen/modelgenerate/generate_testfile.go @@ -133,6 +133,31 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam testObj2 := ast.NewIdent(textutils.CamelToPascal(tbl.GoTypeName) + "2") testDB := ast.NewIdent("TestDB") + // getItemByPKCall builds a call to this table's primary-key getter (e.g. `TestDB.GetItemByID(item.ID)`, + // or `TestDB.GetItemByColAAndColB(item.ColA, item.ColB)` for "without rowid" tables with a + // compound primary key), matching whatever GenerateGetItemByIDFunc/GenerateGetItemBy generated. + getItemByPKCall := func(obj *ast.Ident) *ast.CallExpr { + if !tbl.IsWithoutRowid { + // Normal rowid table: use GetXyzByID + return &ast.CallExpr{ + Fun: &ast.SelectorExpr{X: testDB, Sel: ast.NewIdent("Get" + tbl.GoTypeName + "ByID")}, + Args: []ast.Expr{&ast.SelectorExpr{X: obj, Sel: ast.NewIdent("ID")}}, + } + } else { + // "Without rowid" table: use the primary key "GetItemByBlahBlah" query func + funcNameSuffix := []string{} + args := []ast.Expr{} + for _, c := range tbl.PrimaryKeyColumns() { + funcNameSuffix = append(funcNameSuffix, c.GoFieldName()) + args = append(args, &ast.SelectorExpr{X: obj, Sel: ast.NewIdent(c.GoFieldName())}) + } + return &ast.CallExpr{ + Fun: &ast.SelectorExpr{X: testDB, Sel: ast.NewIdent("Get" + tbl.GoTypeName + "By" + strings.Join(funcNameSuffix, "And"))}, + Args: args, + } + } + } + makeDeepEqual := func(obj1 *ast.Ident, obj2 *ast.Ident) *ast.IfStmt { return &ast.IfStmt{ Init: &ast.AssignStmt{ @@ -331,13 +356,15 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam } return mainExpr }()}, + ) - // require.NotZero(t, item.ID) - &ast.ExprStmt{X: &ast.CallExpr{ + // require.NotZero(t, item.ID) + if !tbl.IsWithoutRowid { // non-rowid tables don't get an ID + stmts = append(stmts, &ast.ExprStmt{X: &ast.CallExpr{ Fun: &ast.SelectorExpr{X: ast.NewIdent("require"), Sel: ast.NewIdent("NotZero")}, Args: []ast.Expr{ast.NewIdent("t"), &ast.SelectorExpr{X: testObj, Sel: ast.NewIdent("ID")}}, - }}, - ) + }}) + } // After create: assert timestamps are set if hasCreatedAt { @@ -355,10 +382,7 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam &ast.AssignStmt{ Lhs: []ast.Expr{testObj2}, Tok: token.DEFINE, - Rhs: []ast.Expr{mustCall(&ast.CallExpr{ - Fun: &ast.SelectorExpr{X: testDB, Sel: ast.NewIdent("Get" + tbl.GoTypeName + "ByID")}, - Args: []ast.Expr{&ast.SelectorExpr{X: testObj, Sel: ast.NewIdent("ID")}}, - })}, + Rhs: []ast.Expr{mustCall(getItemByPKCall(testObj))}, }, // if deep.Equal(...) {...} @@ -391,10 +415,7 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam &ast.AssignStmt{ Lhs: []ast.Expr{testObj2}, Tok: token.ASSIGN, - Rhs: []ast.Expr{mustCall(&ast.CallExpr{ - Fun: &ast.SelectorExpr{X: testDB, Sel: ast.NewIdent("Get" + tbl.GoTypeName + "ByID")}, - Args: []ast.Expr{&ast.SelectorExpr{X: testObj, Sel: ast.NewIdent("ID")}}, - })}, + Rhs: []ast.Expr{mustCall(getItemByPKCall(testObj))}, }, // if deep.Equal(...) {...} @@ -452,10 +473,7 @@ func GenerateModelTestAST(tbl pkgschema.Table, schema pkgschema.Schema, gomodNam &ast.AssignStmt{ Lhs: []ast.Expr{ast.NewIdent("_"), ast.NewIdent("err")}, Tok: token.DEFINE, - Rhs: []ast.Expr{&ast.CallExpr{ - Fun: &ast.SelectorExpr{X: testDB, Sel: ast.NewIdent("Get" + tbl.GoTypeName + "ByID")}, - Args: []ast.Expr{&ast.SelectorExpr{X: testObj, Sel: ast.NewIdent("ID")}}, - }}, + Rhs: []ast.Expr{getItemByPKCall(testObj)}, }, // assert.ErrorIs(t, err, db.ErrNotInDB)