From 047c76b55fe9849eb2c8f9ad46ff0040080f7f57 Mon Sep 17 00:00:00 2001 From: Florent Peterschmitt Date: Fri, 2 Oct 2020 19:16:11 +0200 Subject: [PATCH] [MM-29174] fix: enable automatic emoji resize feature (#15657) * fix: enable automatic emoji resize feature * refactor writes by overriding existing buffer, write once, return once * add testcases * :thinking: * close file * automatic formatting with goimports * ensure image is resized keeping proportions --- api4/emoji_test.go | 34 ++++++++++++++++++++++++++++++---- app/emoji.go | 8 ++------ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/api4/emoji_test.go b/api4/emoji_test.go index 75e2e4201d..59802aae23 100644 --- a/api4/emoji_test.go +++ b/api4/emoji_test.go @@ -7,8 +7,12 @@ import ( "bytes" "image" _ "image/gif" + "os" + "path/filepath" "testing" + "github.com/mattermost/mattermost-server/v5/utils/fileutils" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -33,6 +37,22 @@ func TestCreateEmoji(t *testing.T) { th.RestoreDefaultRolePermissions(defaultRolePermissions) }() + // constants to be used along with checkEmojiFile + emojiWidth := app.MaxEmojiWidth + emojiHeight := app.MaxEmojiHeight * 2 + // check that emoji gets resized correctly, respecting proportions, and is of expected type + checkEmojiFile := func(id, expectedImageType string) { + path, _ := fileutils.FindDir("data") + file, fileErr := os.Open(filepath.Join(path, "/emoji/"+id+"/image")) + require.NoError(t, fileErr) + defer file.Close() + config, imageType, err := image.DecodeConfig(file) + require.NoError(t, err) + require.Equal(t, expectedImageType, imageType) + require.Equal(t, emojiWidth/2, config.Width) + require.Equal(t, emojiHeight/2, config.Height) + } + emoji := &model.Emoji{ CreatorId: th.BasicUser.Id, Name: model.NewId(), @@ -42,11 +62,14 @@ func TestCreateEmoji(t *testing.T) { _, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") CheckNotImplementedStatus(t, resp) + // enable emoji creation for next cases th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) + // try to create a valid gif emoji when they're enabled - newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + newEmoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, emojiWidth, emojiHeight), "image.gif") CheckNoError(t, resp) require.Equal(t, newEmoji.Name, emoji.Name, "create with wrong name") + checkEmojiFile(newEmoji.Id, "gif") // try to create an emoji with a duplicate name emoji2 := &model.Emoji{ @@ -63,9 +86,10 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestAnimatedGif(t, 10, 10, 10), "image.gif") + newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestAnimatedGif(t, emojiWidth, emojiHeight, 10), "image.gif") CheckNoError(t, resp) require.Equal(t, newEmoji.Name, emoji.Name, "create with wrong name") + checkEmojiFile(newEmoji.Id, "gif") // try to create a valid jpeg emoji emoji = &model.Emoji{ @@ -73,9 +97,10 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestJpeg(t, 10, 10), "image.gif") + newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestJpeg(t, emojiWidth, emojiHeight), "image.jpeg") CheckNoError(t, resp) require.Equal(t, newEmoji.Name, emoji.Name, "create with wrong name") + checkEmojiFile(newEmoji.Id, "png") // emoji must be converted from jpeg to png // try to create a valid png emoji emoji = &model.Emoji{ @@ -83,9 +108,10 @@ func TestCreateEmoji(t *testing.T) { Name: model.NewId(), } - newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestPng(t, 10, 10), "image.gif") + newEmoji, resp = Client.CreateEmoji(emoji, utils.CreateTestPng(t, emojiWidth, emojiHeight), "image.png") CheckNoError(t, resp) require.Equal(t, newEmoji.Name, emoji.Name, "create with wrong name") + checkEmojiFile(newEmoji.Id, "png") // try to create an emoji that's too wide emoji = &model.Emoji{ diff --git a/app/emoji.go b/app/emoji.go index 79b9ec50ae..a968e236c9 100644 --- a/app/emoji.go +++ b/app/emoji.go @@ -140,9 +140,7 @@ func (a *App) UploadEmojiImage(id string, imageData *multipart.FileHeader) *mode return model.NewAppError("uploadEmojiImage", "api.emoji.upload.large_image.gif_encode_error", nil, "", http.StatusBadRequest) } - if _, err := a.WriteFile(newbuf, getEmojiImagePath(id)); err != nil { - return err - } + buf = newbuf } else { img, _, err := image.Decode(bytes.NewReader(data)) if err != nil { @@ -153,9 +151,7 @@ func (a *App) UploadEmojiImage(id string, imageData *multipart.FileHeader) *mode if err := png.Encode(newbuf, resized_image); err != nil { return model.NewAppError("uploadEmojiImage", "api.emoji.upload.large_image.encode_error", nil, "", http.StatusBadRequest) } - if _, err := a.WriteFile(newbuf, getEmojiImagePath(id)); err != nil { - return err - } + buf = newbuf } }