MM-54201 Refactor mention parsing in preparation for multi-word mentions (#25030)
* MM-54201 Move ExplicitMentions to its own file and rename it (#24932) * MM-54201 Move ExplicitMentions to its own file and rename it * Fix vet * MM-54201 Refactor current mention parsing into MentionParserStandard (#24936) * MM-54201 Refactor current mention parsing into MentionParserStandard * Fix vet * MM-54201 Unify user and group mention parsing logic (#24937) * MM-54201 Add MentionKeywords type * MM-54201 Move group mentions into MentionKeywords * Fix flaky test caused by random iteration order * Update server/channels/app/mention_results.go Co-authored-by: Jesse Hallam <jesse.hallam@gmail.com> * Address feedback --------- Co-authored-by: Jesse Hallam <jesse.hallam@gmail.com> --------- Co-authored-by: Jesse Hallam <jesse.hallam@gmail.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
74f35aa92c
Коммит
a78710c2a6
292
server/channels/app/mention_keywords_test.go
Обычный файл
292
server/channels/app/mention_keywords_test.go
Обычный файл
@@ -0,0 +1,292 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
package app
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mattermost/mattermost/server/public/model"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func mapsToMentionKeywords(userKeywords map[string][]string, groups map[string]*model.Group) MentionKeywords {
|
||||
keywords := make(MentionKeywords, len(userKeywords)+len(groups))
|
||||
|
||||
for keyword, ids := range userKeywords {
|
||||
for _, id := range ids {
|
||||
keywords[keyword] = append(keywords[keyword], MentionableUserID(id))
|
||||
}
|
||||
}
|
||||
|
||||
for _, group := range groups {
|
||||
keyword := "@" + *group.Name
|
||||
keywords[keyword] = append(keywords[keyword], MentionableGroupID(group.Id))
|
||||
}
|
||||
|
||||
return keywords
|
||||
}
|
||||
|
||||
func TestMentionKeywords_AddUserProfile(t *testing.T) {
|
||||
t.Run("should add @user", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
}
|
||||
channelNotifyProps := map[string]string{}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, nil, false)
|
||||
|
||||
assert.Contains(t, keywords["@user"], MentionableUserID(user.Id))
|
||||
})
|
||||
|
||||
t.Run("should add custom mention keywords", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
NotifyProps: map[string]string{
|
||||
model.MentionKeysNotifyProp: "apple,BANANA,OrAnGe",
|
||||
},
|
||||
}
|
||||
channelNotifyProps := map[string]string{}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, nil, false)
|
||||
|
||||
assert.Contains(t, keywords["apple"], MentionableUserID(user.Id))
|
||||
assert.Contains(t, keywords["banana"], MentionableUserID(user.Id))
|
||||
assert.Contains(t, keywords["orange"], MentionableUserID(user.Id))
|
||||
})
|
||||
|
||||
t.Run("should not add empty custom keywords", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
NotifyProps: map[string]string{
|
||||
model.MentionKeysNotifyProp: ",,",
|
||||
},
|
||||
}
|
||||
channelNotifyProps := map[string]string{}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, nil, false)
|
||||
|
||||
assert.Nil(t, keywords[""])
|
||||
})
|
||||
|
||||
t.Run("should add case sensitive first name if enabled", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
FirstName: "William",
|
||||
LastName: "Robert",
|
||||
NotifyProps: map[string]string{
|
||||
model.FirstNameNotifyProp: "true",
|
||||
},
|
||||
}
|
||||
channelNotifyProps := map[string]string{}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, nil, false)
|
||||
|
||||
assert.Contains(t, keywords["William"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["william"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["Robert"], MentionableUserID(user.Id))
|
||||
})
|
||||
|
||||
t.Run("should not add case sensitive first name if enabled but empty First Name", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
FirstName: "",
|
||||
LastName: "Robert",
|
||||
NotifyProps: map[string]string{
|
||||
model.FirstNameNotifyProp: "true",
|
||||
},
|
||||
}
|
||||
channelNotifyProps := map[string]string{}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, nil, false)
|
||||
|
||||
assert.NotContains(t, keywords[""], MentionableUserID(user.Id))
|
||||
})
|
||||
|
||||
t.Run("should not add case sensitive first name if disabled", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
FirstName: "William",
|
||||
LastName: "Robert",
|
||||
NotifyProps: map[string]string{
|
||||
model.FirstNameNotifyProp: "false",
|
||||
},
|
||||
}
|
||||
channelNotifyProps := map[string]string{}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, nil, false)
|
||||
|
||||
assert.NotContains(t, keywords["William"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["william"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["Robert"], MentionableUserID(user.Id))
|
||||
})
|
||||
|
||||
t.Run("should add @channel/@all/@here when allowed", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
NotifyProps: map[string]string{
|
||||
model.ChannelMentionsNotifyProp: "true",
|
||||
},
|
||||
}
|
||||
channelNotifyProps := map[string]string{}
|
||||
status := &model.Status{
|
||||
Status: model.StatusOnline,
|
||||
}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, status, true)
|
||||
|
||||
assert.Contains(t, keywords["@channel"], MentionableUserID(user.Id))
|
||||
assert.Contains(t, keywords["@all"], MentionableUserID(user.Id))
|
||||
assert.Contains(t, keywords["@here"], MentionableUserID(user.Id))
|
||||
})
|
||||
|
||||
t.Run("should not add @channel/@all/@here when not allowed", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
NotifyProps: map[string]string{
|
||||
model.ChannelMentionsNotifyProp: "true",
|
||||
},
|
||||
}
|
||||
channelNotifyProps := map[string]string{}
|
||||
status := &model.Status{
|
||||
Status: model.StatusOnline,
|
||||
}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, status, false)
|
||||
|
||||
assert.NotContains(t, keywords["@channel"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["@all"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["@here"], MentionableUserID(user.Id))
|
||||
})
|
||||
|
||||
t.Run("should not add @channel/@all/@here when disabled for user", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
NotifyProps: map[string]string{
|
||||
model.ChannelMentionsNotifyProp: "false",
|
||||
},
|
||||
}
|
||||
channelNotifyProps := map[string]string{}
|
||||
status := &model.Status{
|
||||
Status: model.StatusOnline,
|
||||
}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, status, true)
|
||||
|
||||
assert.NotContains(t, keywords["@channel"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["@all"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["@here"], MentionableUserID(user.Id))
|
||||
})
|
||||
|
||||
t.Run("should not add @channel/@all/@here when disabled for channel", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
NotifyProps: map[string]string{
|
||||
model.ChannelMentionsNotifyProp: "true",
|
||||
},
|
||||
}
|
||||
channelNotifyProps := map[string]string{
|
||||
model.IgnoreChannelMentionsNotifyProp: model.IgnoreChannelMentionsOn,
|
||||
}
|
||||
status := &model.Status{
|
||||
Status: model.StatusOnline,
|
||||
}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, status, true)
|
||||
|
||||
assert.NotContains(t, keywords["@channel"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["@all"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["@here"], MentionableUserID(user.Id))
|
||||
})
|
||||
|
||||
t.Run("should not add @channel/@all/@here when channel is muted and channel mention setting is not updated by user", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
NotifyProps: map[string]string{
|
||||
model.ChannelMentionsNotifyProp: "true",
|
||||
},
|
||||
}
|
||||
channelNotifyProps := map[string]string{
|
||||
model.MarkUnreadNotifyProp: model.UserNotifyMention,
|
||||
model.IgnoreChannelMentionsNotifyProp: model.IgnoreChannelMentionsDefault,
|
||||
}
|
||||
status := &model.Status{
|
||||
Status: model.StatusOnline,
|
||||
}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, status, true)
|
||||
|
||||
assert.NotContains(t, keywords["@channel"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["@all"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["@here"], MentionableUserID(user.Id))
|
||||
})
|
||||
|
||||
t.Run("should not add @here when when user is not online", func(t *testing.T) {
|
||||
user := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user",
|
||||
NotifyProps: map[string]string{
|
||||
model.ChannelMentionsNotifyProp: "true",
|
||||
},
|
||||
}
|
||||
channelNotifyProps := map[string]string{}
|
||||
status := &model.Status{
|
||||
Status: model.StatusAway,
|
||||
}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user, channelNotifyProps, status, true)
|
||||
|
||||
assert.Contains(t, keywords["@channel"], MentionableUserID(user.Id))
|
||||
assert.Contains(t, keywords["@all"], MentionableUserID(user.Id))
|
||||
assert.NotContains(t, keywords["@here"], MentionableUserID(user.Id))
|
||||
})
|
||||
|
||||
t.Run("should add for multiple users", func(t *testing.T) {
|
||||
user1 := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user1",
|
||||
NotifyProps: map[string]string{
|
||||
model.ChannelMentionsNotifyProp: "true",
|
||||
},
|
||||
}
|
||||
user2 := &model.User{
|
||||
Id: model.NewId(),
|
||||
Username: "user2",
|
||||
NotifyProps: map[string]string{
|
||||
model.ChannelMentionsNotifyProp: "true",
|
||||
},
|
||||
}
|
||||
|
||||
keywords := MentionKeywords{}
|
||||
keywords.AddUser(user1, map[string]string{}, nil, true)
|
||||
keywords.AddUser(user2, map[string]string{}, nil, true)
|
||||
|
||||
assert.Contains(t, keywords["@user1"], MentionableUserID(user1.Id))
|
||||
assert.Contains(t, keywords["@user2"], MentionableUserID(user2.Id))
|
||||
assert.Contains(t, keywords["@all"], MentionableUserID(user1.Id))
|
||||
assert.Contains(t, keywords["@all"], MentionableUserID(user2.Id))
|
||||
})
|
||||
}
|
||||
Ссылка в новой задаче
Block a user