From 070d82f90f6ad1ec9a04a3f65e719ded955a429f Mon Sep 17 00:00:00 2001 From: go-jet Date: Thu, 8 Aug 2019 17:51:20 +0200 Subject: [PATCH] Generator tests for MySQL. --- generator/internal/template/templates.go | 6 +- tests/mysql/generator_test.go | 202 +++++++++++++++ .../{mysql_main_test.go => main_test.go} | 0 tests/postgres/generator_test.go | 236 ++++++++++++++++++ tests/postgres/main_test.go | 228 ----------------- 5 files changed, 441 insertions(+), 231 deletions(-) create mode 100644 tests/mysql/generator_test.go rename tests/mysql/{mysql_main_test.go => main_test.go} (100%) create mode 100644 tests/postgres/generator_test.go diff --git a/generator/internal/template/templates.go b/generator/internal/template/templates.go index 594867a..c7c064f 100644 --- a/generator/internal/template/templates.go +++ b/generator/internal/template/templates.go @@ -90,15 +90,15 @@ type {{ToGoIdentifier .Name}} struct { ` var enumSQLBuilderTemplate = `package enum -import "github.com/go-jet/jet/postgres" +import "github.com/go-jet/jet/{{dialect.PackageName}}" var {{ToGoIdentifier $.Name}} = &struct { {{- range $index, $element := .Values}} - {{ToGoIdentifier $element}} postgres.StringExpression + {{ToGoIdentifier $element}} {{dialect.PackageName}}.StringExpression {{- end}} } { {{- range $index, $element := .Values}} - {{ToGoIdentifier $element}}: postgres.NewEnumValue("{{$element}}"), + {{ToGoIdentifier $element}}: {{dialect.PackageName}}.NewEnumValue("{{$element}}"), {{- end}} } ` diff --git a/tests/mysql/generator_test.go b/tests/mysql/generator_test.go new file mode 100644 index 0000000..91c45c0 --- /dev/null +++ b/tests/mysql/generator_test.go @@ -0,0 +1,202 @@ +package mysql + +import ( + "bytes" + "github.com/go-jet/jet/generator/mysql" + "github.com/go-jet/jet/tests/dbconfig" + "gotest.tools/assert" + "io/ioutil" + "os" + "os/exec" + "testing" +) + +const genTestDir2 = "./.gentestdata2/mysql" + +func TestGenerator(t *testing.T) { + + err := os.RemoveAll(genTestDir2) + assert.NilError(t, err) + + err = mysql.Generate(genTestDir2, mysql.DBConnection{ + Host: dbconfig.MySqLHost, + Port: dbconfig.MySQLPort, + User: dbconfig.MySQLUser, + Password: dbconfig.MySQLPassword, + DBName: "dvds", + }) + + assert.NilError(t, err) + + assertGeneratedFiles(t) + + err = os.RemoveAll(genTestDir2) + assert.NilError(t, err) +} + +func TestCmdGenerator(t *testing.T) { + goInstallJet := exec.Command("sh", "-c", "go install github.com/go-jet/jet/cmd/jet") + goInstallJet.Stderr = os.Stderr + err := goInstallJet.Run() + assert.NilError(t, err) + + err = os.RemoveAll(genTestDir2) + assert.NilError(t, err) + + cmd := exec.Command("jet", "-source=MySQL", "-dbname=dvds", "-host=localhost", "-port=3306", + "-user=jet", "-password=jet", "-path="+genTestDir2) + + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + + err = cmd.Run() + 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/mysql/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/mysql/dvds/table/actor.go", "\npackage table", actorSQLBuilderFile) + + // Enums SQL Builder files + enumFiles, err := ioutil.ReadDir("./.gentestdata2/mysql/dvds/enum") + assert.NilError(t, err) + + assertFileNameEqual(t, enumFiles, "film_list_rating.go", "film_rating.go", "nicer_but_slower_film_list_rating.go") + assertFileContent(t, "./.gentestdata2/mysql/dvds/enum/film_rating.go", "\npackage enum", mpaaRatingEnumFile) + + // Model files + modelFiles, err := ioutil.ReadDir("./.gentestdata2/mysql/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", "film_list_rating.go", "film_rating.go", "nicer_but_slower_film_list_rating.go") + + assertFileContent(t, "./.gentestdata2/mysql/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/mysql" + +var FilmRating = &struct { + G mysql.StringExpression + Pg mysql.StringExpression + Pg13 mysql.StringExpression + R mysql.StringExpression + Nc17 mysql.StringExpression +}{ + G: mysql.NewEnumValue("G"), + Pg: mysql.NewEnumValue("PG"), + Pg13: mysql.NewEnumValue("PG-13"), + R: mysql.NewEnumValue("R"), + Nc17: mysql.NewEnumValue("NC-17"), +} +` + +var actorSQLBuilderFile = ` +package table + +import ( + "github.com/go-jet/jet/mysql" +) + +var Actor = newActorTable() + +type ActorTable struct { + mysql.Table + + //Columns + ActorID mysql.ColumnInteger + FirstName mysql.ColumnString + LastName mysql.ColumnString + LastUpdate mysql.ColumnTimestamp + + AllColumns mysql.IColumnList + MutableColumns mysql.IColumnList +} + +// 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 = mysql.IntegerColumn("actor_id") + FirstNameColumn = mysql.StringColumn("first_name") + LastNameColumn = mysql.StringColumn("last_name") + LastUpdateColumn = mysql.TimestampColumn("last_update") + ) + + return &ActorTable{ + Table: mysql.NewTable("dvds", "actor", ActorIDColumn, FirstNameColumn, LastNameColumn, LastUpdateColumn), + + //Columns + ActorID: ActorIDColumn, + FirstName: FirstNameColumn, + LastName: LastNameColumn, + LastUpdate: LastUpdateColumn, + + AllColumns: mysql.ColumnList(ActorIDColumn, FirstNameColumn, LastNameColumn, LastUpdateColumn), + MutableColumns: mysql.ColumnList(FirstNameColumn, LastNameColumn, LastUpdateColumn), + } +} +` + +var actorModelFile = ` +package model + +import ( + "time" +) + +type Actor struct { + ActorID uint16 ` + "`sql:\"primary_key\"`" + ` + FirstName string + LastName string + LastUpdate time.Time +} +` diff --git a/tests/mysql/mysql_main_test.go b/tests/mysql/main_test.go similarity index 100% rename from tests/mysql/mysql_main_test.go rename to tests/mysql/main_test.go diff --git a/tests/postgres/generator_test.go b/tests/postgres/generator_test.go new file mode 100644 index 0000000..f09c324 --- /dev/null +++ b/tests/postgres/generator_test.go @@ -0,0 +1,236 @@ +package postgres + +import ( + "bytes" + "github.com/go-jet/jet/generator/postgres" + "github.com/go-jet/jet/tests/dbconfig" + "gotest.tools/assert" + "io/ioutil" + "os" + "os/exec" + "reflect" + "testing" + + "github.com/go-jet/jet/tests/.gentestdata/jetdb/dvds/model" +) + +func TestGeneratedModel(t *testing.T) { + + actor := model.Actor{} + + assert.Equal(t, reflect.TypeOf(actor.ActorID).String(), "int32") + actorIDField, ok := reflect.TypeOf(actor).FieldByName("ActorID") + assert.Assert(t, ok) + assert.Equal(t, actorIDField.Tag.Get("sql"), "primary_key") + assert.Equal(t, reflect.TypeOf(actor.FirstName).String(), "string") + assert.Equal(t, reflect.TypeOf(actor.LastName).String(), "string") + assert.Equal(t, reflect.TypeOf(actor.LastUpdate).String(), "time.Time") + + filmActor := model.FilmActor{} + + assert.Equal(t, reflect.TypeOf(filmActor.FilmID).String(), "int16") + filmIDField, ok := reflect.TypeOf(filmActor).FieldByName("FilmID") + assert.Assert(t, ok) + assert.Equal(t, filmIDField.Tag.Get("sql"), "primary_key") + + assert.Equal(t, reflect.TypeOf(filmActor.ActorID).String(), "int16") + actorIDField, ok = reflect.TypeOf(filmActor).FieldByName("ActorID") + assert.Assert(t, ok) + assert.Equal(t, filmIDField.Tag.Get("sql"), "primary_key") + + staff := model.Staff{} + + 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) { + goInstallJet := exec.Command("sh", "-c", "go install github.com/go-jet/jet/cmd/jet") + goInstallJet.Stderr = os.Stderr + err := goInstallJet.Run() + assert.NilError(t, err) + + 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") + assert.NilError(t, err) + + 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/postgres" + +var MpaaRating = &struct { + G postgres.StringExpression + Pg postgres.StringExpression + Pg13 postgres.StringExpression + R postgres.StringExpression + Nc17 postgres.StringExpression +}{ + G: postgres.NewEnumValue("G"), + Pg: postgres.NewEnumValue("PG"), + Pg13: postgres.NewEnumValue("PG-13"), + R: postgres.NewEnumValue("R"), + Nc17: postgres.NewEnumValue("NC-17"), +} +` + +var actorSQLBuilderFile = ` +package table + +import ( + "github.com/go-jet/jet/postgres" +) + +var Actor = newActorTable() + +type ActorTable struct { + postgres.Table + + //Columns + ActorID postgres.ColumnInteger + FirstName postgres.ColumnString + LastName postgres.ColumnString + LastUpdate postgres.ColumnTimestamp + + AllColumns postgres.IColumnList + MutableColumns postgres.IColumnList +} + +// 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 = postgres.IntegerColumn("actor_id") + FirstNameColumn = postgres.StringColumn("first_name") + LastNameColumn = postgres.StringColumn("last_name") + LastUpdateColumn = postgres.TimestampColumn("last_update") + ) + + return &ActorTable{ + Table: postgres.NewTable("dvds", "actor", ActorIDColumn, FirstNameColumn, LastNameColumn, LastUpdateColumn), + + //Columns + ActorID: ActorIDColumn, + FirstName: FirstNameColumn, + LastName: LastNameColumn, + LastUpdate: LastUpdateColumn, + + AllColumns: postgres.ColumnList(ActorIDColumn, FirstNameColumn, LastNameColumn, LastUpdateColumn), + MutableColumns: postgres.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 +} +` diff --git a/tests/postgres/main_test.go b/tests/postgres/main_test.go index 4cffae0..dda4fe7 100644 --- a/tests/postgres/main_test.go +++ b/tests/postgres/main_test.go @@ -1,18 +1,11 @@ package postgres 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" ) @@ -32,224 +25,3 @@ func TestMain(m *testing.M) { os.Exit(ret) } - -func TestGeneratedModel(t *testing.T) { - - actor := model.Actor{} - - assert.Equal(t, reflect.TypeOf(actor.ActorID).String(), "int32") - actorIDField, ok := reflect.TypeOf(actor).FieldByName("ActorID") - assert.Assert(t, ok) - assert.Equal(t, actorIDField.Tag.Get("sql"), "primary_key") - assert.Equal(t, reflect.TypeOf(actor.FirstName).String(), "string") - assert.Equal(t, reflect.TypeOf(actor.LastName).String(), "string") - assert.Equal(t, reflect.TypeOf(actor.LastUpdate).String(), "time.Time") - - filmActor := model.FilmActor{} - - assert.Equal(t, reflect.TypeOf(filmActor.FilmID).String(), "int16") - filmIDField, ok := reflect.TypeOf(filmActor).FieldByName("FilmID") - assert.Assert(t, ok) - assert.Equal(t, filmIDField.Tag.Get("sql"), "primary_key") - - assert.Equal(t, reflect.TypeOf(filmActor.ActorID).String(), "int16") - actorIDField, ok = reflect.TypeOf(filmActor).FieldByName("ActorID") - assert.Assert(t, ok) - assert.Equal(t, filmIDField.Tag.Get("sql"), "primary_key") - - staff := model.Staff{} - - 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) { - goInstallJet := exec.Command("sh", "-c", "go install github.com/go-jet/jet/cmd/jet") - goInstallJet.Stderr = os.Stderr - err := goInstallJet.Run() - assert.NilError(t, err) - - 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") - assert.NilError(t, err) - - 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/postgres" - -var MpaaRating = &struct { - G postgres.StringExpression - Pg postgres.StringExpression - Pg13 postgres.StringExpression - R postgres.StringExpression - Nc17 postgres.StringExpression -}{ - G: postgres.NewEnumValue("G"), - Pg: postgres.NewEnumValue("PG"), - Pg13: postgres.NewEnumValue("PG-13"), - R: postgres.NewEnumValue("R"), - Nc17: postgres.NewEnumValue("NC-17"), -} -` - -var actorSQLBuilderFile = ` -package table - -import ( - "github.com/go-jet/jet/postgres" -) - -var Actor = newActorTable() - -type ActorTable struct { - postgres.Table - - //Columns - ActorID postgres.ColumnInteger - FirstName postgres.ColumnString - LastName postgres.ColumnString - LastUpdate postgres.ColumnTimestamp - - AllColumns postgres.IColumnList - MutableColumns postgres.IColumnList -} - -// 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 = postgres.IntegerColumn("actor_id") - FirstNameColumn = postgres.StringColumn("first_name") - LastNameColumn = postgres.StringColumn("last_name") - LastUpdateColumn = postgres.TimestampColumn("last_update") - ) - - return &ActorTable{ - Table: postgres.NewTable("dvds", "actor", ActorIDColumn, FirstNameColumn, LastNameColumn, LastUpdateColumn), - - //Columns - ActorID: ActorIDColumn, - FirstName: FirstNameColumn, - LastName: LastNameColumn, - LastUpdate: LastUpdateColumn, - - AllColumns: postgres.ColumnList(ActorIDColumn, FirstNameColumn, LastNameColumn, LastUpdateColumn), - MutableColumns: postgres.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 -} -`