From 31ec532b6dc2bbb0d9b4713c4464c33c3b0633ad Mon Sep 17 00:00:00 2001 From: go-jet Date: Fri, 19 Jul 2019 12:39:10 +0200 Subject: [PATCH] Additional generator tests. --- cmd/jet/main.go | 3 +- generator/postgres/generator.go | 5 +- tests/init/init.go | 2 +- tests/main_test.go | 191 +++++++++++++++++++++++++++++++- 4 files changed, 195 insertions(+), 6 deletions(-) diff --git a/cmd/jet/main.go b/cmd/jet/main.go index 03eee06..bedbe7d 100644 --- a/cmd/jet/main.go +++ b/cmd/jet/main.go @@ -6,7 +6,6 @@ import ( "github.com/go-jet/jet/generator/postgres" _ "github.com/lib/pq" "os" - "strconv" ) var ( @@ -71,7 +70,7 @@ Usage of jet: genData := postgres.DBConnection{ Host: host, - Port: strconv.Itoa(port), + Port: port, User: user, Password: password, SslMode: sslmode, diff --git a/generator/postgres/generator.go b/generator/postgres/generator.go index c18ab7e..6c5b04b 100644 --- a/generator/postgres/generator.go +++ b/generator/postgres/generator.go @@ -8,12 +8,13 @@ import ( "github.com/go-jet/jet/internal/utils" "path" "path/filepath" + "strconv" ) // DBConnection contains postgres connection details type DBConnection struct { Host string - Port string + Port int User string Password string SslMode string @@ -27,7 +28,7 @@ type DBConnection struct { func Generate(destDir string, dbConn DBConnection) error { connectionString := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s %s", - dbConn.Host, dbConn.Port, dbConn.User, dbConn.Password, dbConn.DBName, dbConn.SslMode, dbConn.Params) + dbConn.Host, strconv.Itoa(dbConn.Port), dbConn.User, dbConn.Password, dbConn.DBName, dbConn.SslMode, dbConn.Params) fmt.Println("Connecting to postgres database: " + connectionString) diff --git a/tests/init/init.go b/tests/init/init.go index 3165516..a8f3110 100644 --- a/tests/init/init.go +++ b/tests/init/init.go @@ -39,7 +39,7 @@ func main() { err = postgres.Generate("./.gentestdata", postgres.DBConnection{ Host: dbconfig.Host, - Port: "5432", + Port: 5432, User: dbconfig.User, Password: dbconfig.Password, DBName: dbconfig.DBName, diff --git a/tests/main_test.go b/tests/main_test.go index 6f5fb42..09106a4 100644 --- a/tests/main_test.go +++ b/tests/main_test.go @@ -1,13 +1,17 @@ package tests import ( + "bytes" "database/sql" + "github.com/go-jet/jet/generator/postgres" "github.com/go-jet/jet/tests/.gentestdata/jetdb/dvds/model" "github.com/go-jet/jet/tests/dbconfig" _ "github.com/lib/pq" "github.com/pkg/profile" "gotest.tools/assert" + "io/ioutil" "os" + "os/exec" "reflect" "testing" ) @@ -29,7 +33,7 @@ func TestMain(m *testing.M) { os.Exit(ret) } -func TestGenerateModel(t *testing.T) { +func TestGeneratedModel(t *testing.T) { actor := model.Actor{} @@ -58,3 +62,188 @@ func TestGenerateModel(t *testing.T) { assert.Equal(t, reflect.TypeOf(staff.Email).String(), "*string") assert.Equal(t, reflect.TypeOf(staff.Picture).String(), "*[]uint8") } + +const genTestDir2 = "./.gentestdata2" + +func TestCmdGenerator(t *testing.T) { + err := os.RemoveAll(genTestDir2) + assert.NilError(t, err) + + cmd := exec.Command("jet", "-dbname=jetdb", "-host=localhost", "-port=5432", + "-user=jet", "-password=jet", "-schema=dvds", "-path="+genTestDir2) + + err = cmd.Run() + assert.NilError(t, err) + + assertGeneratedFiles(t) + + err = os.RemoveAll(genTestDir2) + assert.NilError(t, err) +} + +func TestGenerator(t *testing.T) { + + err := os.RemoveAll(genTestDir2) + assert.NilError(t, err) + + err = postgres.Generate(genTestDir2, postgres.DBConnection{ + Host: dbconfig.Host, + Port: dbconfig.Port, + User: dbconfig.User, + Password: dbconfig.Password, + SslMode: "disable", + Params: "", + + DBName: dbconfig.DBName, + SchemaName: "dvds", + }) + + assert.NilError(t, err) + + assertGeneratedFiles(t) + + err = os.RemoveAll(genTestDir2) + assert.NilError(t, err) +} + +func assertGeneratedFiles(t *testing.T) { + // Table SQL Builder files + tableSQLBuilderFiles, err := ioutil.ReadDir("./.gentestdata2/jetdb/dvds/table") + assert.NilError(t, err) + + assertFileNameEqual(t, tableSQLBuilderFiles, "actor.go", "address.go", "category.go", "city.go", "country.go", + "customer.go", "film.go", "film_actor.go", "film_category.go", "inventory.go", "language.go", + "payment.go", "rental.go", "staff.go", "store.go") + + assertFileContent(t, "./.gentestdata2/jetdb/dvds/table/actor.go", "\npackage table", actorSQLBuilderFile) + + // Enums SQL Builder files + enumFiles, err := ioutil.ReadDir("./.gentestdata2/jetdb/dvds/enum") + + assertFileNameEqual(t, enumFiles, "mpaa_rating.go") + assertFileContent(t, "./.gentestdata2/jetdb/dvds/enum/mpaa_rating.go", "\npackage enum", mpaaRatingEnumFile) + + // Model files + modelFiles, err := ioutil.ReadDir("./.gentestdata2/jetdb/dvds/model") + assert.NilError(t, err) + + assertFileNameEqual(t, modelFiles, "actor.go", "address.go", "category.go", "city.go", "country.go", + "customer.go", "film.go", "film_actor.go", "film_category.go", "inventory.go", "language.go", + "payment.go", "rental.go", "staff.go", "store.go", "mpaa_rating.go") + + assertFileContent(t, "./.gentestdata2/jetdb/dvds/model/actor.go", "\npackage model", actorModelFile) +} + +func assertFileContent(t *testing.T, filePath string, contentBegin string, expectedContent string) { + enumFileData, err := ioutil.ReadFile(filePath) + + assert.NilError(t, err) + + beginIndex := bytes.Index(enumFileData, []byte(contentBegin)) + + //fmt.Println("-"+string(enumFileData[beginIndex:])+"-") + + assert.DeepEqual(t, string(enumFileData[beginIndex:]), expectedContent) +} + +func assertFileNameEqual(t *testing.T, fileInfos []os.FileInfo, fileNames ...string) { + + fileNamesMap := map[string]bool{} + + for _, fileInfo := range fileInfos { + fileNamesMap[fileInfo.Name()] = true + } + + for _, fileName := range fileNames { + assert.Assert(t, fileNamesMap[fileName], fileName+" does not exist.") + } +} + +var mpaaRatingEnumFile = ` +package enum + +import "github.com/go-jet/jet" + +var MpaaRating = &struct { + G jet.StringExpression + Pg jet.StringExpression + Pg13 jet.StringExpression + R jet.StringExpression + Nc17 jet.StringExpression +}{ + G: jet.NewEnumValue("G"), + Pg: jet.NewEnumValue("PG"), + Pg13: jet.NewEnumValue("PG-13"), + R: jet.NewEnumValue("R"), + Nc17: jet.NewEnumValue("NC-17"), +} +` + +var actorSQLBuilderFile = ` +package table + +import ( + "github.com/go-jet/jet" +) + +var Actor = newActorTable() + +type ActorTable struct { + jet.Table + + //Columns + ActorID jet.ColumnInteger + FirstName jet.ColumnString + LastName jet.ColumnString + LastUpdate jet.ColumnTimestamp + + AllColumns jet.ColumnList + MutableColumns jet.ColumnList +} + +// creates new ActorTable with assigned alias +func (a *ActorTable) AS(alias string) *ActorTable { + aliasTable := newActorTable() + + aliasTable.Table.AS(alias) + + return aliasTable +} + +func newActorTable() *ActorTable { + var ( + ActorIDColumn = jet.IntegerColumn("actor_id") + FirstNameColumn = jet.StringColumn("first_name") + LastNameColumn = jet.StringColumn("last_name") + LastUpdateColumn = jet.TimestampColumn("last_update") + ) + + return &ActorTable{ + Table: jet.NewTable("dvds", "actor", ActorIDColumn, FirstNameColumn, LastNameColumn, LastUpdateColumn), + + //Columns + ActorID: ActorIDColumn, + FirstName: FirstNameColumn, + LastName: LastNameColumn, + LastUpdate: LastUpdateColumn, + + AllColumns: jet.ColumnList{ActorIDColumn, FirstNameColumn, LastNameColumn, LastUpdateColumn}, + MutableColumns: jet.ColumnList{FirstNameColumn, LastNameColumn, LastUpdateColumn}, + } +} +` + +var actorModelFile = ` +package model + +import ( + "time" +) + +type Actor struct { + ActorID int32 ` + "`sql:\"primary_key\"`" + ` + FirstName string + LastName string + LastUpdate time.Time +} +`