gorm/tests/query_test.go

154 lines
4.0 KiB
Go
Raw Normal View History

2020-05-23 18:50:48 +03:00
package tests_test
import (
"reflect"
2020-05-31 19:36:18 +03:00
"sort"
2020-05-23 18:50:48 +03:00
"strconv"
"testing"
2020-05-31 19:36:18 +03:00
"time"
2020-05-23 18:50:48 +03:00
. "github.com/jinzhu/gorm/tests"
)
func TestFind(t *testing.T) {
var users = []User{
*GetUser("find", Config{}),
*GetUser("find", Config{}),
*GetUser("find", Config{}),
}
if err := DB.Create(&users).Error; err != nil {
t.Fatalf("errors happened when create users: %v", err)
}
t.Run("First", func(t *testing.T) {
var first User
if err := DB.Where("name = ?", "find").First(&first).Error; err != nil {
t.Errorf("errors happened when query first: %v", err)
} else {
CheckUser(t, first, users[0])
}
})
t.Run("Last", func(t *testing.T) {
var last User
if err := DB.Where("name = ?", "find").Last(&last).Error; err != nil {
t.Errorf("errors happened when query last: %v", err)
} else {
CheckUser(t, last, users[2])
}
})
var all []User
if err := DB.Where("name = ?", "find").Find(&all).Error; err != nil || len(all) != 3 {
t.Errorf("errors happened when query find: %v, length: %v", err, len(all))
} else {
for idx, user := range users {
t.Run("FindAll#"+strconv.Itoa(idx+1), func(t *testing.T) {
CheckUser(t, all[idx], user)
})
}
}
t.Run("FirstMap", func(t *testing.T) {
var first = map[string]interface{}{}
if err := DB.Model(&User{}).Where("name = ?", "find").First(first).Error; err != nil {
t.Errorf("errors happened when query first: %v", err)
} else {
for _, name := range []string{"Name", "Age", "Birthday"} {
t.Run(name, func(t *testing.T) {
dbName := DB.NamingStrategy.ColumnName("", name)
reflectValue := reflect.Indirect(reflect.ValueOf(users[0]))
AssertEqual(t, first[dbName], reflectValue.FieldByName(name).Interface())
})
}
}
})
var allMap = []map[string]interface{}{}
if err := DB.Model(&User{}).Where("name = ?", "find").Find(&allMap).Error; err != nil {
t.Errorf("errors happened when query first: %v", err)
} else {
for idx, user := range users {
t.Run("FindAllMap#"+strconv.Itoa(idx+1), func(t *testing.T) {
for _, name := range []string{"Name", "Age", "Birthday"} {
t.Run(name, func(t *testing.T) {
dbName := DB.NamingStrategy.ColumnName("", name)
reflectValue := reflect.Indirect(reflect.ValueOf(user))
AssertEqual(t, allMap[idx][dbName], reflectValue.FieldByName(name).Interface())
})
}
})
}
}
}
2020-05-31 16:11:20 +03:00
2020-05-31 19:36:18 +03:00
func TestFillSmallerStruct(t *testing.T) {
user := User{Name: "SmallerUser", Age: 100}
DB.Save(&user)
type SimpleUser struct {
Name string
ID int64
UpdatedAt time.Time
CreatedAt time.Time
}
var simpleUser SimpleUser
if err := DB.Table("users").Where("name = ?", user.Name).First(&simpleUser).Error; err != nil {
t.Fatalf("Failed to query smaller user, got error %v", err)
}
AssertObjEqual(t, user, simpleUser, "Name", "ID", "UpdatedAt", "CreatedAt")
}
2020-05-31 16:11:20 +03:00
func TestPluck(t *testing.T) {
users := []*User{
GetUser("pluck-user1", Config{}),
GetUser("pluck-user2", Config{}),
GetUser("pluck-user3", Config{}),
}
DB.Create(&users)
var names []string
if err := DB.Model(User{}).Where("name like ?", "pluck-user%").Order("name").Pluck("name", &names).Error; err != nil {
2020-05-31 19:36:18 +03:00
t.Errorf("got error when pluck name: %v", err)
2020-05-31 16:11:20 +03:00
}
var ids []int
if err := DB.Model(User{}).Where("name like ?", "pluck-user%").Order("name").Pluck("id", &ids).Error; err != nil {
2020-05-31 19:36:18 +03:00
t.Errorf("got error when pluck id: %v", err)
2020-05-31 16:11:20 +03:00
}
for idx, name := range names {
if name != users[idx].Name {
t.Errorf("Unexpected result on pluck name, got %+v", names)
}
}
for idx, id := range ids {
if int(id) != int(users[idx].ID) {
t.Errorf("Unexpected result on pluck id, got %+v", ids)
}
}
}
2020-05-31 19:36:18 +03:00
func TestPluckWithSelect(t *testing.T) {
users := []User{
{Name: "pluck_with_select_1", Age: 25},
{Name: "pluck_with_select_2", Age: 26},
}
DB.Create(&users)
var userAges []int
err := DB.Model(&User{}).Where("name like ?", "pluck_with_select%").Select("age + 1 as user_age").Pluck("user_age", &userAges).Error
if err != nil {
t.Fatalf("got error when pluck user_age: %v", err)
}
sort.Ints(userAges)
AssertEqual(t, userAges, []int{26, 27})
}