[MM-55143] Disallow reacting with an emoji that does not exist, limit the total number of unique reactions per post (#25331)

* [MM-55143] Disallow reacting with an emoji that does not exist

* WIP for server limit on emoji reactions

* WIP

* Implement default limit of 25 unique emoji reactions

* Add modal for reaction limit

* Fix test

* PR feedback

* Fix i18n

* Update admin string

* Merge'd

* Fixing some issues, check limits correctly based on other users reactions

* Fix typos

* Fix lint/test

* Add tests, fix other tests

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
Devin Binnie
2023-11-27 09:11:04 -05:00
коммит произвёл GitHub
родитель 0a38042d58
Коммит eaa5cce3ce
24 изменённых файлов: 652 добавлений и 29 удалений

Просмотреть файл

@@ -13,6 +13,89 @@ import (
"github.com/mattermost/mattermost/server/v8/channels/testlib"
)
func TestSaveReactionForPost(t *testing.T) {
th := Setup(t).InitBasic()
post := th.CreatePost(th.BasicChannel)
reaction1, err := th.App.SaveReactionForPost(th.Context, &model.Reaction{
UserId: th.BasicUser.Id,
PostId: post.Id,
EmojiName: "cry",
})
require.NotNil(t, reaction1)
require.Nil(t, err)
reaction2, err := th.App.SaveReactionForPost(th.Context, &model.Reaction{
UserId: th.BasicUser.Id,
PostId: post.Id,
EmojiName: "smile",
})
require.NotNil(t, reaction2)
require.Nil(t, err)
reaction3, err := th.App.SaveReactionForPost(th.Context, &model.Reaction{
UserId: th.BasicUser.Id,
PostId: post.Id,
EmojiName: "rofl",
})
require.NotNil(t, reaction3)
require.Nil(t, err)
t.Run("should not add reaction if it does not exist on the system", func(t *testing.T) {
reaction := &model.Reaction{
UserId: th.BasicUser.Id,
PostId: th.BasicPost.Id,
EmojiName: "definitely-not-a-real-emoji",
}
result, err := th.App.SaveReactionForPost(th.Context, reaction)
require.NotNil(t, err)
require.Nil(t, result)
})
t.Run("should not add reaction if we are over the limit", func(t *testing.T) {
var originalLimit *int
th.UpdateConfig(func(cfg *model.Config) {
originalLimit = cfg.ServiceSettings.UniqueEmojiReactionLimitPerPost
*cfg.ServiceSettings.UniqueEmojiReactionLimitPerPost = 3
})
defer th.UpdateConfig(func(cfg *model.Config) {
cfg.ServiceSettings.UniqueEmojiReactionLimitPerPost = originalLimit
})
reaction := &model.Reaction{
UserId: th.BasicUser.Id,
PostId: post.Id,
EmojiName: "joy",
}
result, err := th.App.SaveReactionForPost(th.Context, reaction)
require.NotNil(t, err)
require.Nil(t, result)
})
t.Run("should always add reaction if we are over the limit but the reaction is not unique", func(t *testing.T) {
user := th.CreateUser()
var originalLimit *int
th.UpdateConfig(func(cfg *model.Config) {
originalLimit = cfg.ServiceSettings.UniqueEmojiReactionLimitPerPost
*cfg.ServiceSettings.UniqueEmojiReactionLimitPerPost = 3
})
defer th.UpdateConfig(func(cfg *model.Config) {
cfg.ServiceSettings.UniqueEmojiReactionLimitPerPost = originalLimit
})
reaction := &model.Reaction{
UserId: user.Id,
PostId: post.Id,
EmojiName: "cry",
}
result, err := th.App.SaveReactionForPost(th.Context, reaction)
require.Nil(t, err)
require.NotNil(t, result)
})
}
func TestSharedChannelSyncForReactionActions(t *testing.T) {
t.Run("adding a reaction in a shared channel performs a content sync when sync service is running on that node", func(t *testing.T) {
th := Setup(t).InitBasic()
@@ -84,3 +167,15 @@ func TestSharedChannelSyncForReactionActions(t *testing.T) {
assert.Equal(t, channel.Id, sharedChannelService.channelNotifications[1])
})
}
func (th *TestHelper) UpdateConfig(f func(*model.Config)) {
if th.ConfigStore.IsReadOnly() {
return
}
old := th.ConfigStore.Get()
updated := old.Clone()
f(updated)
if _, _, err := th.ConfigStore.Set(updated); err != nil {
panic(err)
}
}