MCPcopy
hub / github.com/go-gorm/gorm / TestUpdateFrom

Function TestUpdateFrom

tests/update_test.go:887–933  ·  view source on GitHub ↗

only postgres, gaussdb, sqlserver, sqlite support update from

(t *testing.T)

Source from the content-addressed store, hash-verified

885
886// only postgres, gaussdb, sqlserver, sqlite support update from
887func TestUpdateFrom(t *testing.T) {
888 if DB.Dialector.Name() != "postgres" && DB.Dialector.Name() != "gaussdb" && 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}

Callers

nothing calls this directly

Calls 11

ExprFunction · 0.92
GetUserFunction · 0.85
ClausesMethod · 0.80
ModelMethod · 0.80
NameMethod · 0.65
CreateMethod · 0.65
UpdateMethod · 0.65
WhereMethod · 0.65
FirstMethod · 0.65
FindMethod · 0.65
PreloadMethod · 0.65

Tested by

no test coverage detected