code.gitea.io/gitea@v1.22.3/tests/integration/user_avatar_test.go (about)

     1  // Copyright 2021 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package integration
     5  
     6  import (
     7  	"bytes"
     8  	"fmt"
     9  	"image/png"
    10  	"io"
    11  	"mime/multipart"
    12  	"net/http"
    13  	"net/url"
    14  	"testing"
    15  
    16  	"code.gitea.io/gitea/models/db"
    17  	"code.gitea.io/gitea/models/unittest"
    18  	user_model "code.gitea.io/gitea/models/user"
    19  	"code.gitea.io/gitea/modules/avatar"
    20  
    21  	"github.com/stretchr/testify/assert"
    22  )
    23  
    24  func TestUserAvatar(t *testing.T) {
    25  	onGiteaRun(t, func(t *testing.T, u *url.URL) {
    26  		user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org
    27  
    28  		seed := user2.Email
    29  		if len(seed) == 0 {
    30  			seed = user2.Name
    31  		}
    32  
    33  		img, err := avatar.RandomImage([]byte(seed))
    34  		if err != nil {
    35  			assert.NoError(t, err)
    36  			return
    37  		}
    38  
    39  		session := loginUser(t, "user2")
    40  		csrf := GetCSRF(t, session, "/user/settings")
    41  
    42  		imgData := &bytes.Buffer{}
    43  
    44  		body := &bytes.Buffer{}
    45  
    46  		// Setup multi-part
    47  		writer := multipart.NewWriter(body)
    48  		writer.WriteField("source", "local")
    49  		part, err := writer.CreateFormFile("avatar", "avatar-for-testuseravatar.png")
    50  		if err != nil {
    51  			assert.NoError(t, err)
    52  			return
    53  		}
    54  
    55  		if err := png.Encode(imgData, img); err != nil {
    56  			assert.NoError(t, err)
    57  			return
    58  		}
    59  
    60  		if _, err := io.Copy(part, imgData); err != nil {
    61  			assert.NoError(t, err)
    62  			return
    63  		}
    64  
    65  		if err := writer.Close(); err != nil {
    66  			assert.NoError(t, err)
    67  			return
    68  		}
    69  
    70  		req := NewRequestWithBody(t, "POST", "/user/settings/avatar", body)
    71  		req.Header.Add("X-Csrf-Token", csrf)
    72  		req.Header.Add("Content-Type", writer.FormDataContentType())
    73  
    74  		session.MakeRequest(t, req, http.StatusSeeOther)
    75  
    76  		user2 = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org
    77  
    78  		req = NewRequest(t, "GET", user2.AvatarLinkWithSize(db.DefaultContext, 0))
    79  		_ = session.MakeRequest(t, req, http.StatusOK)
    80  
    81  		testGetAvatarRedirect(t, user2)
    82  
    83  		// Can't test if the response matches because the image is re-generated on upload but checking that this at least doesn't give a 404 should be enough.
    84  	})
    85  }
    86  
    87  func testGetAvatarRedirect(t *testing.T, user *user_model.User) {
    88  	t.Run(fmt.Sprintf("getAvatarRedirect_%s", user.Name), func(t *testing.T) {
    89  		req := NewRequestf(t, "GET", "/%s.png", user.Name)
    90  		resp := MakeRequest(t, req, http.StatusSeeOther)
    91  		assert.EqualValues(t, fmt.Sprintf("/avatars/%s", user.Avatar), resp.Header().Get("location"))
    92  	})
    93  }