diff --git a/session_delete_test.go b/session_delete_test.go new file mode 100644 index 00000000..6522a139 --- /dev/null +++ b/session_delete_test.go @@ -0,0 +1,125 @@ +// Copyright 2017 The Xorm Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xorm + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestDelete(t *testing.T) { + assert.NoError(t, prepareEngine()) + + type UserinfoDelete struct { + Uid int64 + IsMan bool + } + + assert.NoError(t, testEngine.Sync2(new(UserinfoDelete))) + + user := UserinfoDelete{Uid: 1} + cnt, err := testEngine.Insert(&user) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + cnt, err = testEngine.Delete(&UserinfoDelete{Uid: 1}) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + user.Uid = 0 + user.IsMan = true + has, err := testEngine.Id(1).Get(&user) + assert.NoError(t, err) + assert.False(t, has) +} + +func TestDeleted(t *testing.T) { + assert.NoError(t, prepareEngine()) + + type Deleted struct { + Id int64 `xorm:"pk"` + Name string + DeletedAt time.Time `xorm:"deleted"` + } + + err := testEngine.DropTables(&Deleted{}) + assert.NoError(t, err) + + err = testEngine.CreateTables(&Deleted{}) + assert.NoError(t, err) + + _, err = testEngine.InsertOne(&Deleted{Id: 1, Name: "11111"}) + assert.NoError(t, err) + + _, err = testEngine.InsertOne(&Deleted{Id: 2, Name: "22222"}) + assert.NoError(t, err) + + _, err = testEngine.InsertOne(&Deleted{Id: 3, Name: "33333"}) + assert.NoError(t, err) + + // Test normal Find() + var records1 []Deleted + err = testEngine.Where("`"+testEngine.ColumnMapper.Obj2Table("Id")+"` > 0").Find(&records1, &Deleted{}) + assert.EqualValues(t, 3, len(records1)) + + // Test normal Get() + record1 := &Deleted{} + has, err := testEngine.Id(1).Get(record1) + assert.NoError(t, err) + assert.True(t, has) + + // Test Delete() with deleted + affected, err := testEngine.Id(1).Delete(&Deleted{}) + assert.NoError(t, err) + assert.EqualValues(t, 1, affected) + + has, err = testEngine.Id(1).Get(&Deleted{}) + assert.NoError(t, err) + assert.False(t, has) + + var records2 []Deleted + err = testEngine.Where("`" + testEngine.ColumnMapper.Obj2Table("Id") + "` > 0").Find(&records2) + assert.NoError(t, err) + assert.EqualValues(t, 2, len(records2)) + + // Test no rows affected after Delete() again. + affected, err = testEngine.Id(1).Delete(&Deleted{}) + assert.NoError(t, err) + assert.EqualValues(t, 0, affected) + + // Deleted.DeletedAt must not be updated. + affected, err = testEngine.Id(2).Update(&Deleted{Name: "2", DeletedAt: time.Now()}) + assert.NoError(t, err) + assert.EqualValues(t, 1, affected) + + record2 := &Deleted{} + has, err = testEngine.Id(2).Get(record2) + assert.NoError(t, err) + assert.True(t, record2.DeletedAt.IsZero()) + + // Test find all records whatever `deleted`. + var unscopedRecords1 []Deleted + err = testEngine.Unscoped().Where("`"+testEngine.ColumnMapper.Obj2Table("Id")+"` > 0").Find(&unscopedRecords1, &Deleted{}) + assert.NoError(t, err) + assert.EqualValues(t, 3, len(unscopedRecords1)) + + // Delete() must really delete a record with Unscoped() + affected, err = testEngine.Unscoped().Id(1).Delete(&Deleted{}) + assert.NoError(t, err) + assert.EqualValues(t, 1, affected) + + var unscopedRecords2 []Deleted + err = testEngine.Unscoped().Where("`"+testEngine.ColumnMapper.Obj2Table("Id")+"` > 0").Find(&unscopedRecords2, &Deleted{}) + assert.NoError(t, err) + assert.EqualValues(t, 2, len(unscopedRecords2)) + + var records3 []Deleted + err = testEngine.Where("`"+testEngine.ColumnMapper.Obj2Table("Id")+"` > 0").And("`"+testEngine.ColumnMapper.Obj2Table("Id")+"`> 1"). + Or("`"+testEngine.ColumnMapper.Obj2Table("Id")+"` = ?", 3).Find(&records3) + assert.NoError(t, err) + assert.EqualValues(t, 2, len(records3)) +} diff --git a/session_get_test.go b/session_get_test.go index ee6711ab..a8806ced 100644 --- a/session_get_test.go +++ b/session_get_test.go @@ -108,3 +108,44 @@ func TestGetVar(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "1.5", fmt.Sprintf("%v", v4)) } + +func TestGetStruct(t *testing.T) { + assert.NoError(t, prepareEngine()) + + type UserinfoGet struct { + Uid int `xorm:"pk autoincr"` + IsMan bool + } + + assert.NoError(t, testEngine.Sync(new(UserinfoGet))) + + cnt, err := testEngine.Insert(&UserinfoGet{Uid: 2}) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + user := UserinfoGet{Uid: 2} + has, err := testEngine.Get(&user) + assert.NoError(t, err) + assert.True(t, has) + + type NoIdUser struct { + User string `xorm:"unique"` + Remain int64 + Total int64 + } + + assert.NoError(t, testEngine.Sync(&NoIdUser{})) + + userCol := testEngine.ColumnMapper.Obj2Table("User") + _, err = testEngine.Where("`"+userCol+"` = ?", "xlw").Delete(&NoIdUser{}) + assert.NoError(t, err) + + cnt, err = testEngine.Insert(&NoIdUser{"xlw", 20, 100}) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + noIdUser := new(NoIdUser) + has, err = testEngine.Where("`"+userCol+"` = ?", "xlw").Get(noIdUser) + assert.NoError(t, err) + assert.True(t, has) +} diff --git a/session_raw_test.go b/session_raw_test.go index 126f617f..1f2145b2 100644 --- a/session_raw_test.go +++ b/session_raw_test.go @@ -5,6 +5,7 @@ package xorm import ( + "strconv" "testing" "time" @@ -41,3 +42,28 @@ func TestQueryString(t *testing.T) { assert.Equal(t, "28", records[0]["age"]) assert.Equal(t, "1.5", records[0]["money"]) } + +func TestQuery(t *testing.T) { + assert.NoError(t, prepareEngine()) + + type UserinfoQuery struct { + Uid int + Name string + } + + assert.NoError(t, testEngine.Sync(new(UserinfoQuery))) + + res, err := testEngine.Exec("INSERT INTO `userinfo_query` (uid, name) VALUES (?, ?)", 1, "user") + assert.NoError(t, err) + cnt, err := res.RowsAffected() + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + results, err := testEngine.Query("select * from userinfo_query") + assert.NoError(t, err) + assert.EqualValues(t, 1, len(results)) + id, err := strconv.Atoi(string(results[0]["uid"])) + assert.NoError(t, err) + assert.EqualValues(t, 1, id) + assert.Equal(t, "user", string(results[0]["name"])) +} diff --git a/session_sum_test.go b/session_sum_test.go index 31a65f98..05190653 100644 --- a/session_sum_test.go +++ b/session_sum_test.go @@ -9,6 +9,7 @@ import ( "strconv" "testing" + "github.com/go-xorm/builder" "github.com/stretchr/testify/assert" ) @@ -99,3 +100,31 @@ func TestSumCustomColumn(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 3, int(sumInt)) } + +func TestCount(t *testing.T) { + assert.NoError(t, prepareEngine()) + + type UserinfoCount struct { + Departname string + } + assert.NoError(t, testEngine.Sync2(new(UserinfoCount))) + + colName := testEngine.ColumnMapper.Obj2Table("Departname") + var cond builder.Cond = builder.Eq{ + "`" + colName + "`": "dev", + } + + total, err := testEngine.Where(cond).Count(new(UserinfoCount)) + assert.NoError(t, err) + assert.EqualValues(t, 0, total) + + cnt, err := testEngine.Insert(&UserinfoCount{ + Departname: "dev", + }) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + total, err = testEngine.Where(cond).Count(new(UserinfoCount)) + assert.NoError(t, err) + assert.EqualValues(t, 1, total) +}