mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 00:11:04 +00:00 
			
		
		
		
	test(avatar): deleting a user avatar is idempotent
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)
This commit is contained in:
		
					parent
					
						
							
								32d8ada0e7
							
						
					
				
			
			
				commit
				
					
						cf2d8b57ae
					
				
			
		
					 4 changed files with 62 additions and 29 deletions
				
			
		| 
						 | 
				
			
			@ -7,6 +7,7 @@ import (
 | 
			
		|||
	"bytes"
 | 
			
		||||
	"image"
 | 
			
		||||
	"image/png"
 | 
			
		||||
	"os"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
| 
						 | 
				
			
			@ -18,30 +19,62 @@ import (
 | 
			
		|||
	"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)
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
 | 
			
		||||
	t.Run("AtomicStorageFailure", func(t *testing.T) {
 | 
			
		||||
		defer test.MockVariableValue[storage.ObjectStorage](&storage.Avatars, storage.UninitializedStorage)()
 | 
			
		||||
		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)
 | 
			
		||||
		verification := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
 | 
			
		||||
 | 
			
		||||
		// ... 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)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	err = DeleteAvatar(db.DefaultContext, user)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	t.Run("Success", func(t *testing.T) {
 | 
			
		||||
		assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
		user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
 | 
			
		||||
 | 
			
		||||
	verification = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
 | 
			
		||||
	assert.Equal(t, "", verification.Avatar)
 | 
			
		||||
		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)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue