From 06abe98ba90a092b4f788fa2c16c204f5bc0efcd Mon Sep 17 00:00:00 2001 From: Pradeep Murugesan Date: Wed, 11 Jul 2018 16:11:36 +0200 Subject: GH-8964 enable notification for text and preText fields in Attachments (#9069) --- app/notification.go | 45 ++++++++++++++++++++++++--------- app/notification_test.go | 65 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 95 insertions(+), 15 deletions(-) diff --git a/app/notification.go b/app/notification.go index 2ba585f3b..8da581c00 100644 --- a/app/notification.go +++ b/app/notification.go @@ -94,7 +94,7 @@ func (a *App) SendNotifications(post *model.Post, team *model.Team, channel *mod } else { keywords := a.GetMentionKeywordsInChannel(profileMap, post.Type != model.POST_HEADER_CHANGE && post.Type != model.POST_PURPOSE_CHANGE) - m := GetExplicitMentions(post.Message, keywords) + m := GetExplicitMentions(post, keywords) // Add an implicit mention when a user is added to a channel // even if the user has set 'username mentions' to false in account settings. @@ -961,7 +961,7 @@ type ExplicitMentions struct { // Given a message and a map mapping mention keywords to the users who use them, returns a map of mentioned // users and a slice of potential mention users not in the channel and whether or not @here was mentioned. -func GetExplicitMentions(message string, keywords map[string][]string) *ExplicitMentions { +func GetExplicitMentions(post *model.Post, keywords map[string][]string) *ExplicitMentions { ret := &ExplicitMentions{ MentionedUserIds: make(map[string]bool), } @@ -1053,21 +1053,42 @@ func GetExplicitMentions(message string, keywords map[string][]string) *Explicit } buf := "" - markdown.Inspect(message, func(node interface{}) bool { - text, ok := node.(*markdown.Text) - if !ok { - processText(buf) - buf = "" - return true - } - buf += text.Text - return false - }) + mentionsEnabledFields := GetMentionsEnabledFields(post) + for _, message := range mentionsEnabledFields { + markdown.Inspect(message, func(node interface{}) bool { + text, ok := node.(*markdown.Text) + if !ok { + processText(buf) + buf = "" + return true + } + buf += text.Text + return false + }) + } processText(buf) return ret } +// Given a post returns the values of the fields in which mentions are possible. +// post.message, preText and text in the attachment are enabled. +func GetMentionsEnabledFields(post *model.Post) model.StringArray { + ret := []string{} + + ret = append(ret, post.Message) + for _, attachment := range post.Attachments() { + + if len(attachment.Pretext) != 0 { + ret = append(ret, attachment.Pretext) + } + if len(attachment.Text) != 0 { + ret = append(ret, attachment.Text) + } + } + return ret +} + // Given a map of user IDs to profiles, returns a list of mention // keywords for all users in the channel. func (a *App) GetMentionKeywordsInChannel(profiles map[string]*model.User, lookForSpecialMentions bool) map[string][]string { diff --git a/app/notification_test.go b/app/notification_test.go index fb8eef4d7..525b39b67 100644 --- a/app/notification_test.go +++ b/app/notification_test.go @@ -88,6 +88,7 @@ func TestGetExplicitMentions(t *testing.T) { for name, tc := range map[string]struct { Message string + Attachments []*model.SlackAttachment Keywords map[string][]string Expected *ExplicitMentions }{ @@ -508,9 +509,32 @@ func TestGetExplicitMentions(t *testing.T) { }, }, }, + "should include the mentions from attachment text and preText": { + Message: "this is an message for @user1", + Attachments: []*model.SlackAttachment{ + { + Text: "this is a message For @user2", + Pretext: "this is a message for @here", + }, + }, + Keywords: map[string][]string{"@user1": {id1}, "@user2": {id2}}, + Expected: &ExplicitMentions{ + MentionedUserIds: map[string]bool{ + id1: true, + id2: true, + }, + HereMentioned: true, + }, + }, } { t.Run(name, func(t *testing.T) { - m := GetExplicitMentions(tc.Message, tc.Keywords) + + post := &model.Post{Message: tc.Message, Props: model.StringInterface{ + "attachments": tc.Attachments, + }, + } + + m := GetExplicitMentions(post, tc.Keywords) if tc.Expected.MentionedUserIds == nil { tc.Expected.MentionedUserIds = make(map[string]bool) } @@ -564,7 +588,8 @@ func TestGetExplicitMentionsAtHere(t *testing.T) { } for message, shouldMention := range cases { - if m := GetExplicitMentions(message, nil); m.HereMentioned && !shouldMention { + post := &model.Post{Message: message} + if m := GetExplicitMentions(post, nil); m.HereMentioned && !shouldMention { t.Fatalf("shouldn't have mentioned @here with \"%v\"", message) } else if !m.HereMentioned && shouldMention { t.Fatalf("should've mentioned @here with \"%v\"", message) @@ -573,7 +598,7 @@ func TestGetExplicitMentionsAtHere(t *testing.T) { // mentioning @here and someone id := model.NewId() - if m := GetExplicitMentions("@here @user @potential", map[string][]string{"@user": {id}}); !m.HereMentioned { + if m := GetExplicitMentions(&model.Post{Message: "@here @user @potential"}, map[string][]string{"@user": {id}}); !m.HereMentioned { t.Fatal("should've mentioned @here with \"@here @user\"") } else if len(m.MentionedUserIds) != 1 || !m.MentionedUserIds[id] { t.Fatal("should've mentioned @user with \"@here @user\"") @@ -1787,3 +1812,37 @@ func TestGetPushNotificationMessage(t *testing.T) { }) } } + +func TestGetMentionsEnabledFields(t *testing.T) { + + attachmentWithTextAndPreText := model.SlackAttachment{ + Text: "@here with mentions", + Pretext: "@Channel some comment for the channel", + + } + + attachmentWithOutPreText := model.SlackAttachment{ + Text: "some text", + } + attachments := []*model.SlackAttachment{ + &attachmentWithTextAndPreText, + &attachmentWithOutPreText, + } + + post := &model.Post{ + Message: "This is the message", + Props: model.StringInterface{ + "attachments": attachments, + }, + } + expectedFields := []string{ + "This is the message", + "@Channel some comment for the channel", + "@here with mentions", + "some text"} + + mentionEnabledFields := GetMentionsEnabledFields(post) + + assert.EqualValues(t, 4, len(mentionEnabledFields)) + assert.EqualValues(t, expectedFields, mentionEnabledFields) +} -- cgit v1.2.3-1-g7c22