Test Updates

This commit is contained in:
Jinzhu 2020-05-30 16:47:16 +08:00
parent abae7f71c5
commit 028c9d6e17
9 changed files with 55 additions and 150 deletions

View File

@ -164,7 +164,7 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) {
case reflect.Struct: case reflect.Struct:
set = make([]clause.Assignment, 0, len(stmt.Schema.FieldsByDBName)) set = make([]clause.Assignment, 0, len(stmt.Schema.FieldsByDBName))
for _, field := range stmt.Schema.FieldsByDBName { for _, field := range stmt.Schema.FieldsByDBName {
if !field.PrimaryKey || stmt.Dest != stmt.Model { if !field.PrimaryKey || (!stmt.ReflectValue.CanAddr() || stmt.Dest != stmt.Model) {
if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && !restricted) { if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && !restricted) {
value, isZero := field.ValueOf(stmt.ReflectValue) value, isZero := field.ValueOf(stmt.ReflectValue)
if field.AutoUpdateTime > 0 { if field.AutoUpdateTime > 0 {
@ -186,7 +186,7 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) {
} }
} }
if stmt.Dest != stmt.Model { if !stmt.ReflectValue.CanAddr() || stmt.Dest != stmt.Model {
reflectValue := reflect.Indirect(reflect.ValueOf(stmt.Model)) reflectValue := reflect.Indirect(reflect.ValueOf(stmt.Model))
switch reflectValue.Kind() { switch reflectValue.Kind() {
case reflect.Slice, reflect.Array: case reflect.Slice, reflect.Array:

View File

@ -1,35 +0,0 @@
package mssql_test
import (
"fmt"
"os"
"testing"
"github.com/jinzhu/gorm"
"github.com/jinzhu/gorm/dialects/mssql"
"github.com/jinzhu/gorm/tests"
)
var (
DB *gorm.DB
err error
)
func init() {
dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"
if os.Getenv("GORM_DSN") != "" {
dsn = os.Getenv("GORM_DSN")
}
if DB, err = gorm.Open(mssql.Open(dsn), &gorm.Config{}); err != nil {
panic(fmt.Sprintf("failed to initialize database, got error %v", err))
}
}
func TestCURD(t *testing.T) {
tests.RunTestsSuit(t, DB)
}
func TestMigrate(t *testing.T) {
tests.TestMigrate(t, DB)
}

View File

@ -1,35 +0,0 @@
package mysql_test
import (
"fmt"
"os"
"testing"
"github.com/jinzhu/gorm"
"github.com/jinzhu/gorm/dialects/mysql"
"github.com/jinzhu/gorm/tests"
)
var (
DB *gorm.DB
err error
)
func init() {
dsn := "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local"
if os.Getenv("GORM_DSN") != "" {
dsn = os.Getenv("GORM_DSN")
}
if DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}); err != nil {
panic(fmt.Sprintf("failed to initialize database, got error %v", err))
}
}
func TestCURD(t *testing.T) {
tests.RunTestsSuit(t, DB)
}
func TestMigrate(t *testing.T) {
tests.TestMigrate(t, DB)
}

View File

@ -1,35 +0,0 @@
package postgres_test
import (
"fmt"
"os"
"testing"
"github.com/jinzhu/gorm"
"github.com/jinzhu/gorm/dialects/postgres"
"github.com/jinzhu/gorm/tests"
)
var (
DB *gorm.DB
err error
)
func init() {
dsn := "user=gorm password=gorm DB.name=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"
if os.Getenv("GORM_DSN") != "" {
dsn = os.Getenv("GORM_DSN")
}
if DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{}); err != nil {
panic(fmt.Sprintf("failed to initialize database, got error %v", err))
}
}
func TestCURD(t *testing.T) {
tests.RunTestsSuit(t, DB)
}
func TestMigrate(t *testing.T) {
tests.TestMigrate(t, DB)
}

View File

@ -1,31 +0,0 @@
package sqlite_test
import (
"fmt"
"os"
"path/filepath"
"testing"
"github.com/jinzhu/gorm"
"github.com/jinzhu/gorm/dialects/sqlite"
"github.com/jinzhu/gorm/tests"
)
var (
DB *gorm.DB
err error
)
func init() {
if DB, err = gorm.Open(sqlite.Open(filepath.Join(os.TempDir(), "gorm.db")), &gorm.Config{}); err != nil {
panic(fmt.Sprintf("failed to initialize database, got error %v", err))
}
}
func TestCURD(t *testing.T) {
tests.RunTestsSuit(t, DB)
}
func TestMigrate(t *testing.T) {
tests.TestMigrate(t, DB)
}

View File

@ -189,3 +189,7 @@ func (db *DB) getInstance() *DB {
return db return db
} }
func Expr(expr string, args ...interface{}) clause.Expr {
return clause.Expr{SQL: expr, Vars: args}
}

View File

@ -19,7 +19,7 @@ func TestFieldValuerAndSetter(t *testing.T) {
Model: gorm.Model{ Model: gorm.Model{
ID: 10, ID: 10,
CreatedAt: time.Now(), CreatedAt: time.Now(),
DeletedAt: tests.Now(), DeletedAt: gorm.DeletedAt{Time: time.Now(), Valid: true},
}, },
Name: "valuer_and_setter", Name: "valuer_and_setter",
Age: 18, Age: 18,
@ -46,7 +46,7 @@ func TestFieldValuerAndSetter(t *testing.T) {
"name": "valuer_and_setter_2", "name": "valuer_and_setter_2",
"id": 2, "id": 2,
"created_at": time.Now(), "created_at": time.Now(),
"deleted_at": tests.Now(), "deleted_at": time.Now(),
"age": 20, "age": 20,
"birthday": time.Now(), "birthday": time.Now(),
"active": false, "active": false,
@ -89,7 +89,7 @@ func TestPointerFieldValuerAndSetter(t *testing.T) {
Model: &gorm.Model{ Model: &gorm.Model{
ID: 10, ID: 10,
CreatedAt: time.Now(), CreatedAt: time.Now(),
DeletedAt: tests.Now(), DeletedAt: gorm.DeletedAt{Time: time.Now(), Valid: true},
}, },
Name: &name, Name: &name,
Age: &age, Age: &age,
@ -116,7 +116,7 @@ func TestPointerFieldValuerAndSetter(t *testing.T) {
"name": "valuer_and_setter_2", "name": "valuer_and_setter_2",
"id": 2, "id": 2,
"created_at": time.Now(), "created_at": time.Now(),
"deleted_at": tests.Now(), "deleted_at": time.Now(),
"age": 20, "age": 20,
"birthday": time.Now(), "birthday": time.Now(),
"active": false, "active": false,

View File

@ -9,16 +9,8 @@ for dialect in "${dialects[@]}" ; do
then then
if [ "$GORM_VERBOSE" = "" ] if [ "$GORM_VERBOSE" = "" ]
then then
cd dialects/${dialect}
DEBUG=false GORM_DIALECT=${dialect} go test -race ./...
cd ../..
DEBUG=false GORM_DIALECT=${dialect} go test -race ./... DEBUG=false GORM_DIALECT=${dialect} go test -race ./...
else else
cd dialects/${dialect}
DEBUG=false GORM_DIALECT=${dialect} go test -race ./...
cd ../..
DEBUG=false GORM_DIALECT=${dialect} go test -race -v ./... DEBUG=false GORM_DIALECT=${dialect} go test -race -v ./...
fi fi
fi fi

View File

@ -4,6 +4,7 @@ import (
"testing" "testing"
"time" "time"
"github.com/jinzhu/gorm"
. "github.com/jinzhu/gorm/tests" . "github.com/jinzhu/gorm/tests"
) )
@ -114,3 +115,47 @@ func TestUpdate(t *testing.T) {
CheckUser(t, result4, *user) CheckUser(t, result4, *user)
} }
} }
func TestUpdates(t *testing.T) {
var users = []*User{
GetUser("updates_01", Config{}),
GetUser("updates_02", Config{}),
}
DB.Create(&users)
lastUpdatedAt := users[0].UpdatedAt
// update with map
DB.Model(users[0]).Updates(map[string]interface{}{"name": "updates_01_newname", "age": 100})
if users[0].Name != "updates_01_newname" || users[0].Age != 100 {
t.Errorf("Record should be updated also with map")
}
if users[0].UpdatedAt.UnixNano() == lastUpdatedAt.UnixNano() {
t.Errorf("User's updated at should be changed, but got %v, was %v", users[0].UpdatedAt.UnixNano(), lastUpdatedAt)
}
// user2 should not be updated
var user1, user2 User
DB.First(&user1, users[0].ID)
DB.First(&user2, users[1].ID)
CheckUser(t, user1, *users[0])
CheckUser(t, user2, *users[1])
// update with struct
DB.Table("users").Where("name in ?", []string{users[1].Name}).Updates(User{Name: "updates_02_newname"})
var user3 User
if DB.First(&user3, "name = ?", "updates_02_newname").RecordNotFound() {
t.Errorf("User2's name should be updated")
}
AssertEqual(t, user2.UpdatedAt, user3.UpdatedAt)
// update with gorm exprs
DB.Model(&user3).Updates(map[string]interface{}{"age": gorm.Expr("age + ?", 100)})
var user4 User
DB.First(&user4, user3.ID)
user3.Age += 100
AssertEqual(t, user4.UpdatedAt, user3.UpdatedAt)
}