diff --git a/.gitignore b/.gitignore index 4cd4252b..6dc08c05 100644 --- a/.gitignore +++ b/.gitignore @@ -35,7 +35,7 @@ test.db.sql *coverage.out test.db -integrations/*.sql -integrations/test_sqlite* +tests/*.sql +tests/test_sqlite* cover.out cover.html diff --git a/Makefile b/Makefile index ade90e6d..55183557 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ SED_INPLACE := sed -i GO_DIRS := caches contexts integrations core dialects internal log migrate names schemas tags GOFILES := $(wildcard *.go) GOFILES += $(shell find $(GO_DIRS) -name "*.go" -type f) -INTEGRATION_PACKAGES := xorm.io/xorm/integrations +INTEGRATION_PACKAGES := xorm.io/xorm/tests PACKAGES ?= $(filter-out $(INTEGRATION_PACKAGES),$(shell $(GO) list ./...)) TEST_COCKROACH_HOST ?= cockroach:26257 diff --git a/convert/time.go b/convert/time.go index c923e955..d90dc428 100644 --- a/convert/time.go +++ b/convert/time.go @@ -28,14 +28,19 @@ func String2Time(s string, originalLocation *time.Location, convertedLocation *t dt = dt.In(convertedLocation) return &dt, nil } else if len(s) == 20 && s[10] == 'T' && s[19] == 'Z' { + if strings.HasPrefix(s, "0000-00-00T00:00:00") || strings.HasPrefix(s, "0001-01-01T00:00:00") { + return &time.Time{}, nil + } dt, err := time.ParseInLocation("2006-01-02T15:04:05", s[:19], originalLocation) if err != nil { return nil, err } dt = dt.In(convertedLocation) - dt.IsZero() return &dt, nil } else if len(s) == 25 && s[10] == 'T' && s[19] == '+' && s[22] == ':' { + if strings.HasPrefix(s, "0000-00-00T00:00:00") || strings.HasPrefix(s, "0001-01-01T00:00:00") { + return &time.Time{}, nil + } dt, err := time.Parse(time.RFC3339, s) if err != nil { return nil, err @@ -43,6 +48,10 @@ func String2Time(s string, originalLocation *time.Location, convertedLocation *t dt = dt.In(convertedLocation) return &dt, nil } else if len(s) >= 21 && s[10] == 'T' && s[19] == '.' { + if strings.HasPrefix(s, "0000-00-00T00:00:00."+strings.Repeat("0", len(s)-20)) || + strings.HasPrefix(s, "0001-01-01T00:00:00."+strings.Repeat("0", len(s)-20)) { + return &time.Time{}, nil + } dt, err := time.Parse(time.RFC3339Nano, s) if err != nil { return nil, err @@ -50,6 +59,10 @@ func String2Time(s string, originalLocation *time.Location, convertedLocation *t dt = dt.In(convertedLocation) return &dt, nil } else if len(s) >= 21 && s[19] == '.' { + if strings.HasPrefix(s, "0000-00-00T00:00:00."+strings.Repeat("0", len(s)-20)) || + strings.HasPrefix(s, "0001-01-01T00:00:00."+strings.Repeat("0", len(s)-20)) { + return &time.Time{}, nil + } layout := "2006-01-02 15:04:05." + strings.Repeat("0", len(s)-20) dt, err := time.ParseInLocation(layout, s, originalLocation) if err != nil { @@ -68,11 +81,11 @@ func String2Time(s string, originalLocation *time.Location, convertedLocation *t dt = dt.In(convertedLocation) return &dt, nil } else if len(s) == 8 && s[2] == ':' && s[5] == ':' { - currentDate := time.Now() dt, err := time.ParseInLocation("15:04:05", s, originalLocation) if err != nil { return nil, err } + currentDate := time.Now() // add current date for correct time locations dt = dt.AddDate(currentDate.Year(), int(currentDate.Month()), currentDate.Day()) dt = dt.In(convertedLocation) @@ -82,6 +95,9 @@ func String2Time(s string, originalLocation *time.Location, convertedLocation *t } else { i, err := strconv.ParseInt(s, 10, 64) if err == nil { + if i == 0 { + return &time.Time{}, nil + } tm := time.Unix(i, 0).In(convertedLocation) return &tm, nil } @@ -108,6 +124,9 @@ func AsTime(src interface{}, dbLoc *time.Location, uiLoc *time.Location) (*time. if !t.Valid { return nil, nil } + if utils.IsTimeZero(t.Time) { + return &time.Time{}, nil + } z, _ := t.Time.Zone() if len(z) == 0 || t.Time.Year() == 0 || t.Time.Location().String() != dbLoc.String() { tm := time.Date(t.Time.Year(), t.Time.Month(), t.Time.Day(), t.Time.Hour(), @@ -117,6 +136,9 @@ func AsTime(src interface{}, dbLoc *time.Location, uiLoc *time.Location) (*time. tm := t.Time.In(uiLoc) return &tm, nil case *time.Time: + if utils.IsTimeZero(*t) { + return &time.Time{}, nil + } z, _ := t.Zone() if len(z) == 0 || t.Year() == 0 || t.Location().String() != dbLoc.String() { tm := time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), @@ -126,6 +148,9 @@ func AsTime(src interface{}, dbLoc *time.Location, uiLoc *time.Location) (*time. tm := t.In(uiLoc) return &tm, nil case time.Time: + if utils.IsTimeZero(t) { + return &time.Time{}, nil + } z, _ := t.Zone() if len(z) == 0 || t.Year() == 0 || t.Location().String() != dbLoc.String() { tm := time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), @@ -135,12 +160,21 @@ func AsTime(src interface{}, dbLoc *time.Location, uiLoc *time.Location) (*time. tm := t.In(uiLoc) return &tm, nil case int: + if t == 0 { + return &time.Time{}, nil + } tm := time.Unix(int64(t), 0).In(uiLoc) return &tm, nil case int64: + if t == 0 { + return &time.Time{}, nil + } tm := time.Unix(t, 0).In(uiLoc) return &tm, nil case *sql.NullInt64: + if t.Int64 == 0 { + return &time.Time{}, nil + } tm := time.Unix(t.Int64, 0).In(uiLoc) return &tm, nil } diff --git a/dialects/mssql.go b/dialects/mssql.go index dcac9c3f..2c64e637 100644 --- a/dialects/mssql.go +++ b/dialects/mssql.go @@ -320,11 +320,7 @@ func (db *mssql) SQLType(c *schemas.Column) string { res += "(MAX)" } case schemas.TimeStamp, schemas.DateTime: - if c.Length > 3 { - res = "DATETIME2" - } else { - return schemas.DateTime - } + return "DATETIME2" case schemas.TimeStampz: res = "DATETIMEOFFSET" c.Length = 7 diff --git a/internal/statements/statement.go b/internal/statements/statement.go index 68690bbe..c075ec54 100644 --- a/internal/statements/statement.go +++ b/internal/statements/statement.go @@ -707,10 +707,7 @@ func (statement *Statement) CondDeleted(col *schemas.Column) builder.Cond { if col.SQLType.IsNumeric() { cond = builder.Eq{colName: 0} } else { - // FIXME: mssql: The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value. - if statement.dialect.URI().DBType != schemas.MSSQL { - cond = builder.Eq{colName: utils.ZeroTime1} - } + cond = builder.Eq{colName: utils.ZeroTime1} } if col.Nullable { diff --git a/session_insert.go b/session_insert.go index 7003e0f7..7cc15241 100644 --- a/session_insert.go +++ b/session_insert.go @@ -471,7 +471,8 @@ func (session *Session) genInsertColumns(bean interface{}) ([]string, []interfac } if col.IsDeleted { - arg, err := dialects.FormatColumnTime(session.engine.dialect, session.engine.DatabaseTZ, col, time.Time{}) + zeroTime := time.Date(1, 1, 1, 0, 0, 0, 0, session.engine.DatabaseTZ) + arg, err := dialects.FormatColumnTime(session.engine.dialect, session.engine.DatabaseTZ, col, zeroTime) if err != nil { return nil, nil, err } diff --git a/integrations/cache_test.go b/tests/cache_test.go similarity index 97% rename from integrations/cache_test.go rename to tests/cache_test.go index 2caeaa34..c3f84c77 100644 --- a/integrations/cache_test.go +++ b/tests/cache_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "testing" @@ -28,7 +28,7 @@ func TestCacheFind(t *testing.T) { assert.NoError(t, testEngine.Sync(new(MailBox))) - var inserts = []*MailBox{ + inserts := []*MailBox{ { Id: 0, Username: "user1", @@ -105,7 +105,7 @@ func TestCacheFind2(t *testing.T) { assert.NoError(t, testEngine.Sync(new(MailBox2))) - var inserts = []*MailBox2{ + inserts := []*MailBox2{ { Id: 0, Username: "user1", @@ -156,7 +156,7 @@ func TestCacheGet(t *testing.T) { assert.NoError(t, testEngine.Sync(new(MailBox3))) - var inserts = []*MailBox3{ + inserts := []*MailBox3{ { Username: "user1", Password: "pass1", diff --git a/integrations/engine_dm_test.go b/tests/engine_dm_test.go similarity index 93% rename from integrations/engine_dm_test.go rename to tests/engine_dm_test.go index 3b195ef8..5b25af29 100644 --- a/integrations/engine_dm_test.go +++ b/tests/engine_dm_test.go @@ -5,7 +5,7 @@ //go:build dm // +build dm -package integrations +package tests import "xorm.io/xorm/schemas" diff --git a/integrations/engine_group_test.go b/tests/engine_group_test.go similarity index 97% rename from integrations/engine_group_test.go rename to tests/engine_group_test.go index 635f73a6..629e0aa4 100644 --- a/integrations/engine_group_test.go +++ b/tests/engine_group_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "testing" diff --git a/integrations/engine_test.go b/tests/engine_test.go similarity index 99% rename from integrations/engine_test.go rename to tests/engine_test.go index 86ed7344..79ca42f5 100644 --- a/integrations/engine_test.go +++ b/tests/engine_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "context" diff --git a/integrations/main_test.go b/tests/main_test.go similarity index 91% rename from integrations/main_test.go rename to tests/main_test.go index 225ae45a..ab0ee802 100644 --- a/integrations/main_test.go +++ b/tests/main_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "testing" diff --git a/integrations/performance_test.go b/tests/performance_test.go similarity index 92% rename from integrations/performance_test.go rename to tests/performance_test.go index 49183717..d1d12161 100644 --- a/integrations/performance_test.go +++ b/tests/performance_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "testing" @@ -23,7 +23,7 @@ func BenchmarkGetVars(b *testing.B) { assert.NoError(b, testEngine.Sync(new(BenchmarkGetVars))) - var v = BenchmarkGetVars{ + v := BenchmarkGetVars{ Name: "myname", } _, err := testEngine.Insert(&v) @@ -54,7 +54,7 @@ func BenchmarkGetStruct(b *testing.B) { assert.NoError(b, testEngine.Sync(new(BenchmarkGetStruct))) - var v = BenchmarkGetStruct{ + v := BenchmarkGetStruct{ Name: "myname", } _, err := testEngine.Insert(&v) @@ -86,13 +86,13 @@ func BenchmarkFindStruct(b *testing.B) { assert.NoError(b, testEngine.Sync(new(BenchmarkFindStruct))) - var v = BenchmarkFindStruct{ + v := BenchmarkFindStruct{ Name: "myname", } _, err := testEngine.Insert(&v) assert.NoError(b, err) - var mynames = make([]BenchmarkFindStruct, 0, 1) + mynames := make([]BenchmarkFindStruct, 0, 1) b.StartTimer() for i := 0; i < b.N; i++ { err := testEngine.Find(&mynames) diff --git a/integrations/processors_test.go b/tests/processors_test.go similarity index 99% rename from integrations/processors_test.go rename to tests/processors_test.go index 4c383437..af2866e8 100644 --- a/integrations/processors_test.go +++ b/tests/processors_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "errors" @@ -200,7 +200,7 @@ func TestProcessors(t *testing.T) { // -- // test find map processors - var p2FindMap = make(map[int64]*ProcessorsStruct) + p2FindMap := make(map[int64]*ProcessorsStruct) err = testEngine.Find(&p2FindMap) assert.NoError(t, err) @@ -848,13 +848,13 @@ func TestAfterLoadProcessor(t *testing.T) { assertSync(t, new(AfterLoadStructA), new(AfterLoadStructB)) - var a = AfterLoadStructA{ + a := AfterLoadStructA{ Content: "testa", } _, err := testEngine.Insert(&a) assert.NoError(t, err) - var b = AfterLoadStructB{ + b := AfterLoadStructB{ Content: "testb", AId: a.Id, } diff --git a/integrations/rows_test.go b/tests/rows_test.go similarity index 99% rename from integrations/rows_test.go rename to tests/rows_test.go index e354b75e..fe4f374c 100644 --- a/integrations/rows_test.go +++ b/tests/rows_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "testing" diff --git a/integrations/schema_test.go b/tests/schema_test.go similarity index 99% rename from integrations/schema_test.go rename to tests/schema_test.go index 149c6394..c945a35c 100644 --- a/integrations/schema_test.go +++ b/tests/schema_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "errors" diff --git a/integrations/session_cols_test.go b/tests/session_cols_test.go similarity index 97% rename from integrations/session_cols_test.go rename to tests/session_cols_test.go index 462ea7c7..4a6ef39f 100644 --- a/integrations/session_cols_test.go +++ b/tests/session_cols_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "testing" @@ -22,7 +22,7 @@ func TestSetExpr(t *testing.T) { assert.NoError(t, testEngine.Sync(new(UserExprIssue))) - var issue = UserExprIssue{ + issue := UserExprIssue{ Title: "my issue", } cnt, err := testEngine.Insert(&issue) @@ -44,7 +44,7 @@ func TestSetExpr(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - var not = "NOT" + not := "NOT" if testEngine.Dialect().URI().DBType == schemas.MSSQL || testEngine.Dialect().URI().DBType == schemas.DAMENG { not = "~" } @@ -118,7 +118,7 @@ func TestMustCol(t *testing.T) { assertSync(t, new(CustomerUpdate)) - var customer = CustomerUpdate{ + customer := CustomerUpdate{ ParentId: 1, } cnt, err := testEngine.Insert(&customer) diff --git a/integrations/session_cond_test.go b/tests/session_cond_test.go similarity index 98% rename from integrations/session_cond_test.go rename to tests/session_cond_test.go index 0597d74e..cbcd0cb5 100644 --- a/integrations/session_cond_test.go +++ b/tests/session_cond_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "errors" @@ -37,7 +37,7 @@ func TestBuilder(t *testing.T) { assert.NoError(t, err) var cond Condition - var q = testEngine.Quote + q := testEngine.Quote has, err := testEngine.Where(builder.Eq{q("col_name"): "col1"}).Get(&cond) assert.NoError(t, err) assert.Equal(t, true, has, "records should exist") @@ -90,7 +90,7 @@ func TestBuilder(t *testing.T) { assert.EqualValues(t, 0, len(conds), "records should not exist") // complex condtions - var where = builder.NewCond() + where := builder.NewCond() if true { where = where.And(builder.Eq{q("col_name"): "col1"}) where = where.Or(builder.And(builder.In(q("col_name"), "col1", "col2"), builder.Expr(q("col_name")+" = ?", "col1"))) diff --git a/integrations/session_count_test.go b/tests/session_count_test.go similarity index 99% rename from integrations/session_count_test.go rename to tests/session_count_test.go index c6e64e76..24c5d24a 100644 --- a/integrations/session_count_test.go +++ b/tests/session_count_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "testing" diff --git a/integrations/session_delete_test.go b/tests/session_delete_test.go similarity index 99% rename from integrations/session_delete_test.go rename to tests/session_delete_test.go index 1ed3e706..44d4ad7d 100644 --- a/integrations/session_delete_test.go +++ b/tests/session_delete_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "os" diff --git a/integrations/session_exist_test.go b/tests/session_exist_test.go similarity index 98% rename from integrations/session_exist_test.go rename to tests/session_exist_test.go index ca1e66ad..a9e3a6a8 100644 --- a/integrations/session_exist_test.go +++ b/tests/session_exist_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "context" @@ -106,14 +106,14 @@ func TestExistStructForJoin(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - var orderlist = OrderList{ + orderlist := OrderList{ Eid: ply.Id, } cnt, err = testEngine.Insert(&orderlist) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - var um = Number{ + um := Number{ Lid: orderlist.Id, } cnt, err = testEngine.Insert(&um) diff --git a/integrations/session_find_test.go b/tests/session_find_test.go similarity index 99% rename from integrations/session_find_test.go rename to tests/session_find_test.go index 65df5aee..2a754e2a 100644 --- a/integrations/session_find_test.go +++ b/tests/session_find_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "testing" diff --git a/integrations/session_get_test.go b/tests/session_get_test.go similarity index 99% rename from integrations/session_get_test.go rename to tests/session_get_test.go index d3403814..2ff2f67d 100644 --- a/integrations/session_get_test.go +++ b/tests/session_get_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "database/sql" diff --git a/integrations/session_insert_test.go b/tests/session_insert_test.go similarity index 92% rename from integrations/session_insert_test.go rename to tests/session_insert_test.go index 084deb38..dd3e8405 100644 --- a/integrations/session_insert_test.go +++ b/tests/session_insert_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "fmt" @@ -142,8 +142,13 @@ func TestInsert(t *testing.T) { assert.NoError(t, PrepareEngine()) assertSync(t, new(Userinfo)) - user := Userinfo{0, "xiaolunwen", "dev", "lunny", time.Now(), - Userdetail{Id: 1}, 1.78, []byte{1, 2, 3}, true} + user := Userinfo{ + 0, "xiaolunwen", "dev", "lunny", time.Now(), + Userdetail{Id: 1}, + 1.78, + []byte{1, 2, 3}, + true, + } cnt, err := testEngine.Insert(&user) assert.NoError(t, err) assert.EqualValues(t, 1, cnt, "insert not returned 1") @@ -161,8 +166,10 @@ func TestInsertAutoIncr(t *testing.T) { assertSync(t, new(Userinfo)) // auto increment insert - user := Userinfo{Username: "xiaolunwen2", Departname: "dev", Alias: "lunny", Created: time.Now(), - Detail: Userdetail{Id: 1}, Height: 1.78, Avatar: []byte{1, 2, 3}, IsMan: true} + user := Userinfo{ + Username: "xiaolunwen2", Departname: "dev", Alias: "lunny", Created: time.Now(), + Detail: Userdetail{Id: 1}, Height: 1.78, Avatar: []byte{1, 2, 3}, IsMan: true, + } cnt, err := testEngine.Insert(&user) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -184,7 +191,7 @@ func TestInsertDefault(t *testing.T) { err := testEngine.Sync(di) assert.NoError(t, err) - var di2 = DefaultInsert{Name: "test"} + di2 := DefaultInsert{Name: "test"} _, err = testEngine.Omit(testEngine.GetColumnMapper().Obj2Table("Status")).Insert(&di2) assert.NoError(t, err) @@ -210,7 +217,7 @@ func TestInsertDefault2(t *testing.T) { err := testEngine.Sync(di) assert.NoError(t, err) - var di2 = DefaultInsert2{Name: "test"} + di2 := DefaultInsert2{Name: "test"} _, err = testEngine.Omit(testEngine.GetColumnMapper().Obj2Table("CheckTime")).Insert(&di2) assert.NoError(t, err) @@ -438,7 +445,7 @@ func TestCreatedJsonTime(t *testing.T) { assert.True(t, has) assert.EqualValues(t, time.Time(ci5.Created).Unix(), time.Time(di5.Created).Unix()) - var dis = make([]MyJSONTime, 0) + dis := make([]MyJSONTime, 0) err = testEngine.Find(&dis) assert.NoError(t, err) } @@ -762,7 +769,7 @@ func TestInsertWhere(t *testing.T) { assert.NoError(t, PrepareEngine()) assertSync(t, new(InsertWhere)) - var i = InsertWhere{ + i := InsertWhere{ RepoId: 1, Width: 10, Height: 20, @@ -872,7 +879,7 @@ func TestInsertExpr2(t *testing.T) { assertSync(t, new(InsertExprsRelease)) - var ie = InsertExprsRelease{ + ie := InsertExprsRelease{ RepoId: 1, IsTag: true, } @@ -1047,7 +1054,7 @@ func TestInsertIntSlice(t *testing.T) { assert.NoError(t, testEngine.Sync(new(InsertIntSlice))) - var v = InsertIntSlice{ + v := InsertIntSlice{ NameIDs: []int{1, 2}, } cnt, err := testEngine.Insert(&v) @@ -1064,7 +1071,7 @@ func TestInsertIntSlice(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - var v3 = InsertIntSlice{ + v3 := InsertIntSlice{ NameIDs: nil, } cnt, err = testEngine.Insert(&v3) @@ -1202,3 +1209,80 @@ func TestInsertMultipleMap(t *testing.T) { Name: "xiaolunwen", }, res[1]) } + +func TestInsertNotDeleted(t *testing.T) { + assert.NoError(t, PrepareEngine()) + zeroTime := time.Date(1, 1, 1, 0, 0, 0, 0, testEngine.GetTZDatabase()) + type TestInsertNotDeletedStructNotRight struct { + ID uint64 `xorm:"'ID' pk autoincr"` + DeletedAt time.Time `xorm:"'DELETED_AT' deleted notnull"` + } + // notnull tag will be ignored + err := testEngine.Sync(new(TestInsertNotDeletedStructNotRight)) + assert.NoError(t, err) + + type TestInsertNotDeletedStruct struct { + ID uint64 `xorm:"'ID' pk autoincr"` + DeletedAt time.Time `xorm:"'DELETED_AT' deleted"` + } + + assert.NoError(t, testEngine.Sync(new(TestInsertNotDeletedStruct))) + + var v1 TestInsertNotDeletedStructNotRight + _, err = testEngine.Insert(&v1) + assert.NoError(t, err) + + var v2 TestInsertNotDeletedStructNotRight + has, err := testEngine.Get(&v2) + assert.NoError(t, err) + assert.True(t, has) + assert.Equal(t, v2.DeletedAt.In(testEngine.GetTZDatabase()).Format("2006-01-02 15:04:05"), zeroTime.Format("2006-01-02 15:04:05")) + + var v3 TestInsertNotDeletedStruct + _, err = testEngine.Insert(&v3) + assert.NoError(t, err) + + var v4 TestInsertNotDeletedStruct + has, err = testEngine.Get(&v4) + assert.NoError(t, err) + assert.True(t, has) + assert.Equal(t, v4.DeletedAt.In(testEngine.GetTZDatabase()).Format("2006-01-02 15:04:05"), zeroTime.Format("2006-01-02 15:04:05")) +} + +type MyAutoTimeFields1 struct { + Id int64 + Dt time.Time `xorm:"created DATETIME"` +} + +func (MyAutoTimeFields1) TableName() string { + return "my_auto_time_fields" +} + +type MyAutoTimeFields2 struct { + Id int64 + Dt time.Time `xorm:"created"` +} + +func (MyAutoTimeFields2) TableName() string { + return "my_auto_time_fields" +} + +func TestAutoTimeFields(t *testing.T) { + assert.NoError(t, PrepareEngine()) + + assertSync(t, new(MyAutoTimeFields1)) + + _, err := testEngine.Insert(&MyAutoTimeFields1{}) + assert.NoError(t, err) + + var res []MyAutoTimeFields2 + assert.NoError(t, testEngine.Find(&res)) + assert.EqualValues(t, 1, len(res)) + + _, err = testEngine.Insert(&MyAutoTimeFields2{}) + assert.NoError(t, err) + + res = []MyAutoTimeFields2{} + assert.NoError(t, testEngine.Find(&res)) + assert.EqualValues(t, 2, len(res)) +} diff --git a/integrations/session_iterate_test.go b/tests/session_iterate_test.go similarity index 98% rename from integrations/session_iterate_test.go rename to tests/session_iterate_test.go index c5ecc593..f2e36899 100644 --- a/integrations/session_iterate_test.go +++ b/tests/session_iterate_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "testing" @@ -59,7 +59,7 @@ func TestBufferIterate(t *testing.T) { assert.NoError(t, testEngine.Sync(new(UserBufferIterate))) - var size = 20 + size := 20 for i := 0; i < size; i++ { cnt, err := testEngine.Insert(&UserBufferIterate{ IsMan: true, @@ -68,7 +68,7 @@ func TestBufferIterate(t *testing.T) { assert.EqualValues(t, 1, cnt) } - var cnt = 0 + cnt := 0 err := testEngine.BufferSize(9).Iterate(new(UserBufferIterate), func(i int, bean interface{}) error { user := bean.(*UserBufferIterate) assert.EqualValues(t, cnt+1, user.Id) diff --git a/integrations/session_pk_test.go b/tests/session_pk_test.go similarity index 97% rename from integrations/session_pk_test.go rename to tests/session_pk_test.go index 0244937f..43de4eea 100644 --- a/integrations/session_pk_test.go +++ b/tests/session_pk_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "sort" @@ -53,17 +53,21 @@ type StringPK struct { Name string } -type ID int64 -type MyIntPK struct { - ID ID `xorm:"pk autoincr"` - Name string -} +type ( + ID int64 + MyIntPK struct { + ID ID `xorm:"pk autoincr"` + Name string + } +) -type StrID string -type MyStringPK struct { - ID StrID `xorm:"pk notnull"` - Name string -} +type ( + StrID string + MyStringPK struct { + ID StrID `xorm:"pk notnull"` + Name string + } +) func TestIntId(t *testing.T) { assert.NoError(t, PrepareEngine()) @@ -187,7 +191,7 @@ func TestUintId(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - var inserts = []UintId{ + inserts := []UintId{ {Name: "test1"}, {Name: "test2"}, } @@ -390,7 +394,7 @@ func TestCompositeKey(t *testing.T) { assert.True(t, has) assert.EqualValues(t, compositeKeyVal, compositeKeyVal2) - var cps = make([]CompositeKey, 0) + cps := make([]CompositeKey, 0) err = testEngine.Find(&cps) assert.NoError(t, err) assert.EqualValues(t, 1, len(cps)) @@ -460,13 +464,15 @@ func TestCompositeKey2(t *testing.T) { assert.EqualValues(t, 1, cnt) } -type MyString string -type UserPK2 struct { - UserId MyString `xorm:"varchar(19) not null pk"` - NickName string `xorm:"varchar(19) not null"` - GameId uint32 `xorm:"integer pk"` - Score int32 `xorm:"integer"` -} +type ( + MyString string + UserPK2 struct { + UserId MyString `xorm:"varchar(19) not null pk"` + NickName string `xorm:"varchar(19) not null"` + GameId uint32 `xorm:"integer pk"` + Score int32 `xorm:"integer"` + } +) func TestCompositeKey3(t *testing.T) { assert.NoError(t, PrepareEngine()) diff --git a/integrations/session_query_test.go b/tests/session_query_test.go similarity index 99% rename from integrations/session_query_test.go rename to tests/session_query_test.go index ff62f25d..5a3a3631 100644 --- a/integrations/session_query_test.go +++ b/tests/session_query_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "bytes" diff --git a/integrations/session_raw_test.go b/tests/session_raw_test.go similarity index 99% rename from integrations/session_raw_test.go rename to tests/session_raw_test.go index eabd9753..569d7bed 100644 --- a/integrations/session_raw_test.go +++ b/tests/session_raw_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "strconv" diff --git a/integrations/session_sum_test.go b/tests/session_sum_test.go similarity index 92% rename from integrations/session_sum_test.go rename to tests/session_sum_test.go index e000233b..926269ee 100644 --- a/integrations/session_sum_test.go +++ b/tests/session_sum_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "fmt" @@ -25,13 +25,11 @@ func TestSum(t *testing.T) { assert.NoError(t, PrepareEngine()) assert.NoError(t, testEngine.Sync(new(SumStruct))) - var ( - cases = []SumStruct{ - {1, 6.2}, - {2, 5.3}, - {92, -0.2}, - } - ) + cases := []SumStruct{ + {1, 6.2}, + {2, 5.3}, + {92, -0.2}, + } var i int var f float32 @@ -84,13 +82,11 @@ func TestSumWithTableName(t *testing.T) { assert.NoError(t, PrepareEngine()) assert.NoError(t, testEngine.Sync(new(SumStructWithTableName))) - var ( - cases = []SumStructWithTableName{ - {1, 6.2}, - {2, 5.3}, - {92, -0.2}, - } - ) + cases := []SumStructWithTableName{ + {1, 6.2}, + {2, 5.3}, + {92, -0.2}, + } var i int var f float32 @@ -138,13 +134,11 @@ func TestSumCustomColumn(t *testing.T) { Float float32 } - var ( - cases = []SumStruct2{ - {1, 6.2}, - {2, 5.3}, - {92, -0.2}, - } - ) + cases := []SumStruct2{ + {1, 6.2}, + {2, 5.3}, + {92, -0.2}, + } assert.NoError(t, testEngine.Sync(new(SumStruct2))) diff --git a/integrations/session_test.go b/tests/session_test.go similarity index 98% rename from integrations/session_test.go rename to tests/session_test.go index a36b81bf..261f2c48 100644 --- a/integrations/session_test.go +++ b/tests/session_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "database/sql" diff --git a/integrations/session_tx_test.go b/tests/session_tx_test.go similarity index 98% rename from integrations/session_tx_test.go rename to tests/session_tx_test.go index 890e755d..c9db40ba 100644 --- a/integrations/session_tx_test.go +++ b/tests/session_tx_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "fmt" @@ -24,7 +24,7 @@ func TestTransaction(t *testing.T) { } counter(t) - //defer counter() + // defer counter() session := testEngine.NewSession() defer session.Close() @@ -58,7 +58,7 @@ func TestCombineTransaction(t *testing.T) { } counter() - //defer counter() + // defer counter() session := testEngine.NewSession() defer session.Close() @@ -187,7 +187,6 @@ func TestMultipleTransaction(t *testing.T) { } func TestInsertMulti2InterfaceTransaction(t *testing.T) { - type Multi2InterfaceTransaction struct { ID uint64 `xorm:"id pk autoincr"` Name string diff --git a/integrations/session_update_test.go b/tests/session_update_test.go similarity index 99% rename from integrations/session_update_test.go rename to tests/session_update_test.go index 2a8f8187..c13468d9 100644 --- a/integrations/session_update_test.go +++ b/tests/session_update_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "fmt" diff --git a/integrations/tags_test.go b/tests/tags_test.go similarity index 99% rename from integrations/tags_test.go rename to tests/tags_test.go index 4c33d56c..14803462 100644 --- a/integrations/tags_test.go +++ b/tests/tags_test.go @@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "fmt" "sort" - "strings" "testing" "time" "github.com/stretchr/testify/assert" + "xorm.io/xorm/convert" "xorm.io/xorm/internal/utils" "xorm.io/xorm/names" "xorm.io/xorm/schemas" @@ -1201,8 +1201,10 @@ func TestTagTime(t *testing.T) { has, err = testEngine.Table("tag_u_t_c_struct").Cols("created").Get(&tm) assert.NoError(t, err) assert.True(t, has) - assert.EqualValues(t, s.Created.UTC().Format("2006-01-02 15:04:05"), - strings.ReplaceAll(strings.ReplaceAll(tm, "T", " "), "Z", "")) + + tmTime, err := convert.String2Time(tm, time.UTC, time.UTC) + assert.NoError(t, err) + assert.EqualValues(t, s.Created.UTC().Format("2006-01-02 15:04:05"), tmTime.Format("2006-01-02 15:04:05")) } func TestTagAutoIncr(t *testing.T) { diff --git a/integrations/testdata/import1.sql b/tests/testdata/import1.sql similarity index 100% rename from integrations/testdata/import1.sql rename to tests/testdata/import1.sql diff --git a/integrations/testdata/import2.sql b/tests/testdata/import2.sql similarity index 100% rename from integrations/testdata/import2.sql rename to tests/testdata/import2.sql diff --git a/integrations/tests.go b/tests/tests.go similarity index 98% rename from integrations/tests.go rename to tests/tests.go index 59f4b29a..220e1c67 100644 --- a/integrations/tests.go +++ b/tests/tests.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "database/sql" @@ -162,7 +162,7 @@ func createEngine(dbType, connStr string) error { if err != nil { return err } - var tableNames = make([]interface{}, 0, len(tables)) + tableNames := make([]interface{}, 0, len(tables)) for _, table := range tables { tableNames = append(tableNames, table.Name) } diff --git a/integrations/time_test.go b/tests/time_test.go similarity index 96% rename from integrations/time_test.go rename to tests/time_test.go index 5a17417a..13b9ed15 100644 --- a/integrations/time_test.go +++ b/tests/time_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "fmt" @@ -10,6 +10,7 @@ import ( "strings" "testing" "time" + "xorm.io/xorm/convert" "xorm.io/xorm/internal/utils" @@ -18,7 +19,7 @@ import ( ) func formatTime(t time.Time, scales ...int) string { - var layout = "2006-01-02 15:04:05" + layout := "2006-01-02 15:04:05" if len(scales) > 0 && scales[0] > 0 { layout += "." + strings.Repeat("0", scales[0]) } @@ -35,7 +36,7 @@ func TestTimeUserTime(t *testing.T) { assertSync(t, new(TimeUser)) - var user = TimeUser{ + user := TimeUser{ Id: "lunny", OperTime: time.Now(), } @@ -80,7 +81,7 @@ func TestTimeUserTimeDiffLoc(t *testing.T) { assertSync(t, new(TimeUser2)) - var user = TimeUser2{ + user := TimeUser2{ Id: "lunny", OperTime: time.Now(), } @@ -110,7 +111,7 @@ func TestTimeUserCreated(t *testing.T) { assertSync(t, new(UserCreated)) - var user = UserCreated{ + user := UserCreated{ Id: "lunny", } @@ -154,7 +155,7 @@ func TestTimeUserCreatedDiffLoc(t *testing.T) { assertSync(t, new(UserCreated2)) - var user = UserCreated2{ + user := UserCreated2{ Id: "lunny", } @@ -184,7 +185,7 @@ func TestTimeUserUpdated(t *testing.T) { assertSync(t, new(UserUpdated)) - var user = UserUpdated{ + user := UserUpdated{ Id: "lunny", } @@ -204,7 +205,7 @@ func TestTimeUserUpdated(t *testing.T) { assert.EqualValues(t, formatTime(user.UpdatedAt), formatTime(user2.UpdatedAt)) fmt.Println("user2", user2.CreatedAt, user2.UpdatedAt) - var user3 = UserUpdated{ + user3 := UserUpdated{ Id: "lunny2", } @@ -250,7 +251,7 @@ func TestTimeUserUpdatedDiffLoc(t *testing.T) { assertSync(t, new(UserUpdated2)) - var user = UserUpdated2{ + user := UserUpdated2{ Id: "lunny", } @@ -270,7 +271,7 @@ func TestTimeUserUpdatedDiffLoc(t *testing.T) { assert.EqualValues(t, formatTime(user.UpdatedAt), formatTime(user2.UpdatedAt)) fmt.Println("user2", user2.CreatedAt, user2.UpdatedAt) - var user3 = UserUpdated2{ + user3 := UserUpdated2{ Id: "lunny2", } @@ -304,7 +305,7 @@ func TestTimeUserDeleted(t *testing.T) { assertSync(t, new(UserDeleted)) - var user = UserDeleted{ + user := UserDeleted{ Id: "lunny", } @@ -367,7 +368,7 @@ func TestTimeUserDeletedDiffLoc(t *testing.T) { assertSync(t, new(UserDeleted2)) - var user = UserDeleted2{ + user := UserDeleted2{ Id: "lunny", } @@ -412,7 +413,7 @@ func (j JSONDate) MarshalJSON() ([]byte, error) { } func (j *JSONDate) UnmarshalJSON(value []byte) error { - var v = strings.TrimSpace(strings.Trim(string(value), "\"")) + v := strings.TrimSpace(strings.Trim(string(value), "\"")) t, err := time.ParseInLocation("2006-01-02 15:04:05", v, time.Local) if err != nil { @@ -438,7 +439,7 @@ func TestCustomTimeUserDeleted(t *testing.T) { assertSync(t, new(UserDeleted3)) - var user = UserDeleted3{ + user := UserDeleted3{ Id: "lunny", } @@ -500,7 +501,7 @@ func TestCustomTimeUserDeletedDiffLoc(t *testing.T) { assertSync(t, new(UserDeleted4)) - var user = UserDeleted4{ + user := UserDeleted4{ Id: "lunny", } @@ -583,7 +584,7 @@ func TestTimestamp(t *testing.T) { assertSync(t, new(TimestampStruct)) - var d1 = TimestampStruct{ + d1 := TimestampStruct{ InsertTime: time.Now(), } cnt, err := testEngine.Insert(&d1) @@ -625,10 +626,10 @@ func TestTimestamp(t *testing.T) { func TestString2Time(t *testing.T) { loc, err := time.LoadLocation("Asia/Shanghai") assert.NoError(t, err) - var timeTmp1 = time.Date(2023, 7, 14, 11, 30, 0, 0, loc) - var timeTmp2 = time.Date(2023, 7, 14, 0, 0, 0, 0, loc) - var time1StampStr = strconv.FormatInt(timeTmp1.Unix(), 10) - var timeStr = "0000-00-00 00:00:00" + timeTmp1 := time.Date(2023, 7, 14, 11, 30, 0, 0, loc) + timeTmp2 := time.Date(2023, 7, 14, 0, 0, 0, 0, loc) + time1StampStr := strconv.FormatInt(timeTmp1.Unix(), 10) + timeStr := "0000-00-00 00:00:00" dt, err := convert.String2Time(timeStr, time.Local, time.Local) assert.NoError(t, err) assert.True(t, dt.Nanosecond() == 0) diff --git a/integrations/types_null_test.go b/tests/types_null_test.go similarity index 99% rename from integrations/types_null_test.go rename to tests/types_null_test.go index 8d98b456..d4fa250e 100644 --- a/integrations/types_null_test.go +++ b/tests/types_null_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "database/sql" diff --git a/integrations/types_test.go b/tests/types_test.go similarity index 99% rename from integrations/types_test.go rename to tests/types_test.go index 1c815b7a..dfdb4766 100644 --- a/integrations/types_test.go +++ b/tests/types_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package integrations +package tests import ( "errors"