Test Updates
This commit is contained in:
		
							parent
							
								
									abae7f71c5
								
							
						
					
					
						commit
						028c9d6e17
					
				| @ -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: | ||||||
|  | |||||||
| @ -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) |  | ||||||
| } |  | ||||||
| @ -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) |  | ||||||
| } |  | ||||||
| @ -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) |  | ||||||
| } |  | ||||||
| @ -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) |  | ||||||
| } |  | ||||||
							
								
								
									
										4
									
								
								gorm.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								gorm.go
									
									
									
									
									
								
							| @ -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} | ||||||
|  | } | ||||||
|  | |||||||
| @ -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, | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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) | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu