Skip to content

Commit f0af94c

Browse files
FrancoLiberalijinzhu
authored andcommitted
add test to show that update from works
1 parent 3207ad6 commit f0af94c

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

tests/update_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,3 +882,52 @@ func TestSaveWithHooks(t *testing.T) {
882882
t.Errorf(`token content should be "token2_encrypted", but got: "%s"`, o2.Token.Content)
883883
}
884884
}
885+
886+
// only postgres, sqlserver, sqlite support update from
887+
func TestUpdateFrom(t *testing.T) {
888+
if DB.Dialector.Name() != "postgres" && DB.Dialector.Name() != "sqlite" && DB.Dialector.Name() != "sqlserver" {
889+
return
890+
}
891+
892+
users := []*User{
893+
GetUser("update-from-1", Config{Account: true}),
894+
GetUser("update-from-2", Config{Account: true}),
895+
GetUser("update-from-3", Config{}),
896+
}
897+
898+
if err := DB.Create(&users).Error; err != nil {
899+
t.Fatalf("errors happened when create: %v", err)
900+
} else if users[0].ID == 0 {
901+
t.Fatalf("user's primary value should not zero, %v", users[0].ID)
902+
} else if users[0].UpdatedAt.IsZero() {
903+
t.Fatalf("user's updated at should not zero, %v", users[0].UpdatedAt)
904+
}
905+
906+
if rowsAffected := DB.Model(&User{}).Clauses(clause.From{Tables: []clause.Table{{Name: "accounts"}}}).Where("accounts.user_id = users.id AND accounts.number = ? AND accounts.deleted_at IS NULL", users[0].Account.Number).Update("name", "franco").RowsAffected; rowsAffected != 1 {
907+
t.Errorf("should only update one record, but got %v", rowsAffected)
908+
}
909+
910+
var result User
911+
if err := DB.Where("id = ?", users[0].ID).First(&result).Error; err != nil {
912+
t.Errorf("errors happened when query before user: %v", err)
913+
} else if result.UpdatedAt.UnixNano() == users[0].UpdatedAt.UnixNano() {
914+
t.Errorf("user's updated at should be changed, but got %v, was %v", result.UpdatedAt, users[0].UpdatedAt)
915+
} else if result.Name != "franco" {
916+
t.Errorf("user's name should be updated")
917+
}
918+
919+
if rowsAffected := DB.Model(&User{}).Clauses(clause.From{Tables: []clause.Table{{Name: "accounts"}}}).Where("accounts.user_id = users.id AND accounts.number IN ? AND accounts.deleted_at IS NULL", []string{users[0].Account.Number, users[1].Account.Number}).Update("name", gorm.Expr("accounts.number")).RowsAffected; rowsAffected != 2 {
920+
t.Errorf("should update two records, but got %v", rowsAffected)
921+
}
922+
923+
var results []User
924+
if err := DB.Preload("Account").Find(&results, []uint{users[0].ID, users[1].ID}).Error; err != nil {
925+
t.Errorf("Not error should happen when finding users, but got %v", err)
926+
}
927+
928+
for _, user := range results {
929+
if user.Name != user.Account.Number {
930+
t.Errorf("user's name should be equal to the account's number %v, but got %v", user.Account.Number, user.Name)
931+
}
932+
}
933+
}

0 commit comments

Comments
 (0)