From b4ba7a0f97f5f048a839316babaa1ddf124277ca Mon Sep 17 00:00:00 2001 From: Bowen Date: Sun, 9 Mar 2025 12:59:42 +0800 Subject: [PATCH 1/2] feat: Implement Sqlite Mysql drivers --- contracts/database/driver/grammar.go | 9 + database/db/query.go | 7 +- database/db/row.go | 2 +- go.mod | 2 +- mocks/database/driver/Blueprint.go | 47 + mocks/database/driver/Schema.go | 170 +- tests/db_test.go | 188 +- tests/go.mod | 17 +- tests/go.sum | 50 +- tests/migrator_test.go | 47 +- tests/mock_config.go | 26 +- tests/orm_test.go | 11 +- tests/query.go | 185 +- tests/query_test.go | 348 ++-- tests/repository_test.go | 11 +- tests/schema_test.go | 2898 +++++++++++++------------- 16 files changed, 2160 insertions(+), 1858 deletions(-) diff --git a/contracts/database/driver/grammar.go b/contracts/database/driver/grammar.go index 117e7354a..745ce4821 100644 --- a/contracts/database/driver/grammar.go +++ b/contracts/database/driver/grammar.go @@ -2,6 +2,7 @@ package driver import ( sq "github.com/Masterminds/squirrel" + "github.com/goravel/framework/contracts/database/orm" "gorm.io/gorm/clause" ) @@ -159,11 +160,19 @@ type CompileLimitGrammar interface { } type Schema interface { + // GetColumns Get the columns for a given table. + GetColumns(table string) ([]Column, error) + // GetIndexes Get the indexes for a given table. + GetIndexes(table string) ([]Index, error) + // Orm Get the orm instance. + Orm() orm.Orm } type Blueprint interface { // GetAddedColumns Get the added columns. GetAddedColumns() []ColumnDefinition + // GetCommands Get the commands. + GetCommands() []*Command // GetTableName Get the table name with prefix. GetTableName() string // HasCommand Determine if the blueprint has a specific command. diff --git a/database/db/query.go b/database/db/query.go index b0ea83cfb..234ff715e 100644 --- a/database/db/query.go +++ b/database/db/query.go @@ -56,12 +56,7 @@ func (r *Query) Chunk(size uint64, callback func(rows []db.Row) error) error { var destSlice []db.Row for row := range rows { - var dest map[string]any - if err := row.Scan(&dest); err != nil { - return err - } - - destSlice = append(destSlice, NewRow(dest)) + destSlice = append(destSlice, row) } if len(destSlice) == 0 { diff --git a/database/db/row.go b/database/db/row.go index b6244e85b..53998f5d3 100644 --- a/database/db/row.go +++ b/database/db/row.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/mitchellh/mapstructure" + "github.com/go-viper/mapstructure/v2" "gorm.io/gorm" "github.com/goravel/framework/support/carbon" diff --git a/go.mod b/go.mod index 8174d2340..a6a025d8b 100644 --- a/go.mod +++ b/go.mod @@ -85,7 +85,7 @@ require ( github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.16 github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect - github.com/mitchellh/mapstructure v1.5.0 + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/termenv v0.16.0 // indirect diff --git a/mocks/database/driver/Blueprint.go b/mocks/database/driver/Blueprint.go index ee97cd31d..4e71d2ea9 100644 --- a/mocks/database/driver/Blueprint.go +++ b/mocks/database/driver/Blueprint.go @@ -67,6 +67,53 @@ func (_c *Blueprint_GetAddedColumns_Call) RunAndReturn(run func() []driver.Colum return _c } +// GetCommands provides a mock function with no fields +func (_m *Blueprint) GetCommands() []*driver.Command { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetCommands") + } + + var r0 []*driver.Command + if rf, ok := ret.Get(0).(func() []*driver.Command); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*driver.Command) + } + } + + return r0 +} + +// Blueprint_GetCommands_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCommands' +type Blueprint_GetCommands_Call struct { + *mock.Call +} + +// GetCommands is a helper method to define mock.On call +func (_e *Blueprint_Expecter) GetCommands() *Blueprint_GetCommands_Call { + return &Blueprint_GetCommands_Call{Call: _e.mock.On("GetCommands")} +} + +func (_c *Blueprint_GetCommands_Call) Run(run func()) *Blueprint_GetCommands_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Blueprint_GetCommands_Call) Return(_a0 []*driver.Command) *Blueprint_GetCommands_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Blueprint_GetCommands_Call) RunAndReturn(run func() []*driver.Command) *Blueprint_GetCommands_Call { + _c.Call.Return(run) + return _c +} + // GetTableName provides a mock function with no fields func (_m *Blueprint) GetTableName() string { ret := _m.Called() diff --git a/mocks/database/driver/Schema.go b/mocks/database/driver/Schema.go index 2e72b6120..c0fd6657e 100644 --- a/mocks/database/driver/Schema.go +++ b/mocks/database/driver/Schema.go @@ -2,7 +2,12 @@ package driver -import mock "github.com/stretchr/testify/mock" +import ( + driver "github.com/goravel/framework/contracts/database/driver" + mock "github.com/stretchr/testify/mock" + + orm "github.com/goravel/framework/contracts/database/orm" +) // Schema is an autogenerated mock type for the Schema type type Schema struct { @@ -17,6 +22,169 @@ func (_m *Schema) EXPECT() *Schema_Expecter { return &Schema_Expecter{mock: &_m.Mock} } +// GetColumns provides a mock function with given fields: table +func (_m *Schema) GetColumns(table string) ([]driver.Column, error) { + ret := _m.Called(table) + + if len(ret) == 0 { + panic("no return value specified for GetColumns") + } + + var r0 []driver.Column + var r1 error + if rf, ok := ret.Get(0).(func(string) ([]driver.Column, error)); ok { + return rf(table) + } + if rf, ok := ret.Get(0).(func(string) []driver.Column); ok { + r0 = rf(table) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]driver.Column) + } + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(table) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Schema_GetColumns_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetColumns' +type Schema_GetColumns_Call struct { + *mock.Call +} + +// GetColumns is a helper method to define mock.On call +// - table string +func (_e *Schema_Expecter) GetColumns(table interface{}) *Schema_GetColumns_Call { + return &Schema_GetColumns_Call{Call: _e.mock.On("GetColumns", table)} +} + +func (_c *Schema_GetColumns_Call) Run(run func(table string)) *Schema_GetColumns_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *Schema_GetColumns_Call) Return(_a0 []driver.Column, _a1 error) *Schema_GetColumns_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *Schema_GetColumns_Call) RunAndReturn(run func(string) ([]driver.Column, error)) *Schema_GetColumns_Call { + _c.Call.Return(run) + return _c +} + +// GetIndexes provides a mock function with given fields: table +func (_m *Schema) GetIndexes(table string) ([]driver.Index, error) { + ret := _m.Called(table) + + if len(ret) == 0 { + panic("no return value specified for GetIndexes") + } + + var r0 []driver.Index + var r1 error + if rf, ok := ret.Get(0).(func(string) ([]driver.Index, error)); ok { + return rf(table) + } + if rf, ok := ret.Get(0).(func(string) []driver.Index); ok { + r0 = rf(table) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]driver.Index) + } + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(table) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Schema_GetIndexes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetIndexes' +type Schema_GetIndexes_Call struct { + *mock.Call +} + +// GetIndexes is a helper method to define mock.On call +// - table string +func (_e *Schema_Expecter) GetIndexes(table interface{}) *Schema_GetIndexes_Call { + return &Schema_GetIndexes_Call{Call: _e.mock.On("GetIndexes", table)} +} + +func (_c *Schema_GetIndexes_Call) Run(run func(table string)) *Schema_GetIndexes_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *Schema_GetIndexes_Call) Return(_a0 []driver.Index, _a1 error) *Schema_GetIndexes_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *Schema_GetIndexes_Call) RunAndReturn(run func(string) ([]driver.Index, error)) *Schema_GetIndexes_Call { + _c.Call.Return(run) + return _c +} + +// Orm provides a mock function with no fields +func (_m *Schema) Orm() orm.Orm { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Orm") + } + + var r0 orm.Orm + if rf, ok := ret.Get(0).(func() orm.Orm); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(orm.Orm) + } + } + + return r0 +} + +// Schema_Orm_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Orm' +type Schema_Orm_Call struct { + *mock.Call +} + +// Orm is a helper method to define mock.On call +func (_e *Schema_Expecter) Orm() *Schema_Orm_Call { + return &Schema_Orm_Call{Call: _e.mock.On("Orm")} +} + +func (_c *Schema_Orm_Call) Run(run func()) *Schema_Orm_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Schema_Orm_Call) Return(_a0 orm.Orm) *Schema_Orm_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *Schema_Orm_Call) RunAndReturn(run func() orm.Orm) *Schema_Orm_Call { + _c.Call.Return(run) + return _c +} + // NewSchema creates a new instance of Schema. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. func NewSchema(t interface { diff --git a/tests/db_test.go b/tests/db_test.go index 8204267c9..4f5e64fd3 100644 --- a/tests/db_test.go +++ b/tests/db_test.go @@ -7,15 +7,17 @@ import ( "testing" "time" + "github.com/spf13/cast" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + "github.com/goravel/framework/contracts/database/db" "github.com/goravel/framework/errors" "github.com/goravel/framework/support/carbon" "github.com/goravel/framework/support/convert" "github.com/goravel/postgres" + "github.com/goravel/sqlite" "github.com/goravel/sqlserver" - "github.com/spf13/cast" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/suite" ) type DBTestSuite struct { @@ -43,11 +45,11 @@ func (s *DBTestSuite) SetupTest() { } func (s *DBTestSuite) TearDownSuite() { - // if s.queries[sqlite.Name] != nil { - // docker, err := s.queries[sqlite.Name].Driver().Docker() - // s.NoError(err) - // s.NoError(docker.Shutdown()) - // } + if s.queries[sqlite.Name] != nil { + docker, err := s.queries[sqlite.Name].Driver().Docker() + s.NoError(err) + s.NoError(docker.Shutdown()) + } } func (s *DBTestSuite) TestCount() { @@ -505,28 +507,28 @@ func (s *DBTestSuite) TestInsert_First_Get() { } } -// func (s *DBTestSuite) TestInsertGetId() { -// for driver, query := range s.queries { -// s.Run(driver, func() { -// id, err := query.DB().Table("products").InsertGetId(Product{ -// Name: "insert get id", -// }) - -// if driver == sqlserver.Name || driver == postgres.Name { -// s.Error(err) -// s.Equal(int64(0), id) -// } else { -// s.NoError(err) -// s.True(id > 0) - -// var product Product -// err = query.DB().Table("products").Where("id", id).First(&product) -// s.NoError(err) -// s.Equal("insert get id", product.Name) -// } -// }) -// } -// } +func (s *DBTestSuite) TestInsertGetId() { + for driver, query := range s.queries { + s.Run(driver, func() { + id, err := query.DB().Table("products").InsertGetId(Product{ + Name: "insert get id", + }) + + if driver == sqlserver.Name || driver == postgres.Name { + s.Error(err) + s.Equal(int64(0), id) + } else { + s.NoError(err) + s.True(id > 0) + + var product Product + err = query.DB().Table("products").Where("id", id).First(&product) + s.NoError(err) + s.Equal("insert get id", product.Name) + } + }) + } +} func (s *DBTestSuite) TestJoin() { for driver, query := range s.queries { @@ -627,6 +629,10 @@ func (s *DBTestSuite) TestLimit() { func (s *DBTestSuite) TestLockForUpdate() { for driver, query := range s.queries { + if driver == sqlite.Name { + continue + } + s.Run(driver, func() { query.DB().Table("products").Insert([]Product{ {Name: "lock_for_update_product"}, @@ -674,19 +680,11 @@ func (s *DBTestSuite) TestOffset() { }) var products []Product - err := query.DB().Table("products").Offset(1).Get(&products) - s.NoError(err) + err := query.DB().Table("products").Offset(1).Limit(1).Get(&products) - if driver == sqlserver.Name { - s.Equal(3, len(products)) - s.Equal("offset_product1", products[0].Name) - s.Equal("offset_product2", products[1].Name) - s.Equal("offset_product3", products[2].Name) - } else { - s.Equal(2, len(products)) - s.Equal("offset_product2", products[0].Name) - s.Equal("offset_product3", products[1].Name) - } + s.NoError(err) + s.Equal(1, len(products)) + s.Equal("offset_product2", products[0].Name) }) } } @@ -871,6 +869,10 @@ func (s *DBTestSuite) TestRightJoin() { func (s *DBTestSuite) TestSharedLock() { for driver, query := range s.queries { + if driver == sqlite.Name { + continue + } + s.Run(driver, func() { query.DB().Table("products").Insert([]Product{ {Name: "shared_lock_product"}, @@ -1330,54 +1332,54 @@ func (s *DBTestSuite) TestWhereNot() { } } -// func TestDB_Connection(t *testing.T) { -// t.Parallel() -// postgresTestQuery := NewTestQueryBuilder().Postgres("", false) -// postgresTestQuery.CreateTable(TestTableProducts) - -// sqliteTestQuery := NewTestQueryBuilder().Sqlite("", false) -// sqliteTestQuery.CreateTable(TestTableProducts) -// defer func() { -// docker, err := sqliteTestQuery.Driver().Docker() -// assert.NoError(t, err) -// assert.NoError(t, docker.Shutdown()) -// }() - -// sqliteConnection := sqliteTestQuery.Driver().Config().Connection -// mockDatabaseConfig(postgresTestQuery.MockConfig(), sqliteTestQuery.Driver().Config(), sqliteConnection, "", false) - -// result, err := postgresTestQuery.DB().Table("products").Insert(Product{ -// Name: "connection", -// }) - -// assert.NoError(t, err) -// assert.Equal(t, int64(1), result.RowsAffected) - -// var product Product -// err = postgresTestQuery.DB().Table("products").Where("name", "connection").First(&product) -// assert.NoError(t, err) -// assert.True(t, product.ID > 0) -// assert.Equal(t, "connection", product.Name) - -// var product1 Product -// err = postgresTestQuery.DB().Connection(sqliteConnection).Table("products").Where("name", "connection").First(&product1) -// assert.NoError(t, err) -// assert.True(t, product1.ID == 0) - -// result, err = postgresTestQuery.DB().Connection(sqliteConnection).Table("products").Insert(Product{ -// Name: "sqlite connection", -// }) -// assert.NoError(t, err) -// assert.Equal(t, int64(1), result.RowsAffected) - -// var product2 Product -// err = postgresTestQuery.DB().Connection(sqliteConnection).Table("products").Where("name", "sqlite connection").First(&product2) -// assert.NoError(t, err) -// assert.True(t, product2.ID > 0) -// assert.Equal(t, "sqlite connection", product2.Name) - -// var product3 Product -// err = postgresTestQuery.DB().Table("products").Where("name", "sqlite connection").First(&product3) -// assert.NoError(t, err) -// assert.True(t, product3.ID == 0) -// } +func TestDB_Connection(t *testing.T) { + t.Parallel() + postgresTestQuery := NewTestQueryBuilder().Postgres("", false) + postgresTestQuery.CreateTable(TestTableProducts) + + sqliteTestQuery := NewTestQueryBuilder().Sqlite("", false) + sqliteTestQuery.CreateTable(TestTableProducts) + defer func() { + docker, err := sqliteTestQuery.Driver().Docker() + assert.NoError(t, err) + assert.NoError(t, docker.Shutdown()) + }() + + sqliteConnection := sqliteTestQuery.Driver().Config().Connection + mockDatabaseConfig(postgresTestQuery.MockConfig(), sqliteTestQuery.Driver().Config(), sqliteConnection, "", false) + + result, err := postgresTestQuery.DB().Table("products").Insert(Product{ + Name: "connection", + }) + + assert.NoError(t, err) + assert.Equal(t, int64(1), result.RowsAffected) + + var product Product + err = postgresTestQuery.DB().Table("products").Where("name", "connection").First(&product) + assert.NoError(t, err) + assert.True(t, product.ID > 0) + assert.Equal(t, "connection", product.Name) + + var product1 Product + err = postgresTestQuery.DB().Connection(sqliteConnection).Table("products").Where("name", "connection").First(&product1) + assert.NoError(t, err) + assert.True(t, product1.ID == 0) + + result, err = postgresTestQuery.DB().Connection(sqliteConnection).Table("products").Insert(Product{ + Name: "sqlite connection", + }) + assert.NoError(t, err) + assert.Equal(t, int64(1), result.RowsAffected) + + var product2 Product + err = postgresTestQuery.DB().Connection(sqliteConnection).Table("products").Where("name", "sqlite connection").First(&product2) + assert.NoError(t, err) + assert.True(t, product2.ID > 0) + assert.Equal(t, "sqlite connection", product2.Name) + + var product3 Product + err = postgresTestQuery.DB().Table("products").Where("name", "sqlite connection").First(&product3) + assert.NoError(t, err) + assert.True(t, product3.ID == 0) +} diff --git a/tests/go.mod b/tests/go.mod index 550a955c2..8cee4c368 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -9,7 +9,9 @@ godebug x509negativeserial=1 require ( github.com/brianvoe/gofakeit/v7 v7.2.1 github.com/goravel/framework v1.15.4 + github.com/goravel/mysql v0.0.0-20250304195634-71a67b22a27a github.com/goravel/postgres v0.0.2-0.20250308101510-84fe97cf908f + github.com/goravel/sqlite v0.0.0-20250301031930-fef86990c00d github.com/goravel/sqlserver v0.0.0-20250309034753-57ae2c9b8bb4 github.com/jmoiron/sqlx v1.4.0 github.com/spf13/cast v1.7.1 @@ -21,13 +23,19 @@ require ( atomicgo.dev/cursor v0.2.0 // indirect atomicgo.dev/keyboard v0.2.9 // indirect atomicgo.dev/schedule v0.1.0 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/containerd/console v1.0.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dromara/carbon/v2 v2.5.4 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/glebarez/go-sqlite v1.22.0 // indirect + github.com/glebarez/sqlite v1.11.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect @@ -42,12 +50,14 @@ require ( github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/lithammer/fuzzysearch v1.1.8 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/microsoft/go-mssqldb v1.8.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/pterm/pterm v0.12.80 // indirect github.com/redis/go-redis/v9 v9.7.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/samber/lo v1.49.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect @@ -64,9 +74,14 @@ require ( google.golang.org/grpc v1.71.0 // indirect google.golang.org/protobuf v1.36.5 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/mysql v1.5.7 // indirect gorm.io/driver/postgres v1.5.11 // indirect gorm.io/driver/sqlserver v1.5.4 // indirect gorm.io/plugin/dbresolver v1.5.3 // indirect + modernc.org/libc v1.61.11 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.8.2 // indirect + modernc.org/sqlite v1.34.5 // indirect ) replace ( diff --git a/tests/go.sum b/tests/go.sum index 4ee9b6381..3b80decbf 100644 --- a/tests/go.sum +++ b/tests/go.sum @@ -38,6 +38,8 @@ github.com/MarvinJWendt/testza v0.3.0/go.mod h1:eFcL4I0idjtIx8P9C6KkAuLgATNKpX4/ github.com/MarvinJWendt/testza v0.4.2/go.mod h1:mSdhXiKH8sg/gQehJ63bINcCKp7RtYewEjXsvsVUPbE= github.com/MarvinJWendt/testza v0.5.2 h1:53KDo64C1z/h/d/stCYCPY69bt/OSwjq5KpFNwi+zB4= github.com/MarvinJWendt/testza v0.5.2/go.mod h1:xu53QFE5sCdjtMCKk8YMQ2MnymimEctc4n3EjyIYvEY= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= @@ -62,10 +64,16 @@ github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/ github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/dromara/carbon/v2 v2.5.4 h1:BkftNHVCkEwzv6ZuFiB/R1rLHaw6ufbCVkyLDCf3GeY= github.com/dromara/carbon/v2 v2.5.4/go.mod h1:zyPlND2o27sKKkRmdgLbk/qYxkmmH6Z4eE8OoM0w3DM= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= +github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= +github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= +github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -87,6 +95,8 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -95,8 +105,12 @@ github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQ github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= +github.com/goravel/mysql v0.0.0-20250304195634-71a67b22a27a h1:QSjmP2XWjpZI1upqNPf6YpXXr53KBfMiAvBOckWawx0= +github.com/goravel/mysql v0.0.0-20250304195634-71a67b22a27a/go.mod h1:C6xxY0TOCkCNwfA8St3Ty+EWTMJXOD+f4hyN9EYEtws= github.com/goravel/postgres v0.0.2-0.20250308101510-84fe97cf908f h1:IXZuq1JI3Fst8wEBRRkH3TU0ngGTbX2BsaNl9GwYGkI= github.com/goravel/postgres v0.0.2-0.20250308101510-84fe97cf908f/go.mod h1:lOQxiRGy36ch1ZHDT3RhIrwMEccp/4Km3G4sv8I+iQI= +github.com/goravel/sqlite v0.0.0-20250301031930-fef86990c00d h1:CoXZ0QFVOgvYxFZv8PblWBSw8HYYJYiFUhwFOcF9o24= +github.com/goravel/sqlite v0.0.0-20250301031930-fef86990c00d/go.mod h1:5aqawjDfrMnSrz1vffkDv2N9rbRqx8sITHrf7EEOx6E= github.com/goravel/sqlserver v0.0.0-20250309034753-57ae2c9b8bb4 h1:g+waLC1LkdX/6I/estkmaZRI85rXnvzjmquOkt9AUfc= github.com/goravel/sqlserver v0.0.0-20250309034753-57ae2c9b8bb4/go.mod h1:L/45aUBsACppYeu3IelbDeCN9pjcyvcXKtxs3TFiyVQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= @@ -145,6 +159,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -153,10 +169,10 @@ github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxU github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= github.com/microsoft/go-mssqldb v1.8.0 h1:7cyZ/AT7ycDsEoWPIXibd+aVKFtteUNhDGf3aobP+tw= github.com/microsoft/go-mssqldb v1.8.0/go.mod h1:6znkekS3T2vp0waiMhen4GPU1BiAsrP+iXHcE7a7rFo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= @@ -174,6 +190,8 @@ github.com/pterm/pterm v0.12.80 h1:mM55B+GnKUnLMUSqhdINe4s6tOuVQIetQ3my8JGyAIg= github.com/pterm/pterm v0.12.80/go.mod h1:c6DeF9bSnOSeFPZlfs4ZRAFcf5SCoTwvwQ5xaKGQlHo= github.com/redis/go-redis/v9 v9.7.1 h1:4LhKRCIduqXqtvCUlaq9c8bdHOkICjDMrr1+Zb3osAc= github.com/redis/go-redis/v9 v9.7.1/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -234,6 +252,8 @@ golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -306,6 +326,8 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= +golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 h1:J1H9f+LEdWAfHcez/4cvaVBox7cOYT+IU6rgqj5x++8= google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= @@ -338,3 +360,27 @@ gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= gorm.io/plugin/dbresolver v1.5.3 h1:wFwINGZZmttuu9h7XpvbDHd8Lf9bb8GNzp/NpAMV2wU= gorm.io/plugin/dbresolver v1.5.3/go.mod h1:TSrVhaUg2DZAWP3PrHlDlITEJmNOkL0tFTjvTEsQ4XE= +modernc.org/cc/v4 v4.24.4 h1:TFkx1s6dCkQpd6dKurBNmpo+G8Zl4Sq/ztJ+2+DEsh0= +modernc.org/cc/v4 v4.24.4/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/ccgo/v4 v4.23.15 h1:wFDan71KnYqeHz4eF63vmGE6Q6Pc0PUGDpP0PRMYjDc= +modernc.org/ccgo/v4 v4.23.15/go.mod h1:nJX30dks/IWuBOnVa7VRii9Me4/9TZ1SC9GNtmARTy0= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.6.2 h1:YBXi5Kqp6aCK3fIxwKQ3/fErvawVKwjOLItxj1brGds= +modernc.org/gc/v2 v2.6.2/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/libc v1.61.11 h1:6sZG8uB6EMMG7iTLPTndi8jyTdgAQNIeLGjCFICACZw= +modernc.org/libc v1.61.11/go.mod h1:HHX+srFdn839oaJRd0W8hBM3eg+mieyZCAjWwB08/nM= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.8.2 h1:cL9L4bcoAObu4NkxOlKWBWtNHIsnnACGF/TbqQ6sbcI= +modernc.org/memory v1.8.2/go.mod h1:ZbjSvMO5NQ1A2i3bWeDiVMxIorXwdClKE/0SZ+BMotU= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.34.5 h1:Bb6SR13/fjp15jt70CL4f18JIN7p7dnMExd+UFnF15g= +modernc.org/sqlite v1.34.5/go.mod h1:YLuNmX9NKs8wRNK2ko1LW1NGYcc9FkBO69JOt1AR9JE= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/tests/migrator_test.go b/tests/migrator_test.go index 73c6db773..1c1ac02d4 100644 --- a/tests/migrator_test.go +++ b/tests/migrator_test.go @@ -9,6 +9,7 @@ import ( contractsmigration "github.com/goravel/framework/contracts/database/migration" contractsschema "github.com/goravel/framework/contracts/database/schema" "github.com/goravel/framework/database/migration" + "github.com/goravel/sqlite" ) type DefaultMigratorWithDBSuite struct { @@ -26,11 +27,11 @@ func (s *DefaultMigratorWithDBSuite) SetupTest() { } func (s *DefaultMigratorWithDBSuite) TearDownTest() { - // if s.driverToTestQuery[sqlite.Name] != nil { - // docker, err := s.driverToTestQuery[sqlite.Name].Driver().Docker() - // s.NoError(err) - // s.NoError(docker.Shutdown()) - // } + if s.driverToTestQuery[sqlite.Name] != nil { + docker, err := s.driverToTestQuery[sqlite.Name].Driver().Docker() + s.NoError(err) + s.NoError(docker.Shutdown()) + } } func (s *DefaultMigratorWithDBSuite) TestRun() { @@ -139,24 +140,24 @@ func TestDefaultMigratorWithPostgresSchema(t *testing.T) { assert.False(t, schema.HasTable("users")) } -// func TestDefaultMigratorWithSqlserverSchema(t *testing.T) { -// sqlserverTestQuery := NewTestQueryBuilder().Sqlserver("", false) -// sqlserverTestQuery.WithSchema("goravel") - -// schema := newSchema(sqlserverTestQuery, map[string]*TestQuery{ -// sqlserverTestQuery.Driver().Config().Driver: sqlserverTestQuery, -// }) -// testMigration := NewTestMigrationWithSqlserverSchema(schema) -// schema.Register([]contractsschema.Migration{ -// testMigration, -// }) -// migrator := migration.NewMigrator(nil, schema, "migrations") - -// assert.NoError(t, migrator.Run()) -// assert.True(t, schema.HasTable("goravel.users")) -// assert.NoError(t, migrator.Rollback(1, 0)) -// assert.False(t, schema.HasTable("goravel.users")) -// } +func TestDefaultMigratorWithSqlserverSchema(t *testing.T) { + sqlserverTestQuery := NewTestQueryBuilder().Sqlserver("", false) + sqlserverTestQuery.WithSchema("goravel") + + schema := newSchema(sqlserverTestQuery, map[string]*TestQuery{ + sqlserverTestQuery.Driver().Config().Driver: sqlserverTestQuery, + }) + testMigration := NewTestMigrationWithSqlserverSchema(schema) + schema.Register([]contractsschema.Migration{ + testMigration, + }) + migrator := migration.NewMigrator(nil, schema, "migrations") + + assert.NoError(t, migrator.Run()) + assert.True(t, schema.HasTable("goravel.users")) + assert.NoError(t, migrator.Rollback(1, 0)) + assert.False(t, schema.HasTable("goravel.users")) +} type TestMigration struct { schema contractsschema.Schema diff --git a/tests/mock_config.go b/tests/mock_config.go index 74a7634f1..aa1d6ecd5 100644 --- a/tests/mock_config.go +++ b/tests/mock_config.go @@ -7,7 +7,9 @@ import ( "github.com/goravel/framework/contracts/database/driver" mocksconfig "github.com/goravel/framework/mocks/config" "github.com/goravel/framework/testing/utils" + "github.com/goravel/mysql" "github.com/goravel/postgres" + "github.com/goravel/sqlite" "github.com/goravel/sqlserver" ) @@ -45,22 +47,22 @@ func mockDatabaseConfigWithoutWriteAndRead(mockConfig *mocksconfig.Config, confi return postgres.NewPostgres(mockConfig, utils.NewTestLog(), connection), nil }) } - // if config.Driver == mysql.Name { - // mockConfig.EXPECT().GetString(fmt.Sprintf("database.connections.%s.loc", connection)).Return("UTC") - // mockConfig.EXPECT().GetString(fmt.Sprintf("database.connections.%s.charset", connection)).Return("utf8mb4") - // mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.via", connection)).Return(func() (driver.Driver, error) { - // return mysql.NewMysql(mockConfig, utils.NewTestLog(), connection), nil - // }) - // } + if config.Driver == mysql.Name { + mockConfig.EXPECT().GetString(fmt.Sprintf("database.connections.%s.loc", connection)).Return("UTC") + mockConfig.EXPECT().GetString(fmt.Sprintf("database.connections.%s.charset", connection)).Return("utf8mb4") + mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.via", connection)).Return(func() (driver.Driver, error) { + return mysql.NewMysql(mockConfig, utils.NewTestLog(), connection), nil + }) + } if config.Driver == sqlserver.Name { mockConfig.EXPECT().GetString(fmt.Sprintf("database.connections.%s.charset", connection)).Return("utf8mb4") mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.via", connection)).Return(func() (driver.Driver, error) { return sqlserver.NewSqlserver(mockConfig, utils.NewTestLog(), connection), nil }) } - // if config.Driver == sqlite.Name { - // mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.via", connection)).Return(func() (driver.Driver, error) { - // return sqlite.NewSqlite(mockConfig, utils.NewTestLog(), connection), nil - // }) - // } + if config.Driver == sqlite.Name { + mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.via", connection)).Return(func() (driver.Driver, error) { + return sqlite.NewSqlite(mockConfig, utils.NewTestLog(), connection), nil + }) + } } diff --git a/tests/orm_test.go b/tests/orm_test.go index 1b38e2331..0e323452f 100644 --- a/tests/orm_test.go +++ b/tests/orm_test.go @@ -10,6 +10,7 @@ import ( contractsorm "github.com/goravel/framework/contracts/database/orm" "github.com/goravel/framework/database/orm" "github.com/goravel/postgres" + "github.com/goravel/sqlite" ) type OrmSuite struct { @@ -45,11 +46,11 @@ func (s *OrmSuite) SetupTest() { } func (s *OrmSuite) TearDownSuite() { - // if s.queries[sqlite.Name] != nil { - // docker, err := s.queries[sqlite.Name].Driver().Docker() - // s.NoError(err) - // s.NoError(docker.Shutdown()) - // } + if s.queries[sqlite.Name] != nil { + docker, err := s.queries[sqlite.Name].Driver().Docker() + s.NoError(err) + s.NoError(docker.Shutdown()) + } } func (s *OrmSuite) TestConnection() { diff --git a/tests/query.go b/tests/query.go index e8912d4e2..e6e1448b4 100644 --- a/tests/query.go +++ b/tests/query.go @@ -16,9 +16,14 @@ import ( "github.com/goravel/framework/database/logger" mocksconfig "github.com/goravel/framework/mocks/config" "github.com/goravel/framework/support/docker" + "github.com/goravel/framework/support/str" "github.com/goravel/framework/testing/utils" + "github.com/goravel/mysql" + mysqlcontracts "github.com/goravel/mysql/contracts" "github.com/goravel/postgres" postgrescontracts "github.com/goravel/postgres/contracts" + "github.com/goravel/sqlite" + sqlitecontracts "github.com/goravel/sqlite/contracts" "github.com/goravel/sqlserver" sqlservercontracts "github.com/goravel/sqlserver/contracts" "github.com/jmoiron/sqlx" @@ -123,36 +128,36 @@ func NewTestQueryBuilder() *TestQueryBuilder { } func (r *TestQueryBuilder) All(prefix string, singular bool) map[string]*TestQuery { - postgresTestQuery := r.Postgres(prefix, singular) - // mysqlTestQuery := r.Mysql(prefix, singular) - sqlserverTestQuery := r.Sqlserver(prefix, singular) + // postgresTestQuery := r.Postgres(prefix, singular) + mysqlTestQuery := r.Mysql(prefix, singular) + // sqlserverTestQuery := r.Sqlserver(prefix, singular) // sqliteTestQuery := r.Sqlite(prefix, singular) return map[string]*TestQuery{ - postgresTestQuery.Driver().Config().Driver: postgresTestQuery, - // mysqlTestQuery.Driver().Config().Driver: mysqlTestQuery, - sqlserverTestQuery.Driver().Config().Driver: sqlserverTestQuery, - // sqliteTestQuery.Driver().Config().Driver: sqliteTestQuery, + // postgresTestQuery.Driver().Config().Driver: postgresTestQuery, + mysqlTestQuery.Driver().Config().Driver: mysqlTestQuery, + // sqlserverTestQuery.Driver().Config().Driver: sqlserverTestQuery, + // sqliteTestQuery.Driver().Config().Driver: sqliteTestQuery, } } func (r *TestQueryBuilder) AllOfReadWrite() map[string]map[string]*TestQuery { return map[string]map[string]*TestQuery{ - postgres.Name: r.PostgresWithReadWrite(), - // mysql.Name: r.MysqlWithReadWrite(), + postgres.Name: r.PostgresWithReadWrite(), + mysql.Name: r.MysqlWithReadWrite(), sqlserver.Name: r.SqlserverWithReadWrite(), - // sqlite.Name: r.SqliteWithReadWrite(), + sqlite.Name: r.SqliteWithReadWrite(), } } -// func (r *TestQueryBuilder) Mysql(prefix string, singular bool) *TestQuery { -// testQuery, _ := r.single(mysql.Name, prefix, singular) -// return testQuery -// } +func (r *TestQueryBuilder) Mysql(prefix string, singular bool) *TestQuery { + testQuery, _ := r.single(mysql.Name, prefix, singular) + return testQuery +} -// func (r *TestQueryBuilder) MysqlWithReadWrite() map[string]*TestQuery { -// return r.readWriteMix(mysql.Name) -// } +func (r *TestQueryBuilder) MysqlWithReadWrite() map[string]*TestQuery { + return r.readWriteMix(mysql.Name) +} func (r *TestQueryBuilder) Postgres(prefix string, singular bool) *TestQuery { testQuery, _ := r.single(postgres.Name, prefix, singular) @@ -163,44 +168,44 @@ func (r *TestQueryBuilder) PostgresWithReadWrite() map[string]*TestQuery { return r.readWriteMix(postgres.Name) } -// func (r *TestQueryBuilder) Sqlite(prefix string, singular bool) *TestQuery { -// connection := sqlite.Name -// mockConfig := &mocksconfig.Config{} -// docker := sqlite.NewDocker(fmt.Sprintf("%s_%s", testDatabase, str.Random(6))) -// err := docker.Build() -// if err != nil { -// panic(err) -// } - -// mockDatabaseConfig(mockConfig, database.Config{ -// Driver: sqlite.Name, -// Database: docker.Config().Database, -// }, connection, prefix, singular) - -// ctx := context.WithValue(context.Background(), testContextKey, "goravel") -// driver := sqlite.NewSqlite(mockConfig, utils.NewTestLog(), connection) -// testQuery, err := NewTestQuery(ctx, driver, mockConfig) -// if err != nil { -// panic(err) -// } - -// return testQuery -// } - -// func (r *TestQueryBuilder) SqliteWithReadWrite() map[string]*TestQuery { -// writeTestQuery := r.Sqlite("", false) -// readTestQuery := r.Sqlite("", false) - -// return map[string]*TestQuery{ -// "write": writeTestQuery, -// "read": readTestQuery, -// "mix": r.mix(sqlite.Name, contractsdocker.DatabaseConfig{ -// Database: writeTestQuery.Driver().Config().Database, -// }, contractsdocker.DatabaseConfig{ -// Database: readTestQuery.Driver().Config().Database, -// }), -// } -// } +func (r *TestQueryBuilder) Sqlite(prefix string, singular bool) *TestQuery { + connection := sqlite.Name + mockConfig := &mocksconfig.Config{} + docker := sqlite.NewDocker(fmt.Sprintf("%s_%s", testDatabase, str.Random(6))) + err := docker.Build() + if err != nil { + panic(err) + } + + mockDatabaseConfig(mockConfig, database.Config{ + Driver: sqlite.Name, + Database: docker.Config().Database, + }, connection, prefix, singular) + + ctx := context.WithValue(context.Background(), testContextKey, "goravel") + driver := sqlite.NewSqlite(mockConfig, utils.NewTestLog(), connection) + testQuery, err := NewTestQuery(ctx, driver, mockConfig) + if err != nil { + panic(err) + } + + return testQuery +} + +func (r *TestQueryBuilder) SqliteWithReadWrite() map[string]*TestQuery { + writeTestQuery := r.Sqlite("", false) + readTestQuery := r.Sqlite("", false) + + return map[string]*TestQuery{ + "write": writeTestQuery, + "read": readTestQuery, + "mix": r.mix(sqlite.Name, contractsdocker.DatabaseConfig{ + Database: writeTestQuery.Driver().Config().Database, + }, contractsdocker.DatabaseConfig{ + Database: readTestQuery.Driver().Config().Database, + }), + } +} func (r *TestQueryBuilder) Sqlserver(prefix string, singular bool) *TestQuery { testQuery, _ := r.single(sqlserver.Name, prefix, singular) @@ -224,9 +229,9 @@ func (r *TestQueryBuilder) single(driver string, prefix string, singular bool) ( case postgres.Name: dockerDriver = postgres.NewDocker(postgres.NewConfig(mockConfig, connection), testDatabase, testUsername, testPassword) databaseDriver = postgres.NewPostgres(mockConfig, utils.NewTestLog(), connection) - // case mysql.Name: - // dockerDriver = mysql.NewDocker(mysql.NewConfig(mockConfig, connection), testDatabase, testUsername, testPassword) - // databaseDriver = mysql.NewMysql(mockConfig, utils.NewTestLog(), connection) + case mysql.Name: + dockerDriver = mysql.NewDocker(mysql.NewConfig(mockConfig, connection), testDatabase, testUsername, testPassword) + databaseDriver = mysql.NewMysql(mockConfig, utils.NewTestLog(), connection) case sqlserver.Name: dockerDriver = sqlserver.NewDocker(sqlserver.NewConfig(mockConfig, connection), testDatabase, testUsername, testPassword) databaseDriver = sqlserver.NewSqlserver(mockConfig, utils.NewTestLog(), connection) @@ -306,26 +311,26 @@ func (r *TestQueryBuilder) mix(driver string, writeDatabaseConfig, readDatabaseC }, }) - // case mysql.Name: - // databaseDriver = mysql.NewMysql(mockConfig, utils.NewTestLog(), connection) - // mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.write", connection)).Return([]mysqlcontracts.Config{ - // { - // Host: writeDatabaseConfig.Host, - // Port: writeDatabaseConfig.Port, - // Username: writeDatabaseConfig.Username, - // Password: writeDatabaseConfig.Password, - // Database: writeDatabaseConfig.Database, - // }, - // }) - // mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.read", connection)).Return([]mysqlcontracts.Config{ - // { - // Host: readDatabaseConfig.Host, - // Port: readDatabaseConfig.Port, - // Username: readDatabaseConfig.Username, - // Password: readDatabaseConfig.Password, - // Database: readDatabaseConfig.Database, - // }, - // }) + case mysql.Name: + databaseDriver = mysql.NewMysql(mockConfig, utils.NewTestLog(), connection) + mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.write", connection)).Return([]mysqlcontracts.Config{ + { + Host: writeDatabaseConfig.Host, + Port: writeDatabaseConfig.Port, + Username: writeDatabaseConfig.Username, + Password: writeDatabaseConfig.Password, + Database: writeDatabaseConfig.Database, + }, + }) + mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.read", connection)).Return([]mysqlcontracts.Config{ + { + Host: readDatabaseConfig.Host, + Port: readDatabaseConfig.Port, + Username: readDatabaseConfig.Username, + Password: readDatabaseConfig.Password, + Database: readDatabaseConfig.Database, + }, + }) case sqlserver.Name: databaseDriver = sqlserver.NewSqlserver(mockConfig, utils.NewTestLog(), connection) mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.write", connection)).Return([]sqlservercontracts.Config{ @@ -346,18 +351,18 @@ func (r *TestQueryBuilder) mix(driver string, writeDatabaseConfig, readDatabaseC Database: readDatabaseConfig.Database, }, }) - // case sqlite.Name: - // databaseDriver = sqlite.NewSqlite(mockConfig, utils.NewTestLog(), connection) - // mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.write", connection)).Return([]sqlitecontracts.Config{ - // { - // Database: writeDatabaseConfig.Database, - // }, - // }) - // mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.read", connection)).Return([]sqlitecontracts.Config{ - // { - // Database: readDatabaseConfig.Database, - // }, - // }) + case sqlite.Name: + databaseDriver = sqlite.NewSqlite(mockConfig, utils.NewTestLog(), connection) + mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.write", connection)).Return([]sqlitecontracts.Config{ + { + Database: writeDatabaseConfig.Database, + }, + }) + mockConfig.EXPECT().Get(fmt.Sprintf("database.connections.%s.read", connection)).Return([]sqlitecontracts.Config{ + { + Database: readDatabaseConfig.Database, + }, + }) } mockDatabaseConfigWithoutWriteAndRead(mockConfig, database.Config{ diff --git a/tests/query_test.go b/tests/query_test.go index 758404f94..3e6946ad2 100644 --- a/tests/query_test.go +++ b/tests/query_test.go @@ -4,12 +4,16 @@ import ( "fmt" "strconv" "testing" + "time" contractsorm "github.com/goravel/framework/contracts/database/orm" + databasedb "github.com/goravel/framework/database/db" "github.com/goravel/framework/database/gorm" "github.com/goravel/framework/errors" "github.com/goravel/framework/support/carbon" + "github.com/goravel/mysql" "github.com/goravel/postgres" + "github.com/goravel/sqlite" "github.com/goravel/sqlserver" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" @@ -41,11 +45,11 @@ func (s *QueryTestSuite) SetupTest() { } func (s *QueryTestSuite) TearDownSuite() { - // if s.queries[sqlite.Name] != nil { - // docker, err := s.queries[sqlite.Name].Driver().Docker() - // s.NoError(err) - // s.NoError(docker.Shutdown()) - // } + if s.queries[sqlite.Name] != nil { + docker, err := s.queries[sqlite.Name].Driver().Docker() + s.NoError(err) + s.NoError(docker.Shutdown()) + } } func (s *QueryTestSuite) TestAssociation() { @@ -600,32 +604,32 @@ func (s *QueryTestSuite) TestCursor() { } } -// func (s *QueryTestSuite) TestDBRaw() { -// userName := "db_raw" -// for driver, query := range s.queries { -// s.Run(driver, func() { -// user := User{Name: userName} - -// s.Nil(query.Query().Create(&user)) -// s.True(user.ID > 0) -// switch driver { -// case sqlserver.Name, mysql.Name: -// res, err := query.Query().Model(&user).Update("Name", databasedb.Raw("concat(name, ?)", driver)) -// s.Nil(err) -// s.Equal(int64(1), res.RowsAffected) -// default: -// res, err := query.Query().Model(&user).Update("Name", databasedb.Raw("name || ?", driver)) -// s.Nil(err) -// s.Equal(int64(1), res.RowsAffected) -// } - -// var user1 User -// s.Nil(query.Query().Find(&user1, user.ID)) -// s.True(user1.ID > 0) -// s.True(user1.Name == userName+driver) -// }) -// } -// } +func (s *QueryTestSuite) TestDBRaw() { + userName := "db_raw" + for driver, query := range s.queries { + s.Run(driver, func() { + user := User{Name: userName} + + s.Nil(query.Query().Create(&user)) + s.True(user.ID > 0) + switch driver { + case sqlserver.Name, mysql.Name: + res, err := query.Query().Model(&user).Update("Name", databasedb.Raw("concat(name, ?)", driver)) + s.Nil(err) + s.Equal(int64(1), res.RowsAffected) + default: + res, err := query.Query().Model(&user).Update("Name", databasedb.Raw("name || ?", driver)) + s.Nil(err) + s.Equal(int64(1), res.RowsAffected) + } + + var user1 User + s.Nil(query.Query().Find(&user1, user.ID)) + s.True(user1.ID > 0) + s.True(user1.Name == userName+driver) + }) + } +} func (s *QueryTestSuite) TestDelete() { for _, query := range s.queries { @@ -2086,38 +2090,40 @@ func (s *QueryTestSuite) TestJoin() { } } -// func (s *QueryTestSuite) TestLockForUpdate() { -// for driver, query := range s.queries { -// if driver != sqlite.Name { -// s.Run(driver, func() { -// user := User{Name: "lock_for_update_user"} -// s.Nil(query.Query().Create(&user)) -// s.True(user.ID > 0) +func (s *QueryTestSuite) TestLockForUpdate() { + for driver, query := range s.queries { + if driver == sqlite.Name { + continue + } + + s.Run(driver, func() { + user := User{Name: "lock_for_update_user"} + s.Nil(query.Query().Create(&user)) + s.True(user.ID > 0) -// for i := 0; i < 10; i++ { -// go func() { -// tx, err := query.Query().Begin() -// s.Nil(err) + for i := 0; i < 10; i++ { + go func() { + tx, err := query.Query().Begin() + s.Nil(err) -// var user1 User -// s.Nil(tx.LockForUpdate().Find(&user1, user.ID)) -// s.True(user1.ID > 0) -// user1.Name += "1" -// s.Nil(tx.Save(&user1)) + var user1 User + s.Nil(tx.LockForUpdate().Find(&user1, user.ID)) + s.True(user1.ID > 0) + user1.Name += "1" + s.Nil(tx.Save(&user1)) -// s.Nil(tx.Commit()) -// }() -// } + s.Nil(tx.Commit()) + }() + } -// time.Sleep(2 * time.Second) + time.Sleep(2 * time.Second) -// var user2 User -// s.Nil(query.Query().Find(&user2, user.ID)) -// s.Equal("lock_for_update_user1111111111", user2.Name) -// }) -// } -// } -// } + var user2 User + s.Nil(query.Query().Find(&user2, user.ID)) + s.Equal("lock_for_update_user1111111111", user2.Name) + }) + } +} func (s *QueryTestSuite) TestOffset() { for driver, query := range s.queries { @@ -2882,36 +2888,38 @@ func (s *QueryTestSuite) TestSelect() { } } -// func (s *QueryTestSuite) TestSharedLock() { -// for driver, query := range s.queries { -// if driver != sqlite.Name { -// s.Run(driver, func() { -// user := User{Name: "shared_lock_user"} -// s.Nil(query.Query().Create(&user)) -// s.True(user.ID > 0) +func (s *QueryTestSuite) TestSharedLock() { + for driver, query := range s.queries { + if driver == sqlite.Name { + continue + } -// tx, err := query.Query().Begin() -// s.Nil(err) -// var user1 User -// s.Nil(tx.SharedLock().Find(&user1, user.ID)) -// s.True(user1.ID > 0) + s.Run(driver, func() { + user := User{Name: "shared_lock_user"} + s.Nil(query.Query().Create(&user)) + s.True(user.ID > 0) -// var user2 User -// s.Nil(query.Query().SharedLock().Find(&user2, user.ID)) -// s.True(user2.ID > 0) + tx, err := query.Query().Begin() + s.Nil(err) + var user1 User + s.Nil(tx.SharedLock().Find(&user1, user.ID)) + s.True(user1.ID > 0) -// user1.Name += "1" -// s.Nil(tx.Save(&user1)) + var user2 User + s.Nil(query.Query().SharedLock().Find(&user2, user.ID)) + s.True(user2.ID > 0) -// s.Nil(tx.Commit()) + user1.Name += "1" + s.Nil(tx.Save(&user1)) -// var user3 User -// s.Nil(query.Query().Find(&user3, user.ID)) -// s.Equal("shared_lock_user1", user3.Name) -// }) -// } -// } -// } + s.Nil(tx.Commit()) + + var user3 User + s.Nil(query.Query().Find(&user3, user.ID)) + s.Equal("shared_lock_user1", user3.Name) + }) + } +} func (s *QueryTestSuite) TestSoftDelete() { for driver, query := range s.queries { @@ -3579,106 +3587,106 @@ func (s *QueryTestSuite) TestWithNesting() { } } -// func TestCustomConnection(t *testing.T) { -// postgresTestQuery := NewTestQueryBuilder().Postgres("", false) -// postgresTestQuery.CreateTable(TestTableReviews, TestTableProducts) +func TestCustomConnection(t *testing.T) { + postgresTestQuery := NewTestQueryBuilder().Postgres("", false) + postgresTestQuery.CreateTable(TestTableReviews, TestTableProducts) -// sqliteTestQuery := NewTestQueryBuilder().Sqlite("", false) -// sqliteTestQuery.CreateTable(TestTableReviews, TestTableProducts) + sqliteTestQuery := NewTestQueryBuilder().Sqlite("", false) + sqliteTestQuery.CreateTable(TestTableReviews, TestTableProducts) -// query := postgresTestQuery.Query() + query := postgresTestQuery.Query() -// review := Review{Body: "create_review"} -// assert.Nil(t, query.Create(&review)) -// assert.True(t, review.ID > 0) + review := Review{Body: "create_review"} + assert.Nil(t, query.Create(&review)) + assert.True(t, review.ID > 0) -// var review1 Review -// assert.Nil(t, query.Where("body", "create_review").First(&review1)) -// assert.True(t, review1.ID > 0) + var review1 Review + assert.Nil(t, query.Where("body", "create_review").First(&review1)) + assert.True(t, review1.ID > 0) -// mockDatabaseConfig(postgresTestQuery.MockConfig(), sqliteTestQuery.Driver().Config(), "sqlite", "", false) + mockDatabaseConfig(postgresTestQuery.MockConfig(), sqliteTestQuery.Driver().Config(), "sqlite", "", false) -// product := Product{Name: "create_product"} -// assert.Nil(t, query.Create(&product)) -// assert.True(t, product.ID > 0) + product := Product{Name: "create_product"} + assert.Nil(t, query.Create(&product)) + assert.True(t, product.ID > 0) -// var product1 Product -// assert.Nil(t, query.Where("name", "create_product").First(&product1)) -// assert.True(t, product1.ID > 0) + var product1 Product + assert.Nil(t, query.Where("name", "create_product").First(&product1)) + assert.True(t, product1.ID > 0) -// var product2 Product -// assert.Nil(t, query.Where("name", "create_product1").First(&product2)) -// assert.True(t, product2.ID == 0) + var product2 Product + assert.Nil(t, query.Where("name", "create_product1").First(&product2)) + assert.True(t, product2.ID == 0) -// mockDatabaseConfig(postgresTestQuery.MockConfig(), postgresTestQuery.Driver().Config(), "dummy", "", false) + mockDatabaseConfig(postgresTestQuery.MockConfig(), postgresTestQuery.Driver().Config(), "dummy", "", false) -// person := Person{Name: "create_person"} -// assert.NotNil(t, query.Create(&person)) -// assert.True(t, person.ID == 0) + person := Person{Name: "create_person"} + assert.NotNil(t, query.Create(&person)) + assert.True(t, person.ID == 0) -// docker, err := sqliteTestQuery.Driver().Docker() -// assert.NoError(t, err) -// assert.NoError(t, docker.Shutdown()) -// } + docker, err := sqliteTestQuery.Driver().Docker() + assert.NoError(t, err) + assert.NoError(t, docker.Shutdown()) +} -// func TestReadWriteSeparate(t *testing.T) { -// dbs := NewTestQueryBuilder().AllOfReadWrite() +func TestReadWriteSeparate(t *testing.T) { + dbs := NewTestQueryBuilder().AllOfReadWrite() -// for drive, db := range dbs { -// t.Run(drive, func(t *testing.T) { -// db["read"].CreateTable(TestTableUsers) -// db["write"].CreateTable(TestTableUsers) + for drive, db := range dbs { + t.Run(drive, func(t *testing.T) { + db["read"].CreateTable(TestTableUsers) + db["write"].CreateTable(TestTableUsers) -// user1 := User{Name: "user"} -// assert.Nil(t, db["mix"].Query().Create(&user1)) -// assert.True(t, user1.ID > 0) + user1 := User{Name: "user"} + assert.Nil(t, db["mix"].Query().Create(&user1)) + assert.True(t, user1.ID > 0) -// var user2 User -// assert.Nil(t, db["mix"].Query().Find(&user2, user1.ID)) -// assert.True(t, user2.ID == 0) + var user2 User + assert.Nil(t, db["mix"].Query().Find(&user2, user1.ID)) + assert.True(t, user2.ID == 0) -// var user3 User -// assert.Nil(t, db["read"].Query().Find(&user3, user1.ID)) -// assert.True(t, user3.ID == 0) + var user3 User + assert.Nil(t, db["read"].Query().Find(&user3, user1.ID)) + assert.True(t, user3.ID == 0) -// var user4 User -// assert.Nil(t, db["write"].Query().Find(&user4, user1.ID)) -// assert.True(t, user4.ID > 0) -// }) -// } + var user4 User + assert.Nil(t, db["write"].Query().Find(&user4, user1.ID)) + assert.True(t, user4.ID > 0) + }) + } -// docker, err := dbs[sqlite.Name]["read"].Driver().Docker() -// assert.NoError(t, err) -// assert.NoError(t, docker.Shutdown()) + docker, err := dbs[sqlite.Name]["read"].Driver().Docker() + assert.NoError(t, err) + assert.NoError(t, docker.Shutdown()) -// docker, err = dbs[sqlite.Name]["write"].Driver().Docker() -// assert.NoError(t, err) -// assert.NoError(t, docker.Shutdown()) -// } + docker, err = dbs[sqlite.Name]["write"].Driver().Docker() + assert.NoError(t, err) + assert.NoError(t, docker.Shutdown()) +} -// func TestTablePrefixAndSingular(t *testing.T) { -// queries := NewTestQueryBuilder().All("goravel_", true) +func TestTablePrefixAndSingular(t *testing.T) { + queries := NewTestQueryBuilder().All("goravel_", true) -// for drive, query := range queries { -// t.Run(drive, func(t *testing.T) { -// query.CreateTable(TestTableUser) + for drive, query := range queries { + t.Run(drive, func(t *testing.T) { + query.CreateTable(TestTableUser) -// user := User{Name: "user"} -// assert.Nil(t, query.Query().Create(&user)) -// assert.True(t, user.ID > 0) + user := User{Name: "user"} + assert.Nil(t, query.Query().Create(&user)) + assert.True(t, user.ID > 0) -// var user1 User -// assert.Nil(t, query.Query().Find(&user1, user.ID)) -// assert.True(t, user1.ID > 0) -// }) -// } + var user1 User + assert.Nil(t, query.Query().Find(&user1, user.ID)) + assert.True(t, user1.ID > 0) + }) + } -// if queries[sqlite.Name] != nil { -// docker, err := queries[sqlite.Name].Driver().Docker() -// assert.NoError(t, err) -// assert.NoError(t, docker.Shutdown()) -// } -// } + if queries[sqlite.Name] != nil { + docker, err := queries[sqlite.Name].Driver().Docker() + assert.NoError(t, err) + assert.NoError(t, docker.Shutdown()) + } +} func TestPostgresWithSchema(t *testing.T) { postgresTestQuery := NewTestQueryBuilder().Postgres("", false) @@ -3694,19 +3702,19 @@ func TestPostgresWithSchema(t *testing.T) { assert.True(t, user1.ID > 0) } -// func TestSqlserverWithSchema(t *testing.T) { -// sqlserverTestQuery := NewTestQueryBuilder().Sqlserver("", false) -// sqlserverTestQuery.WithSchema(testSchema) -// sqlserverTestQuery.CreateTable(TestTableSchema) +func TestSqlserverWithSchema(t *testing.T) { + sqlserverTestQuery := NewTestQueryBuilder().Sqlserver("", false) + sqlserverTestQuery.WithSchema(testSchema) + sqlserverTestQuery.CreateTable(TestTableSchema) -// schema := Schema{Name: "first_schema"} -// assert.Nil(t, sqlserverTestQuery.Query().Create(&schema)) -// assert.True(t, schema.ID > 0) + schema := Schema{Name: "first_schema"} + assert.Nil(t, sqlserverTestQuery.Query().Create(&schema)) + assert.True(t, schema.ID > 0) -// var schema1 Schema -// assert.Nil(t, sqlserverTestQuery.Query().Where("name", "first_schema").First(&schema1)) -// assert.True(t, schema1.ID > 0) -// } + var schema1 Schema + assert.Nil(t, sqlserverTestQuery.Query().Where("name", "first_schema").First(&schema1)) + assert.True(t, schema1.ID > 0) +} func paginator(page string, limit string) func(methods contractsorm.Query) contractsorm.Query { return func(query contractsorm.Query) contractsorm.Query { diff --git a/tests/repository_test.go b/tests/repository_test.go index 70cda281c..cb48dcd4a 100644 --- a/tests/repository_test.go +++ b/tests/repository_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/goravel/framework/database/migration" + "github.com/goravel/sqlite" ) type RepositoryTestSuite struct { @@ -23,11 +24,11 @@ func (s *RepositoryTestSuite) SetupTest() { } func (s *RepositoryTestSuite) TearDownTest() { - // if s.driverToTestQuery[sqlite.Name] != nil { - // docker, err := s.driverToTestQuery[sqlite.Name].Driver().Docker() - // s.NoError(err) - // s.NoError(docker.Shutdown()) - // } + if s.driverToTestQuery[sqlite.Name] != nil { + docker, err := s.driverToTestQuery[sqlite.Name].Driver().Docker() + s.NoError(err) + s.NoError(docker.Shutdown()) + } } func (s *RepositoryTestSuite) TestCreate_Delete_Exists() { diff --git a/tests/schema_test.go b/tests/schema_test.go index 4a7273d78..a8675ae49 100644 --- a/tests/schema_test.go +++ b/tests/schema_test.go @@ -9,7 +9,9 @@ import ( contractsschema "github.com/goravel/framework/contracts/database/schema" databaseschema "github.com/goravel/framework/database/schema" "github.com/goravel/framework/support/carbon" + "github.com/goravel/mysql" "github.com/goravel/postgres" + "github.com/goravel/sqlite" "github.com/goravel/sqlserver" "github.com/spf13/cast" "github.com/stretchr/testify/assert" @@ -35,18 +37,18 @@ func (s *SchemaSuite) SetupTest() { } func (s *SchemaSuite) TearDownTest() { - // if s.driverToTestQuery[sqlite.Name] != nil { - // docker, err := s.driverToTestQuery[sqlite.Name].Driver().Docker() - // s.NoError(err) - // s.NoError(docker.Shutdown()) - // } + if s.driverToTestQuery[sqlite.Name] != nil { + docker, err := s.driverToTestQuery[sqlite.Name].Driver().Docker() + s.NoError(err) + s.NoError(docker.Shutdown()) + } } func (s *SchemaSuite) TestColumnChange() { for driver, testQuery := range s.driverToTestQuery { - // if driver == sqlite.Name { - // continue - // } + if driver == sqlite.Name { + continue + } s.Run(driver, func() { schema := newSchema(testQuery, s.driverToTestQuery) table := "column_change" @@ -95,14 +97,14 @@ func (s *SchemaSuite) TestColumnChange() { if column.Name == "change_remove_default" || column.Name == "change_modify_default" { s.Contains(column.Default, "goravel") } - // if driver != sqlserver.Name { - // if column.Name == "change_add_comment" { - // s.Empty(column.Comment) - // } - // if column.Name == "change_remove_comment" || column.Name == "change_modify_comment" { - // s.Contains(column.Comment, "goravel") - // } - // } + if driver != sqlserver.Name { + if column.Name == "change_add_comment" { + s.Empty(column.Comment) + } + if column.Name == "change_remove_comment" || column.Name == "change_modify_comment" { + s.Contains(column.Comment, "goravel") + } + } } s.NoError(schema.Table(table, func(table contractsschema.Blueprint) { @@ -119,15 +121,15 @@ func (s *SchemaSuite) TestColumnChange() { })) columns, err = schema.GetColumns(table) s.Require().Nil(err) - for _, column := range columns { - // if driver == mysql.Name { - // if i == 0 { - // s.Equal(column.Name, "change_modify_comment") - // } - // if column.Name == "change_type" { - // s.Equal(columns[i+1].Name, "change_add_comment") - // } - // } + for i, column := range columns { + if driver == mysql.Name { + if i == 0 { + s.Equal(column.Name, "change_modify_comment") + } + if column.Name == "change_type" { + s.Equal(columns[i+1].Name, "change_add_comment") + } + } if column.Name == "change_length" { s.Contains(column.Type, fmt.Sprintf("(%d)", expectedCustomStringLength)) } @@ -149,17 +151,17 @@ func (s *SchemaSuite) TestColumnChange() { if column.Name == "change_modify_default" { s.Contains(column.Default, "goravel_again") } - // if driver != sqlserver.Name { - // if column.Name == "change_add_comment" { - // s.Contains(column.Comment, "goravel") - // } - // if column.Name == "change_remove_comment" { - // s.Empty(column.Comment) - // } - // if column.Name == "change_modify_comment" { - // s.Contains(column.Comment, "goravel_again") - // } - // } + if driver != sqlserver.Name { + if column.Name == "change_add_comment" { + s.Contains(column.Comment, "goravel") + } + if column.Name == "change_remove_comment" { + s.Empty(column.Comment) + } + if column.Name == "change_modify_comment" { + s.Contains(column.Comment, "goravel_again") + } + } } }) } @@ -226,12 +228,12 @@ func (s *SchemaSuite) TestColumnExtraAttributes() { s.NoError(testQuery.Query().Where("id", columnExtraAttribute.ID).First(&anotherColumnExtraAttribute)) s.Equal("world", anotherColumnExtraAttribute.Name) s.Equal(columnExtraAttribute.UseCurrent, anotherColumnExtraAttribute.UseCurrent) - // if driver == mysql.Name { - // s.NotEqual(columnExtraAttribute.UseCurrentOnUpdate, anotherColumnExtraAttribute.UseCurrentOnUpdate) - // s.True(anotherColumnExtraAttribute.UseCurrentOnUpdate.Between(now, carbon.Now().AddSecond())) - // } else { - // s.Equal(columnExtraAttribute.UseCurrentOnUpdate, anotherColumnExtraAttribute.UseCurrentOnUpdate) - // } + if driver == mysql.Name { + s.NotEqual(columnExtraAttribute.UseCurrentOnUpdate, anotherColumnExtraAttribute.UseCurrentOnUpdate) + s.True(anotherColumnExtraAttribute.UseCurrentOnUpdate.Between(now, carbon.Now().AddSecond())) + } else { + s.Equal(columnExtraAttribute.UseCurrentOnUpdate, anotherColumnExtraAttribute.UseCurrentOnUpdate) + } }) } } @@ -596,975 +598,1080 @@ func (s *SchemaSuite) TestColumnTypes_Postgres() { s.Equal("int8", column.TypeName) } } -} +} + +func (s *SchemaSuite) TestColumnTypes_Sqlite() { + if s.driverToTestQuery[sqlite.Name] == nil { + s.T().Skip("Skip test") + } + + testQuery := s.driverToTestQuery[sqlite.Name] + schema := newSchema(testQuery, s.driverToTestQuery) + table := "sqlite_columns" + s.createTableAndAssertColumnsForColumnMethods(schema, table) + + columns, err := schema.GetColumns(table) + s.Require().Nil(err) + + for _, column := range columns { + if column.Name == "another_deleted_at" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "big_integer" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("integer", column.Type) + s.Equal("integer", column.TypeName) + } + if column.Name == "boolean_default" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Equal("'1'", column.Default) + s.False(column.Nullable) + s.Equal("tinyint(1)", column.Type) + s.Equal("tinyint", column.TypeName) + } + if column.Name == "char" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("varchar", column.Type) + s.Equal("varchar", column.TypeName) + } + if column.Name == "created_at" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "custom_type" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("geometry", column.Type) + s.Equal("geometry", column.TypeName) + } + if column.Name == "date" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("date", column.Type) + s.Equal("date", column.TypeName) + } + if column.Name == "date_time" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "date_time_tz" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "decimal" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("numeric", column.Type) + s.Equal("numeric", column.TypeName) + } + if column.Name == "deleted_at" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "double" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("double", column.Type) + s.Equal("double", column.TypeName) + } + if column.Name == "enum" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("varchar", column.Type) + s.Equal("varchar", column.TypeName) + } + if column.Name == "enum_int" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("varchar", column.Type) + s.Equal("varchar", column.TypeName) + } + if column.Name == "float" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("float", column.Type) + s.Equal("float", column.TypeName) + } + if column.Name == "id" { + s.True(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("integer", column.Type) + s.Equal("integer", column.TypeName) + } + if column.Name == "integer" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("integer", column.Type) + s.Equal("integer", column.TypeName) + } + if column.Name == "integer_default" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Equal("'1'", column.Default) + s.False(column.Nullable) + s.Equal("integer", column.Type) + s.Equal("integer", column.TypeName) + } + if column.Name == "json" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("text", column.Type) + s.Equal("text", column.TypeName) + } + if column.Name == "jsonb" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("text", column.Type) + s.Equal("text", column.TypeName) + } + if column.Name == "long_text" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("text", column.Type) + s.Equal("text", column.TypeName) + } + if column.Name == "medium_text" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("text", column.Type) + s.Equal("text", column.TypeName) + } + if column.Name == "string" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("varchar", column.Type) + s.Equal("varchar", column.TypeName) + } + if column.Name == "string_default" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Equal("'goravel'", column.Default) + s.False(column.Nullable) + s.Equal("varchar", column.Type) + s.Equal("varchar", column.TypeName) + } + if column.Name == "text" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("text", column.Type) + s.Equal("text", column.TypeName) + } + if column.Name == "tiny_text" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("text", column.Type) + s.Equal("text", column.TypeName) + } + if column.Name == "time" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("time", column.Type) + s.Equal("time", column.TypeName) + } + if column.Name == "time_tz" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("time", column.Type) + s.Equal("time", column.TypeName) + } + if column.Name == "timestamp" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "timestamp_tz" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "timestamp_use_current" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Equal("CURRENT_TIMESTAMP", column.Default) + s.False(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "timestamp_use_current_on_update" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Equal("CURRENT_TIMESTAMP", column.Default) + s.False(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "updated_at" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "unsigned_integer" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("integer", column.Type) + s.Equal("integer", column.TypeName) + } + if column.Name == "unsigned_big_integer" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("integer", column.Type) + s.Equal("integer", column.TypeName) + } + } +} + +func (s *SchemaSuite) TestColumnTypes_Mysql() { + if s.driverToTestQuery[mysql.Name] == nil { + s.T().Skip("Skip test") + } + + testQuery := s.driverToTestQuery[mysql.Name] + schema := newSchema(testQuery, s.driverToTestQuery) + table := "mysql_columns" + s.createTableAndAssertColumnsForColumnMethods(schema, table) + + columns, err := schema.GetColumns(table) + s.Require().Nil(err) + + for _, column := range columns { + if column.Name == "another_deleted_at" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("timestamp", column.Type) + s.Equal("timestamp", column.TypeName) + } + if column.Name == "big_integer" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a big_integer column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("bigint", column.Type) + s.Equal("bigint", column.TypeName) + } + if column.Name == "boolean_default" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a boolean column with default value", column.Comment) + s.Equal("1", column.Default) + s.False(column.Nullable) + s.Equal("tinyint(1)", column.Type) + s.Equal("tinyint", column.TypeName) + } + if column.Name == "char" { + s.False(column.Autoincrement) + s.Equal("utf8mb4_0900_ai_ci", column.Collation) + s.Equal("This is a char column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("char(255)", column.Type) + s.Equal("char", column.TypeName) + } + if column.Name == "created_at" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("timestamp(2)", column.Type) + s.Equal("timestamp", column.TypeName) + } + if column.Name == "custom_type" { + s.False(column.Autoincrement) + s.Equal("This is a custom type column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("geometry", column.Type) + s.Equal("geometry", column.TypeName) + } + if column.Name == "date" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a date column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("date", column.Type) + s.Equal("date", column.TypeName) + } + if column.Name == "date_time" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a date time column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("datetime(3)", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "date_time_tz" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a date time with time zone column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("datetime(3)", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "decimal" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a decimal column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("decimal(4,1)", column.Type) + s.Equal("decimal", column.TypeName) + } + if column.Name == "deleted_at" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("timestamp", column.Type) + s.Equal("timestamp", column.TypeName) + } + if column.Name == "double" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a double column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("double", column.Type) + s.Equal("double", column.TypeName) + } + if column.Name == "enum" { + s.False(column.Autoincrement) + s.Equal("utf8mb4_0900_ai_ci", column.Collation) + s.Equal("This is a enum column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("enum('a','b','c')", column.Type) + s.Equal("enum", column.TypeName) + } + if column.Name == "enum_int" { + s.False(column.Autoincrement) + s.Equal("utf8mb4_0900_ai_ci", column.Collation) + s.Equal("This is a enum column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("enum('1','2','3')", column.Type) + s.Equal("enum", column.TypeName) + } + if column.Name == "float" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a float column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("float", column.Type) + s.Equal("float", column.TypeName) + } + if column.Name == "id" { + s.True(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a id column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("bigint unsigned", column.Type) + s.Equal("bigint", column.TypeName) + } + if column.Name == "integer" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a integer column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("int", column.Type) + s.Equal("int", column.TypeName) + } + if column.Name == "integer_default" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a integer_default column", column.Comment) + s.Equal(1, cast.ToInt(column.Default)) + s.False(column.Nullable) + s.Equal("int", column.Type) + s.Equal("int", column.TypeName) + } + if column.Name == "json" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a json column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("json", column.Type) + s.Equal("json", column.TypeName) + } + if column.Name == "jsonb" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a jsonb column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("json", column.Type) + s.Equal("json", column.TypeName) + } + if column.Name == "long_text" { + s.False(column.Autoincrement) + s.Equal("utf8mb4_0900_ai_ci", column.Collation) + s.Equal("This is a long_text column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("longtext", column.Type) + s.Equal("longtext", column.TypeName) + } + if column.Name == "medium_text" { + s.False(column.Autoincrement) + s.Equal("utf8mb4_0900_ai_ci", column.Collation) + s.Equal("This is a medium_text column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("mediumtext", column.Type) + s.Equal("mediumtext", column.TypeName) + } + if column.Name == "string" { + s.False(column.Autoincrement) + s.Equal("utf8mb4_0900_ai_ci", column.Collation) + s.Equal("This is a string column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("varchar(255)", column.Type) + s.Equal("varchar", column.TypeName) + } + if column.Name == "string_default" { + s.False(column.Autoincrement) + s.Equal("utf8mb4_0900_ai_ci", column.Collation) + s.Equal("This is a string_default column", column.Comment) + s.Equal("goravel", column.Default) + s.False(column.Nullable) + s.Equal("varchar(255)", column.Type) + s.Equal("varchar", column.TypeName) + } + if column.Name == "text" { + s.False(column.Autoincrement) + s.Equal("utf8mb4_0900_ai_ci", column.Collation) + s.Equal("This is a text column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("text", column.Type) + s.Equal("text", column.TypeName) + } + if column.Name == "time" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a time column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("time(2)", column.Type) + s.Equal("time", column.TypeName) + } + if column.Name == "time_tz" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a time with time zone column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("time(2)", column.Type) + s.Equal("time", column.TypeName) + } + if column.Name == "timestamp" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a timestamp without time zone column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("timestamp(2)", column.Type) + s.Equal("timestamp", column.TypeName) + } + if column.Name == "timestamp_tz" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a timestamp with time zone column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("timestamp(2)", column.Type) + s.Equal("timestamp", column.TypeName) + } + if column.Name == "timestamp_use_current" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a timestamp_use_current column", column.Comment) + s.Equal("CURRENT_TIMESTAMP", column.Default) + s.False(column.Nullable) + s.Equal("timestamp", column.Type) + s.Equal("timestamp", column.TypeName) + } + if column.Name == "timestamp_use_current_on_update" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a timestamp_use_current_on_update column", column.Comment) + s.Equal("CURRENT_TIMESTAMP", column.Default) + s.False(column.Nullable) + s.Equal("timestamp", column.Type) + s.Equal("timestamp", column.TypeName) + } + if column.Name == "tiny_text" { + s.False(column.Autoincrement) + s.Equal("utf8mb4_0900_ai_ci", column.Collation) + s.Equal("This is a tiny_text column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("tinytext", column.Type) + s.Equal("tinytext", column.TypeName) + } + if column.Name == "updated_at" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("timestamp(2)", column.Type) + s.Equal("timestamp", column.TypeName) + } + if column.Name == "unsigned_integer" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a unsigned_integer column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("int unsigned", column.Type) + s.Equal("int", column.TypeName) + } + if column.Name == "unsigned_big_integer" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Equal("This is a unsigned_big_integer column", column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("bigint unsigned", column.Type) + s.Equal("bigint", column.TypeName) + } + } +} + +func (s *SchemaSuite) TestColumnTypes_Sqlserver() { + if s.driverToTestQuery[sqlserver.Name] == nil { + s.T().Skip("Skip test") + } + + testQuery := s.driverToTestQuery[sqlserver.Name] + schema := newSchema(testQuery, s.driverToTestQuery) + table := "sqlserver_columns" + s.createTableAndAssertColumnsForColumnMethods(schema, table) + + columns, err := schema.GetColumns(table) + s.Require().Nil(err) + + for _, column := range columns { + if column.Name == "another_deleted_at" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("datetimeoffset(34)", column.Type) + s.Equal("datetimeoffset", column.TypeName) + } + if column.Name == "big_integer" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("bigint", column.Type) + s.Equal("bigint", column.TypeName) + } + if column.Name == "boolean_default" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Equal("('1')", column.Default) + s.False(column.Nullable) + s.Equal("bit", column.Type) + s.Equal("bit", column.TypeName) + } + if column.Name == "char" { + s.False(column.Autoincrement) + s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("nchar(510)", column.Type) + s.Equal("nchar", column.TypeName) + } + if column.Name == "created_at" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("datetime2(22)", column.Type) + s.Equal("datetime2", column.TypeName) + } + if column.Name == "custom_type" { + s.False(column.Autoincrement) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("geometry", column.Type) + s.Equal("geometry", column.TypeName) + } + if column.Name == "date" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("date", column.Type) + s.Equal("date", column.TypeName) + } + if column.Name == "date_time" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("datetime2(23)", column.Type) + s.Equal("datetime2", column.TypeName) + } + if column.Name == "date_time_tz" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("datetimeoffset(30)", column.Type) + s.Equal("datetimeoffset", column.TypeName) + } + if column.Name == "decimal" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("decimal(4,1)", column.Type) + s.Equal("decimal", column.TypeName) + } + if column.Name == "deleted_at" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "double" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("float(53)", column.Type) + s.Equal("float", column.TypeName) + } + if column.Name == "enum" { + s.False(column.Autoincrement) + s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("nvarchar(510)", column.Type) + s.Equal("nvarchar", column.TypeName) + } + if column.Name == "enum_int" { + s.False(column.Autoincrement) + s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("nvarchar(510)", column.Type) + s.Equal("nvarchar", column.TypeName) + } + if column.Name == "float" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("real", column.Type) + s.Equal("real", column.TypeName) + } + if column.Name == "id" { + s.True(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("bigint", column.Type) + s.Equal("bigint", column.TypeName) + } + if column.Name == "integer" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("int", column.Type) + s.Equal("int", column.TypeName) + } + if column.Name == "integer_default" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Equal("('1')", column.Default) + s.False(column.Nullable) + s.Equal("int", column.Type) + s.Equal("int", column.TypeName) + } + if column.Name == "json" { + s.False(column.Autoincrement) + s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("nvarchar(max)", column.Type) + s.Equal("nvarchar", column.TypeName) + } + if column.Name == "jsonb" { + s.False(column.Autoincrement) + s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("nvarchar(max)", column.Type) + s.Equal("nvarchar", column.TypeName) + } + if column.Name == "long_text" { + s.False(column.Autoincrement) + s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("nvarchar(max)", column.Type) + s.Equal("nvarchar", column.TypeName) + } + if column.Name == "medium_text" { + s.False(column.Autoincrement) + s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("nvarchar(max)", column.Type) + s.Equal("nvarchar", column.TypeName) + } + if column.Name == "string" { + s.False(column.Autoincrement) + s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("nvarchar(510)", column.Type) + s.Equal("nvarchar", column.TypeName) + } + if column.Name == "string_default" { + s.False(column.Autoincrement) + s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) + s.Empty(column.Comment) + s.Equal("('goravel')", column.Default) + s.False(column.Nullable) + s.Equal("nvarchar(510)", column.Type) + s.Equal("nvarchar", column.TypeName) + } + if column.Name == "text" { + s.False(column.Autoincrement) + s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("nvarchar(max)", column.Type) + s.Equal("nvarchar", column.TypeName) + } + if column.Name == "time" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("time(11)", column.Type) + s.Equal("time", column.TypeName) + } + if column.Name == "time_tz" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("time(11)", column.Type) + s.Equal("time", column.TypeName) + } + if column.Name == "timestamp" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("datetime2(22)", column.Type) + s.Equal("datetime2", column.TypeName) + } + if column.Name == "timestamp_tz" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("datetimeoffset(29)", column.Type) + s.Equal("datetimeoffset", column.TypeName) + } + if column.Name == "timestamp_use_current" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Equal("(getdate())", column.Default) + s.False(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "timestamp_use_current_on_update" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Equal("(getdate())", column.Default) + s.False(column.Nullable) + s.Equal("datetime", column.Type) + s.Equal("datetime", column.TypeName) + } + if column.Name == "tiny_text" { + s.False(column.Autoincrement) + s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("nvarchar(510)", column.Type) + s.Equal("nvarchar", column.TypeName) + } + if column.Name == "updated_at" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.True(column.Nullable) + s.Equal("datetime2(22)", column.Type) + s.Equal("datetime2", column.TypeName) + } + if column.Name == "unsigned_integer" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("int", column.Type) + s.Equal("int", column.TypeName) + } + if column.Name == "unsigned_big_integer" { + s.False(column.Autoincrement) + s.Empty(column.Collation) + s.Empty(column.Comment) + s.Empty(column.Default) + s.False(column.Nullable) + s.Equal("bigint", column.Type) + s.Equal("bigint", column.TypeName) + } + } +} + +func (s *SchemaSuite) TestEnum_Postgres() { + if s.driverToTestQuery[postgres.Name] == nil { + s.T().Skip("Skip test") + } + + testQuery := s.driverToTestQuery[postgres.Name] + schema := newSchema(testQuery, s.driverToTestQuery) + table := "postgres_enum" + + s.NoError(schema.Create(table, func(table contractsschema.Blueprint) { + table.ID() + table.Enum("str", []any{"a", "b", "c"}) + table.Enum("int", []any{1, 2, 3}) + })) + + type PostgresEnum struct { + ID uint `gorm:"primaryKey"` + Str string + Int string + } + + postgresEnum := &PostgresEnum{ + Str: "a", + Int: "4", + } + s.ErrorContains(testQuery.Query().Table(table).Create(&postgresEnum), `new row for relation "goravel_postgres_enum" violates check constraint "goravel_postgres_enum_int_check"`) + + postgresEnum = &PostgresEnum{ + Str: "a", + Int: "1", + } + s.NoError(testQuery.Query().Table(table).Create(&postgresEnum)) + s.True(postgresEnum.ID > 0) +} + +func (s *SchemaSuite) TestEnum_Sqlite() { + if s.driverToTestQuery[sqlite.Name] == nil { + s.T().Skip("Skip test") + } + + testQuery := s.driverToTestQuery[sqlite.Name] + schema := newSchema(testQuery, s.driverToTestQuery) + table := "sqlite_enum" + + s.NoError(schema.Create(table, func(table contractsschema.Blueprint) { + table.ID() + table.Enum("str", []any{"a", "b", "c"}) + table.Enum("int", []any{1, 2, 3}) + })) + + type SqliteEnum struct { + ID uint `gorm:"primaryKey"` + Str string + Int string + } + + sqliteEnum := &SqliteEnum{ + Str: "a", + Int: "4", + } + s.ErrorContains(testQuery.Query().Table(table).Create(&sqliteEnum), `constraint failed: CHECK constraint failed: int`) + + sqliteEnum = &SqliteEnum{ + Str: "a", + Int: "1", + } + s.NoError(testQuery.Query().Table(table).Create(&sqliteEnum)) + s.True(sqliteEnum.ID > 0) +} + +func (s *SchemaSuite) TestEnum_Mysql() { + if s.driverToTestQuery[mysql.Name] == nil { + s.T().Skip("Skip test") + } + + testQuery := s.driverToTestQuery[mysql.Name] + schema := newSchema(testQuery, s.driverToTestQuery) + table := "mysql_enum" + + s.NoError(schema.Create(table, func(table contractsschema.Blueprint) { + table.ID() + table.Enum("str", []any{"a", "b", "c"}) + table.Enum("int", []any{1, 2, 3}) + })) + + type MysqlEnum struct { + ID uint `gorm:"primaryKey"` + Str string + Int int + } -// func (s *SchemaSuite) TestColumnTypes_Sqlite() { -// if s.driverToTestQuery[sqlite.Name] == nil { -// s.T().Skip("Skip test") -// } - -// testQuery := s.driverToTestQuery[sqlite.Name] -// schema := newSchema(testQuery, s.driverToTestQuery) -// table := "sqlite_columns" -// s.createTableAndAssertColumnsForColumnMethods(schema, table) - -// columns, err := schema.GetColumns(table) -// s.Require().Nil(err) - -// for _, column := range columns { -// if column.Name == "another_deleted_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "big_integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("integer", column.Type) -// s.Equal("integer", column.TypeName) -// } -// if column.Name == "boolean_default" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Equal("'1'", column.Default) -// s.False(column.Nullable) -// s.Equal("tinyint(1)", column.Type) -// s.Equal("tinyint", column.TypeName) -// } -// if column.Name == "char" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("varchar", column.Type) -// s.Equal("varchar", column.TypeName) -// } -// if column.Name == "created_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "custom_type" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("geometry", column.Type) -// s.Equal("geometry", column.TypeName) -// } -// if column.Name == "date" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("date", column.Type) -// s.Equal("date", column.TypeName) -// } -// if column.Name == "date_time" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "date_time_tz" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "decimal" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("numeric", column.Type) -// s.Equal("numeric", column.TypeName) -// } -// if column.Name == "deleted_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "double" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("double", column.Type) -// s.Equal("double", column.TypeName) -// } -// if column.Name == "enum" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("varchar", column.Type) -// s.Equal("varchar", column.TypeName) -// } -// if column.Name == "enum_int" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("varchar", column.Type) -// s.Equal("varchar", column.TypeName) -// } -// if column.Name == "float" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("float", column.Type) -// s.Equal("float", column.TypeName) -// } -// if column.Name == "id" { -// s.True(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("integer", column.Type) -// s.Equal("integer", column.TypeName) -// } -// if column.Name == "integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("integer", column.Type) -// s.Equal("integer", column.TypeName) -// } -// if column.Name == "integer_default" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Equal("'1'", column.Default) -// s.False(column.Nullable) -// s.Equal("integer", column.Type) -// s.Equal("integer", column.TypeName) -// } -// if column.Name == "json" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("text", column.Type) -// s.Equal("text", column.TypeName) -// } -// if column.Name == "jsonb" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("text", column.Type) -// s.Equal("text", column.TypeName) -// } -// if column.Name == "long_text" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("text", column.Type) -// s.Equal("text", column.TypeName) -// } -// if column.Name == "medium_text" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("text", column.Type) -// s.Equal("text", column.TypeName) -// } -// if column.Name == "string" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("varchar", column.Type) -// s.Equal("varchar", column.TypeName) -// } -// if column.Name == "string_default" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Equal("'goravel'", column.Default) -// s.False(column.Nullable) -// s.Equal("varchar", column.Type) -// s.Equal("varchar", column.TypeName) -// } -// if column.Name == "text" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("text", column.Type) -// s.Equal("text", column.TypeName) -// } -// if column.Name == "tiny_text" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("text", column.Type) -// s.Equal("text", column.TypeName) -// } -// if column.Name == "time" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("time", column.Type) -// s.Equal("time", column.TypeName) -// } -// if column.Name == "time_tz" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("time", column.Type) -// s.Equal("time", column.TypeName) -// } -// if column.Name == "timestamp" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "timestamp_tz" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "timestamp_use_current" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Equal("CURRENT_TIMESTAMP", column.Default) -// s.False(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "timestamp_use_current_on_update" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Equal("CURRENT_TIMESTAMP", column.Default) -// s.False(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "updated_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "unsigned_integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("integer", column.Type) -// s.Equal("integer", column.TypeName) -// } -// if column.Name == "unsigned_big_integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("integer", column.Type) -// s.Equal("integer", column.TypeName) -// } -// } -// } - -// func (s *SchemaSuite) TestColumnTypes_Mysql() { -// if s.driverToTestQuery[mysql.Name] == nil { -// s.T().Skip("Skip test") -// } - -// testQuery := s.driverToTestQuery[mysql.Name] -// schema := newSchema(testQuery, s.driverToTestQuery) -// table := "mysql_columns" -// s.createTableAndAssertColumnsForColumnMethods(schema, table) - -// columns, err := schema.GetColumns(table) -// s.Require().Nil(err) - -// for _, column := range columns { -// if column.Name == "another_deleted_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("timestamp", column.Type) -// s.Equal("timestamp", column.TypeName) -// } -// if column.Name == "big_integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a big_integer column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("bigint", column.Type) -// s.Equal("bigint", column.TypeName) -// } -// if column.Name == "boolean_default" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a boolean column with default value", column.Comment) -// s.Equal("1", column.Default) -// s.False(column.Nullable) -// s.Equal("tinyint(1)", column.Type) -// s.Equal("tinyint", column.TypeName) -// } -// if column.Name == "char" { -// s.False(column.Autoincrement) -// s.Equal("utf8mb4_0900_ai_ci", column.Collation) -// s.Equal("This is a char column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("char(255)", column.Type) -// s.Equal("char", column.TypeName) -// } -// if column.Name == "created_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("timestamp(2)", column.Type) -// s.Equal("timestamp", column.TypeName) -// } -// if column.Name == "custom_type" { -// s.False(column.Autoincrement) -// s.Equal("This is a custom type column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("geometry", column.Type) -// s.Equal("geometry", column.TypeName) -// } -// if column.Name == "date" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a date column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("date", column.Type) -// s.Equal("date", column.TypeName) -// } -// if column.Name == "date_time" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a date time column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("datetime(3)", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "date_time_tz" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a date time with time zone column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("datetime(3)", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "decimal" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a decimal column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("decimal(4,1)", column.Type) -// s.Equal("decimal", column.TypeName) -// } -// if column.Name == "deleted_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("timestamp", column.Type) -// s.Equal("timestamp", column.TypeName) -// } -// if column.Name == "double" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a double column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("double", column.Type) -// s.Equal("double", column.TypeName) -// } -// if column.Name == "enum" { -// s.False(column.Autoincrement) -// s.Equal("utf8mb4_0900_ai_ci", column.Collation) -// s.Equal("This is a enum column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("enum('a','b','c')", column.Type) -// s.Equal("enum", column.TypeName) -// } -// if column.Name == "enum_int" { -// s.False(column.Autoincrement) -// s.Equal("utf8mb4_0900_ai_ci", column.Collation) -// s.Equal("This is a enum column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("enum('1','2','3')", column.Type) -// s.Equal("enum", column.TypeName) -// } -// if column.Name == "float" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a float column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("float", column.Type) -// s.Equal("float", column.TypeName) -// } -// if column.Name == "id" { -// s.True(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a id column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("bigint unsigned", column.Type) -// s.Equal("bigint", column.TypeName) -// } -// if column.Name == "integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a integer column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("int", column.Type) -// s.Equal("int", column.TypeName) -// } -// if column.Name == "integer_default" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a integer_default column", column.Comment) -// s.Equal(1, cast.ToInt(column.Default)) -// s.False(column.Nullable) -// s.Equal("int", column.Type) -// s.Equal("int", column.TypeName) -// } -// if column.Name == "json" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a json column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("json", column.Type) -// s.Equal("json", column.TypeName) -// } -// if column.Name == "jsonb" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a jsonb column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("json", column.Type) -// s.Equal("json", column.TypeName) -// } -// if column.Name == "long_text" { -// s.False(column.Autoincrement) -// s.Equal("utf8mb4_0900_ai_ci", column.Collation) -// s.Equal("This is a long_text column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("longtext", column.Type) -// s.Equal("longtext", column.TypeName) -// } -// if column.Name == "medium_text" { -// s.False(column.Autoincrement) -// s.Equal("utf8mb4_0900_ai_ci", column.Collation) -// s.Equal("This is a medium_text column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("mediumtext", column.Type) -// s.Equal("mediumtext", column.TypeName) -// } -// if column.Name == "string" { -// s.False(column.Autoincrement) -// s.Equal("utf8mb4_0900_ai_ci", column.Collation) -// s.Equal("This is a string column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("varchar(255)", column.Type) -// s.Equal("varchar", column.TypeName) -// } -// if column.Name == "string_default" { -// s.False(column.Autoincrement) -// s.Equal("utf8mb4_0900_ai_ci", column.Collation) -// s.Equal("This is a string_default column", column.Comment) -// s.Equal("goravel", column.Default) -// s.False(column.Nullable) -// s.Equal("varchar(255)", column.Type) -// s.Equal("varchar", column.TypeName) -// } -// if column.Name == "text" { -// s.False(column.Autoincrement) -// s.Equal("utf8mb4_0900_ai_ci", column.Collation) -// s.Equal("This is a text column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("text", column.Type) -// s.Equal("text", column.TypeName) -// } -// if column.Name == "time" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a time column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("time(2)", column.Type) -// s.Equal("time", column.TypeName) -// } -// if column.Name == "time_tz" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a time with time zone column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("time(2)", column.Type) -// s.Equal("time", column.TypeName) -// } -// if column.Name == "timestamp" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a timestamp without time zone column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("timestamp(2)", column.Type) -// s.Equal("timestamp", column.TypeName) -// } -// if column.Name == "timestamp_tz" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a timestamp with time zone column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("timestamp(2)", column.Type) -// s.Equal("timestamp", column.TypeName) -// } -// if column.Name == "timestamp_use_current" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a timestamp_use_current column", column.Comment) -// s.Equal("CURRENT_TIMESTAMP", column.Default) -// s.False(column.Nullable) -// s.Equal("timestamp", column.Type) -// s.Equal("timestamp", column.TypeName) -// } -// if column.Name == "timestamp_use_current_on_update" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a timestamp_use_current_on_update column", column.Comment) -// s.Equal("CURRENT_TIMESTAMP", column.Default) -// s.False(column.Nullable) -// s.Equal("timestamp", column.Type) -// s.Equal("timestamp", column.TypeName) -// } -// if column.Name == "tiny_text" { -// s.False(column.Autoincrement) -// s.Equal("utf8mb4_0900_ai_ci", column.Collation) -// s.Equal("This is a tiny_text column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("tinytext", column.Type) -// s.Equal("tinytext", column.TypeName) -// } -// if column.Name == "updated_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("timestamp(2)", column.Type) -// s.Equal("timestamp", column.TypeName) -// } -// if column.Name == "unsigned_integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a unsigned_integer column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("int unsigned", column.Type) -// s.Equal("int", column.TypeName) -// } -// if column.Name == "unsigned_big_integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Equal("This is a unsigned_big_integer column", column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("bigint unsigned", column.Type) -// s.Equal("bigint", column.TypeName) -// } -// } -// } - -// func (s *SchemaSuite) TestColumnTypes_Sqlserver() { -// if s.driverToTestQuery[sqlserver.Name] == nil { -// s.T().Skip("Skip test") -// } - -// testQuery := s.driverToTestQuery[sqlserver.Name] -// schema := newSchema(testQuery, s.driverToTestQuery) -// table := "sqlserver_columns" -// s.createTableAndAssertColumnsForColumnMethods(schema, table) - -// columns, err := schema.GetColumns(table) -// s.Require().Nil(err) - -// for _, column := range columns { -// if column.Name == "another_deleted_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("datetimeoffset(34)", column.Type) -// s.Equal("datetimeoffset", column.TypeName) -// } -// if column.Name == "big_integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("bigint", column.Type) -// s.Equal("bigint", column.TypeName) -// } -// if column.Name == "boolean_default" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Equal("('1')", column.Default) -// s.False(column.Nullable) -// s.Equal("bit", column.Type) -// s.Equal("bit", column.TypeName) -// } -// if column.Name == "char" { -// s.False(column.Autoincrement) -// s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("nchar(510)", column.Type) -// s.Equal("nchar", column.TypeName) -// } -// if column.Name == "created_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("datetime2(22)", column.Type) -// s.Equal("datetime2", column.TypeName) -// } -// if column.Name == "custom_type" { -// s.False(column.Autoincrement) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("geometry", column.Type) -// s.Equal("geometry", column.TypeName) -// } -// if column.Name == "date" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("date", column.Type) -// s.Equal("date", column.TypeName) -// } -// if column.Name == "date_time" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("datetime2(23)", column.Type) -// s.Equal("datetime2", column.TypeName) -// } -// if column.Name == "date_time_tz" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("datetimeoffset(30)", column.Type) -// s.Equal("datetimeoffset", column.TypeName) -// } -// if column.Name == "decimal" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("decimal(4,1)", column.Type) -// s.Equal("decimal", column.TypeName) -// } -// if column.Name == "deleted_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "double" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("float(53)", column.Type) -// s.Equal("float", column.TypeName) -// } -// if column.Name == "enum" { -// s.False(column.Autoincrement) -// s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("nvarchar(510)", column.Type) -// s.Equal("nvarchar", column.TypeName) -// } -// if column.Name == "enum_int" { -// s.False(column.Autoincrement) -// s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("nvarchar(510)", column.Type) -// s.Equal("nvarchar", column.TypeName) -// } -// if column.Name == "float" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("real", column.Type) -// s.Equal("real", column.TypeName) -// } -// if column.Name == "id" { -// s.True(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("bigint", column.Type) -// s.Equal("bigint", column.TypeName) -// } -// if column.Name == "integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("int", column.Type) -// s.Equal("int", column.TypeName) -// } -// if column.Name == "integer_default" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Equal("('1')", column.Default) -// s.False(column.Nullable) -// s.Equal("int", column.Type) -// s.Equal("int", column.TypeName) -// } -// if column.Name == "json" { -// s.False(column.Autoincrement) -// s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("nvarchar(max)", column.Type) -// s.Equal("nvarchar", column.TypeName) -// } -// if column.Name == "jsonb" { -// s.False(column.Autoincrement) -// s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("nvarchar(max)", column.Type) -// s.Equal("nvarchar", column.TypeName) -// } -// if column.Name == "long_text" { -// s.False(column.Autoincrement) -// s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("nvarchar(max)", column.Type) -// s.Equal("nvarchar", column.TypeName) -// } -// if column.Name == "medium_text" { -// s.False(column.Autoincrement) -// s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("nvarchar(max)", column.Type) -// s.Equal("nvarchar", column.TypeName) -// } -// if column.Name == "string" { -// s.False(column.Autoincrement) -// s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("nvarchar(510)", column.Type) -// s.Equal("nvarchar", column.TypeName) -// } -// if column.Name == "string_default" { -// s.False(column.Autoincrement) -// s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) -// s.Empty(column.Comment) -// s.Equal("('goravel')", column.Default) -// s.False(column.Nullable) -// s.Equal("nvarchar(510)", column.Type) -// s.Equal("nvarchar", column.TypeName) -// } -// if column.Name == "text" { -// s.False(column.Autoincrement) -// s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("nvarchar(max)", column.Type) -// s.Equal("nvarchar", column.TypeName) -// } -// if column.Name == "time" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("time(11)", column.Type) -// s.Equal("time", column.TypeName) -// } -// if column.Name == "time_tz" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("time(11)", column.Type) -// s.Equal("time", column.TypeName) -// } -// if column.Name == "timestamp" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("datetime2(22)", column.Type) -// s.Equal("datetime2", column.TypeName) -// } -// if column.Name == "timestamp_tz" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("datetimeoffset(29)", column.Type) -// s.Equal("datetimeoffset", column.TypeName) -// } -// if column.Name == "timestamp_use_current" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Equal("(getdate())", column.Default) -// s.False(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "timestamp_use_current_on_update" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Equal("(getdate())", column.Default) -// s.False(column.Nullable) -// s.Equal("datetime", column.Type) -// s.Equal("datetime", column.TypeName) -// } -// if column.Name == "tiny_text" { -// s.False(column.Autoincrement) -// s.Equal("SQL_Latin1_General_CP1_CI_AS", column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("nvarchar(510)", column.Type) -// s.Equal("nvarchar", column.TypeName) -// } -// if column.Name == "updated_at" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.True(column.Nullable) -// s.Equal("datetime2(22)", column.Type) -// s.Equal("datetime2", column.TypeName) -// } -// if column.Name == "unsigned_integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("int", column.Type) -// s.Equal("int", column.TypeName) -// } -// if column.Name == "unsigned_big_integer" { -// s.False(column.Autoincrement) -// s.Empty(column.Collation) -// s.Empty(column.Comment) -// s.Empty(column.Default) -// s.False(column.Nullable) -// s.Equal("bigint", column.Type) -// s.Equal("bigint", column.TypeName) -// } -// } -// } + mysqlEnum := &MysqlEnum{ + Str: "a", + Int: 4, + } + s.ErrorContains(testQuery.Query().Table(table).Create(&mysqlEnum), "Data truncated for column 'int' at row 1") -func (s *SchemaSuite) TestEnum_Postgres() { - if s.driverToTestQuery[postgres.Name] == nil { + mysqlEnum = &MysqlEnum{ + Str: "a", + Int: 1, + } + s.NoError(testQuery.Query().Table(table).Create(&mysqlEnum)) + s.True(mysqlEnum.ID > 0) +} + +func (s *SchemaSuite) TestEnum_Sqlserver() { + if s.driverToTestQuery[sqlserver.Name] == nil { s.T().Skip("Skip test") } - testQuery := s.driverToTestQuery[postgres.Name] + testQuery := s.driverToTestQuery[sqlserver.Name] schema := newSchema(testQuery, s.driverToTestQuery) - table := "postgres_enum" + table := "sqlserver_enum" s.NoError(schema.Create(table, func(table contractsschema.Blueprint) { table.ID() @@ -1572,131 +1679,26 @@ func (s *SchemaSuite) TestEnum_Postgres() { table.Enum("int", []any{1, 2, 3}) })) - type PostgresEnum struct { + type SqlserverEnum struct { ID uint `gorm:"primaryKey"` Str string Int string } - postgresEnum := &PostgresEnum{ + sqlserverEnum := &SqlserverEnum{ Str: "a", Int: "4", } - s.ErrorContains(testQuery.Query().Table(table).Create(&postgresEnum), `new row for relation "goravel_postgres_enum" violates check constraint "goravel_postgres_enum_int_check"`) + s.ErrorContains(testQuery.Query().Table(table).Create(&sqlserverEnum), `The INSERT statement conflicted with the CHECK constraint`) - postgresEnum = &PostgresEnum{ + sqlserverEnum = &SqlserverEnum{ Str: "a", Int: "1", } - s.NoError(testQuery.Query().Table(table).Create(&postgresEnum)) - s.True(postgresEnum.ID > 0) + s.NoError(testQuery.Query().Table(table).Create(&sqlserverEnum)) + s.True(sqlserverEnum.ID > 0) } -// func (s *SchemaSuite) TestEnum_Sqlite() { -// if s.driverToTestQuery[sqlite.Name] == nil { -// s.T().Skip("Skip test") -// } - -// testQuery := s.driverToTestQuery[sqlite.Name] -// schema := newSchema(testQuery, s.driverToTestQuery) -// table := "sqlite_enum" - -// s.NoError(schema.Create(table, func(table contractsschema.Blueprint) { -// table.ID() -// table.Enum("str", []any{"a", "b", "c"}) -// table.Enum("int", []any{1, 2, 3}) -// })) - -// type SqliteEnum struct { -// ID uint `gorm:"primaryKey"` -// Str string -// Int string -// } - -// sqliteEnum := &SqliteEnum{ -// Str: "a", -// Int: "4", -// } -// s.ErrorContains(testQuery.Query().Table(table).Create(&sqliteEnum), `constraint failed: CHECK constraint failed: int`) - -// sqliteEnum = &SqliteEnum{ -// Str: "a", -// Int: "1", -// } -// s.NoError(testQuery.Query().Table(table).Create(&sqliteEnum)) -// s.True(sqliteEnum.ID > 0) -// } - -// func (s *SchemaSuite) TestEnum_Mysql() { -// if s.driverToTestQuery[mysql.Name] == nil { -// s.T().Skip("Skip test") -// } - -// testQuery := s.driverToTestQuery[mysql.Name] -// schema := newSchema(testQuery, s.driverToTestQuery) -// table := "mysql_enum" - -// s.NoError(schema.Create(table, func(table contractsschema.Blueprint) { -// table.ID() -// table.Enum("str", []any{"a", "b", "c"}) -// table.Enum("int", []any{1, 2, 3}) -// })) - -// type MysqlEnum struct { -// ID uint `gorm:"primaryKey"` -// Str string -// Int int -// } - -// mysqlEnum := &MysqlEnum{ -// Str: "a", -// Int: 4, -// } -// s.ErrorContains(testQuery.Query().Table(table).Create(&mysqlEnum), "Data truncated for column 'int' at row 1") - -// mysqlEnum = &MysqlEnum{ -// Str: "a", -// Int: 1, -// } -// s.NoError(testQuery.Query().Table(table).Create(&mysqlEnum)) -// s.True(mysqlEnum.ID > 0) -// } - -// func (s *SchemaSuite) TestEnum_Sqlserver() { -// if s.driverToTestQuery[sqlserver.Name] == nil { -// s.T().Skip("Skip test") -// } - -// testQuery := s.driverToTestQuery[sqlserver.Name] -// schema := newSchema(testQuery, s.driverToTestQuery) -// table := "sqlserver_enum" - -// s.NoError(schema.Create(table, func(table contractsschema.Blueprint) { -// table.ID() -// table.Enum("str", []any{"a", "b", "c"}) -// table.Enum("int", []any{1, 2, 3}) -// })) - -// type SqlserverEnum struct { -// ID uint `gorm:"primaryKey"` -// Str string -// Int string -// } - -// sqlserverEnum := &SqlserverEnum{ -// Str: "a", -// Int: "4", -// } -// s.ErrorContains(testQuery.Query().Table(table).Create(&sqlserverEnum), `The INSERT statement conflicted with the CHECK constraint`) - -// sqlserverEnum = &SqlserverEnum{ -// Str: "a", -// Int: "1", -// } -// s.NoError(testQuery.Query().Table(table).Create(&sqlserverEnum)) -// s.True(sqlserverEnum.ID > 0) -// } - func (s *SchemaSuite) TestForeign() { for driver, testQuery := range s.driverToTestQuery { s.Run(driver, func() { @@ -1742,25 +1744,25 @@ func (s *SchemaSuite) TestForeign() { s.ElementsMatch([]string{"id"}, foreignKey.ForeignColumns) s.Equal("no action", foreignKey.OnDelete) s.Equal("no action", foreignKey.OnUpdate) - // if driver == sqlite.Name { - // s.Empty(foreignKey.Name) - // s.Empty(foreignKey.ForeignSchema) - // } else { - // s.Equal("goravel_foreign3_foreign1_id_foreign", foreignKey.Name) - // s.NotEmpty(foreignKey.ForeignSchema) - // } + if driver == sqlite.Name { + s.Empty(foreignKey.Name) + s.Empty(foreignKey.ForeignSchema) + } else { + s.Equal("goravel_foreign3_foreign1_id_foreign", foreignKey.Name) + s.NotEmpty(foreignKey.ForeignSchema) + } } else if s.prefix+table2 == foreignKey.ForeignTable { s.ElementsMatch([]string{"foreign2_id"}, foreignKey.Columns) s.ElementsMatch([]string{"id"}, foreignKey.ForeignColumns) s.Equal("cascade", foreignKey.OnDelete) s.Equal("cascade", foreignKey.OnUpdate) - // if driver == sqlite.Name { - // s.Empty(foreignKey.Name) - // s.Empty(foreignKey.ForeignSchema) - // } else { - // s.Equal("foreign3_foreign2_id_foreign", foreignKey.Name) - // s.NotEmpty(foreignKey.ForeignSchema) - // } + if driver == sqlite.Name { + s.Empty(foreignKey.Name) + s.Empty(foreignKey.ForeignSchema) + } else { + s.Equal("foreign3_foreign2_id_foreign", foreignKey.Name) + s.NotEmpty(foreignKey.ForeignSchema) + } } else { s.Fail("Unexpected foreign key") } @@ -1775,11 +1777,11 @@ func (s *SchemaSuite) TestForeign() { foreignKeys, err = schema.GetForeignKeys(table3) s.NoError(err) - // if driver == sqlite.Name { - // s.Len(foreignKeys, 2) - // } else { - // s.Len(foreignKeys, 0) - // } + if driver == sqlite.Name { + s.Len(foreignKeys, 2) + } else { + s.Len(foreignKeys, 0) + } }) } } @@ -1798,13 +1800,13 @@ func (s *SchemaSuite) TestFullText() { s.Require().Nil(err) - // if driver == mysql.Name || driver == postgres.Name { - // s.True(schema.HasIndex(table, "goravel_fulltext_name_fulltext")) - // s.True(schema.HasIndex(table, "fulltext_avatar_fulltext")) - // } else { - // s.False(schema.HasIndex(table, "goravel_fulltext_name_fulltext")) - // s.False(schema.HasIndex(table, "fulltext_avatar_fulltext")) - // } + if driver == mysql.Name || driver == postgres.Name { + s.True(schema.HasIndex(table, "goravel_fulltext_name_fulltext")) + s.True(schema.HasIndex(table, "fulltext_avatar_fulltext")) + } else { + s.False(schema.HasIndex(table, "goravel_fulltext_name_fulltext")) + s.False(schema.HasIndex(table, "fulltext_avatar_fulltext")) + } err = schema.Table(table, func(table contractsschema.Blueprint) { table.DropFullText("name") @@ -1834,12 +1836,12 @@ func (s *SchemaSuite) TestPrimary() { if driver == postgres.Name { s.Require().True(schema.HasIndex(table, "goravel_primaries_pkey")) } - // if driver == mysql.Name { - // s.Require().True(schema.HasIndex(table, "primary")) - // } - // if driver == sqlserver.Name { - // s.Require().True(schema.HasIndex(table, "goravel_primaries_name_age_primary")) - // } + if driver == mysql.Name { + s.Require().True(schema.HasIndex(table, "primary")) + } + if driver == sqlserver.Name { + s.Require().True(schema.HasIndex(table, "goravel_primaries_name_age_primary")) + } s.NoError(schema.Table(table, func(table contractsschema.Blueprint) { table.DropPrimary("name", "age") @@ -1847,12 +1849,12 @@ func (s *SchemaSuite) TestPrimary() { if driver == postgres.Name { s.Require().False(schema.HasIndex(table, "goravel_primaries_pkey")) } - // if driver == mysql.Name { - // s.Require().False(schema.HasIndex(table, "primary")) - // } - // if driver == sqlserver.Name { - // s.Require().False(schema.HasIndex(table, "goravel_primaries_name_age_primary")) - // } + if driver == mysql.Name { + s.Require().False(schema.HasIndex(table, "primary")) + } + if driver == sqlserver.Name { + s.Require().False(schema.HasIndex(table, "goravel_primaries_name_age_primary")) + } }) } } @@ -1879,9 +1881,9 @@ func (s *SchemaSuite) TestRenameColumn() { func (s *SchemaSuite) TestTableComment() { for driver, testQuery := range s.driverToTestQuery { - // if driver == sqlite.Name || driver == sqlserver.Name { - // continue - // } + if driver == sqlite.Name || driver == sqlserver.Name { + continue + } s.Run(driver, func() { schema := newSchema(testQuery, s.driverToTestQuery) table := "table_with_comment" @@ -1996,253 +1998,253 @@ func (s *SchemaSuite) TestID_Postgres() { } } -// func (s *SchemaSuite) TestID_Sqlite() { -// if s.driverToTestQuery[sqlite.Name] == nil { -// s.T().Skip("Skip test") -// } - -// testQuery := s.driverToTestQuery[sqlite.Name] -// schema := newSchema(testQuery, s.driverToTestQuery) - -// tests := []struct { -// table string -// setup func(table string) error -// expectType string -// }{ -// { -// table: "ID", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.ID("id").Comment("This is a id column") -// }) -// }, -// expectType: "integer", -// }, -// { -// table: "MediumIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.MediumIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "integer", -// }, -// { -// table: "IntegerIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.IntegerIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "integer", -// }, -// { -// table: "SmallIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.SmallIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "integer", -// }, -// { -// table: "TinyIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.TinyIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "integer", -// }, -// } - -// for _, test := range tests { -// s.Run(test.table, func() { -// s.Require().Nil(test.setup(test.table)) -// s.Require().True(schema.HasTable(test.table)) - -// columns, err := schema.GetColumns(test.table) -// s.Require().Nil(err) -// s.Equal(1, len(columns)) -// s.Equal("id", columns[0].Name) -// s.True(columns[0].Autoincrement) -// s.Empty(columns[0].Comment) -// s.Empty(columns[0].Default) -// s.False(columns[0].Nullable) -// s.Equal(test.expectType, columns[0].Type) -// }) -// } -// } - -// func (s *SchemaSuite) TestID_Mysql() { -// if s.driverToTestQuery[mysql.Name] == nil { -// s.T().Skip("Skip test") -// } - -// testQuery := s.driverToTestQuery[mysql.Name] -// schema := newSchema(testQuery, s.driverToTestQuery) - -// tests := []struct { -// table string -// setup func(table string) error -// expectType string -// expectTypeName string -// }{ -// { -// table: "ID", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.ID("id").Comment("This is a id column") -// }) -// }, -// expectType: "bigint unsigned", -// expectTypeName: "bigint", -// }, -// { -// table: "MediumIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.MediumIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "mediumint unsigned", -// expectTypeName: "mediumint", -// }, -// { -// table: "IntegerIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.IntegerIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "int unsigned", -// expectTypeName: "int", -// }, -// { -// table: "SmallIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.SmallIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "smallint unsigned", -// expectTypeName: "smallint", -// }, -// { -// table: "TinyIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.TinyIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "tinyint unsigned", -// expectTypeName: "tinyint", -// }, -// } - -// for _, test := range tests { -// s.Run(test.table, func() { -// s.Require().Nil(test.setup(test.table)) -// s.Require().True(schema.HasTable(test.table)) - -// columns, err := schema.GetColumns(test.table) -// s.Require().Nil(err) -// s.Equal(1, len(columns)) -// s.True(columns[0].Autoincrement) -// s.Empty(columns[0].Collation) -// s.Equal("This is a id column", columns[0].Comment) -// s.Empty(columns[0].Default) -// s.False(columns[0].Nullable) -// s.Equal(test.expectType, columns[0].Type) -// s.Equal(test.expectTypeName, columns[0].TypeName) -// }) -// } -// } - -// func (s *SchemaSuite) TestID_Sqlserver() { -// if s.driverToTestQuery[sqlserver.Name] == nil { -// s.T().Skip("Skip test") -// } - -// testQuery := s.driverToTestQuery[sqlserver.Name] -// schema := newSchema(testQuery, s.driverToTestQuery) - -// tests := []struct { -// table string -// setup func(table string) error -// expectType string -// expectTypeName string -// }{ -// { -// table: "ID", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.ID("id").Comment("This is a id column") -// }) -// }, -// expectType: "bigint", -// expectTypeName: "bigint", -// }, -// { -// table: "MediumIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.MediumIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "int", -// expectTypeName: "int", -// }, -// { -// table: "IntegerIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.IntegerIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "int", -// expectTypeName: "int", -// }, -// { -// table: "SmallIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.SmallIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "smallint", -// expectTypeName: "smallint", -// }, -// { -// table: "TinyIncrements", -// setup: func(table string) error { -// return schema.Create(table, func(table contractsschema.Blueprint) { -// table.TinyIncrements("id").Comment("This is a id column") -// }) -// }, -// expectType: "tinyint", -// expectTypeName: "tinyint", -// }, -// } - -// for _, test := range tests { -// s.Run(test.table, func() { -// s.Require().Nil(test.setup(test.table)) -// s.Require().True(schema.HasTable(test.table)) - -// columns, err := schema.GetColumns(test.table) -// s.Require().Nil(err) -// s.Equal(1, len(columns)) -// s.True(columns[0].Autoincrement) -// s.Empty(columns[0].Collation) -// s.Empty(columns[0].Comment) -// s.Empty(columns[0].Default) -// s.False(columns[0].Nullable) -// s.Equal(test.expectType, columns[0].Type) -// s.Equal(test.expectTypeName, columns[0].TypeName) -// }) -// } -// } +func (s *SchemaSuite) TestID_Sqlite() { + if s.driverToTestQuery[sqlite.Name] == nil { + s.T().Skip("Skip test") + } + + testQuery := s.driverToTestQuery[sqlite.Name] + schema := newSchema(testQuery, s.driverToTestQuery) + + tests := []struct { + table string + setup func(table string) error + expectType string + }{ + { + table: "ID", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.ID("id").Comment("This is a id column") + }) + }, + expectType: "integer", + }, + { + table: "MediumIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.MediumIncrements("id").Comment("This is a id column") + }) + }, + expectType: "integer", + }, + { + table: "IntegerIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.IntegerIncrements("id").Comment("This is a id column") + }) + }, + expectType: "integer", + }, + { + table: "SmallIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.SmallIncrements("id").Comment("This is a id column") + }) + }, + expectType: "integer", + }, + { + table: "TinyIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.TinyIncrements("id").Comment("This is a id column") + }) + }, + expectType: "integer", + }, + } + + for _, test := range tests { + s.Run(test.table, func() { + s.Require().Nil(test.setup(test.table)) + s.Require().True(schema.HasTable(test.table)) + + columns, err := schema.GetColumns(test.table) + s.Require().Nil(err) + s.Equal(1, len(columns)) + s.Equal("id", columns[0].Name) + s.True(columns[0].Autoincrement) + s.Empty(columns[0].Comment) + s.Empty(columns[0].Default) + s.False(columns[0].Nullable) + s.Equal(test.expectType, columns[0].Type) + }) + } +} + +func (s *SchemaSuite) TestID_Mysql() { + if s.driverToTestQuery[mysql.Name] == nil { + s.T().Skip("Skip test") + } + + testQuery := s.driverToTestQuery[mysql.Name] + schema := newSchema(testQuery, s.driverToTestQuery) + + tests := []struct { + table string + setup func(table string) error + expectType string + expectTypeName string + }{ + { + table: "ID", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.ID("id").Comment("This is a id column") + }) + }, + expectType: "bigint unsigned", + expectTypeName: "bigint", + }, + { + table: "MediumIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.MediumIncrements("id").Comment("This is a id column") + }) + }, + expectType: "mediumint unsigned", + expectTypeName: "mediumint", + }, + { + table: "IntegerIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.IntegerIncrements("id").Comment("This is a id column") + }) + }, + expectType: "int unsigned", + expectTypeName: "int", + }, + { + table: "SmallIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.SmallIncrements("id").Comment("This is a id column") + }) + }, + expectType: "smallint unsigned", + expectTypeName: "smallint", + }, + { + table: "TinyIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.TinyIncrements("id").Comment("This is a id column") + }) + }, + expectType: "tinyint unsigned", + expectTypeName: "tinyint", + }, + } + + for _, test := range tests { + s.Run(test.table, func() { + s.Require().Nil(test.setup(test.table)) + s.Require().True(schema.HasTable(test.table)) + + columns, err := schema.GetColumns(test.table) + s.Require().Nil(err) + s.Equal(1, len(columns)) + s.True(columns[0].Autoincrement) + s.Empty(columns[0].Collation) + s.Equal("This is a id column", columns[0].Comment) + s.Empty(columns[0].Default) + s.False(columns[0].Nullable) + s.Equal(test.expectType, columns[0].Type) + s.Equal(test.expectTypeName, columns[0].TypeName) + }) + } +} + +func (s *SchemaSuite) TestID_Sqlserver() { + if s.driverToTestQuery[sqlserver.Name] == nil { + s.T().Skip("Skip test") + } + + testQuery := s.driverToTestQuery[sqlserver.Name] + schema := newSchema(testQuery, s.driverToTestQuery) + + tests := []struct { + table string + setup func(table string) error + expectType string + expectTypeName string + }{ + { + table: "ID", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.ID("id").Comment("This is a id column") + }) + }, + expectType: "bigint", + expectTypeName: "bigint", + }, + { + table: "MediumIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.MediumIncrements("id").Comment("This is a id column") + }) + }, + expectType: "int", + expectTypeName: "int", + }, + { + table: "IntegerIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.IntegerIncrements("id").Comment("This is a id column") + }) + }, + expectType: "int", + expectTypeName: "int", + }, + { + table: "SmallIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.SmallIncrements("id").Comment("This is a id column") + }) + }, + expectType: "smallint", + expectTypeName: "smallint", + }, + { + table: "TinyIncrements", + setup: func(table string) error { + return schema.Create(table, func(table contractsschema.Blueprint) { + table.TinyIncrements("id").Comment("This is a id column") + }) + }, + expectType: "tinyint", + expectTypeName: "tinyint", + }, + } + + for _, test := range tests { + s.Run(test.table, func() { + s.Require().Nil(test.setup(test.table)) + s.Require().True(schema.HasTable(test.table)) + + columns, err := schema.GetColumns(test.table) + s.Require().Nil(err) + s.Equal(1, len(columns)) + s.True(columns[0].Autoincrement) + s.Empty(columns[0].Collation) + s.Empty(columns[0].Comment) + s.Empty(columns[0].Default) + s.False(columns[0].Nullable) + s.Equal(test.expectType, columns[0].Type) + s.Equal(test.expectTypeName, columns[0].TypeName) + }) + } +} func (s *SchemaSuite) TestIndexMethods() { for driver, testQuery := range s.driverToTestQuery { @@ -2270,25 +2272,25 @@ func (s *SchemaSuite) TestIndexMethods() { if index.Name == "goravel_indexes_id_name_index" { s.ElementsMatch(index.Columns, []string{"id", "name"}) s.False(index.Primary) - // if driver == sqlite.Name { - // s.Empty(index.Type) - // } else if driver == sqlserver.Name { - // s.Equal("nonclustered", index.Type) - // } else { - // s.Equal("btree", index.Type) - // } + if driver == sqlite.Name { + s.Empty(index.Type) + } else if driver == sqlserver.Name { + s.Equal("nonclustered", index.Type) + } else { + s.Equal("btree", index.Type) + } s.False(index.Unique) } if index.Name == "name_index" { s.ElementsMatch(index.Columns, []string{"name"}) s.False(index.Primary) - // if driver == sqlite.Name { - // s.Empty(index.Type) - // } else if driver == sqlserver.Name { - // s.Equal("nonclustered", index.Type) - // } else { - // s.Equal("btree", index.Type) - // } + if driver == sqlite.Name { + s.Empty(index.Type) + } else if driver == sqlserver.Name { + s.Equal("nonclustered", index.Type) + } else { + s.Equal("btree", index.Type) + } s.False(index.Unique) } if strings.HasPrefix(index.Name, "pk_") { @@ -2300,11 +2302,11 @@ func (s *SchemaSuite) TestIndexMethods() { if index.Name == "primary" { s.ElementsMatch(index.Columns, []string{"id"}) s.True(index.Primary) - // if driver == sqlite.Name { - // s.Empty(index.Type) - // } else { - // s.Equal("btree", index.Type) - // } + if driver == sqlite.Name { + s.Empty(index.Type) + } else { + s.Equal("btree", index.Type) + } s.True(index.Unique) } if index.Name == "goravel_indexes_pkey" { @@ -2518,11 +2520,11 @@ func (s *SchemaSuite) TestViewMethods() { s.Equal("goravel_view", views[0].Name) s.NotEmpty(views[0].Definition) - // if driver == postgres.Name || driver == sqlserver.Name { - // s.NotEmpty(views[0].Schema) - // } else { - // s.Empty(views[0].Schema) - // } + if driver == postgres.Name || driver == sqlserver.Name { + s.NotEmpty(views[0].Schema) + } else { + s.Empty(views[0].Schema) + } s.NoError(schema.DropAllViews()) s.False(schema.HasView("goravel_view")) @@ -2638,23 +2640,23 @@ func TestPostgresSchema(t *testing.T) { assert.True(t, newSchema.HasTable(table)) } -// func TestSqlserverSchema(t *testing.T) { -// schema := "goravel" -// table := "table" -// sqlserverTestQuery := NewTestQueryBuilder().Sqlserver("", false) -// sqlserverTestQuery.WithSchema(testSchema) -// newSchema := newSchema(sqlserverTestQuery, map[string]*TestQuery{ -// sqlserverTestQuery.Driver().Config().Connection: sqlserverTestQuery, -// }) - -// assert.NoError(t, newSchema.Create(fmt.Sprintf("%s.%s", schema, table), func(table contractsschema.Blueprint) { -// table.String("name") -// })) -// tables, err := newSchema.GetTables() - -// assert.NoError(t, err) -// assert.Len(t, tables, 1) -// assert.Equal(t, table, tables[0].Name) -// assert.Equal(t, schema, tables[0].Schema) -// assert.True(t, newSchema.HasTable(fmt.Sprintf("%s.%s", schema, table))) -// } +func TestSqlserverSchema(t *testing.T) { + schema := "goravel" + table := "table" + sqlserverTestQuery := NewTestQueryBuilder().Sqlserver("", false) + sqlserverTestQuery.WithSchema(testSchema) + newSchema := newSchema(sqlserverTestQuery, map[string]*TestQuery{ + sqlserverTestQuery.Driver().Config().Connection: sqlserverTestQuery, + }) + + assert.NoError(t, newSchema.Create(fmt.Sprintf("%s.%s", schema, table), func(table contractsschema.Blueprint) { + table.String("name") + })) + tables, err := newSchema.GetTables() + + assert.NoError(t, err) + assert.Len(t, tables, 1) + assert.Equal(t, table, tables[0].Name) + assert.Equal(t, schema, tables[0].Schema) + assert.True(t, newSchema.HasTable(fmt.Sprintf("%s.%s", schema, table))) +} From 3f81b101524f8fc6a1b81a246d2a70e9faae9518 Mon Sep 17 00:00:00 2001 From: Bowen Date: Sun, 9 Mar 2025 14:44:14 +0800 Subject: [PATCH 2/2] fix test --- database/db/row.go | 19 ++++++++++++++++++- tests/query.go | 14 +++++++------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/database/db/row.go b/database/db/row.go index 53998f5d3..27570a97a 100644 --- a/database/db/row.go +++ b/database/db/row.go @@ -23,7 +23,7 @@ func NewRow(row map[string]any) *Row { func (r *Row) Scan(value any) error { msConfig := &mapstructure.DecoderConfig{ DecodeHook: mapstructure.ComposeDecodeHookFunc( - ToTimeHookFunc(), ToCarbonHookFunc(), ToDeletedAtHookFunc(), + ToStringHookFunc(), ToTimeHookFunc(), ToCarbonHookFunc(), ToDeletedAtHookFunc(), ), Squash: true, Result: value, @@ -40,6 +40,23 @@ func (r *Row) Scan(value any) error { return decoder.Decode(r.row) } +// ToStringHookFunc is a hook function that converts []uint8 to string. +// Mysql returns []uint8 for String type when scanning the rows. +func ToStringHookFunc() mapstructure.DecodeHookFunc { + return func(f reflect.Type, t reflect.Type, data any) (any, error) { + if t != reflect.TypeOf("") { + return data, nil + } + + dataSlice, ok := data.([]uint8) + if ok { + return string(dataSlice), nil + } + + return data, nil + } +} + func ToTimeHookFunc() mapstructure.DecodeHookFunc { return func(f reflect.Type, t reflect.Type, data any) (any, error) { if t != reflect.TypeOf(time.Time{}) { diff --git a/tests/query.go b/tests/query.go index e6e1448b4..70f3c52e7 100644 --- a/tests/query.go +++ b/tests/query.go @@ -128,16 +128,16 @@ func NewTestQueryBuilder() *TestQueryBuilder { } func (r *TestQueryBuilder) All(prefix string, singular bool) map[string]*TestQuery { - // postgresTestQuery := r.Postgres(prefix, singular) + postgresTestQuery := r.Postgres(prefix, singular) mysqlTestQuery := r.Mysql(prefix, singular) - // sqlserverTestQuery := r.Sqlserver(prefix, singular) - // sqliteTestQuery := r.Sqlite(prefix, singular) + sqlserverTestQuery := r.Sqlserver(prefix, singular) + sqliteTestQuery := r.Sqlite(prefix, singular) return map[string]*TestQuery{ - // postgresTestQuery.Driver().Config().Driver: postgresTestQuery, - mysqlTestQuery.Driver().Config().Driver: mysqlTestQuery, - // sqlserverTestQuery.Driver().Config().Driver: sqlserverTestQuery, - // sqliteTestQuery.Driver().Config().Driver: sqliteTestQuery, + postgresTestQuery.Driver().Config().Driver: postgresTestQuery, + mysqlTestQuery.Driver().Config().Driver: mysqlTestQuery, + sqlserverTestQuery.Driver().Config().Driver: sqlserverTestQuery, + sqliteTestQuery.Driver().Config().Driver: sqliteTestQuery, } }