| 147 | } |
| 148 | |
| 149 | func TestCallbacksWithErrors(t *testing.T) { |
| 150 | DB.Migrator().DropTable(&Product{}) |
| 151 | DB.AutoMigrate(&Product{}) |
| 152 | |
| 153 | p := Product{Code: "Invalid", Price: 100} |
| 154 | if DB.Save(&p).Error == nil { |
| 155 | t.Fatalf("An error from before create callbacks happened when create with invalid value") |
| 156 | } |
| 157 | |
| 158 | if DB.Where("code = ?", "Invalid").First(&Product{}).Error == nil { |
| 159 | t.Fatalf("Should not save record that have errors") |
| 160 | } |
| 161 | |
| 162 | if DB.Save(&Product{Code: "dont_save", Price: 100}).Error == nil { |
| 163 | t.Fatalf("An error from after create callbacks happened when create with invalid value") |
| 164 | } |
| 165 | |
| 166 | p2 := Product{Code: "update_callback", Price: 100} |
| 167 | DB.Save(&p2) |
| 168 | |
| 169 | p2.Code = "dont_update" |
| 170 | if DB.Save(&p2).Error == nil { |
| 171 | t.Fatalf("An error from before update callbacks happened when update with invalid value") |
| 172 | } |
| 173 | |
| 174 | if DB.Where("code = ?", "update_callback").First(&Product{}).Error != nil { |
| 175 | t.Fatalf("Record Should not be updated due to errors happened in before update callback") |
| 176 | } |
| 177 | |
| 178 | if DB.Where("code = ?", "dont_update").First(&Product{}).Error == nil { |
| 179 | t.Fatalf("Record Should not be updated due to errors happened in before update callback") |
| 180 | } |
| 181 | |
| 182 | p2.Code = "dont_save" |
| 183 | if DB.Save(&p2).Error == nil { |
| 184 | t.Fatalf("An error from before save callbacks happened when update with invalid value") |
| 185 | } |
| 186 | |
| 187 | p3 := Product{Code: "dont_delete", Price: 100} |
| 188 | DB.Save(&p3) |
| 189 | if DB.Delete(&p3).Error == nil { |
| 190 | t.Fatalf("An error from before delete callbacks happened when delete") |
| 191 | } |
| 192 | |
| 193 | if DB.Where("Code = ?", "dont_delete").First(&p3).Error != nil { |
| 194 | t.Fatalf("An error from before delete callbacks happened") |
| 195 | } |
| 196 | |
| 197 | p4 := Product{Code: "after_save_error", Price: 100} |
| 198 | DB.Save(&p4) |
| 199 | if err := DB.First(&Product{}, "code = ?", "after_save_error").Error; err == nil { |
| 200 | t.Fatalf("Record should be reverted if get an error in after save callback") |
| 201 | } |
| 202 | |
| 203 | p5 := Product{Code: "after_delete_error", Price: 100} |
| 204 | DB.Save(&p5) |
| 205 | if err := DB.First(&Product{}, "code = ?", "after_delete_error").Error; err != nil { |
| 206 | t.Fatalf("Record should be found") |