Merge pull request 'test(avatar): deleting a user avatar and file is atomic' (#4015) from earl-warren/forgejo:wip-delete-avatar into forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4015 Reviewed-by: Victoria <efertone@noreply.codeberg.org>
This commit is contained in:
		
				commit
				
					
						1b3ccfffe8
					
				
			
		
					 4 changed files with 57 additions and 10 deletions
				
			
		| 
						 | 
					@ -10,7 +10,7 @@ import (
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var uninitializedStorage = discardStorage("uninitialized storage")
 | 
					var UninitializedStorage = discardStorage("uninitialized storage")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type discardStorage string
 | 
					type discardStorage string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,7 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Test_discardStorage(t *testing.T) {
 | 
					func Test_discardStorage(t *testing.T) {
 | 
				
			||||||
	tests := []discardStorage{
 | 
						tests := []discardStorage{
 | 
				
			||||||
		uninitializedStorage,
 | 
							UninitializedStorage,
 | 
				
			||||||
		discardStorage("empty"),
 | 
							discardStorage("empty"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, tt := range tests {
 | 
						for _, tt := range tests {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -109,26 +109,26 @@ func SaveFrom(objStorage ObjectStorage, p string, callback func(w io.Writer) err
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	// Attachments represents attachments storage
 | 
						// Attachments represents attachments storage
 | 
				
			||||||
	Attachments ObjectStorage = uninitializedStorage
 | 
						Attachments ObjectStorage = UninitializedStorage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// LFS represents lfs storage
 | 
						// LFS represents lfs storage
 | 
				
			||||||
	LFS ObjectStorage = uninitializedStorage
 | 
						LFS ObjectStorage = UninitializedStorage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Avatars represents user avatars storage
 | 
						// Avatars represents user avatars storage
 | 
				
			||||||
	Avatars ObjectStorage = uninitializedStorage
 | 
						Avatars ObjectStorage = UninitializedStorage
 | 
				
			||||||
	// RepoAvatars represents repository avatars storage
 | 
						// RepoAvatars represents repository avatars storage
 | 
				
			||||||
	RepoAvatars ObjectStorage = uninitializedStorage
 | 
						RepoAvatars ObjectStorage = UninitializedStorage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// RepoArchives represents repository archives storage
 | 
						// RepoArchives represents repository archives storage
 | 
				
			||||||
	RepoArchives ObjectStorage = uninitializedStorage
 | 
						RepoArchives ObjectStorage = UninitializedStorage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Packages represents packages storage
 | 
						// Packages represents packages storage
 | 
				
			||||||
	Packages ObjectStorage = uninitializedStorage
 | 
						Packages ObjectStorage = UninitializedStorage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Actions represents actions storage
 | 
						// Actions represents actions storage
 | 
				
			||||||
	Actions ObjectStorage = uninitializedStorage
 | 
						Actions ObjectStorage = UninitializedStorage
 | 
				
			||||||
	// Actions Artifacts represents actions artifacts storage
 | 
						// Actions Artifacts represents actions artifacts storage
 | 
				
			||||||
	ActionsArtifacts ObjectStorage = uninitializedStorage
 | 
						ActionsArtifacts ObjectStorage = UninitializedStorage
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Init init the stoarge
 | 
					// Init init the stoarge
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										47
									
								
								services/user/avatar_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								services/user/avatar_test.go
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,47 @@
 | 
				
			||||||
 | 
					// Copyright The Forgejo Authors.
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: MIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"image"
 | 
				
			||||||
 | 
						"image/png"
 | 
				
			||||||
 | 
						"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"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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)()
 | 
				
			||||||
 | 
							err = DeleteAvatar(db.DefaultContext, user)
 | 
				
			||||||
 | 
							assert.Error(t, err)
 | 
				
			||||||
 | 
							verification := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
 | 
				
			||||||
 | 
							assert.True(t, verification.UseCustomAvatar)
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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