diff --git a/assets b/assets index da7a3a3..dd539f6 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit da7a3a38bf924d53072a7c56d144b0e777ea0511 +Subproject commit dd539f606a1dc7d48a2e745892abef6bbe99405c diff --git a/models/file.go b/models/file.go index 171c94c..d377641 100644 --- a/models/file.go +++ b/models/file.go @@ -225,17 +225,17 @@ func DeleteFiles(files []*File, uid uint) error { } result := tx.Unscoped().Where("size = ?", file.Size).Delete(file) + if result.Error != nil { + tx.Rollback() + return result.Error + } + if result.RowsAffected == 0 { tx.Rollback() return errors.New("file size is dirty") } size += file.Size - - if result.Error != nil { - tx.Rollback() - return result.Error - } } if err := user.ChangeStorage(tx, "-", size); err != nil { diff --git a/models/file_test.go b/models/file_test.go index 0f97184..19fdacb 100644 --- a/models/file_test.go +++ b/models/file_test.go @@ -339,7 +339,7 @@ func TestDeleteFiles(t *testing.T) { // uid 不一致 { err := DeleteFiles([]*File{{}}, 1) - a.Contains("User id not consistent", err.Error()) + a.Contains("user id not consistent", err.Error()) } // 删除失败 @@ -365,14 +365,26 @@ func TestDeleteFiles(t *testing.T) { a.Error(err) } - // 成功,其中一个文件已经不存在 + // 文件脏读 { mock.ExpectBegin() mock.ExpectExec("DELETE(.+)"). WillReturnResult(sqlmock.NewResult(1, 0)) + mock.ExpectRollback() + err := DeleteFiles([]*File{{Size: 1}, {Size: 2}}, 0) + a.NoError(mock.ExpectationsWereMet()) + a.Error(err) + a.Contains("file size is dirty", err.Error()) + } + + // 成功 + { + mock.ExpectBegin() + mock.ExpectExec("DELETE(.+)"). + WillReturnResult(sqlmock.NewResult(2, 1)) mock.ExpectExec("DELETE(.+)"). WillReturnResult(sqlmock.NewResult(2, 1)) - mock.ExpectExec("UPDATE(.+)storage(.+)").WithArgs(uint64(2), sqlmock.AnyArg()).WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectExec("UPDATE(.+)storage(.+)").WithArgs(uint64(3), sqlmock.AnyArg()).WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() err := DeleteFiles([]*File{{Size: 1}, {Size: 2}}, 0) a.NoError(mock.ExpectationsWereMet())