func TestUpdateColumn(t *testing.T) { product1 := Product{Code: "product1code", Price: 10} product2 := Product{Code: "product2code", Price: 20} DB.Save(&product1).Save(&product2).UpdateColumn(map[string]interface{}{"code": "product2newcode", "price": 100}) if product2.Code != "product2newcode" || product2.Price != 100 { t.Errorf("product 2 should be updated with update column") } var product3 Product DB.First(&product3, product1.Id) if product3.Code != "product1code" || product3.Price != 10 { t.Errorf("product 1 should not be updated") } DB.First(&product2, product2.Id) updatedAt2 := product2.UpdatedAt DB.Model(product2).UpdateColumn("code", "update_column_new") var product4 Product DB.First(&product4, product2.Id) if updatedAt2.Format(time.RFC3339Nano) != product4.UpdatedAt.Format(time.RFC3339Nano) { t.Errorf("updatedAt should not be updated with update column") } DB.Model(&product4).UpdateColumn("price", gorm.Expr("price + 100 - 50")) var product5 Product DB.First(&product5, product4.Id) if product5.Price != product4.Price+100-50 { t.Errorf("UpdateColumn with expression") } if product5.UpdatedAt.Format(time.RFC3339Nano) != product4.UpdatedAt.Format(time.RFC3339Nano) { t.Errorf("UpdateColumn with expression should not update UpdatedAt") } }
func TestUpdates(t *testing.T) { product1 := Product{Code: "product1code", Price: 10} product2 := Product{Code: "product2code", Price: 10} DB.Save(&product1).Save(&product2) DB.Model(&product1).Updates(map[string]interface{}{"code": "product1newcode", "price": 100}) if product1.Code != "product1newcode" || product1.Price != 100 { t.Errorf("Record should be updated also with map") } DB.First(&product1, product1.Id) DB.First(&product2, product2.Id) updatedAt2 := product2.UpdatedAt if DB.First(&Product{}, "code = ? and price = ?", product2.Code, product2.Price).RecordNotFound() { t.Errorf("Product2 should not be updated") } if DB.First(&Product{}, "code = ?", "product1newcode").RecordNotFound() { t.Errorf("Product1 should be updated") } DB.Table("products").Where("code in (?)", []string{"product2code"}).Updates(Product{Code: "product2newcode"}) if !DB.First(&Product{}, "code = 'product2code'").RecordNotFound() { t.Errorf("Product2's code should be updated") } var product4 Product DB.First(&product4, product2.Id) if updatedAt2.Format(time.RFC3339Nano) != product4.UpdatedAt.Format(time.RFC3339Nano) { t.Errorf("updatedAt should be updated if something changed") } if DB.First(&Product{}, "code = ?", "product2newcode").RecordNotFound() { t.Errorf("product2's code should be updated") } updatedAt4 := product4.UpdatedAt DB.Model(&product4).Updates(map[string]interface{}{"price": gorm.Expr("price + ?", 100)}) var product5 Product DB.First(&product5, product4.Id) if product5.Price != product4.Price+100 { t.Errorf("Updates with expression") } // product4's UpdatedAt will be reset when updating if product4.UpdatedAt.Format(time.RFC3339Nano) == updatedAt4.Format(time.RFC3339Nano) { t.Errorf("Updates with expression should update UpdatedAt") } }
func TestSelectWithVariables(t *testing.T) { DB.Save(&User{Name: "jinzhu"}) rows, _ := DB.Table("users").Select("? as fake", gorm.Expr("name")).Rows() if !rows.Next() { t.Errorf("Should have returned at least one row") } else { columns, _ := rows.Columns() if !reflect.DeepEqual(columns, []string{"fake"}) { t.Errorf("Should only contains one column") } } rows.Close() }
func TestOrderAndPluck(t *testing.T) { user1 := User{Name: "OrderPluckUser1", Age: 1} user2 := User{Name: "OrderPluckUser2", Age: 10} user3 := User{Name: "OrderPluckUser3", Age: 20} DB.Save(&user1).Save(&user2).Save(&user3) scopedb := DB.Model(&User{}).Where("name like ?", "%OrderPluckUser%") var user User scopedb.Order(gorm.Expr("name = ? DESC", "OrderPluckUser2")).First(&user) if user.Name != "OrderPluckUser2" { t.Errorf("Order with sql expression") } var ages []int64 scopedb.Order("age desc").Pluck("age", &ages) if ages[0] != 20 { t.Errorf("The first age should be 20 when order with age desc") } var ages1, ages2 []int64 scopedb.Order("age desc").Pluck("age", &ages1).Pluck("age", &ages2) if !reflect.DeepEqual(ages1, ages2) { t.Errorf("The first order is the primary order") } var ages3, ages4 []int64 scopedb.Model(&User{}).Order("age desc").Pluck("age", &ages3).Order("age", true).Pluck("age", &ages4) if reflect.DeepEqual(ages3, ages4) { t.Errorf("Reorder should work") } var names []string var ages5 []int64 scopedb.Model(User{}).Order("name").Order("age desc").Pluck("age", &ages5).Pluck("name", &names) if names != nil && ages5 != nil { if !(names[0] == user1.Name && names[1] == user2.Name && names[2] == user3.Name && ages5[2] == 20) { t.Errorf("Order with multiple orders") } } else { t.Errorf("Order with multiple orders") } DB.Model(User{}).Select("name, age").Find(&[]User{}) }
func TestUpdate(t *testing.T) { product1 := Product{Code: "product1code"} product2 := Product{Code: "product2code"} DB.Save(&product1).Save(&product2).Update("code", "product2newcode") if product2.Code != "product2newcode" { t.Errorf("Record should be updated") } DB.First(&product1, product1.Id) DB.First(&product2, product2.Id) updatedAt1 := product1.UpdatedAt if DB.First(&Product{}, "code = ?", product1.Code).RecordNotFound() { t.Errorf("Product1 should not be updated") } if !DB.First(&Product{}, "code = ?", "product2code").RecordNotFound() { t.Errorf("Product2's code should be updated") } if DB.First(&Product{}, "code = ?", "product2newcode").RecordNotFound() { t.Errorf("Product2's code should be updated") } DB.Table("products").Where("code in (?)", []string{"product1code"}).Update("code", "product1newcode") var product4 Product DB.First(&product4, product1.Id) if updatedAt1.Format(time.RFC3339Nano) != product4.UpdatedAt.Format(time.RFC3339Nano) { t.Errorf("updatedAt should be updated if something changed") } if !DB.First(&Product{}, "code = 'product1code'").RecordNotFound() { t.Errorf("Product1's code should be updated") } if DB.First(&Product{}, "code = 'product1newcode'").RecordNotFound() { t.Errorf("Product should not be changed to 789") } if DB.Model(product2).Update("CreatedAt", time.Now().Add(time.Hour)).Error != nil { t.Error("No error should raise when update with CamelCase") } if DB.Model(&product2).UpdateColumn("CreatedAt", time.Now().Add(time.Hour)).Error != nil { t.Error("No error should raise when update_column with CamelCase") } var products []Product DB.Find(&products) if count := DB.Model(Product{}).Update("CreatedAt", time.Now().Add(2*time.Hour)).RowsAffected; count != int64(len(products)) { t.Error("RowsAffected should be correct when do batch update") } DB.First(&product4, product4.Id) updatedAt4 := product4.UpdatedAt DB.Model(&product4).Update("price", gorm.Expr("price + ? - ?", 100, 50)) var product5 Product DB.First(&product5, product4.Id) if product5.Price != product4.Price+100-50 { t.Errorf("Update with expression") } if product4.UpdatedAt.Format(time.RFC3339Nano) == updatedAt4.Format(time.RFC3339Nano) { t.Errorf("Update with expression should update UpdatedAt") } }