mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-10-28 21:11:17 +00:00
If the avatar file in storage does not exist, it is not an error and the database can be updated. See1be797fabaFix bug on avatar (cherry picked from commitd2c4d833f4)
80 lines
2.3 KiB
Go
80 lines
2.3 KiB
Go
// Copyright The Forgejo Authors.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package user
|
|
|
|
import (
|
|
"bytes"
|
|
"image"
|
|
"image/png"
|
|
"os"
|
|
"testing"
|
|
|
|
"code.gitea.io/gitea/models/db"
|
|
"code.gitea.io/gitea/models/unittest"
|
|
user_model "code.gitea.io/gitea/models/user"
|
|
"code.gitea.io/gitea/modules/storage"
|
|
"code.gitea.io/gitea/modules/test"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
type alreadyDeletedStorage struct {
|
|
storage.DiscardStorage
|
|
}
|
|
|
|
func (s alreadyDeletedStorage) Delete(_ string) error {
|
|
return os.ErrNotExist
|
|
}
|
|
|
|
func TestUserDeleteAvatar(t *testing.T) {
|
|
myImage := image.NewRGBA(image.Rect(0, 0, 1, 1))
|
|
var buff bytes.Buffer
|
|
png.Encode(&buff, myImage)
|
|
|
|
t.Run("AtomicStorageFailure", func(t *testing.T) {
|
|
defer test.MockProtect[storage.ObjectStorage](&storage.Avatars)()
|
|
|
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
|
|
|
err := UploadAvatar(db.DefaultContext, user, buff.Bytes())
|
|
assert.NoError(t, err)
|
|
verification := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
|
assert.NotEqual(t, "", verification.Avatar)
|
|
|
|
// fail to delete ...
|
|
storage.Avatars = storage.UninitializedStorage
|
|
err = DeleteAvatar(db.DefaultContext, user)
|
|
assert.Error(t, err)
|
|
|
|
// ... the avatar is not removed from the database
|
|
verification = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
|
assert.True(t, verification.UseCustomAvatar)
|
|
|
|
// already deleted ...
|
|
storage.Avatars = alreadyDeletedStorage{}
|
|
err = DeleteAvatar(db.DefaultContext, user)
|
|
assert.NoError(t, err)
|
|
|
|
// ... the avatar is removed from the database
|
|
verification = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
|
assert.Equal(t, "", verification.Avatar)
|
|
})
|
|
|
|
t.Run("Success", func(t *testing.T) {
|
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
|
|
|
err := UploadAvatar(db.DefaultContext, user, buff.Bytes())
|
|
assert.NoError(t, err)
|
|
verification := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
|
assert.NotEqual(t, "", verification.Avatar)
|
|
|
|
err = DeleteAvatar(db.DefaultContext, user)
|
|
assert.NoError(t, err)
|
|
|
|
verification = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
|
assert.Equal(t, "", verification.Avatar)
|
|
})
|
|
}
|